diff --git a/day02/day02 b/day02/day02 index e9e67a1..69bb082 100755 Binary files a/day02/day02 and b/day02/day02 differ diff --git a/day02/source/day02.swift b/day02/source/day02.swift index 1fbf1b1..01b9678 100644 --- a/day02/source/day02.swift +++ b/day02/source/day02.swift @@ -4,6 +4,74 @@ import Foundation @main struct Day02 { + static func run() { + print("Parsing...") + let parsed = parseInput(realInput) + //print("Running Part 1...") + //part1(parsed) + print("Running Part 2...") + part2(parsed) + print("Finished!") + } + + typealias ParsedInput = [(UInt64, UInt64)] + + static func parseInput(_ input: String) -> ParsedInput { + input.split(separator: ",") + //.filter({ line in + // let split = line.split(separator: "-") + // return String(split[0]).count % 2 == 0 || String(split[1]).count % 2 == 0 + //}) + .map({ line in + let split = line.split(separator: "-") + return (UInt64(split.first!)!, UInt64(split.last!)!) + }) + } + + static func part1(_ input: ParsedInput) { + var sum: UInt64 = 0 + for (lhs, rhs) in input { + for cur in lhs...rhs { + let cnt = String(cur).count + guard cnt % 2 == 0 else { continue } + let low = cur % UInt64(pow(10, (Double(cnt) / 2))) + let hi = low * UInt64(pow(10, (Double(cnt) / 2))) + if cur == hi + low { + sum += cur + } + } + } + print("Part 1: \(sum)") + } + + static func part2(_ input: ParsedInput) { + var sum: UInt64 = 0 + for (lhs, rhs) in input { + for cur in lhs...rhs { + let sCur = String(cur) + let cnt = sCur.count + guard cnt > 1 else { continue } + + nextLength: for checkOffset in 0...((cnt / 2) - 1) { + let sub = sCur[sCur.startIndex...sCur.index(sCur.startIndex, offsetBy: checkOffset)] + + for windowOffset in stride(from: sub.count, to: cnt, by: sub.count) { + guard windowOffset + (sub.count) <= cnt else { break nextLength } + let winStartIdx = sCur.index(sCur.startIndex, offsetBy: windowOffset) + let winEndIdx = sCur.index(winStartIdx, offsetBy: sub.count - 1) + let window = sCur[winStartIdx...winEndIdx] + if sub != window { + continue nextLength + } + } + sum += cur + break + } + } + } + print("Part 2: \(sum)") + } + #if hasFeature(Embedded) static func main() { gfxInitDefault() @@ -32,48 +100,6 @@ struct Day02 { } #endif - static func run() { - print("Parsing...") - let parsed = parseInput(realInput) - print("Running Part 1...") - part1(parsed) - //part2(parsed) - print("Finished!") - } - - typealias ParsedInput = [(UInt64, UInt64)] - - static func parseInput(_ input: String) -> ParsedInput { - input.split(separator: ",") - .filter({ line in - let split = line.split(separator: "-") - return String(split[0]).count % 2 == 0 || String(split[1]).count % 2 == 0 - }) - .map({ line in - let split = line.split(separator: "-") - return (UInt64(split.first!)!, UInt64(split.last!)!) - }) - } - - static func part1(_ input: ParsedInput) { - var sum: UInt64 = 0 - for (lhs, rhs) in input { - for cur in lhs...rhs { - let cnt = String(cur).count - guard cnt % 2 == 0 else { continue } - let low = cur % UInt64(pow(10, (Double(cnt) / 2))) - let hi = low * UInt64(pow(10, (Double(cnt) / 2))) - if cur == hi + low { - sum += cur - } - } - } - print("Part 1: \(sum)") - } - - static func part2(_ input: ParsedInput) { - - } } let testInput = """