make d19p2 shorter
This commit is contained in:
		| @@ -1,30 +1,19 @@ | ||||
| import Foundation | ||||
|  | ||||
| enum Color: Character, CustomStringConvertible { | ||||
|     case r = "r" | ||||
|     case g = "g" | ||||
|     case u = "u" | ||||
|     case w = "w" | ||||
|     case b = "b" | ||||
|     var description: String { return String(self.rawValue) } | ||||
| } | ||||
| typealias Color = Character | ||||
|  | ||||
| func readInput(_ filePath: String) throws -> ([[Color]], [[Color]]) { | ||||
|     let content = try String(contentsOfFile: filePath, encoding: .ascii) | ||||
|     let lines = content.split(separator: "\n") | ||||
|     let towels = lines[0].split(separator: ", ").map { $0.compactMap(Color.init) } | ||||
|     let patterns = lines[1..<lines.count].map { $0.compactMap(Color.init) } | ||||
|     let towels = lines[0].split(separator: ", ").map(Array.init) | ||||
|     let patterns = lines[1..<lines.count].map(Array.init) | ||||
|     return (towels, patterns) | ||||
| } | ||||
|  | ||||
| var cache: [[Color]: Int] = [:] | ||||
| func matches(_ pattern: [Color], _ towels: [[Color]]) -> Int { | ||||
|     if pattern.count == 0 { | ||||
|         return 1 | ||||
|     } | ||||
|     if let cached = cache[pattern] { | ||||
|         return cached | ||||
|     } | ||||
|     if pattern.count == 0 { return 1 } | ||||
|     if let cached = cache[pattern] { return cached } | ||||
|     let r = towels | ||||
|         .filter { pattern.starts(with: $0) } | ||||
|         .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]) | ||||
| print(patterns.reduce(0) { s, p in s + matches(p, towels) }) | ||||
| print(patterns.map{ matches($0, towels) }.reduce(0, +)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user