63 lines
1.6 KiB
Swift
63 lines
1.6 KiB
Swift
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)")
|
|
}
|