blob: 6d682bdd5ab553b8766e93043cf2330acb012d22 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#!/usr/bin/swift
import Foundation
guard CommandLine.arguments.count >= 2 else {
fatalError("Usage: ./Day_01 <input.txt>")
}
let ranges: [ClosedRange<Int>] = try! String.init(contentsOfFile: CommandLine.arguments[1],
encoding: .utf8)
.split(separator: ",")
.map { rangeString in
guard let separatorIdx = rangeString.firstIndex(of: "-"),
let lower = Int(rangeString[..<separatorIdx]),
let upper = Int(rangeString[rangeString.index(after: separatorIdx)...]) else {
fatalError("L16 : [ERROR] Failed to create ClosedRange!")
}
return lower...upper
}
var invalidIdSum: Int = 0
for range in ranges {
for number in range {
let numString = String(number)
let length = numString.count
guard length.isMultiple(of: 2) else { continue }
let mid = numString.index(numString.startIndex, offsetBy: length / 2)
let left = numString[numString.startIndex..<mid]
let right = numString[mid..<numString.endIndex]
if left == right {
invalidIdSum += number
}
}
}
print("=======Part 1=======\n\(invalidIdSum)")
invalidIdSum = 0
func isRepeating(_ x: Int) -> Bool {
if x == 0 { return false }
var digits = 0
var temp = x
while temp > 0 {
digits += 1
temp /= 10
}
if digits < 2 { return false }
for period in 1...(digits / 2) {
guard digits % period == 0 else { continue }
var divisor = 1
for _ in 0..<period {
divisor *= 10
}
let pattern = x % divisor
var reconstructed = 0
var multiplier = 1
for _ in 0..<(digits / period) {
reconstructed += pattern * multiplier
multiplier *= divisor
}
if reconstructed == x {
return true
}
}
return false
}
ranges.forEach { range in
for id in range {
if isRepeating(id) {
invalidIdSum += id
}
}
}
print("=======Part 2=======\n\(invalidIdSum)")
|