d11
This commit is contained in:
		
							
								
								
									
										61
									
								
								day11/d11p1.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								day11/d11p1.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| import Foundation | ||||
|  | ||||
| class Node : CustomStringConvertible { | ||||
|     var value: Int | ||||
|     var next: Node? | ||||
|     init(_ value: Int, next: Node? = nil) { | ||||
|         self.value = value | ||||
|         self.next = next | ||||
|     } | ||||
|     var description: String { | ||||
|         let nextStr = if let next { String(describing: next) } else { "nil" } | ||||
|         return "(\(value))->\(nextStr)" | ||||
|     } | ||||
|     func evolve() -> Int { | ||||
|         if value == 0 { | ||||
|             value = 1 | ||||
|             return 1 | ||||
|         } | ||||
|         // I don't have log10() unless I import Graphics, which is overkill... | ||||
|         let s = String(value) | ||||
|         if s.count.isMultiple(of: 2) { | ||||
|             let secondHalf = s.count/2 ..< s.count | ||||
|             let newNode = Node(Int(String(Array(s)[secondHalf]))!, next: next) | ||||
|             value = Int(String(Array(s)[0 ..< s.count/2]))! | ||||
|             next = newNode | ||||
|             return 2 | ||||
|         } | ||||
|         value = value*2024 | ||||
|         return 1 | ||||
|     } | ||||
| } | ||||
|  | ||||
| func readInput(_ filePath: String) throws -> Node { | ||||
|     let content = try String(contentsOfFile: filePath, encoding: .ascii).trimmingCharacters(in: .whitespacesAndNewlines) | ||||
|     let head: Node = Node(-1) | ||||
|     var current = head | ||||
|     content.split(separator: " ").forEach { i in | ||||
|         print(i) | ||||
|         let new = Node(Int(i)!) | ||||
|         current.next = new | ||||
|         current = new | ||||
|     } | ||||
|     return head.next! | ||||
| } | ||||
|  | ||||
| func evolve(_ chain: Node) -> Int { | ||||
|     var next: Node? = chain | ||||
|     var count = 0 | ||||
|     while let node = next { | ||||
|         next = node.next | ||||
|         count += node.evolve() | ||||
|     } | ||||
|     return count | ||||
| } | ||||
|  | ||||
| let nums = try readInput(CommandLine.arguments[1]) | ||||
| print(nums) | ||||
| for i in 1...25 { | ||||
|     let count = evolve(nums) | ||||
|     print("\(i): \(count)")  // - \(nums)") | ||||
| } | ||||
							
								
								
									
										39
									
								
								day11/d11p2.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								day11/d11p2.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| import Foundation | ||||
|  | ||||
| struct NumTimes : Hashable { | ||||
|     let num: Int | ||||
|     let times: Int | ||||
| } | ||||
|  | ||||
| func readInput(_ filePath: String) throws -> [Int] { | ||||
|     return try String(contentsOfFile: filePath, encoding: .ascii) | ||||
|         .trimmingCharacters(in: .whitespacesAndNewlines) | ||||
|         .split(separator: " ").map { Int($0)! } | ||||
| } | ||||
|  | ||||
| func evolve(_ num: Int) -> [Int] { | ||||
|     if num == 0 { return [1] } | ||||
|     let s = String(num) | ||||
|     if s.count.isMultiple(of: 2) { | ||||
|         return [ | ||||
|             Int(String(Array(s)[s.count/2 ..< s.count]))!, | ||||
|             Int(String(Array(s)[0 ..< s.count/2]))! | ||||
|         ] | ||||
|     } | ||||
|     return [num * 2024] | ||||
|     | ||||
| } | ||||
|  | ||||
| var cache: [NumTimes: Int] = [:] | ||||
|  | ||||
| func count(_ num: Int, times: Int) -> Int { | ||||
|     let key = NumTimes(num: num, times: times) | ||||
|     if let cached = cache[key] { return cached } | ||||
|     if times == 0 { return 1 } | ||||
|     cache[key] = evolve(num).map { n in count(n, times: times-1) }.reduce(0, +) | ||||
|     return cache[key]! | ||||
| } | ||||
|  | ||||
| let nums = try readInput(CommandLine.arguments[1]) | ||||
| print(nums) | ||||
| print(nums.map { count($0, times: 75) }.reduce(0, +)) | ||||
							
								
								
									
										1
									
								
								day11/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								day11/input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| 0 27 5409930 828979 4471 3 68524 170 | ||||
							
								
								
									
										1
									
								
								day11/test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								day11/test.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| 125 17 | ||||
		Reference in New Issue
	
	Block a user