d07
This commit is contained in:
		
							
								
								
									
										42
									
								
								day07/d07p1.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								day07/d07p1.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| import Foundation | ||||
|  | ||||
| struct Equation { | ||||
|     let left: Int | ||||
|     let right: [Int] | ||||
|  | ||||
|     init(from s: String) { | ||||
|         let split = s.split(separator: " ") | ||||
|         left = Int(split[0].filter { $0 != ":" })! | ||||
|         right = split.dropFirst().map { Int($0)! } | ||||
|     } | ||||
|  | ||||
|     func valid(with ops: [(Int, Int) -> Int]) -> Bool { | ||||
|         if ops.count != right.count - 1 { | ||||
|             return false | ||||
|         } | ||||
|         return left == ops.enumerated().reduce(right[0], { acc, op in | ||||
|             op.1(acc, right[op.0+1])  | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| func readInput(_ filePath: String) throws -> [Equation] { | ||||
|     let content = try String(contentsOfFile: filePath, encoding: .ascii) | ||||
|     return content.split(separator: "\n").map { Equation(from: String($0)) } | ||||
| } | ||||
|  | ||||
| func combo<T>(of symbols: [T], len: Int) -> [[T]] { | ||||
|     if len == 0 { | ||||
|         return [[]] | ||||
|     } | ||||
|     let cdrs = combo(of: symbols, len: len - 1) | ||||
|     return symbols.flatMap { s in cdrs.map { cdr in [s] + cdr } } | ||||
| } | ||||
|  | ||||
| let op: [(Int, Int) -> Int] = [(+), (*)] | ||||
| let eqs = try readInput(CommandLine.arguments[1]) | ||||
| let answer = eqs | ||||
|     .filter { eq in | ||||
|         combo(of: op, len: eq.right.count - 1).contains { eq.valid(with: $0) } | ||||
|     }.reduce(0, { s, eq in s + eq.left }) | ||||
| print(answer) | ||||
		Reference in New Issue
	
	Block a user