diff --git a/day11/d11p1.swift b/day11/d11p1.swift new file mode 100644 index 0000000..5702002 --- /dev/null +++ b/day11/d11p1.swift @@ -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)") +} diff --git a/day11/d11p2.swift b/day11/d11p2.swift new file mode 100644 index 0000000..23f86a6 --- /dev/null +++ b/day11/d11p2.swift @@ -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 { + if times == 0 { return 1 } + let key = NumTimes(num: num, times: times) + if let cached = cache[key] { return cached } + 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, +)) diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..935be34 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1 @@ +0 27 5409930 828979 4471 3 68524 170 diff --git a/day11/test.txt b/day11/test.txt new file mode 100644 index 0000000..9b26c84 --- /dev/null +++ b/day11/test.txt @@ -0,0 +1 @@ +125 17