Files
aoc24/day25/d25p1.swift
2024-12-25 00:09:37 -08:00

63 lines
1.8 KiB
Swift

import Foundation
struct Key : CustomStringConvertible {
let pins: [Int]
var description: String {
return "(" + pins.map(String.init).joined(separator: ",") + ")"
}
init(_ block: ArraySlice<[Character]>) {
var pins: [Int] = [0, 0, 0, 0, 0]
((block.startIndex+1)..<(block.endIndex-1)).forEach { i in
for j in 0..<5 {
if pins[j] == 0 && block[i][j] == "#" {
pins[j] = 6 - (i - block.startIndex)
}
}
}
self.pins = pins
}
}
struct Lock : CustomStringConvertible {
let pins: [Int]
var description: String {
return "(" + pins.map(String.init).joined(separator: ",") + ")"
}
init(_ block: ArraySlice<[Character]>) {
var pins: [Int] = [0, 0, 0, 0, 0]
((block.startIndex+1)..<(block.endIndex-1)).reversed().forEach { i in
for j in 0..<5 {
if pins[j] == 0 && block[i][j] == "#" {
pins[j] = i - block.startIndex
}
}
}
self.pins = pins
}
}
func readInput(_ filePath: String) throws -> ([Lock], [Key]) {
let content = try String(contentsOfFile: filePath, encoding: .ascii)
let lines = content.split(separator: "\n", omittingEmptySubsequences: false)
var locks: [Lock] = []
var keys: [Key] = []
lines.map(Array.init).split(separator: []).forEach { block in
if block[block.startIndex][0] == "#" {
locks.append(Lock(block))
} else {
keys.append(Key(block))
}
}
return (locks, keys)
}
let (locks, keys) = try readInput(CommandLine.arguments[1])
var answer = 0
for lock in locks {
for key in keys {
answer += zip(lock.pins, key.pins).contains { $0 + $1 > 5 } ? 0 : 1
}
}
print(answer)