make d19p2 shorter

This commit is contained in:
2024-12-19 08:42:56 -08:00
parent 3057dfabac
commit ea0fce76e5

View File

@@ -1,30 +1,19 @@
import Foundation import Foundation
enum Color: Character, CustomStringConvertible { typealias Color = Character
case r = "r"
case g = "g"
case u = "u"
case w = "w"
case b = "b"
var description: String { return String(self.rawValue) }
}
func readInput(_ filePath: String) throws -> ([[Color]], [[Color]]) { func readInput(_ filePath: String) throws -> ([[Color]], [[Color]]) {
let content = try String(contentsOfFile: filePath, encoding: .ascii) let content = try String(contentsOfFile: filePath, encoding: .ascii)
let lines = content.split(separator: "\n") let lines = content.split(separator: "\n")
let towels = lines[0].split(separator: ", ").map { $0.compactMap(Color.init) } let towels = lines[0].split(separator: ", ").map(Array.init)
let patterns = lines[1..<lines.count].map { $0.compactMap(Color.init) } let patterns = lines[1..<lines.count].map(Array.init)
return (towels, patterns) return (towels, patterns)
} }
var cache: [[Color]: Int] = [:] var cache: [[Color]: Int] = [:]
func matches(_ pattern: [Color], _ towels: [[Color]]) -> Int { func matches(_ pattern: [Color], _ towels: [[Color]]) -> Int {
if pattern.count == 0 { if pattern.count == 0 { return 1 }
return 1 if let cached = cache[pattern] { return cached }
}
if let cached = cache[pattern] {
return cached
}
let r = towels let r = towels
.filter { pattern.starts(with: $0) } .filter { pattern.starts(with: $0) }
.map { matches(Array(pattern[$0.count..<pattern.count]), towels) } .map { matches(Array(pattern[$0.count..<pattern.count]), towels) }
@@ -34,4 +23,4 @@ func matches(_ pattern: [Color], _ towels: [[Color]]) -> Int {
} }
let (towels, patterns) = try readInput(CommandLine.arguments[1]) let (towels, patterns) = try readInput(CommandLine.arguments[1])
print(patterns.reduce(0) { s, p in s + matches(p, towels) }) print(patterns.map{ matches($0, towels) }.reduce(0, +))