Merge remote-tracking branch 'twentyone/main'
This commit is contained in:
commit
55c236e336
29 changed files with 11688 additions and 0 deletions
2053
2021/AoC21.xcodeproj/project.pbxproj
Normal file
2053
2021/AoC21.xcodeproj/project.pbxproj
Normal file
File diff suppressed because it is too large
Load diff
7
2021/AoC21.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
2021/AoC21.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
27
2021/common.swift
Normal file
27
2021/common.swift
Normal file
|
@ -0,0 +1,27 @@
|
|||
import Foundation
|
||||
|
||||
protocol Puzzle {
|
||||
mutating func run()
|
||||
init()
|
||||
}
|
||||
|
||||
extension Puzzle {
|
||||
static func main() {
|
||||
let start = Date()
|
||||
var instance = Self()
|
||||
instance.run()
|
||||
let duration = Date().timeIntervalSince(start)
|
||||
if duration > 1 {
|
||||
print(String(format: "Took %.2f s", duration))
|
||||
} else {
|
||||
print(String(format: "Took %.2f ms", 1000 * duration))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension RangeReplaceableCollection {
|
||||
mutating func removeFirst(where predicate: (Element) -> Bool) -> Element? {
|
||||
guard let index = firstIndex(where: predicate) else { return nil }
|
||||
return remove(at: index)
|
||||
}
|
||||
}
|
32
2021/day1.hs
Normal file
32
2021/day1.hs
Normal file
File diff suppressed because one or more lines are too long
170
2021/day10.swift
Normal file
170
2021/day10.swift
Normal file
|
@ -0,0 +1,170 @@
|
|||
@main
|
||||
struct Day10: Puzzle {
|
||||
func run() {
|
||||
var rest = input[...]
|
||||
var score = 0
|
||||
var completeionScores: [Int] = []
|
||||
loop: while true {
|
||||
if let complete = parse(&rest) {
|
||||
completeionScores.append(complete)
|
||||
}
|
||||
|
||||
switch rest.first {
|
||||
case "\n": break
|
||||
case ")": score += 3
|
||||
case "]": score += 57
|
||||
case "}": score += 1197
|
||||
case ">": score += 25137
|
||||
case let ch?: print("Unknown char", ch)
|
||||
case nil: break loop
|
||||
}
|
||||
|
||||
rest = rest.drop { !$0.isNewline }.dropFirst()
|
||||
}
|
||||
|
||||
print(score)
|
||||
|
||||
completeionScores.sort()
|
||||
let completeScore = completeionScores[completeionScores.count / 2]
|
||||
print("Part 2:", completeScore)
|
||||
}
|
||||
|
||||
func end(for start: Character) -> Character? {
|
||||
switch start {
|
||||
case "(": return ")"
|
||||
case "[": return "]"
|
||||
case "{": return "}"
|
||||
case "<": return ">"
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
func parse(_ string: inout Substring) -> Int? {
|
||||
var stack: [Character] = []
|
||||
while true {
|
||||
guard let current = string.first else { return nil }
|
||||
|
||||
if current == stack.last {
|
||||
stack.removeLast()
|
||||
} else if let closing = end(for: current) {
|
||||
stack.append(closing)
|
||||
} else if current == "\n" {
|
||||
|
||||
return stack.reversed().reduce(0) { partialResult, ch -> Int in
|
||||
let characterScore: Int
|
||||
switch (ch) {
|
||||
case ")": characterScore = 1
|
||||
case "]": characterScore = 2
|
||||
case "}": characterScore = 3
|
||||
case ">": characterScore = 4
|
||||
default: fatalError()
|
||||
}
|
||||
|
||||
return partialResult * 5 + characterScore
|
||||
}
|
||||
} else { return nil }
|
||||
|
||||
string = string.dropFirst()
|
||||
}
|
||||
}
|
||||
|
||||
let input = """
|
||||
{<[[<<<[[{[[<<()()>>[([]<>){{}{}}]]]<(<{{}<>}{{}{}}><{<>[]}[{}{}]>)({(())}<[(){}][(){}]>)>}]<<<(<<{}
|
||||
{[({({([({(((<[]()>[()<>]){[<>[]](<>[])})<<<[]()}>(<()()>)>)}[{((<{}[]>{<>()}){[<>{}]<<><>>})(({[]()}<<>()>)<
|
||||
(((([{{{<{<[[<()<>><<>{}>]]{<(<>())>}>{<[([]<>)<{}{}>][[<><>][<>[]]]>[{(<>{})[<>()]}<<()[]>[[]<
|
||||
<<[<([[{{{[({<<>()>}<<<>[]>([]())>){{{{}[]}<(){}>)}]{{[(()())[(){}]]<<[]{}>({}[])>}({<<><>>}<([]<>){()[]}>)}
|
||||
<[(({[({<<[[[{<>{}}(<><>))<(<>[])[{}[]]>]<[([][])[(){}]]>]([<[()()](<>[])>]<(<{}()>[{}<>])({<>[
|
||||
(<[[{[[[(<((<<{}{}><[]<>>><[{}<>][<>[]]>)<(<{}<>><{}{}>)[{()[]}<<>()>]>)>[(<{({}{})}[{()[]}{[]<>}]>){<(([]
|
||||
(([[({{{(<([({[]{}}){{[][]]}])>)[<([[[{}]{(){}}][([]())]]([{[][]}{<>()}](({}()){<>{}})))[{({
|
||||
{(<<([([(<<[{((){})([]<>)}]<{{{}{}}{{}[]}}<{(){}}{()[]})>><([<[]{}>([]<>)](<()<>>)){<([]<>
|
||||
{[<<[<{{((({<[[]{}]{{}}>{<{}<>>[<>[]]}})<{[(<><>><{}<>>][{[]{}}]}[[[[][]]<<>{}>]{[[]()][[]<>]}]>)[(
|
||||
({<(<([{<{<[(((){}){(){}})]>}[{{{{()()}<[]()>}{{<>()}<{}{}>}}[[{{}{}}[<><>]]{({}[]>[[]{}]}]}({{{()()
|
||||
{[[{([{<<{<(<<{}()>[()]>)<{{()()}}[<[][]>(<>{})]>>{[<{<>()){()<>}>{{()()}[<>()]}][[[{}[]]]<{{}[]}<()(
|
||||
{{<<<<<[[([{<[{}[]]{()<>}>{<<>()>{{}<>}}}<<{{}()}{()()}>{[()<>]({}[])]>]{[(<{}{}>)<({}[])>]<{({}<>)}{({}())
|
||||
({(<<{[<<{<(<[<>()][[][]]><[{}<>]({}[])>)[[[<>[]][[]()]]<{[]{}}[{}{}]>]>{[(<[]()>{<>{}})][<{{}}<{
|
||||
(<<<[[({<[[(<<[]{}>>[(()<>)[<>{}]])<{(<>[])}(<<>()>[[]{}])>]<[({[]()}{{}{}})<{{}()}<{}<>>>]>][[({<<>()>{[]()}
|
||||
{{{[<[([<(<{[([][])[{}[]]]{[()()]{{}()}}}><[<([][])(<>())><{()[]}({}<>)>]<<<(){}><<><>>>((()()){
|
||||
[(((([{({<(<(<[]<>>{()[]})><{(<><>){{}[]}}{(()<>)([][])}>)>})}][({{[[{<(<><>){{}()}>((<>()){<>[]
|
||||
([{<{<({(<[(<({}<>)><{[]}[{}[]]>)(<[[][]]{[]{}}>{{[]}((){})})]{(((()){{}()})(([][])({}{})))[(<()[]><(
|
||||
[([{{<{(<[{{((()())<[]{}>){{{}<>}<<><>>}}[<([]())>[(()[])<{}{}>]]}{[({(){}}{(){}])<<[]()>{{}()}>
|
||||
(<[<{{[<<({<<{<><>}><<()[]>[<><>]>>}{[(((){}){()<>}}<<[]()>{(){}}>]{{{{}[]}[{}<>]}[{{}{}}<(){}>]}}){{({
|
||||
<([([[<[({<<{{[][]}<{}[]>}<<()[]>[()<>]>>>})((<(<[[]]((){})>{([]()){<><>}})>)(<<<<[]<>>[[]()])>>([[
|
||||
[<<{<(<<{{[({<<>()><{}[]>})<{[<>()](<><>)}[{{}()}{[]()}]>]}}({<[{<()<>>}[<<>>]]((<[][]>{[][
|
||||
{{(<({[((<([({()<>})[{{}[]}(()<>))]{[{[]<>}][{()<>}]})([({<><>}{{}()})])>)({<(((()<>)(<><>)))>((
|
||||
[(<{({[<{<[<([{}()](<>{}))>]([([[]<>]<()<>>){<()>}]{{[[]()]{{}{}}}[{[]}{{}<>}]})>}<([<[<<>[]>]{<(){}>{
|
||||
[[[[<(<({<[[<{()}{{}[]}><[<><>]<()[]>>](<([]{})[{}]>)]>}<[{[[{(){}}]{(<><>)}][<<[][]>{(){}
|
||||
{(({({[{{((<[([]())((){})]>){[{(<>[])}<([]{})[[]<>]>]({<()<>>[[]<>]}[<()>{<>[]}])})({<([[][]]((){}))([<>{}])
|
||||
<(<(<<{[<<{<<[()[]][[]()]><([][])<{}()>>}}>[<<<<{}<>>>{[{}][{}{}]}>[<[()()]{{}[]}>[{[][]}([])]]>[[<<[][]>(
|
||||
<<{{({<<(([{{([][])(()<>)}}(<<[]{}>>)])([{[(()[])]}<{{<><>}<[]<>>}[<{}<>><[]<>)]>]{{<[{}[]]
|
||||
({[[[[(([[[{<({})([]())>{{<>{}}}}][[<<[]>[<>()]>]{[[[]<>][<>{}]]{[<>[]]}})][[<(<(){}>{()[]})><[[()[
|
||||
(((((([{{{(<<(<>{}){<>}><(()[])<()[]>>>{[<{}<>>(<>())}<{{}()}>})((([(){}]{<>})[{[]{}}{{}[]
|
||||
(([([(((<[(({[<>()]{[][]}})[{{[]()>[[]{}]}(<<>{}><{}<>>)]){[({[]}(<>[]))([()()][<>{}])]({({}
|
||||
[(<({{([[<(((<<>()>[[]<>])({{}()}<()<>>))[[{[]()}<()<>>][{()()}<{}[]>]])>({(<({}{})<()[]}>[{()
|
||||
{{{[([<{{{([<<<>{}>{()<>}>{<{}()><<><>>}]([{()}]))<{[<()()>{()[]}]{({}[])[<>()]}}>}}}({<(({({
|
||||
[([([<[<(<[{{{<>()}{()[]}}({()[]}[{}<>])}{[{<>}]([[][]]<(){}>)}]>[[{<[<>()][{}()]>(((){}>[<>[]])}{{{<>(
|
||||
{{[{{[[<{(<([[[][]]([]<>)])>)<{<<{<>()}[<>()]><((){})<<><>>>>([<<><>>(()<>)]([(){}}{[]<>}))}>}(({{{{[]}{
|
||||
[[[[({[<({{[[(<><>)]{<<>[]>([]{})}]<[{[]}{()()}]([<>()]([]<>>)>}})>{{<([{<{}{}>{()}}])({<[<>()](<><>)>
|
||||
{[({<[({[{[({[{}()][[]<>]}((()<>)<{}<>>))<[{{}}({}{})]>]{[<<<>[]>[[][]]>(({}[])(()[]))>{(([]{})({}[]))([
|
||||
[<<([{{(<<[<[[{}[]]](<[]{}>[<>{}])>[[<{}[]>(<>[])]{([][])[()[]]}]][[{{()[]}[<>{}]}(<<>{}>[[]
|
||||
<[(([{([([<{[[(){}]<<>{}>]}[[[()()]{{}<>}]]>[[{({}{})[()()]}([()()][<>[]])]{<[[]<>][[][]]>}]]{{<{[<>
|
||||
[<[[[[([[{[[<[{}{}]([]<>)>[({}[])<[]<>>]][<{()()}[<>[]]>([[]]<<><>>)]]}([<{{{}[]}}{(()<>>({}[
|
||||
<[<{[(<{({[<[[[][]]([][])]<([]){{}<>}>>[({<>{}}<[]>)]]([[([]{})[[]()]][[[]{}]({}{})]](<[{}<>
|
||||
({[<([(<[[<([[(){}]<<>{}>])({[[]{}]<()[]>}<<[]<>>{[][]}>)>{<[<[]()><{}[]>]([<>()]({}[]))><(
|
||||
({<<<{<({[[{[{<>{}}[<><>]]}{(({})[()()])<<()<>>([]{})>}]]]{<{{([[]<>](<>[]))[[{}()]({}())]}}>((<([{}<>])>{{<[
|
||||
[{([{[[{{<{<[{[]()}<[]{}>]>({<{}[]>{<>[]}})}[(({{}<>}<{}<>]){[[]{}]({}[])})]>}}]({([[([<()()>{[]
|
||||
<[{([([{[{<(([<>[]]{<>()})<{{}<>}>){([<><>])<(()[])<<>{}>>}><{{[{}<>]{<>}}[(())[()<>]]}<{[{}{}]{{}{}}}<{{}<>
|
||||
[{<<([{{(((<{<<>()>[{}()]}>{<<<>[]><[]()>>}){[(([][])([]()))<{{}[]}[[]()]>][[{{}<>}({}{})]{({}{})(<
|
||||
{({[((<([[[{{([])[()()]}({{}{}}))<(<[]<>>[()[]])>]<<([[]<>])<[<>()][[]<>]>>({[<><>]{{}[]}}({()[]
|
||||
{[(<(<{[({[(<<[]>{<>{}}>[{<><>}([]())])(<[[][]]<()<>>>[(()[])])]<{[{()[]}[<>{}]]}[{<(){}>(<>{})}<<<>()>>]
|
||||
(<{<[<({{{{([({}{})[[]{}]]({{}<>}<()[]}))}(<<{<>()}{()<>}>{[<>{}][()[]]}>{<<[][]>{<>()}><(<>{})<{}[]>>})}
|
||||
{(<<{[({<<[(<{{}{}}<[]<>>>((<>())([]<>)))]>><<({<{[]<>}([]<>)>{[()()]}}<<{{}<>}<()()>>(<()()
|
||||
<([([<(<[({[[({}()){()<>}](({}{})(<><>))][{({}<>)<{}{}>}{([]){(){}}}]})]>)<[[{<{{(()){<>[]}}({{}()}
|
||||
<<<([{[({{{((<{}()>{()()})[[<>()]])[[[{}()]<{}()>]{{[]<>}{{}())}]}<<{<<>><<><>>}[{{}[]}(<><>)
|
||||
<([<[<{[[[{[{[<><>][{}<>]}(<[]{}>)]}([{{<>()}<{}[]>}{([]<>)[(){}]}]<{((){})<[]()>}[<[]()><()[]>]>
|
||||
[([[[[[({{[(<[{}<>]<{}()>><[<><>]{<>()}>)]}<{(<(()<>)<{}{}>>{{()<>}(()()}})}>})(<[<([<<>[]>((){})]([[]<>]<()
|
||||
{(<[[{(((([[([{}()]<{}()))[({}{}){[]}]](<<<>[]>>([<>{}]))][(<({}{})<()[]>><<[]{}><{}[]>>)])(<([([][])[
|
||||
({(([{{<{{{<[<<>[]>{()<>}][([][]){()<>}]>([<()>(<><>)]<{<><>}<[]>>)}<{[[<>[]][<>{}]]<{<>()}{[][]
|
||||
{[([[[(([<{<{[[]<>]<<>()>}<<()()>([]{})>>[<<()[]>(<>())>[(()<>)]]}>]{{({{{{}[]}({})}<{{}<>}[[]()]>}((
|
||||
[<([[<[{{{[[[<<>{}>]{<()[]>{[]<>}}]{([[]{}]({}()))}]}}}(<{<[[({}{})<()()>]]({({}<>)[[]]}{[<><>]{<>{}}})>(<[
|
||||
<<(<<{{(({<[<<[]{}>{()()}}[[()[]]]]{[(<>{}){<>}]{[{}](<>)}}><{<(()())<[]<>>>[<(){}>(<>[])]
|
||||
{<(<[<[(((<{((()[])([]<>))([[]<>]({}[]))}><<([<>())<[]<>>)(<{}[]>({}<>))>[[([]())]({()()}{{}<>})
|
||||
[[((<[[[{{<{<{{}()}[{}()]>{{[]{}}[<><>]}}>}<{[<[(){}]<<><>>]([{}<>]<<><>>)]}(<<[{}<>]<<>{}>
|
||||
<[{{[[{<[{(({[(){}]({}{})})[([{}<>][()()])[<[][]><{}<>>]])}](<({(([]<>){()[]})[([]())((){})]}{{{<>{}}<[]()>}<
|
||||
<{((<([[{<<[(<{}()><{}[]>)]>[([{<>()}<()()>]<{()[]><()[]>>){<[{}[]]>[{[][]}(<><>)]}]>{{[{{{}<>}{<>}}[[(){}]<(
|
||||
{<[({(<{{[([{{[]{}}((){})}[[{}[]]<{}()>]]((<[]<>>)<([]()){{}[]}>))(<<{()[]}{[]})>[[(()())]{[()<>][<>(
|
||||
<<{[[[[{<({<[[{}()]]{{[]<>}{[]}}><{{{}()}({}{})}>}{([({}[])({}())](({}[])))[<{[]<>}[<>()]><<[]<>>(<>[])>]}
|
||||
[(([<<[{[{<({{()[]}<<><>>})[[([]())[[]{}])(<<>{}>)]>(<{{[][]}[{}()]}([{}{}][(){}])>((<<>[]>(()
|
||||
[({<<[[<{[<<({[]()}<()<>>)>]]{{<[[[]][{}<>]]>}{([[<>{}][{}{}]]<((){})(()[])>)}}}([{((<{}[]>)[<{}[]><{}()>])}
|
||||
{[[((<[{<<([{<<><>>([]{})}<(<><>)<<>()>>][{[[]{}]{()()}}<({}{})([][])>])><<{({<>{}}[<>()])((
|
||||
[[[<{{(<((([{<[]{}>({}<>)}[<<>()>]]<<(()[]){{}[]}>{(()<>){{}<>}}>){{{(()())[<><>]}[[[]<>]{<>[]}]}}))[
|
||||
(<({[({[[({{<{<>{}}<()[]>>[{(){}}<<>[]>]}[[<[][]><()<>>]({<>{}}{[]()})]}{(([[]<>][{}[]])(<[]<>>([
|
||||
{([<{[<({{{({[[][]][()()])[<<>()><[][]>])}<{{{[]()}[{}()]}{{<>()}{<>}}}((({}())<{}{}>){(<>{})[<>{}]})>}})(((
|
||||
([[[[[[{(((((<<>()>[[]<>])<{()()}[()<>]>){<[()[]]<<>[]>>(<<>{}}{{}[]})}))<<[([()()][[]()])[{()[]}([]())]][<([
|
||||
({{((((<{<[{[(<>{})][<()()>[[]()]]}]{({(<>())[[]()]}{<[][]><[][]>})}>}>{<<{{(({}())[<>])((()[])<[]<>>)}}[
|
||||
<(<[[[<<{([<<[[]<>]{<>[]}><{()()}([]<>)>>]{<{(<>())((){})}{[{}{}]<<>{}>}>})({([[{}{}]])[(<<>()>[
|
||||
{[(<{<[[{<{{(<()[]><<>{}>){[()<>]<{}<>>}}[[[<>{}][[]<>]]]}<[[({})<<>[]>]]{{<()<>><<>[]>}<{()[]}((){}
|
||||
({[{(<<{[<{({[()()]{{}}}<({}{}){()()}>)}<{(({}{})[<>[]]){([]())[[][]]}}{(<[]<>)[()])[[<>()]]}>>
|
||||
(({<<[<[<<<({<{}[]>({}{})}{<{}[]><{}[]>})>>(<<(<()()>{[]{}})({()<>}[()()])>[{[{}()][[]]}({<>()}}]>(
|
||||
<<(<(<[{([{<[[<>{}]<{}<>>]>{<(()[])(()())><{<>[]}{()()}>}}([{({}<>){<>{}}}{{<>[]}[{}{}]}]([<[]()>((){})
|
||||
{[{([({[[<<<{{[]{}}<[]{}>}[<()[]><[]<>>]>([{{}[]][[][]]]{{(){}}({}[])})>(<{[<>{}](()<>)}>{[<[]()>
|
||||
([[[<(<{[({<({()()}{<>()})((<>[])<[]<>>)>}<{<<{}()><<>>>}({{{}[]}}[(()[])[()<>]])>)<[<((()())[<>{}])(
|
||||
{<(((<[((((({<[]>[[]{}]}))[(<[[][]][{}{}]>){{[<>()][[]<>]}([()()](<><>))}])){(<[{[<>()][{}()]
|
||||
({([{<(((<{[<[{}[]]<<>>>({{}[]}[[]()])]([<(){}>])}{<[{<>[]}{[]<>}][<<><>){<>{}}]>[<((){})([]{})>[[{}{}][()
|
||||
<[{[<[{[({{<(({}<>}[[]()])>({{[][]}}<[(){}](()[])>)}})([[{{<<>()>([]{})}[<<>{}>[<><>]]}]])]
|
||||
{(<{([{[[({[(<[]{}>)({{}[]}{()()}))<{(()[])}[[()()]{{}[]}]>}<{<(()<>)>{{[]{}}({}())}}({{{}[]}{<
|
||||
[<<{<{<<(<([<(<>()){[]()}>[({}<>)({}<>)]][(([]{}){()[]})[{{}()}(()())]])>{([{{()[]}<<>[]>}<{<>[
|
||||
{{[[(([([({([([]<>)(()())][{<>()}{(){}}])})])]([{{[<{{{}<>}(<>())>{[()()]<<>[]>}>[{(()){{}[
|
||||
[({({({(({{(<[()()][{}<>]>[[{}()]{(){}}])<[<<>[]>][<{}>(<>{})]>}(((({}())({}{}))){{(()[])<[][
|
||||
<(<(<[([<[{[<(()<>)<()[]>><(<>())([][])>]{<[{}<>]{{}()}>{[[]{}](<>{})}}}<[<([]{})><{{}<>}([]())>]>]>
|
||||
<<<(<<[({{{<{({}<>)<()[]>}<[()<>]{(){}}>><{[[]()]<[]{}>}[({}{})<(){}>]>}(<[<<>[]>{()[]}]>)}[<{[<{}>[{}{
|
||||
{(<((<[{{[[[[<{}{}]<{}()>]][{({}{})<<>{}>}[<()[]>(()())]]]{([<[]()><[]{}>](<{}()>))({<<><>>(<>())}{
|
||||
{({{[[<[{<{{(<<>>)(<[]()>[()])}([({}<>)])}[[{[()<>][()[]]}]({<[]<>>{<>()}})]><<(<<{}()>{<>[]
|
||||
{{{[{[<<{[[{[{{}<>}<[][]>]{(()[])<<>()>}}[<{()()}[(){}]><<()[]>>]]{<((<>{})({}()))[<(){}>([][])]>{({{}[]}<
|
||||
<{{[<{({{{[<{{<>()}{{}()}}>]<{<[()[]](<><>)><[<>[]]{(){}}>}<([(){}]<{}{}>){(())}>>}[([{[[]<>][{}<>]}[{()}(
|
||||
[<<[{{(({({<{{{}{}}{<>[]}}({[][]}{<>[]})>[{[{}<>][<>[]]}[({}[])[[]<>]]]})}))<(<[[<(({}()))[<<>()>{(
|
||||
{<<([<{({[{{[({}[])<<>{}>]([()<>]<(){}>)}<([{}[]]({}{}))>}[<<<<>{}>[[][]]>{<<>[]><()>}>[<<<>><[][]>
|
||||
[({(<({[<[{{[<<>[]>[()[]]]<<<>[]>>}}<{([{}[]](<>{}))[{<>}{{}<>}]}(<<[][]>>[{[]<>}])>]>[(<(({<>[]}{<><>}))(<
|
||||
{<[[{{<<{(<(<([]<>)[[][]]>[([]{})[<>{}]])<[{<>()}{[]<>}]>>>[{(({()()}[<>[]]){({}())<[]<>>})}[(<{<>
|
||||
{[[{{{<[<[{<(({}{})[{}()])[(<><>)({}())]>}{[<{[]{}}[()[]]>]<{[()()]<[]()>}<[[][]]>>}]>{{({{{()[]}{{}(
|
||||
<{[<([{{[[<(<{<><>}[{}{}]><((){})>){[[()()][()[]]]{[[]<>]}}>]<<(<({}[])<{}[]>>{(<><>)<[]()>}){(<
|
||||
"""
|
||||
}
|
70
2021/day11.swift
Normal file
70
2021/day11.swift
Normal file
|
@ -0,0 +1,70 @@
|
|||
@main
|
||||
struct Day11: Puzzle {
|
||||
mutating func run() {
|
||||
var count = 0
|
||||
var currentStep = 0
|
||||
repeat {
|
||||
let stepCount = step()
|
||||
count += stepCount
|
||||
currentStep += 1
|
||||
if (currentStep == 100) {
|
||||
print("Part 1:", count)
|
||||
}
|
||||
|
||||
if stepCount == width * height {
|
||||
print("Part 2:", currentStep)
|
||||
break
|
||||
}
|
||||
} while true
|
||||
}
|
||||
|
||||
subscript(x: Int, y: Int) -> Int {
|
||||
get { data[x + width * y] }
|
||||
set { data[x + width * y] = newValue }
|
||||
}
|
||||
|
||||
mutating func step() -> Int {
|
||||
var flashes: Set<Point> = []
|
||||
|
||||
func up(x: Int, y: Int) {
|
||||
self[x, y] += 1
|
||||
if self[x, y] > 9, flashes.insert(Point(x: x, y: y)).inserted {
|
||||
for i in -1...1 where 0..<height ~= y + i {
|
||||
for j in -1...1 where (i != 0 || j != 0) && 0..<width ~= x + j {
|
||||
up(x: x + j, y: y + i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for y in 0..<height {
|
||||
for x in 0..<width {
|
||||
up(x: x, y: y)
|
||||
}
|
||||
}
|
||||
|
||||
for point in flashes {
|
||||
self[point.x, point.y] = 0
|
||||
}
|
||||
|
||||
return flashes.count
|
||||
}
|
||||
|
||||
struct Point: Hashable { var x: Int, y: Int }
|
||||
|
||||
let width = 10
|
||||
let height = 10
|
||||
|
||||
var data = [
|
||||
2, 5, 2, 4, 2, 5, 5, 3, 3, 1,
|
||||
1, 1, 3, 5, 6, 2, 5, 8, 8, 1,
|
||||
2, 8, 3, 8, 3, 5, 3, 8, 6, 3,
|
||||
1, 6, 6, 2, 3, 1, 2, 3, 6, 5,
|
||||
6, 8, 4, 7, 8, 3, 5, 8, 2, 5,
|
||||
2, 1, 8, 5, 6, 8, 4, 3, 6, 7,
|
||||
6, 8, 7, 4, 2, 1, 2, 8, 3, 1,
|
||||
5, 3, 8, 7, 2, 4, 7, 8, 1, 1,
|
||||
2, 2, 5, 5, 4, 8, 2, 8, 7, 5,
|
||||
8, 5, 2, 8, 5, 5, 7, 1, 3, 1,
|
||||
]
|
||||
}
|
125
2021/day12.swift
Normal file
125
2021/day12.swift
Normal file
|
@ -0,0 +1,125 @@
|
|||
protocol PathProtocol {
|
||||
func appending(_ room: Int, small: Bool) -> Self?
|
||||
}
|
||||
|
||||
@main
|
||||
struct Day12: Puzzle {
|
||||
func run() {
|
||||
let rooms = input.reduce(into: Set<String>()) { partialResult, pair in
|
||||
partialResult.insert(pair.0)
|
||||
partialResult.insert(pair.1)
|
||||
}.sorted()
|
||||
|
||||
let small = Set(rooms.enumerated().compactMap { $0.element.first!.isLowercase ? $0.offset : nil })
|
||||
|
||||
let matrix = buildMatrix(rooms, small: small)
|
||||
|
||||
let startIndex = rooms.firstIndex(of: "start")!
|
||||
let endIndex = rooms.firstIndex(of: "end")!
|
||||
|
||||
let paths = matrix.findPaths(from: startIndex, to: endIndex, continuing: Path())
|
||||
print("total paths", paths.count)
|
||||
|
||||
let paths2 = matrix.findPaths(from: startIndex, to: endIndex, continuing: PathParth2(start: startIndex))
|
||||
print("part 2:", paths2.count)
|
||||
}
|
||||
|
||||
struct Path: PathProtocol {
|
||||
var rooms: [Int] = []
|
||||
|
||||
func appending(_ room: Int, small: Bool) -> Path? {
|
||||
guard !small || !rooms.contains(room) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return Path(rooms: rooms + [room])
|
||||
}
|
||||
}
|
||||
|
||||
struct PathParth2: PathProtocol {
|
||||
let start: Int
|
||||
var rooms: [Int] = []
|
||||
var repeatedSmall: Bool = false
|
||||
|
||||
func appending(_ room: Int, small: Bool) -> PathParth2? {
|
||||
var rs = repeatedSmall
|
||||
if small && rooms.contains(room) {
|
||||
if room == start || repeatedSmall {
|
||||
return nil
|
||||
}
|
||||
|
||||
rs = true
|
||||
}
|
||||
|
||||
return PathParth2(start: start, rooms: rooms + [room], repeatedSmall: rs)
|
||||
}
|
||||
}
|
||||
|
||||
struct Matrix {
|
||||
var data: [Bool]
|
||||
let size: Int
|
||||
let small: Set<Int>
|
||||
|
||||
func neighbors(of index: Int) -> [Int] {
|
||||
let slice = data[index * size ..< (index + 1) * size]
|
||||
return slice.enumerated().compactMap { $0.element ? $0.offset : nil }
|
||||
}
|
||||
|
||||
func findPaths<Path: PathProtocol>(from: Int, to: Int, continuing: Path) -> [Path] {
|
||||
guard from != to else {
|
||||
return [continuing]
|
||||
}
|
||||
|
||||
guard let current = continuing.appending(from, small: small.contains(from)) else {
|
||||
return []
|
||||
}
|
||||
|
||||
return neighbors(of: from).reduce(into: []) { partialResult, next in
|
||||
partialResult += findPaths(from: next, to: to, continuing: current)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func buildMatrix(_ rooms: [String], small: Set<Int>) -> Matrix {
|
||||
let count = rooms.count
|
||||
var matrix = [Bool](repeating: false, count: count * count)
|
||||
|
||||
for (from, to) in input {
|
||||
let fromIndex = rooms.firstIndex(of: from)!
|
||||
let toIndex = rooms.firstIndex(of: to)!
|
||||
|
||||
matrix[fromIndex + count * toIndex] = true
|
||||
matrix[toIndex + count * fromIndex] = true
|
||||
}
|
||||
|
||||
return Matrix(data: matrix, size: count, small: small)
|
||||
}
|
||||
|
||||
|
||||
let input: [(String, String)] = [
|
||||
("rf", "RL"),
|
||||
("rf", "wz"),
|
||||
("wz", "RL"),
|
||||
("AV", "mh"),
|
||||
("end", "wz"),
|
||||
("end", "dm"),
|
||||
("wz", "gy"),
|
||||
("wz", "dm"),
|
||||
("cg", "AV"),
|
||||
("rf", "AV"),
|
||||
("rf", "gy"),
|
||||
("end", "mh"),
|
||||
("cg", "gy"),
|
||||
("cg", "RL"),
|
||||
("gy", "RL"),
|
||||
("VI", "gy"),
|
||||
("AV", "gy"),
|
||||
("dm", "rf"),
|
||||
("start", "cg"),
|
||||
("start", "RL"),
|
||||
("rf", "mh"),
|
||||
("AV", "start"),
|
||||
("qk", "mh"),
|
||||
("wz", "mh"),
|
||||
]
|
||||
}
|
931
2021/day13.swift
Normal file
931
2021/day13.swift
Normal file
|
@ -0,0 +1,931 @@
|
|||
@main
|
||||
struct Day13: Puzzle {
|
||||
|
||||
var maxX: Int = 0
|
||||
var maxY: Int = 0
|
||||
|
||||
mutating func run() {
|
||||
maxX = dots.map(\.x).max()!
|
||||
maxY = dots.map(\.y).max()!
|
||||
|
||||
for (pos, fold) in folds.enumerated() {
|
||||
self.fold(fold)
|
||||
if (pos == 0) {
|
||||
print("Part 1:", Set(dots).count)
|
||||
}
|
||||
}
|
||||
|
||||
print("\n\nPart 2:\n")
|
||||
|
||||
for y in 0..<maxY {
|
||||
let dots = dots.filter { $0.y == y }.map(\.x).sorted()
|
||||
var x = 0
|
||||
|
||||
for dotX in dots where dotX >= x {
|
||||
print(String(repeating: ".", count: dotX - x) + "#", terminator: "")
|
||||
x = dotX + 1
|
||||
}
|
||||
print(String(repeating: ".", count: maxX - x))
|
||||
}
|
||||
}
|
||||
|
||||
mutating func fold(_ fold: Fold) {
|
||||
switch fold {
|
||||
case .x(let axis):
|
||||
self.fold(at: axis, keyPath: \.x, max: maxX)
|
||||
maxX = axis
|
||||
|
||||
case .y(let axis):
|
||||
self.fold(at: axis, keyPath: \.y, max: maxY)
|
||||
maxY = axis
|
||||
}
|
||||
}
|
||||
|
||||
mutating func fold(at limit: Int, keyPath: WritableKeyPath<Dot, Int>, max: Int) {
|
||||
let mid = dots.partition { dot in dot[keyPath: keyPath] > limit }
|
||||
for index in mid..<dots.endIndex {
|
||||
dots[index][keyPath: keyPath] = 2 * limit - dots[index][keyPath: keyPath]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct Dot: Hashable {
|
||||
var x: Int
|
||||
var y: Int
|
||||
|
||||
init(_ x: Int, _ y: Int) {
|
||||
self.x = x
|
||||
self.y = y
|
||||
}
|
||||
}
|
||||
|
||||
var dots: [Dot] = [
|
||||
Dot(609, 754),
|
||||
Dot(1101, 140),
|
||||
Dot(1129, 317),
|
||||
Dot(622, 327),
|
||||
Dot(967, 218),
|
||||
Dot(661, 789),
|
||||
Dot(661, 127),
|
||||
Dot(1183, 596),
|
||||
Dot(649, 280),
|
||||
Dot(932, 693),
|
||||
Dot(1288, 157),
|
||||
Dot(1111, 372),
|
||||
Dot(781, 219),
|
||||
Dot(994, 236),
|
||||
Dot(1145, 770),
|
||||
Dot(1153, 395),
|
||||
Dot(755, 289),
|
||||
Dot(502, 406),
|
||||
Dot(850, 126),
|
||||
Dot(902, 58),
|
||||
Dot(907, 5),
|
||||
Dot(268, 700),
|
||||
Dot(646, 436),
|
||||
Dot(1108, 523),
|
||||
Dot(443, 343),
|
||||
Dot(932, 201),
|
||||
Dot(1115, 105),
|
||||
Dot(1191, 278),
|
||||
Dot(1241, 203),
|
||||
Dot(1000, 252),
|
||||
Dot(1290, 403),
|
||||
Dot(144, 597),
|
||||
Dot(927, 448),
|
||||
Dot(782, 630),
|
||||
Dot(131, 705),
|
||||
Dot(333, 367),
|
||||
Dot(38, 613),
|
||||
Dot(1285, 294),
|
||||
Dot(872, 93),
|
||||
Dot(492, 759),
|
||||
Dot(986, 203),
|
||||
Dot(70, 740),
|
||||
Dot(378, 693),
|
||||
Dot(1004, 319),
|
||||
Dot(731, 235),
|
||||
Dot(479, 875),
|
||||
Dot(1210, 389),
|
||||
Dot(1215, 215),
|
||||
Dot(214, 122),
|
||||
Dot(599, 660),
|
||||
Dot(500, 254),
|
||||
Dot(8, 478),
|
||||
Dot(120, 29),
|
||||
Dot(70, 809),
|
||||
Dot(373, 248),
|
||||
Dot(1235, 441),
|
||||
Dot(1293, 345),
|
||||
Dot(454, 686),
|
||||
Dot(985, 469),
|
||||
Dot(1101, 478),
|
||||
Dot(765, 287),
|
||||
Dot(1029, 309),
|
||||
Dot(667, 203),
|
||||
Dot(1220, 800),
|
||||
Dot(508, 285),
|
||||
Dot(65, 675),
|
||||
Dot(1078, 663),
|
||||
Dot(592, 677),
|
||||
Dot(236, 122),
|
||||
Dot(462, 564),
|
||||
Dot(1042, 418),
|
||||
Dot(748, 852),
|
||||
Dot(810, 254),
|
||||
Dot(718, 229),
|
||||
Dot(386, 22),
|
||||
Dot(1191, 728),
|
||||
Dot(432, 872),
|
||||
Dot(392, 28),
|
||||
Dot(972, 259),
|
||||
Dot(336, 416),
|
||||
Dot(1096, 480),
|
||||
Dot(415, 871),
|
||||
Dot(1241, 427),
|
||||
Dot(165, 441),
|
||||
Dot(510, 673),
|
||||
Dot(750, 313),
|
||||
Dot(1255, 779),
|
||||
Dot(194, 854),
|
||||
Dot(639, 107),
|
||||
Dot(281, 585),
|
||||
Dot(679, 519),
|
||||
Dot(611, 644),
|
||||
Dot(497, 171),
|
||||
Dot(326, 730),
|
||||
Dot(882, 456),
|
||||
Dot(403, 453),
|
||||
Dot(454, 630),
|
||||
Dot(726, 227),
|
||||
Dot(383, 502),
|
||||
Dot(574, 528),
|
||||
Dot(1120, 593),
|
||||
Dot(214, 256),
|
||||
Dot(165, 422),
|
||||
Dot(425, 115),
|
||||
Dot(795, 323),
|
||||
Dot(673, 602),
|
||||
Dot(5, 827),
|
||||
Dot(1009, 619),
|
||||
Dot(364, 194),
|
||||
Dot(75, 390),
|
||||
Dot(870, 122),
|
||||
Dot(654, 449),
|
||||
Dot(62, 665),
|
||||
Dot(999, 228),
|
||||
Dot(611, 508),
|
||||
Dot(87, 660),
|
||||
Dot(677, 880),
|
||||
Dot(656, 449),
|
||||
Dot(681, 336),
|
||||
Dot(499, 70),
|
||||
Dot(870, 638),
|
||||
Dot(119, 728),
|
||||
Dot(1185, 498),
|
||||
Dot(28, 406),
|
||||
Dot(1, 796),
|
||||
Dot(334, 210),
|
||||
Dot(803, 445),
|
||||
Dot(17, 345),
|
||||
Dot(58, 194),
|
||||
Dot(1310, 162),
|
||||
Dot(661, 827),
|
||||
Dot(276, 649),
|
||||
Dot(679, 883),
|
||||
Dot(164, 506),
|
||||
Dot(990, 236),
|
||||
Dot(82, 327),
|
||||
Dot(999, 485),
|
||||
Dot(498, 208),
|
||||
Dot(1228, 119),
|
||||
Dot(529, 732),
|
||||
Dot(252, 544),
|
||||
Dot(579, 403),
|
||||
Dot(808, 592),
|
||||
Dot(251, 665),
|
||||
Dot(912, 602),
|
||||
Dot(502, 722),
|
||||
Dot(85, 75),
|
||||
Dot(440, 122),
|
||||
Dot(755, 12),
|
||||
Dot(898, 766),
|
||||
Dot(878, 22),
|
||||
Dot(924, 22),
|
||||
Dot(679, 277),
|
||||
Dot(1191, 616),
|
||||
Dot(1278, 775),
|
||||
Dot(1148, 871),
|
||||
Dot(229, 37),
|
||||
Dot(957, 854),
|
||||
Dot(987, 448),
|
||||
Dot(1285, 518),
|
||||
Dot(1252, 476),
|
||||
Dot(1295, 857),
|
||||
Dot(822, 285),
|
||||
Dot(731, 627),
|
||||
Dot(199, 74),
|
||||
Dot(82, 775),
|
||||
Dot(1186, 299),
|
||||
Dot(954, 488),
|
||||
Dot(753, 508),
|
||||
Dot(1232, 593),
|
||||
Dot(1216, 663),
|
||||
Dot(529, 284),
|
||||
Dot(795, 571),
|
||||
Dot(1118, 226),
|
||||
Dot(467, 617),
|
||||
Dot(691, 36),
|
||||
Dot(181, 317),
|
||||
Dot(994, 658),
|
||||
Dot(651, 894),
|
||||
Dot(1101, 754),
|
||||
Dot(763, 603),
|
||||
Dot(1088, 872),
|
||||
Dot(45, 528),
|
||||
Dot(937, 224),
|
||||
Dot(1042, 470),
|
||||
Dot(1066, 648),
|
||||
Dot(1131, 95),
|
||||
Dot(738, 434),
|
||||
Dot(283, 60),
|
||||
Dot(994, 302),
|
||||
Dot(1268, 865),
|
||||
Dot(795, 287),
|
||||
Dot(75, 179),
|
||||
Dot(1011, 425),
|
||||
Dot(741, 75),
|
||||
Dot(773, 659),
|
||||
Dot(373, 700),
|
||||
Dot(201, 479),
|
||||
Dot(649, 614),
|
||||
Dot(328, 893),
|
||||
Dot(1103, 728),
|
||||
Dot(1144, 285),
|
||||
Dot(468, 45),
|
||||
Dot(857, 591),
|
||||
Dot(69, 203),
|
||||
Dot(401, 339),
|
||||
Dot(579, 659),
|
||||
Dot(502, 172),
|
||||
Dot(584, 891),
|
||||
Dot(802, 609),
|
||||
Dot(644, 359),
|
||||
Dot(679, 11),
|
||||
Dot(1260, 201),
|
||||
Dot(194, 505),
|
||||
Dot(507, 485),
|
||||
Dot(738, 350),
|
||||
Dot(170, 882),
|
||||
Dot(84, 511),
|
||||
Dot(1203, 123),
|
||||
Dot(1240, 533),
|
||||
Dot(811, 70),
|
||||
Dot(736, 687),
|
||||
Dot(856, 686),
|
||||
Dot(698, 417),
|
||||
Dot(726, 592),
|
||||
Dot(572, 544),
|
||||
Dot(1144, 609),
|
||||
Dot(629, 376),
|
||||
Dot(1039, 840),
|
||||
Dot(455, 148),
|
||||
Dot(580, 224),
|
||||
Dot(848, 778),
|
||||
Dot(684, 45),
|
||||
Dot(1265, 304),
|
||||
Dot(681, 406),
|
||||
Dot(15, 228),
|
||||
Dot(172, 814),
|
||||
Dot(637, 549),
|
||||
Dot(617, 610),
|
||||
Dot(1185, 610),
|
||||
Dot(1250, 275),
|
||||
Dot(107, 291),
|
||||
Dot(186, 261),
|
||||
Dot(1247, 299),
|
||||
Dot(467, 123),
|
||||
Dot(350, 582),
|
||||
Dot(782, 432),
|
||||
Dot(38, 505),
|
||||
Dot(843, 617),
|
||||
Dot(1184, 630),
|
||||
Dot(304, 712),
|
||||
Dot(373, 221),
|
||||
Dot(534, 865),
|
||||
Dot(743, 402),
|
||||
Dot(857, 620),
|
||||
Dot(671, 857),
|
||||
Dot(70, 361),
|
||||
Dot(692, 252),
|
||||
Dot(338, 658),
|
||||
Dot(1121, 144),
|
||||
Dot(1258, 266),
|
||||
Dot(1058, 843),
|
||||
Dot(773, 211),
|
||||
Dot(1129, 516),
|
||||
Dot(1088, 22),
|
||||
Dot(15, 86),
|
||||
Dot(343, 676),
|
||||
Dot(70, 1),
|
||||
Dot(55, 794),
|
||||
Dot(691, 91),
|
||||
Dot(982, 893),
|
||||
Dot(1300, 628),
|
||||
Dot(656, 162),
|
||||
Dot(262, 362),
|
||||
Dot(850, 854),
|
||||
Dot(617, 284),
|
||||
Dot(977, 280),
|
||||
Dot(373, 640),
|
||||
Dot(654, 221),
|
||||
Dot(484, 882),
|
||||
Dot(251, 235),
|
||||
Dot(103, 639),
|
||||
Dot(1293, 292),
|
||||
Dot(1150, 525),
|
||||
Dot(758, 432),
|
||||
Dot(480, 124),
|
||||
Dot(1235, 504),
|
||||
Dot(1293, 549),
|
||||
Dot(60, 275),
|
||||
Dot(1036, 317),
|
||||
Dot(512, 231),
|
||||
Dot(599, 794),
|
||||
Dot(783, 148),
|
||||
Dot(350, 518),
|
||||
Dot(45, 252),
|
||||
Dot(1265, 140),
|
||||
Dot(979, 448),
|
||||
Dot(706, 878),
|
||||
Dot(1203, 686),
|
||||
Dot(288, 837),
|
||||
Dot(180, 138),
|
||||
Dot(572, 431),
|
||||
Dot(199, 148),
|
||||
Dot(530, 408),
|
||||
Dot(711, 794),
|
||||
Dot(1302, 682),
|
||||
Dot(497, 295),
|
||||
Dot(36, 549),
|
||||
Dot(201, 415),
|
||||
Dot(1009, 432),
|
||||
Dot(94, 663),
|
||||
Dot(1150, 77),
|
||||
Dot(1096, 638),
|
||||
Dot(803, 87),
|
||||
Dot(211, 775),
|
||||
Dot(320, 12),
|
||||
Dot(166, 609),
|
||||
Dot(629, 558),
|
||||
Dot(572, 366),
|
||||
Dot(1226, 766),
|
||||
Dot(295, 789),
|
||||
Dot(195, 105),
|
||||
Dot(99, 712),
|
||||
Dot(507, 87),
|
||||
Dot(242, 383),
|
||||
Dot(55, 354),
|
||||
Dot(681, 558),
|
||||
Dot(1135, 313),
|
||||
Dot(192, 226),
|
||||
Dot(895, 871),
|
||||
Dot(508, 609),
|
||||
Dot(1146, 394),
|
||||
Dot(281, 588),
|
||||
Dot(714, 312),
|
||||
Dot(567, 234),
|
||||
Dot(283, 834),
|
||||
Dot(455, 893),
|
||||
Dot(45, 140),
|
||||
Dot(691, 673),
|
||||
Dot(763, 123),
|
||||
Dot(75, 715),
|
||||
Dot(820, 506),
|
||||
Dot(1285, 40),
|
||||
Dot(242, 712),
|
||||
Dot(475, 1),
|
||||
Dot(453, 722),
|
||||
Dot(965, 793),
|
||||
Dot(475, 212),
|
||||
Dot(201, 610),
|
||||
Dot(333, 280),
|
||||
Dot(934, 103),
|
||||
Dot(570, 488),
|
||||
Dot(1126, 10),
|
||||
Dot(380, 404),
|
||||
Dot(256, 332),
|
||||
Dot(818, 311),
|
||||
Dot(1179, 257),
|
||||
Dot(725, 19),
|
||||
Dot(131, 49),
|
||||
Dot(947, 283),
|
||||
Dot(84, 128),
|
||||
Dot(402, 798),
|
||||
Dot(544, 68),
|
||||
Dot(835, 1),
|
||||
Dot(637, 345),
|
||||
Dot(846, 77),
|
||||
Dot(117, 445),
|
||||
Dot(599, 107),
|
||||
Dot(755, 371),
|
||||
Dot(596, 582),
|
||||
Dot(216, 93),
|
||||
Dot(32, 775),
|
||||
Dot(999, 409),
|
||||
Dot(50, 693),
|
||||
Dot(184, 231),
|
||||
Dot(343, 436),
|
||||
Dot(768, 17),
|
||||
Dot(507, 409),
|
||||
Dot(880, 379),
|
||||
Dot(1000, 700),
|
||||
Dot(1266, 824),
|
||||
Dot(529, 675),
|
||||
Dot(119, 278),
|
||||
Dot(284, 477),
|
||||
Dot(1305, 280),
|
||||
Dot(226, 582),
|
||||
Dot(353, 854),
|
||||
Dot(1238, 360),
|
||||
Dot(1048, 476),
|
||||
Dot(1079, 887),
|
||||
Dot(960, 518),
|
||||
Dot(619, 445),
|
||||
Dot(530, 75),
|
||||
Dot(863, 390),
|
||||
Dot(972, 770),
|
||||
Dot(759, 191),
|
||||
Dot(1235, 390),
|
||||
Dot(813, 218),
|
||||
Dot(775, 728),
|
||||
Dot(199, 1),
|
||||
Dot(1283, 649),
|
||||
Dot(800, 221),
|
||||
Dot(1183, 416),
|
||||
Dot(10, 87),
|
||||
Dot(199, 809),
|
||||
Dot(1272, 505),
|
||||
Dot(1099, 775),
|
||||
Dot(730, 574),
|
||||
Dot(803, 436),
|
||||
Dot(10, 135),
|
||||
Dot(1118, 330),
|
||||
Dot(1186, 150),
|
||||
Dot(1200, 600),
|
||||
Dot(179, 95),
|
||||
Dot(1228, 648),
|
||||
Dot(1218, 673),
|
||||
Dot(731, 403),
|
||||
Dot(780, 744),
|
||||
Dot(763, 238),
|
||||
Dot(1258, 765),
|
||||
Dot(209, 140),
|
||||
Dot(572, 618),
|
||||
Dot(631, 211),
|
||||
Dot(1081, 115),
|
||||
Dot(584, 592),
|
||||
Dot(432, 868),
|
||||
Dot(787, 413),
|
||||
Dot(700, 518),
|
||||
Dot(555, 12),
|
||||
Dot(1265, 670),
|
||||
Dot(350, 312),
|
||||
Dot(599, 659),
|
||||
Dot(90, 823),
|
||||
Dot(678, 312),
|
||||
Dot(99, 523),
|
||||
Dot(455, 1),
|
||||
Dot(851, 49),
|
||||
Dot(743, 660),
|
||||
Dot(714, 694),
|
||||
Dot(102, 14),
|
||||
Dot(1183, 484),
|
||||
Dot(870, 548),
|
||||
Dot(242, 800),
|
||||
Dot(759, 255),
|
||||
Dot(200, 712),
|
||||
Dot(110, 404),
|
||||
Dot(1190, 865),
|
||||
Dot(441, 553),
|
||||
Dot(427, 289),
|
||||
Dot(577, 819),
|
||||
Dot(1198, 521),
|
||||
Dot(1022, 57),
|
||||
Dot(946, 252),
|
||||
Dot(852, 117),
|
||||
Dot(535, 166),
|
||||
Dot(1146, 871),
|
||||
Dot(937, 130),
|
||||
Dot(1009, 294),
|
||||
Dot(855, 746),
|
||||
Dot(301, 619),
|
||||
Dot(908, 798),
|
||||
Dot(1255, 100),
|
||||
Dot(1047, 236),
|
||||
Dot(1004, 127),
|
||||
Dot(683, 649),
|
||||
Dot(596, 312),
|
||||
Dot(189, 592),
|
||||
Dot(584, 85),
|
||||
Dot(107, 603),
|
||||
Dot(734, 705),
|
||||
Dot(1255, 794),
|
||||
Dot(671, 37),
|
||||
Dot(316, 816),
|
||||
Dot(1183, 148),
|
||||
Dot(599, 802),
|
||||
Dot(999, 555),
|
||||
Dot(131, 845),
|
||||
Dot(842, 630),
|
||||
Dot(1094, 435),
|
||||
Dot(684, 493),
|
||||
Dot(1038, 257),
|
||||
Dot(17, 292),
|
||||
Dot(1208, 14),
|
||||
Dot(58, 582),
|
||||
Dot(503, 691),
|
||||
Dot(338, 684),
|
||||
Dot(1225, 75),
|
||||
Dot(818, 759),
|
||||
Dot(227, 289),
|
||||
Dot(649, 815),
|
||||
Dot(835, 95),
|
||||
Dot(447, 838),
|
||||
Dot(468, 630),
|
||||
Dot(196, 119),
|
||||
Dot(1228, 366),
|
||||
Dot(155, 70),
|
||||
Dot(927, 18),
|
||||
Dot(145, 129),
|
||||
Dot(488, 285),
|
||||
Dot(1255, 660),
|
||||
Dot(338, 236),
|
||||
Dot(684, 401),
|
||||
Dot(1123, 501),
|
||||
Dot(244, 210),
|
||||
Dot(44, 70),
|
||||
Dot(972, 322),
|
||||
Dot(964, 333),
|
||||
Dot(190, 301),
|
||||
Dot(1260, 878),
|
||||
Dot(555, 289),
|
||||
Dot(738, 17),
|
||||
Dot(574, 687),
|
||||
Dot(821, 322),
|
||||
Dot(294, 119),
|
||||
Dot(1124, 261),
|
||||
Dot(8, 864),
|
||||
Dot(97, 633),
|
||||
Dot(741, 560),
|
||||
Dot(401, 107),
|
||||
Dot(560, 313),
|
||||
Dot(1252, 200),
|
||||
Dot(1273, 508),
|
||||
Dot(803, 485),
|
||||
Dot(25, 294),
|
||||
Dot(1193, 449),
|
||||
Dot(266, 520),
|
||||
Dot(927, 100),
|
||||
Dot(848, 668),
|
||||
Dot(1300, 135),
|
||||
Dot(430, 379),
|
||||
Dot(398, 809),
|
||||
Dot(1285, 376),
|
||||
Dot(70, 533),
|
||||
Dot(800, 673),
|
||||
Dot(869, 553),
|
||||
Dot(552, 432),
|
||||
Dot(736, 207),
|
||||
Dot(227, 658),
|
||||
Dot(202, 523),
|
||||
Dot(1096, 414),
|
||||
Dot(1300, 807),
|
||||
Dot(611, 386),
|
||||
Dot(1124, 40),
|
||||
Dot(194, 768),
|
||||
Dot(786, 789),
|
||||
Dot(428, 134),
|
||||
Dot(125, 610),
|
||||
Dot(301, 723),
|
||||
Dot(637, 154),
|
||||
Dot(1114, 119),
|
||||
Dot(1166, 597),
|
||||
Dot(1253, 276),
|
||||
Dot(373, 757),
|
||||
Dot(842, 854),
|
||||
Dot(447, 56),
|
||||
Dot(338, 592),
|
||||
Dot(1186, 819),
|
||||
Dot(412, 766),
|
||||
Dot(1042, 700),
|
||||
Dot(529, 50),
|
||||
Dot(932, 130),
|
||||
Dot(914, 469),
|
||||
Dot(766, 765),
|
||||
Dot(1274, 549),
|
||||
Dot(253, 555),
|
||||
Dot(55, 787),
|
||||
Dot(142, 630),
|
||||
Dot(567, 423),
|
||||
Dot(1054, 292),
|
||||
Dot(584, 816),
|
||||
Dot(870, 775),
|
||||
Dot(530, 744),
|
||||
Dot(560, 761),
|
||||
Dot(376, 791),
|
||||
Dot(127, 746),
|
||||
Dot(142, 679),
|
||||
Dot(383, 354),
|
||||
Dot(1213, 185),
|
||||
Dot(147, 458),
|
||||
Dot(619, 449),
|
||||
Dot(17, 549),
|
||||
Dot(1292, 113),
|
||||
Dot(830, 115),
|
||||
Dot(1290, 711),
|
||||
Dot(579, 627),
|
||||
Dot(594, 744),
|
||||
Dot(459, 49),
|
||||
Dot(17, 101),
|
||||
Dot(960, 312),
|
||||
Dot(1114, 103),
|
||||
Dot(962, 331),
|
||||
Dot(510, 221),
|
||||
Dot(960, 648),
|
||||
Dot(808, 40),
|
||||
Dot(1158, 854),
|
||||
Dot(453, 31),
|
||||
Dot(445, 757),
|
||||
Dot(972, 722),
|
||||
Dot(82, 648),
|
||||
Dot(84, 766),
|
||||
Dot(252, 350),
|
||||
Dot(656, 673),
|
||||
Dot(994, 572),
|
||||
Dot(242, 576),
|
||||
Dot(438, 93),
|
||||
Dot(972, 684),
|
||||
Dot(930, 765),
|
||||
Dot(810, 366),
|
||||
Dot(1245, 219),
|
||||
Dot(796, 630),
|
||||
Dot(912, 85),
|
||||
Dot(851, 553),
|
||||
Dot(590, 362),
|
||||
Dot(522, 768),
|
||||
Dot(1223, 471),
|
||||
Dot(912, 187),
|
||||
Dot(1000, 194),
|
||||
Dot(455, 61),
|
||||
Dot(1140, 882),
|
||||
Dot(142, 862),
|
||||
Dot(440, 548),
|
||||
Dot(310, 194),
|
||||
Dot(579, 267),
|
||||
Dot(335, 527),
|
||||
Dot(52, 129),
|
||||
Dot(338, 572),
|
||||
Dot(52, 317),
|
||||
Dot(249, 334),
|
||||
Dot(428, 456),
|
||||
Dot(1240, 592),
|
||||
Dot(649, 127),
|
||||
Dot(1235, 715),
|
||||
Dot(720, 532),
|
||||
Dot(976, 236),
|
||||
Dot(855, 820),
|
||||
Dot(58, 694),
|
||||
Dot(1019, 803),
|
||||
Dot(1016, 119),
|
||||
Dot(338, 302),
|
||||
Dot(360, 441),
|
||||
Dot(631, 277),
|
||||
Dot(360, 119),
|
||||
Dot(388, 374),
|
||||
Dot(1054, 332),
|
||||
Dot(398, 292),
|
||||
Dot(1240, 361),
|
||||
Dot(781, 675),
|
||||
Dot(199, 746),
|
||||
Dot(338, 266),
|
||||
Dot(1068, 94),
|
||||
Dot(1144, 733),
|
||||
Dot(1191, 838),
|
||||
Dot(1293, 101),
|
||||
Dot(190, 593),
|
||||
Dot(572, 17),
|
||||
Dot(187, 393),
|
||||
Dot(35, 673),
|
||||
Dot(604, 878),
|
||||
Dot(960, 376),
|
||||
Dot(1285, 742),
|
||||
Dot(1153, 767),
|
||||
Dot(907, 229),
|
||||
Dot(1236, 171),
|
||||
Dot(74, 798),
|
||||
Dot(529, 844),
|
||||
Dot(304, 742),
|
||||
Dot(1111, 509),
|
||||
Dot(1186, 75),
|
||||
Dot(330, 789),
|
||||
Dot(902, 836),
|
||||
Dot(507, 807),
|
||||
Dot(594, 150),
|
||||
Dot(1150, 824),
|
||||
Dot(350, 648),
|
||||
Dot(460, 374),
|
||||
Dot(637, 602),
|
||||
Dot(443, 775),
|
||||
Dot(1029, 585),
|
||||
Dot(1006, 152),
|
||||
Dot(855, 74),
|
||||
Dot(989, 367),
|
||||
Dot(945, 308),
|
||||
Dot(654, 673),
|
||||
Dot(599, 115),
|
||||
Dot(1148, 388),
|
||||
Dot(1185, 442),
|
||||
Dot(972, 266),
|
||||
Dot(1247, 485),
|
||||
Dot(57, 618),
|
||||
Dot(1068, 383),
|
||||
Dot(160, 525),
|
||||
Dot(1006, 182),
|
||||
Dot(82, 528),
|
||||
Dot(542, 877),
|
||||
Dot(189, 144),
|
||||
Dot(515, 607),
|
||||
Dot(950, 329),
|
||||
Dot(335, 367),
|
||||
Dot(927, 502),
|
||||
Dot(808, 722),
|
||||
Dot(790, 513),
|
||||
Dot(147, 893),
|
||||
Dot(1211, 630),
|
||||
Dot(117, 683),
|
||||
Dot(1247, 261),
|
||||
Dot(380, 577),
|
||||
Dot(338, 628),
|
||||
Dot(1240, 85),
|
||||
Dot(966, 194),
|
||||
Dot(85, 819),
|
||||
Dot(229, 331),
|
||||
Dot(1115, 789),
|
||||
Dot(100, 57),
|
||||
Dot(534, 641),
|
||||
Dot(857, 722),
|
||||
Dot(867, 551),
|
||||
Dot(15, 779),
|
||||
Dot(1226, 847),
|
||||
Dot(1101, 11),
|
||||
Dot(701, 590),
|
||||
Dot(1111, 522),
|
||||
Dot(410, 246),
|
||||
Dot(679, 375),
|
||||
Dot(1275, 673),
|
||||
Dot(161, 453),
|
||||
Dot(1208, 822),
|
||||
Dot(1163, 458),
|
||||
Dot(244, 684),
|
||||
Dot(169, 767),
|
||||
Dot(490, 506),
|
||||
Dot(25, 40),
|
||||
Dot(1111, 677),
|
||||
Dot(20, 403),
|
||||
Dot(271, 115),
|
||||
Dot(1094, 660),
|
||||
Dot(527, 333),
|
||||
Dot(92, 673),
|
||||
Dot(838, 745),
|
||||
Dot(1039, 100),
|
||||
Dot(950, 791),
|
||||
Dot(1279, 161),
|
||||
Dot(401, 787),
|
||||
Dot(291, 49),
|
||||
Dot(883, 68),
|
||||
Dot(644, 583),
|
||||
Dot(1138, 528),
|
||||
Dot(858, 696),
|
||||
Dot(323, 448),
|
||||
Dot(840, 231),
|
||||
Dot(1150, 593),
|
||||
Dot(165, 472),
|
||||
Dot(885, 709),
|
||||
Dot(1171, 123),
|
||||
Dot(1275, 91),
|
||||
Dot(410, 210),
|
||||
Dot(664, 10),
|
||||
Dot(200, 182),
|
||||
Dot(363, 283),
|
||||
Dot(529, 610),
|
||||
Dot(1216, 399),
|
||||
Dot(992, 478),
|
||||
Dot(1266, 70),
|
||||
Dot(194, 40),
|
||||
Dot(681, 376),
|
||||
Dot(753, 277),
|
||||
Dot(857, 303),
|
||||
Dot(1006, 742),
|
||||
Dot(609, 670),
|
||||
Dot(842, 712),
|
||||
Dot(1131, 767),
|
||||
Dot(579, 665),
|
||||
Dot(1109, 610),
|
||||
Dot(80, 239),
|
||||
Dot(1240, 816),
|
||||
Dot(69, 427),
|
||||
Dot(557, 386),
|
||||
Dot(781, 284),
|
||||
Dot(494, 824),
|
||||
Dot(160, 77),
|
||||
Dot(36, 252),
|
||||
Dot(838, 149),
|
||||
Dot(325, 469),
|
||||
Dot(611, 610),
|
||||
Dot(599, 0),
|
||||
Dot(612, 635),
|
||||
Dot(979, 446),
|
||||
Dot(887, 887),
|
||||
Dot(974, 478),
|
||||
Dot(609, 130),
|
||||
Dot(551, 479),
|
||||
Dot(345, 101),
|
||||
Dot(343, 781),
|
||||
Dot(880, 462),
|
||||
Dot(726, 533),
|
||||
Dot(164, 871),
|
||||
Dot(1300, 124),
|
||||
Dot(780, 408),
|
||||
Dot(627, 649),
|
||||
Dot(1246, 362),
|
||||
Dot(1200, 404),
|
||||
Dot(398, 1),
|
||||
Dot(172, 528),
|
||||
Dot(994, 322),
|
||||
Dot(572, 528),
|
||||
Dot(360, 775),
|
||||
Dot(380, 490),
|
||||
Dot(783, 522),
|
||||
Dot(27, 649),
|
||||
Dot(1278, 329),
|
||||
Dot(1255, 110),
|
||||
Dot(27, 245),
|
||||
Dot(679, 617),
|
||||
Dot(64, 362),
|
||||
Dot(58, 418),
|
||||
Dot(1230, 574),
|
||||
Dot(281, 254),
|
||||
Dot(408, 126),
|
||||
Dot(701, 140),
|
||||
Dot(659, 448),
|
||||
Dot(971, 721),
|
||||
Dot(766, 129),
|
||||
Dot(671, 115),
|
||||
Dot(1252, 582),
|
||||
Dot(271, 840),
|
||||
Dot(957, 40),
|
||||
Dot(570, 406),
|
||||
Dot(110, 490),
|
||||
Dot(634, 543),
|
||||
Dot(304, 152),
|
||||
Dot(699, 610),
|
||||
Dot(1131, 212),
|
||||
Dot(1226, 511),
|
||||
Dot(296, 598),
|
||||
Dot(773, 30),
|
||||
Dot(1223, 660),
|
||||
Dot(693, 586),
|
||||
Dot(84, 847),
|
||||
Dot(1208, 72),
|
||||
Dot(338, 722),
|
||||
Dot(164, 785),
|
||||
Dot(924, 418),
|
||||
Dot(1240, 740),
|
||||
Dot(75, 504),
|
||||
Dot(330, 105),
|
||||
Dot(455, 746),
|
||||
Dot(842, 264),
|
||||
Dot(818, 358),
|
||||
]
|
||||
|
||||
enum Fold {
|
||||
case x(Int)
|
||||
case y(Int)
|
||||
}
|
||||
|
||||
let folds: [Fold] = [
|
||||
.x(655),
|
||||
.y(447),
|
||||
.x(327),
|
||||
.y(223),
|
||||
.x(163),
|
||||
.y(111),
|
||||
.x(81),
|
||||
.y(55),
|
||||
.x(40),
|
||||
.y(27),
|
||||
.y(13),
|
||||
.y(6),
|
||||
]
|
||||
}
|
151
2021/day14.swift
Normal file
151
2021/day14.swift
Normal file
|
@ -0,0 +1,151 @@
|
|||
@main
|
||||
struct Day14: Puzzle {
|
||||
mutating func run() {
|
||||
let part1 = calculate(start, depth: 10)
|
||||
print("Part 1:", part1.values.max()! - part1.values.min()!)
|
||||
|
||||
let part2 = calculate(start, depth: 40)
|
||||
print("Part 2:", part2.values.max()! - part2.values.min()!)
|
||||
}
|
||||
|
||||
mutating func calculate(_ string: String, depth: Int) -> [Character: Int] {
|
||||
var result: [Character: Int] = [:]
|
||||
for (a, b) in zip(string, string.dropFirst()) {
|
||||
result.merge(calculate(a, b, depth: depth), uniquingKeysWith: +)
|
||||
}
|
||||
result[string.last!, default: 0] += 1
|
||||
return result
|
||||
}
|
||||
|
||||
struct CacheKey: Hashable {
|
||||
var string: String
|
||||
var depth: Int
|
||||
}
|
||||
var cache: [CacheKey: [Character: Int]] = [:]
|
||||
|
||||
mutating func calculate(_ first: Character, _ second: Character, depth: Int) -> [Character: Int] {
|
||||
guard depth > 0 else {
|
||||
return [first: 1]
|
||||
}
|
||||
|
||||
let pair = "\(first)\(second)"
|
||||
let cacheKey = CacheKey(string: pair, depth: depth)
|
||||
|
||||
if let result = cache[cacheKey] {
|
||||
return result
|
||||
}
|
||||
|
||||
let mid = mapping[pair]!
|
||||
|
||||
var result = calculate(first, mid, depth: depth - 1)
|
||||
result.merge(calculate(mid, second, depth: depth - 1), uniquingKeysWith: +)
|
||||
|
||||
cache[cacheKey] = result
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
let start = "KBKPHKHHNBCVCHPSPNHF"
|
||||
let mapping: [String: Character] = [
|
||||
"OP": "H",
|
||||
"CF": "C",
|
||||
"BB": "V",
|
||||
"KH": "O",
|
||||
"CV": "S",
|
||||
"FV": "O",
|
||||
"FS": "K",
|
||||
"KO": "C",
|
||||
"PP": "S",
|
||||
"SH": "K",
|
||||
"FH": "O",
|
||||
"NF": "H",
|
||||
"PN": "P",
|
||||
"BO": "H",
|
||||
"OK": "K",
|
||||
"PO": "P",
|
||||
"SF": "K",
|
||||
"BF": "P",
|
||||
"HH": "S",
|
||||
"KP": "H",
|
||||
"HB": "N",
|
||||
"NP": "V",
|
||||
"KK": "P",
|
||||
"PF": "P",
|
||||
"BK": "V",
|
||||
"OF": "H",
|
||||
"FO": "S",
|
||||
"VC": "P",
|
||||
"FK": "B",
|
||||
"NK": "S",
|
||||
"CB": "B",
|
||||
"PV": "C",
|
||||
"CO": "N",
|
||||
"BN": "C",
|
||||
"HV": "H",
|
||||
"OC": "N",
|
||||
"NB": "O",
|
||||
"CS": "S",
|
||||
"HK": "C",
|
||||
"VS": "F",
|
||||
"BH": "C",
|
||||
"PC": "S",
|
||||
"KC": "O",
|
||||
"VO": "P",
|
||||
"FB": "K",
|
||||
"BV": "V",
|
||||
"VN": "N",
|
||||
"ON": "F",
|
||||
"VH": "H",
|
||||
"CN": "O",
|
||||
"HO": "O",
|
||||
"SV": "O",
|
||||
"SS": "H",
|
||||
"KF": "N",
|
||||
"SP": "C",
|
||||
"NS": "V",
|
||||
"SO": "F",
|
||||
"BC": "P",
|
||||
"HC": "C",
|
||||
"FP": "H",
|
||||
"OH": "S",
|
||||
"OB": "S",
|
||||
"HF": "V",
|
||||
"SC": "B",
|
||||
"SN": "N",
|
||||
"VK": "C",
|
||||
"NC": "V",
|
||||
"VV": "S",
|
||||
"SK": "K",
|
||||
"PK": "K",
|
||||
"PS": "N",
|
||||
"KB": "S",
|
||||
"KS": "C",
|
||||
"NN": "C",
|
||||
"OO": "C",
|
||||
"BS": "B",
|
||||
"NV": "H",
|
||||
"FF": "P",
|
||||
"FC": "N",
|
||||
"OS": "H",
|
||||
"KN": "N",
|
||||
"VP": "B",
|
||||
"PH": "N",
|
||||
"NH": "S",
|
||||
"OV": "O",
|
||||
"FN": "V",
|
||||
"CP": "B",
|
||||
"NO": "V",
|
||||
"CK": "C",
|
||||
"VF": "B",
|
||||
"HS": "B",
|
||||
"KV": "K",
|
||||
"VB": "H",
|
||||
"SB": "S",
|
||||
"BP": "S",
|
||||
"CC": "F",
|
||||
"HP": "B",
|
||||
"PB": "P",
|
||||
"HN": "P",
|
||||
"CH": "O",
|
||||
]
|
||||
}
|
171
2021/day15.swift
Normal file
171
2021/day15.swift
Normal file
|
@ -0,0 +1,171 @@
|
|||
@main
|
||||
struct Day15: Puzzle {
|
||||
mutating func run() {
|
||||
let part1 = find(target: Point(x: width - 1, y: height - 1))
|
||||
print("Part 1:", part1)
|
||||
|
||||
let part2 = find(target: Point(x: 5 * width - 1, y: 5 * height - 1))
|
||||
print("Part 2:", part2)
|
||||
}
|
||||
|
||||
struct Point: Hashable {
|
||||
var x: Int
|
||||
var y: Int
|
||||
|
||||
var neighbors: [Point] {
|
||||
[
|
||||
Point(x: x - 1, y: y),
|
||||
Point(x: x + 1, y: y),
|
||||
Point(x: x, y: y - 1),
|
||||
Point(x: x, y: y + 1)
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
func find(target: Point) -> Int {
|
||||
var current = Point(x: 0, y: 0)
|
||||
var totalCost = 0
|
||||
|
||||
var possible: [Point: Int] = [:]
|
||||
var visited: Set<Point> = []
|
||||
|
||||
func isInside(_ point: Point) -> Bool {
|
||||
0...target.x ~= point.x && 0...target.y ~= point.y
|
||||
}
|
||||
|
||||
while current != target {
|
||||
visited.insert(current)
|
||||
|
||||
for n in current.neighbors where isInside(n) && !visited.contains(n) {
|
||||
possible[n] = min(possible[n, default: .max], totalCost + self[n])
|
||||
}
|
||||
|
||||
(current, totalCost) = possible.min { $0.value < $1.value }!
|
||||
|
||||
possible.removeValue(forKey: current)
|
||||
}
|
||||
|
||||
return totalCost
|
||||
}
|
||||
|
||||
subscript(point: Point) -> Int {
|
||||
self[point.x , point.y]
|
||||
}
|
||||
|
||||
subscript(x: Int, y: Int) -> Int {
|
||||
let repX = x / width
|
||||
let xPos = x % width
|
||||
|
||||
let repY = y / height
|
||||
let yPos = y % height
|
||||
|
||||
return (input[xPos + width * yPos] + repX + repY - 1) % 9 + 1
|
||||
}
|
||||
|
||||
let width = 100
|
||||
let height = 100
|
||||
|
||||
let input: [Int] = """
|
||||
8576219475874583191916312133474175459337114195988185136398151631965391991813219974121211251194786128
|
||||
1713881999231519357799114192443351147195293575386923868711388519361669464234397975938889146414199688
|
||||
2151922113728581598379349983928489926261239862882888968998791929828316718921297117449631496888879522
|
||||
3291722311299652548445221254456535112944431135116631433192483199481594768169444158222431199929579291
|
||||
1472287315918113113959972189351931626141472991992791413146153989481318998519171231313898962992319251
|
||||
8978798318873934543151823824117132228417869392811216547172919119998739911121199246294815175868992773
|
||||
4711149989992717728465321161611967173674239298593935117599173279267114155265393397571372124856718732
|
||||
9843245319692998612781837729915931371619886371128818266322121623171343132131239399743799827972585645
|
||||
7183211712173272827112268971459424836293613294388761928991542137194981939169315879277494581991465822
|
||||
2385721996578834579224651431411717198341139751429156637229888849181154922897746418293184413519931124
|
||||
6188313732929496115412842928273812153715747411177189187726751991191841181119822534511125656211991265
|
||||
8797112815141319881991983914861912838966446818811271274141461487947171138945321912192198815813211761
|
||||
6131514331472951494911549373681638637191295997625615885219668259269297171939941498581919718223529141
|
||||
3916711951831246219991217199412116783411218814949692281987659123812288937983969116847986196936523779
|
||||
9111121227192813382983442234171148191131821497435387936912532695293912972491131977272231919798477344
|
||||
9994893855122115213919995636978443773161196511775674783979472217917498285423121574533491643891265199
|
||||
9245818921321877317663254739619499915821162412924816263648913499811482474392667993739139899758919393
|
||||
1717618849193152316325119128859116191132672215933282127611134982961918179152189411131259943819997123
|
||||
3697848795188715264992962617223177221118919863975198881197837936258983111819488622362584888223331999
|
||||
1798259211962116675922944295117391732295963342131192112612386194749389991199821195162975124619149837
|
||||
5365696872959269494682128272373619348283964191994187749824841195582221478325111187843285531119934786
|
||||
6717218734155417511564162235845524121493736962442884479191718924594119911521121422231982184671122116
|
||||
9346412964321187889663345611132183519588187791111227269112129947122999176114184938494824342939375892
|
||||
2912811929919891428891223818529115949522464779949526791515797886471246181118183121786524127979998512
|
||||
7353285281129811915971956929718433284441492484117162562212973157265812816731843791838571691421923924
|
||||
3239161911151141369392413114665193927469988999219478935992541193184945926828911597158489999651151172
|
||||
9229716159183212219791136121569512978927999177196111291668152292896495877722611129462617229299962112
|
||||
5994461796358342348216915883991574569784887978731368749888449599246152414391635925763156831839199496
|
||||
1569319989929452917219726368583887924179117119284971126181346919789949393972171262535283921926293357
|
||||
9983673949614595396426594299567925779229751982433631919159114841538978735893759492592481573495963491
|
||||
3725632421623191323789991288299296415942162988289929992238877153268488127718372211951117951486111926
|
||||
1219319492614741819142363452974731825929485665978219725131218962626179997611254524524915768686381164
|
||||
8248145978417221154822663831966124539168641311913211295941167919583189792718599334616827916567313217
|
||||
3483959252172951953519211189255336234459522397526829492685113849198611624111948187714151963198671919
|
||||
7812289559812455122297839958719917624841136314322613942214613249662544617928521344873779598816941946
|
||||
6868958791119815122313931178313637489923479492171741443993619161318781194421239654468391996636923611
|
||||
6999166111129212624151555925991311538952878946191234511973499736237742491811348911419449161895978178
|
||||
3532973784281182181552481928144111246711742443831184236962981395142863562121961323169398316921741321
|
||||
8433727191521455193223914171391447439164791659118411391327413285243717794299999523811137619197999791
|
||||
8169125649963232439519311131691539694589231314268683691811431259295132344195953951287639889737849189
|
||||
8928161919934761971442719391119881113318323987227229831917897151155121657624142152884624176461913498
|
||||
2949199492196424164751892146395174669111921799261527568751283712133148212821261936297739912939743599
|
||||
9931616797885267969938591912672996183187926259991298429278229232257219428413174972999193796827459799
|
||||
3138768154311742899419449741617489465993174645228814938145273266941566223933119891379181296548999222
|
||||
1338961668848636157444719898575174699419997972125194827176897565699991611654214368232592793825617931
|
||||
9283643143692917314535119897889711191946688911436965194232811624712861576291987716317193114445363435
|
||||
8718611398299869991788113111214414269554542114329621286592313532782819131919527228417764279755899812
|
||||
8128249329314753847725634378737239939769913811444529224619715471961999278915341955188871714271145449
|
||||
1286217894699991715153139268991918988338684391252271254127193342854156438873836258484975151167996316
|
||||
4191439845728418348368191516746499654147257851256861534634988281199187541199892317145428248531129171
|
||||
9799283477747387253566811199414256363339122372629545249542373591951156699415998714124115397811359516
|
||||
3191985767689943186838293175311429527499612824265518522881922917119891424717751985621941995373481629
|
||||
8127933395192162886259956635985821651844893796541627799276258692298972881471991789861232424926758792
|
||||
4349683335349673317521761437148933192989961489478395417258212949865876242843242464123471244631449998
|
||||
3983861771861891251448475182984833811718959521263444111998834975935221115813839514917176912994677265
|
||||
3361812177831144971531441184671112122322312961859915722393944269211333951428175372918136112814926411
|
||||
2492891241191991149319731182431211211971267682931551534199328118919751416881458658314218331565282229
|
||||
1316191719349114251772629411233483317516143684488291792691839198723174287211241498955137331159443961
|
||||
1295632882814319179937625629218199381191127966181781921829819969815912382191294796979515315471941392
|
||||
1952318366571121641614137937116326339638859628226299126699118638171813164397332391891669798271559135
|
||||
1123676641998146639499323488991286491444174358479157916696196841912233773269986812299996975117612192
|
||||
2496461124219121332118311532239527696198787778122345883331631119147159212262659717289674149798169111
|
||||
3994915157217763242581922474512992479146377117411981999549977495462427199524334285127723311599337186
|
||||
2856249932899117429471617195415229923432185189218399415357391954728651191591964713418532917111296399
|
||||
1916415314958527255299763241981929186681257596912948977397875248189748655173819381269954513499896991
|
||||
4214987991254389723346911149661118597277889213928551947599177915888233175182921923128853579525754718
|
||||
3582279578128192231339943295188563998645998149526284997789731787116991199391984141983177825883111821
|
||||
3318115949152512995142691231324793411691198458654473675135993122216324137859959272731599996923465431
|
||||
9431374329994955614816239978928993493129129641248882311462522524447519388869238199852941551532223632
|
||||
6749132793518479891929891686579791123712167784913331559922969149125915827657111724348929978159964476
|
||||
6899888192198113996189996152913216258469182711411338723293823541574149295918323829819122941288693461
|
||||
9833728958423343229397292861582211971713299293611778961979819175799893793971822162383179128129741328
|
||||
9719459171294372288418126215914532995125999274359633129923191213332337513812761149562146497198614329
|
||||
6323381739518574154814713691189651618965915153972197836392492518147816118266818195856772641337997448
|
||||
9515391698994467556612815425651153225477392335219196697477512338938131933398177519117437353271396315
|
||||
2881769116189531115832167881372917543267529333184621316918481786111252281738298936313393416198972192
|
||||
1262821848371618529985323295192217356152412696271318793198457225899782896767339942896611231999996177
|
||||
7611115824284211421951282951346181221891123993118231772195952872865982323819415318945742389969468591
|
||||
6289176957971112617212793915412958239574931721216722823933461763146195116737161463663388274118352919
|
||||
2739192179312181318764617662499189345995579913463399176128133623751919135855775349195561978131664671
|
||||
7419179135228196296753972713643556671138381494838116814212892453118963456121883515171981991493112197
|
||||
2351962484381996196119791327953881225881124837211622273581789216339733276411173141146816794919111532
|
||||
4828494193941149581788515219884312818182198261739598611663311138255885557141492174934279519487959315
|
||||
6266441934234532987821537914696156313934795144412166199339199381197916324959558778257894958593689511
|
||||
1218836684761811498991162549547375891999161535133511817388897491266957819219117988952234747197245136
|
||||
7714718988198712181711441996373181351671962319416917816121119483959397254815953421521642116185224622
|
||||
6315878819598412161782318179586237893968466116199183185764132999388411414821117761121199725212571499
|
||||
9298381112525419214597534611761811137687414291394795245955115116482261788724982532573616634235949295
|
||||
2513837618149681781571514782119218925111312739891194994857915371836413112952729282168681511999132471
|
||||
9859244419394114469927618849921646911349163815889492121537711577378978633345419421881312649299234749
|
||||
6241913851991287776811271361777919519213726771122769111499925516752149976397933753482495291399144132
|
||||
7549785323789821947513966787125532113931855716249321712383292746672763573114656989299712174939322181
|
||||
9188852123922512181114117536955617335173328988385462159798591117758397298294919117614163738414981949
|
||||
2974419341361292817129453536824618155299993142149899966226312193848695911943416589913541194129913422
|
||||
1672761999113289962322634642122163368424955339864962951462929691975798622972131599198673671183449929
|
||||
3462285147627397867977869242451116812198183328383813959284449969199819896174618466572298882951459875
|
||||
6153638634925613615423256118159531429294172496996993184762972841759153392753653191942715379879852345
|
||||
6516291128536155113712481272992636373774429965994966353494115221979925592128929821611928492143929534
|
||||
3993993153713717844719492314391992638719111242291783837279215399219822611221331985991484863975594721
|
||||
5995891457939115884519762228128552168915218299831775259316392719113962218429351553267511523198149462
|
||||
""".compactMap { $0.wholeNumberValue }
|
||||
|
||||
}
|
131
2021/day16.swift
Normal file
131
2021/day16.swift
Normal file
|
@ -0,0 +1,131 @@
|
|||
@main
|
||||
struct Day16: Puzzle {
|
||||
mutating func run() {
|
||||
var start = Cursor.start
|
||||
|
||||
let part2 = packet(at: &start)
|
||||
print("Part 1:", versionSum)
|
||||
print("Part 2:", part2)
|
||||
}
|
||||
|
||||
var versionSum = 0
|
||||
|
||||
mutating func packet(at cursor: inout Cursor) -> UInt64 {
|
||||
let version = getBits(at: &cursor, count: 3)
|
||||
let type = getBits(at: &cursor, count: 3)
|
||||
|
||||
versionSum += Int(version)
|
||||
|
||||
if type == 4 {
|
||||
return literal(at: &cursor)
|
||||
}
|
||||
|
||||
let subPackets = operatorPacket(at: &cursor)
|
||||
|
||||
switch type {
|
||||
case 0: return subPackets.reduce(0, +)
|
||||
case 1: return subPackets.reduce(1, *)
|
||||
case 2: return subPackets.min()!
|
||||
case 3: return subPackets.max()!
|
||||
case 5: return subPackets[0] > subPackets[1] ? 1 : 0
|
||||
case 6: return subPackets[0] < subPackets[1] ? 1 : 0
|
||||
case 7: return subPackets[0] == subPackets[1] ? 1 : 0
|
||||
default: fatalError("Unknown packet type \(type)")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func literal(at cursor: inout Cursor) -> UInt64 {
|
||||
var result: UInt64 = 0
|
||||
while getBit(at: &cursor) {
|
||||
result = result << 4 | getBits(at: &cursor, count: 4)
|
||||
}
|
||||
result = result << 4 | getBits(at: &cursor, count: 4)
|
||||
return result
|
||||
}
|
||||
|
||||
mutating func operatorPacket(at cursor: inout Cursor) -> [UInt64] {
|
||||
let type = getBit(at: &cursor)
|
||||
var result: [UInt64] = []
|
||||
if type {
|
||||
let count = getBits(at: &cursor, count: 11)
|
||||
for _ in 0..<count {
|
||||
result.append(packet(at: &cursor))
|
||||
}
|
||||
} else {
|
||||
let length = getBits(at: &cursor, count: 15)
|
||||
let end = cursor.adding(bits: Int(length))
|
||||
while cursor < end {
|
||||
result.append(packet(at: &cursor))
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
struct Cursor: Equatable {
|
||||
var offset: Int
|
||||
var bit: Int
|
||||
|
||||
static let start = Cursor(offset: 0, bit: 0)
|
||||
|
||||
var remainingBits: Int { 4 - bit }
|
||||
|
||||
mutating func skip(_ bits: Int) {
|
||||
bit += bits
|
||||
offset += bit / 4
|
||||
bit = bit % 4
|
||||
}
|
||||
|
||||
func adding(bits: Int) -> Cursor {
|
||||
var result = self
|
||||
result.skip(bits)
|
||||
return result
|
||||
}
|
||||
|
||||
var bitPos: Int {
|
||||
offset * 4 + bit
|
||||
}
|
||||
|
||||
static func < (lhs: Cursor, rhs: Cursor) -> Bool {
|
||||
lhs.bitPos < rhs.bitPos
|
||||
}
|
||||
}
|
||||
|
||||
func getBit(at cursor: inout Cursor) -> Bool {
|
||||
getBits(at: &cursor, count: 1) == 1
|
||||
}
|
||||
|
||||
func getBitRange(_ x: Int, start: Int, count: Int) -> UInt64 {
|
||||
let mask = UInt64((1 << count) - 1)
|
||||
let shift = 4 - count - start
|
||||
precondition(shift >= 0)
|
||||
|
||||
return UInt64(x) >> shift & mask
|
||||
}
|
||||
|
||||
func getBits(at cursor: inout Cursor, count: Int) -> UInt64 {
|
||||
var remaining = count
|
||||
var result: UInt64 = 0
|
||||
|
||||
while remaining > 0 {
|
||||
let take = min(cursor.remainingBits, remaining)
|
||||
let bits = getBitRange(input[cursor.offset], start: cursor.bit, count: take)
|
||||
|
||||
result = result << take | bits
|
||||
remaining -= take
|
||||
|
||||
cursor.bit += take
|
||||
if cursor.bit == 4 {
|
||||
cursor.bit = 0
|
||||
cursor.offset += 1
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
let input = """
|
||||
E20D79005573F71DA0054E48527EF97D3004653BB1FC006867A8B1371AC49C801039171941340066E6B99A6A58B8110088BA008CE6F7893D4E6F7893DCDCFDB9D6CBC4026FE8026200DC7D84B1C00010A89507E3CCEE37B592014D3C01491B6697A83CB4F59E5E7FFA5CC66D4BC6F05D3004E6BB742B004E7E6B3375A46CF91D8C027911797589E17920F4009BE72DA8D2E4523DCEE86A8018C4AD3C7F2D2D02C5B9FF53366E3004658DB0012A963891D168801D08480485B005C0010A883116308002171AA24C679E0394EB898023331E60AB401294D98CA6CD8C01D9B349E0A99363003E655D40289CBDBB2F55D25E53ECAF14D9ABBB4CC726F038C011B0044401987D0BE0C00021B04E2546499DE824C015B004A7755B570013F2DD8627C65C02186F2996E9CCD04E5718C5CBCC016B004A4F61B27B0D9B8633F9344D57B0C1D3805537ADFA21F231C6EC9F3D3089FF7CD25E5941200C96801F191C77091238EE13A704A7CCC802B3B00567F192296259ABD9C400282915B9F6E98879823046C0010C626C966A19351EE27DE86C8E6968F2BE3D2008EE540FC01196989CD9410055725480D60025737BA1547D700727B9A89B444971830070401F8D70BA3B8803F16A3FC2D00043621C3B8A733C8BD880212BCDEE9D34929164D5CB08032594E5E1D25C0055E5B771E966783240220CD19E802E200F4588450BC401A8FB14E0A1805B36F3243B2833247536B70BDC00A60348880C7730039400B402A91009F650028C00E2020918077610021C00C1002D80512601188803B4000C148025010036727EE5AD6B445CC011E00B825E14F4BBF5F97853D2EFD6256F8FFE9F3B001420C01A88915E259002191EE2F4392004323E44A8B4C0069CEF34D304C001AB94379D149BD904507004A6D466B618402477802E200D47383719C0010F8A507A294CC9C90024A967C9995EE2933BA840
|
||||
""".compactMap { $0.hexDigitValue }
|
||||
}
|
71
2021/day17.swift
Normal file
71
2021/day17.swift
Normal file
|
@ -0,0 +1,71 @@
|
|||
@main
|
||||
struct Day17: Puzzle {
|
||||
func run() {
|
||||
var maxHeight: Int = 0
|
||||
var count = 0
|
||||
|
||||
for speedX in 1..<300 {
|
||||
for speedY in -600..<300 {
|
||||
if case .hit(let height) = run(vx: speedX, vy: speedY) {
|
||||
maxHeight = max(height, maxHeight)
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print("Part 1:", maxHeight)
|
||||
print("Part 2:", count)
|
||||
}
|
||||
|
||||
enum Result {
|
||||
case tooFar
|
||||
case tooShort
|
||||
case hit(height: Int)
|
||||
}
|
||||
|
||||
struct Vector: Hashable {
|
||||
var x: Int
|
||||
var y: Int
|
||||
}
|
||||
|
||||
func run(vx: Int, vy: Int) -> Result {
|
||||
var state = State(vx: vx, vy: vy)
|
||||
while state.x <= xMax && state.y >= yMin {
|
||||
state.step()
|
||||
if xMin...xMax ~= state.x && yMin...yMax ~= state.y {
|
||||
return .hit(height: state.maxHeight)
|
||||
}
|
||||
}
|
||||
|
||||
if state.x > xMax {
|
||||
return .tooFar
|
||||
}
|
||||
|
||||
return .tooShort
|
||||
}
|
||||
|
||||
struct State {
|
||||
var vx: Int
|
||||
var vy: Int
|
||||
var x: Int = 0
|
||||
var y: Int = 0
|
||||
var maxHeight = 0
|
||||
|
||||
mutating func step() {
|
||||
if y > maxHeight {
|
||||
maxHeight = y
|
||||
}
|
||||
|
||||
x += vx
|
||||
y += vy
|
||||
vx -= vx.signum()
|
||||
vy -= 1
|
||||
}
|
||||
}
|
||||
|
||||
// target area: x=138..184, y=-125..-71
|
||||
let xMin = 138
|
||||
let xMax = 184
|
||||
let yMin = -125
|
||||
let yMax = -71
|
||||
}
|
318
2021/day18.swift
Normal file
318
2021/day18.swift
Normal file
|
@ -0,0 +1,318 @@
|
|||
import Foundation
|
||||
|
||||
@main
|
||||
struct Day18: Puzzle {
|
||||
func run() {
|
||||
let pairs = Scanner(string: input).all()
|
||||
let first = pairs[0]
|
||||
let result = pairs.dropFirst().reduce(first, +)
|
||||
print(result.toString())
|
||||
print("Part 1:", result.magnitude())
|
||||
|
||||
var largest = 0
|
||||
for a in pairs {
|
||||
for b in pairs where a !== b {
|
||||
largest = max(largest, (a + b).magnitude())
|
||||
largest = max(largest, (b + a).magnitude())
|
||||
}
|
||||
}
|
||||
print("Part 2:", largest)
|
||||
}
|
||||
}
|
||||
|
||||
extension Scanner {
|
||||
func pair() -> Pair? {
|
||||
guard scanString("[") != nil else { return nil }
|
||||
guard let leftPart = part() else { return nil }
|
||||
guard scanString(",") != nil else { return nil }
|
||||
guard let rightPart = part() else { return nil }
|
||||
guard scanString("]") != nil else { return nil }
|
||||
return Pair(leftPart, rightPart)
|
||||
}
|
||||
|
||||
func part() -> Number? {
|
||||
if let digits = scanInt() {
|
||||
return Regular(value: digits)
|
||||
}
|
||||
|
||||
return pair()
|
||||
}
|
||||
|
||||
func all() -> [Pair] {
|
||||
var result: [Pair] = []
|
||||
while let pair = self.pair() {
|
||||
result.append(pair)
|
||||
}
|
||||
assert(isAtEnd)
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
struct ExplodeContext {
|
||||
var lastRegular: Regular? = nil
|
||||
var addToNextNumber: Int? = nil
|
||||
var didExplode = false
|
||||
}
|
||||
|
||||
enum Action {
|
||||
case goOn
|
||||
case stop
|
||||
case replace(Number)
|
||||
}
|
||||
|
||||
protocol Number: AnyObject {
|
||||
func toString() -> String
|
||||
|
||||
func visitExplode(depth: Int, context: inout ExplodeContext) -> Action
|
||||
func visitSplit(didSplit: inout Bool) -> Action
|
||||
|
||||
func magnitude() -> Int
|
||||
|
||||
func copy() -> Number
|
||||
}
|
||||
|
||||
extension Number where Self == Pair {
|
||||
static func parse(_ string: String) -> Self {
|
||||
Scanner(string: string).pair()!
|
||||
}
|
||||
}
|
||||
|
||||
class Regular: Number {
|
||||
var value: Int
|
||||
|
||||
init(value: Int) {
|
||||
self.value = value
|
||||
}
|
||||
|
||||
func toString() -> String {
|
||||
"\(value)"
|
||||
}
|
||||
|
||||
func visitExplode(depth: Int, context: inout ExplodeContext) -> Action {
|
||||
if let add = context.addToNextNumber {
|
||||
value += add
|
||||
return .stop
|
||||
}
|
||||
|
||||
context.lastRegular = self
|
||||
return .goOn
|
||||
}
|
||||
|
||||
func visitSplit(didSplit: inout Bool) -> Action {
|
||||
if value >= 10 {
|
||||
let first = value / 2
|
||||
didSplit = true
|
||||
return .replace(Pair(Regular(value: first), Regular(value: value - first)))
|
||||
}
|
||||
|
||||
return .goOn
|
||||
}
|
||||
|
||||
func magnitude() -> Int {
|
||||
value
|
||||
}
|
||||
|
||||
func copy() -> Number { Regular(value: value) }
|
||||
|
||||
}
|
||||
|
||||
class Pair: Number {
|
||||
var left: Number
|
||||
var right: Number
|
||||
|
||||
init(_ left: Number, _ right: Number) {
|
||||
self.left = left
|
||||
self.right = right
|
||||
}
|
||||
|
||||
func toString() -> String {
|
||||
"[\(left.toString()), \(right.toString())]"
|
||||
}
|
||||
|
||||
func splitFirst() -> Bool {
|
||||
var didSplit = false
|
||||
_ = visitSplit(didSplit: &didSplit)
|
||||
return didSplit
|
||||
}
|
||||
|
||||
func explodeFirst() -> Bool {
|
||||
var context = ExplodeContext()
|
||||
_ = visitExplode(depth: 0, context: &context)
|
||||
return context.didExplode
|
||||
}
|
||||
|
||||
func reduce() -> Pair {
|
||||
while true {
|
||||
if explodeFirst() { continue }
|
||||
if splitFirst() { continue }
|
||||
break
|
||||
}
|
||||
|
||||
return self
|
||||
}
|
||||
|
||||
func visitExplode(depth: Int, context: inout ExplodeContext) -> Action {
|
||||
if !context.didExplode && depth == 4 {
|
||||
context.lastRegular?.value += (left as! Regular).value
|
||||
context.addToNextNumber = (right as! Regular).value
|
||||
context.didExplode = true
|
||||
return .replace(Regular(value: 0))
|
||||
}
|
||||
|
||||
|
||||
switch left.visitExplode(depth: depth + 1, context: &context) {
|
||||
case .goOn:
|
||||
break
|
||||
case .stop:
|
||||
return .stop
|
||||
case .replace(let number):
|
||||
left = number
|
||||
break
|
||||
}
|
||||
|
||||
let result = right.visitExplode(depth: depth + 1, context: &context)
|
||||
switch result {
|
||||
case .goOn:
|
||||
return .goOn
|
||||
case .stop:
|
||||
return .stop
|
||||
case .replace(let number):
|
||||
right = number
|
||||
return .goOn
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func visitSplit(didSplit: inout Bool) -> Action {
|
||||
switch left.visitSplit(didSplit: &didSplit) {
|
||||
case .goOn: break
|
||||
case .stop: return .stop
|
||||
case .replace(let new):
|
||||
left = new
|
||||
return .stop
|
||||
}
|
||||
|
||||
switch right.visitSplit(didSplit: &didSplit) {
|
||||
case .goOn: return .goOn
|
||||
case .stop: return .stop
|
||||
case .replace(let new):
|
||||
right = new
|
||||
return .stop
|
||||
}
|
||||
}
|
||||
|
||||
func magnitude() -> Int {
|
||||
3 * left.magnitude() + 2 * right.magnitude()
|
||||
}
|
||||
|
||||
func copy() -> Number {
|
||||
Pair(left.copy(), right.copy())
|
||||
}
|
||||
}
|
||||
|
||||
func +(lhs: Number, rhs: Number) -> Pair {
|
||||
Pair(lhs.copy(), rhs.copy()).reduce()
|
||||
}
|
||||
|
||||
let input = """
|
||||
[4,[3,[9,[9,0]]]]
|
||||
[[[7,6],[2,[2,5]]],[5,[[7,3],8]]]
|
||||
[4,[4,6]]
|
||||
[[0,[5,6]],[[[1,3],[2,7]],[[0,6],4]]]
|
||||
[6,[[3,[6,0]],3]]
|
||||
[[7,[9,[8,5]]],[6,7]]
|
||||
[[[[2,6],1],2],[3,[8,4]]]
|
||||
[4,[[[5,4],[2,7]],[[8,0],[2,3]]]]
|
||||
[[[[4,3],2],[[3,6],[2,5]]],[[[3,7],8],0]]
|
||||
[[[8,[0,7]],1],[[9,[3,9]],9]]
|
||||
[[[[3,0],[1,3]],[[0,9],8]],[[[7,2],9],[[1,4],[3,5]]]]
|
||||
[[[[9,6],[4,4]],[1,3]],[[4,3],[[6,4],[8,4]]]]
|
||||
[[[1,2],[[7,6],[2,3]]],[[4,6],[4,2]]]
|
||||
[[[4,8],[[5,8],1]],[2,3]]
|
||||
[[[5,2],[3,[5,7]]],[[2,9],5]]
|
||||
[[[6,[3,2]],[2,6]],[[8,[4,2]],[[5,2],7]]]
|
||||
[[[[2,6],[0,1]],[7,[3,6]]],[[1,6],[[7,9],0]]]
|
||||
[[[0,3],[8,1]],[[[9,0],3],[0,2]]]
|
||||
[[8,[[7,1],[4,7]]],[[0,[1,3]],[8,2]]]
|
||||
[[[[2,3],4],[[0,8],[9,0]]],[1,[[5,3],4]]]
|
||||
[[[[7,2],2],[[1,3],[8,3]]],[4,[[7,9],[0,6]]]]
|
||||
[[[[2,2],[3,4]],[[1,5],[4,3]]],[6,[[7,2],1]]]
|
||||
[1,[[[5,7],0],[9,[8,8]]]]
|
||||
[[[[9,2],[0,9]],[4,[7,8]]],[[4,8],[[1,8],[4,9]]]]
|
||||
[[[[4,7],2],2],4]
|
||||
[1,[[2,[4,2]],1]]
|
||||
[[[[7,2],[3,8]],[0,[1,3]]],[[[4,4],[2,4]],[8,2]]]
|
||||
[[[[1,0],[0,5]],2],[[9,[5,0]],[[1,6],5]]]
|
||||
[4,[[[8,1],[1,4]],[7,[1,3]]]]
|
||||
[[[6,[0,4]],[[4,6],[2,4]]],[9,[1,5]]]
|
||||
[[[[3,6],[3,3]],1],[0,[[8,8],2]]]
|
||||
[[7,[5,[2,6]]],[[[7,9],6],[0,[3,6]]]]
|
||||
[[[[6,7],4],[[2,9],2]],3]
|
||||
[[[7,[1,7]],[5,4]],[[[1,1],[0,1]],5]]
|
||||
[[6,[[1,0],6]],[0,[6,[0,5]]]]
|
||||
[[[[2,4],[4,6]],9],[4,[[8,0],7]]]
|
||||
[[[[9,9],[5,7]],[9,[8,6]]],[[3,[2,3]],0]]
|
||||
[[0,[1,[5,3]]],[3,[8,[3,4]]]]
|
||||
[[[[4,3],8],[2,9]],[[1,[6,5]],[[5,7],2]]]
|
||||
[[[0,[7,4]],[9,[9,6]]],[[8,[5,5]],[[6,4],1]]]
|
||||
[[[[7,3],[7,9]],[8,[6,2]]],[[8,[4,5]],[[6,4],[6,7]]]]
|
||||
[[7,[[9,0],[9,0]]],[[[0,8],2],[8,[8,3]]]]
|
||||
[4,[7,[5,6]]]
|
||||
[7,[[[3,8],8],3]]
|
||||
[[[4,[6,6]],0],[9,0]]
|
||||
[[[[7,4],8],8],[[0,1],[[0,0],[2,4]]]]
|
||||
[7,[1,[[9,4],[3,6]]]]
|
||||
[[[[2,8],9],[[8,6],[2,2]]],[[[5,1],9],[2,[0,7]]]]
|
||||
[8,7]
|
||||
[[[[0,8],4],[[9,9],[9,9]]],[[[4,3],[1,0]],[6,8]]]
|
||||
[[[[8,3],[8,9]],1],[[4,[1,0]],[[4,0],[2,3]]]]
|
||||
[[[[4,7],[1,3]],[6,9]],[[1,0],[[1,8],5]]]
|
||||
[[2,[4,[6,5]]],[3,[[9,9],5]]]
|
||||
[[[[7,6],4],9],[8,[4,5]]]
|
||||
[[[0,[6,6]],[7,[8,9]]],[[[0,0],[3,4]],[4,[1,8]]]]
|
||||
[[[9,[7,0]],[5,8]],[6,[[5,0],[0,6]]]]
|
||||
[[[[4,0],[1,9]],[7,[3,6]]],[[2,[8,6]],[[2,8],[8,2]]]]
|
||||
[[[9,6],8],[[[5,5],[4,8]],0]]
|
||||
[[[[1,7],1],2],[[[6,8],3],[[3,3],5]]]
|
||||
[3,[5,[[3,8],6]]]
|
||||
[3,[[[9,6],[5,8]],[9,2]]]
|
||||
[[6,1],[6,4]]
|
||||
[[2,6],[[[1,2],2],8]]
|
||||
[[[[1,7],[3,6]],[2,[0,2]]],[[3,0],9]]
|
||||
[1,[[0,[4,9]],5]]
|
||||
[[[[5,5],[5,2]],[0,[6,4]]],8]
|
||||
[0,[7,[[6,9],[6,0]]]]
|
||||
[[[[2,2],[4,7]],[[7,4],6]],[[0,[1,7]],[[3,2],6]]]
|
||||
[[9,8],0]
|
||||
[[[[5,4],[4,8]],2],[3,[8,9]]]
|
||||
[[[[7,0],8],5],[2,6]]
|
||||
[[[5,[0,8]],5],[[[5,0],[1,8]],[[0,2],7]]]
|
||||
[[[[9,4],8],[[6,5],4]],[[5,[8,9]],[4,[0,4]]]]
|
||||
[[[[3,6],7],[[9,3],7]],[7,[[8,3],9]]]
|
||||
[[[[0,7],5],[[5,7],2]],[[2,[9,5]],[[7,7],[5,0]]]]
|
||||
[[[[7,5],2],[8,6]],[[2,[6,2]],[5,[3,1]]]]
|
||||
[[9,[9,1]],6]
|
||||
[[[0,7],[[5,9],2]],3]
|
||||
[[[9,3],[8,8]],[0,[4,5]]]
|
||||
[[[[6,2],5],[4,[3,1]]],[9,[2,8]]]
|
||||
[[[1,[9,4]],[[0,0],2]],[[1,[2,1]],[[7,8],[3,2]]]]
|
||||
[[[[0,6],[8,9]],[[4,7],[5,6]]],[[[1,4],[8,7]],[4,6]]]
|
||||
[[[[6,4],[1,5]],[0,8]],[[[9,7],[1,2]],[9,4]]]
|
||||
[[[[4,5],[0,7]],[9,[1,8]]],[[[5,0],6],7]]
|
||||
[[[0,[6,9]],[5,[5,6]]],7]
|
||||
[[4,5],[[7,[6,5]],1]]
|
||||
[[[7,9],[6,7]],[4,1]]
|
||||
[[[[9,6],1],[[3,1],[9,7]]],[1,[7,1]]]
|
||||
[[[0,[2,0]],5],[[8,[7,6]],[[7,3],4]]]
|
||||
[[[6,[1,7]],[9,[2,7]]],3]
|
||||
[[[6,[8,2]],5],[4,[[1,3],[5,1]]]]
|
||||
[[[4,[3,3]],[4,[2,4]]],[5,4]]
|
||||
[[[1,6],[4,[4,0]]],[[8,[2,2]],[[8,1],[4,7]]]]
|
||||
[[2,0],[[2,1],[[4,8],[2,7]]]]
|
||||
[9,[[8,4],0]]
|
||||
[[1,6],[[5,[1,3]],[9,[0,9]]]]
|
||||
[[[0,[3,5]],3],[[2,[8,0]],[[2,0],[4,3]]]]
|
||||
[[[1,[1,9]],[9,[7,9]]],[[2,2],[[6,7],[0,7]]]]
|
||||
[[[4,6],[[6,2],[0,9]]],[[1,0],[1,[6,7]]]]
|
||||
[9,[[[0,1],4],[[9,3],3]]]
|
||||
"""
|
1104
2021/day19.swift
Normal file
1104
2021/day19.swift
Normal file
File diff suppressed because it is too large
Load diff
1029
2021/day2.hs
Normal file
1029
2021/day2.hs
Normal file
File diff suppressed because one or more lines are too long
192
2021/day20.swift
Normal file
192
2021/day20.swift
Normal file
|
@ -0,0 +1,192 @@
|
|||
|
||||
@main
|
||||
struct Day20: Puzzle {
|
||||
func run() {
|
||||
var image = Image(input)
|
||||
for i in 0..<50 {
|
||||
image = image.run(map: map)
|
||||
if i == 1 {
|
||||
print("Part 1:", image.countLitPixels())
|
||||
}
|
||||
}
|
||||
print("Part 2:", image.countLitPixels())
|
||||
}
|
||||
}
|
||||
|
||||
struct Image {
|
||||
var width: Int
|
||||
var height: Int
|
||||
var pixels: [Bool]
|
||||
var border: Bool
|
||||
|
||||
init(_ string: String) {
|
||||
pixels = []
|
||||
width = 0
|
||||
height = 1
|
||||
border = false
|
||||
for char in string {
|
||||
if char.isNewline {
|
||||
width = 0
|
||||
height += 1
|
||||
continue
|
||||
}
|
||||
|
||||
pixels.append(char == "#")
|
||||
width += 1
|
||||
}
|
||||
}
|
||||
|
||||
init(width: Int, height: Int, border: Bool) {
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.border = border
|
||||
self.pixels = Array(repeating: false, count: width * height)
|
||||
}
|
||||
|
||||
subscript(x: Int, y: Int) -> Bool {
|
||||
get {
|
||||
guard 0..<width ~= x && 0..<height ~= y else {
|
||||
return border
|
||||
}
|
||||
|
||||
return pixels[x + width * y]
|
||||
}
|
||||
|
||||
set {
|
||||
precondition(0..<width ~= x && 0..<height ~= y)
|
||||
pixels[x + width * y] = newValue
|
||||
}
|
||||
}
|
||||
|
||||
var borderIndex: Int { border ? 7 : 0 }
|
||||
|
||||
func lookupIndex(x: Int, y: Int) -> Int {
|
||||
var index = 0
|
||||
for i in -1...1 {
|
||||
for j in -1...1 {
|
||||
index = index << 1 | (self[x + j, y + i] ? 1 : 0)
|
||||
}
|
||||
}
|
||||
return index
|
||||
}
|
||||
|
||||
func run(map: [Bool]) -> Image {
|
||||
var outputImage = Image(width: width + 2, height: height + 2, border: map[borderIndex])
|
||||
for y in -1...height {
|
||||
for x in -1...width {
|
||||
outputImage[x + 1, y + 1] = map[lookupIndex(x: x, y: y)]
|
||||
}
|
||||
}
|
||||
return outputImage
|
||||
}
|
||||
|
||||
func countLitPixels() -> Int {
|
||||
pixels.lazy.filter { $0 }.count
|
||||
}
|
||||
}
|
||||
|
||||
let map = "#####.#.###.###.#.#.####.#####.####.#..####.##.####...##......#.##.##.#.#..#.##.###.#.#.#.##.#..#.####.#.#.##.#..........###.##...#.#...#.#.###..#...##.####.##...###.....##..##..##.#......#.#.##.#.#.##.#.......###.##.#.###.##..##.......##....#.##....#..###.######.##...##.##...#.#.##...##.##.#....##.####..#..#..##.##.#.#..#....#######.###.##...#.####..#.#.#.##...##..##.#.#.#.##.#.......###..######..###..##......###..###.#.#.#.......#.....##.#.##..#.##.#.##.####..#.##....##.#.#..#.####.##.#.#.##...#..##.####."
|
||||
.map { $0 == "#" }
|
||||
|
||||
let input = """
|
||||
.###..###..#.####.#....#..##.###.........#.#.#..#.#...##...#.#........##..#..#.##....#.##.#...###.##
|
||||
.##......#.#..###.######.#.#.######...#..##...#......###..###..####..####..##..#.##.#.#.#....##..##.
|
||||
.##.##..###..#...###....#...##..#..######...#.#.##.#..####.#..#..###.######.#.#..#..##...##.#.#.#.#.
|
||||
..#..##..####...###.#...###.#.####...#####...#####.#.#########.##..####...#....##....##..#.#..#...##
|
||||
.#.#..#.###....###.#.#..###.#..#####.#.###...####.##.###.#..####.###...#...#.##.#..#..#...##....####
|
||||
######....#..##.#..#.##.#.#.##.#.#####.#..###.#####..#######..##..#..#........##.##..#...#..##..#.##
|
||||
.#.##########.##...#.###..##...#....#.##..##.###..#####...#..##.#.....##..####.#.#.##..#...#..#.#.#.
|
||||
.##..#.#..#..##.###..#.#.##..#.#...########.##..#....##...#..#.####.#.#..####..#.#..##.#.......##..#
|
||||
##..##...###.##..#.#.#.###.#..####.##.....#.###.##.##......#.......#.#####.#..##.#.##.#..##.###.##.#
|
||||
..#..###.....##..####.......####.###.#..##.##.#######.####..#.######.###.#.#..###..###.##.###.##..#.
|
||||
.##.#..#..#.####.#.#.#..#....#...##.....##..##..##.##.#..##...#..#...##.###.##.##........#.#..#..###
|
||||
....#.######.#..#......####.##....##.#..#..##...#...#...#.##...##..###.......##.....#..#..#..#####..
|
||||
###..##.....##.##.###.##..#.#.###..####.#.#....#.##.#.....#######.##.....#..#####.##..#..#####.##.##
|
||||
#.#.#..#.#.#..........##.##......#.###...#.###.##.######..#...#...#.......###...#..#.##...#.#.##..##
|
||||
##...##.###.#.##..##....#.#.#..##.###.##.#...#.#..##..#..##...#..##...##..#.####..#..##.#.#...##....
|
||||
...#..###.####.#.####.#.#.#....#.##.##..#####..#####.#.####.##..##.###....###..#....#..##.#.#..#..#.
|
||||
..#.#.###...###...#####.####..#.#...###.###..#.##....#.#.#.....#..#...#..#.##..####......##.#.###...
|
||||
#.##.....##...#.#...#####.#.##.##..##.#.##....#.##.....#.###..#..##....###.....#####..####..#..##...
|
||||
#...##....##..#..####...#...###...##.##..##..#....###.#....#########.##..##.#.#.######.###..####.##.
|
||||
##.#.##.#.#..#......##.#..#...##..#.#..##.###..##.......##..#.#...#.#..#.#.#....##..######.##...#...
|
||||
.#..##..#....##..#.##..##...#..##...#....#.#.##..#...##.##.#..#.#.#.##.#..#.#.......#.###..######..#
|
||||
#..##.#.##.#..##...####.##.#...####...##.###..#..#.#.#..###..##.#....#####.###..#...#..#..####...##.
|
||||
#.####....######.....#.##..####....###.##....###.####...##.#....####.#..##..#..##..#.##.####.#.....#
|
||||
...#.#.###...####..#..#.#..#.##...###.#.#.##.#...#.#.#.##.##...#.#####.#....#..##.#...#.##....##....
|
||||
#..##..#.##..#.#.#..#..###.##.....####..##..##..#######...##.#.....##..#...########..#.#.#.....##...
|
||||
.#...##...##..##.#..##......#.##......#.###.##.##...##....####.##.#.....#.#.#.#.##.#.##.#..#..##..#.
|
||||
.#..#..###.#.#.##..#..#...#..##..#.##...##..#...######..##.#.######........###.#..##..##..######.##.
|
||||
#####..##.####.....###.###.########.###...#########..#.#.###.#..#####..#..###.#####.#.....#..##..##.
|
||||
........#....###..####.#.###...#.###.........#.......#..#.#..###.##.#...#.###.##..#...##.##.##.#.###
|
||||
.##....##.#..##.##...####..########.#####..#.#.#...#.##..#.##..######.###.#..##.#..#...###..#.##.###
|
||||
#..#.##.##..#.#.#...##....#.#..#..###...###..#..#..##.#.....#..#..#.#.####...#.####.#.#.#.#.#.....#.
|
||||
###..##.##..##.###.#.#....#..........##.#....#.#.##......#.##.#...#####.##....#.#.#....#.###.#.####.
|
||||
###.....##..#....#..##.##....#..##.##.#...#..#.#####.####.#..##...#...##.###..##.####..##...##.####.
|
||||
#.#..#.#.#.#..#..#.###..###.##.###.#....#..###.#.###.....##..#.#.##.#....#.#.#.#.#...#.##.######.##.
|
||||
##....###...#...#.######.#.#.#....#..#.###.#.##..##...#.....##.#...##.#.#####.##.#.##########.####..
|
||||
...#.#.#..###.#....##.#....##.#..##...#.##....#...#####.#.....##..#.##.##.....#.##.#.#..##.##.#..#.#
|
||||
###.##.########.##..##.#...###.##.##.#.#...##..###...##.##.##.#..#...#.#.##.....##.....#..##.#.#.###
|
||||
#.###.#......####..###.....#.##.###..###....###.....#..#.#.##.##....#.#....#.######.#...##...######.
|
||||
#.#####.###..#.#..........#.######.#####.####.##.##....###..#.###.#.......#....##.#.######..#.###.#.
|
||||
#.#.##..#...##...#..#.#...#.##..#.####.#.......####.##..#.##..##.#....#.#.....#..#..#...#..#.##.#.#.
|
||||
####.#.##..##....####.#.##.#.##..#.#.#.#####.####.#.##..##.#.####.#..##..#.###.#...#.##...#.#..###..
|
||||
#.###...#.#...##.####...###..#..##.#.##.#.#.######...##.##.#.####..#.###..#.##...##..##.#.#.#.####.#
|
||||
....#.##..##..####......###.#.....#....######.#...##..#..##.###...##.#####..#.##...#...##.#.#####.##
|
||||
..##...#..##.......#.#.###.#...#####........###...#....#...##.##...###....##.##.#..####....##..##.#.
|
||||
.#..###.##......##..#...##......##.#.##..##..###.#.#.#.##...#...#.#.....#.#.#.......#..###..####.###
|
||||
...#..#..##...#..##.##.#####.#.##.#.#...##.####.###...###.#.##.##.##..#.##..#..##.#.###....###..####
|
||||
#......#...#.#.#.#.#..#...#....###.##.##...######....#.###.##..##.##..#.#..#.####.#.####.......##.#.
|
||||
#.###.#..####....##.##.###.##.#.#######..##.##.#.#..#...#.#..####.##..#.##.#....#....#.##.#.#.##...#
|
||||
##...###..##.#.##...##..####.#.#.#####.#.#.##..........#....#...#..##.###....###.#.#.###.###....#.#.
|
||||
###.#.##..#....#.#.#.##.######..####.#...##.##...###..###..##.........##.##.#.###...##.#####...###.#
|
||||
..###..#.##..######.#....#...##.#.....#..######.....#.####.#..###..#..##.##...##..##....##..###..##.
|
||||
#.#.#############.#..##.#.#..#####.#.#.....#....####.#....#..##..###.#...#.##...###.##...##...#..##.
|
||||
##..##........##.#.##.###..#.#.##..#...#.##.###.#.###########..#.#.#.##..#....#....#.#..#...##...#..
|
||||
#.#.#...##...#.#.##.#..##.#.####.##.#....##..#..#.....#...######.#...##...####.#....#.........#.#...
|
||||
##..#.#.##...#....#.##..##.##.###.#.....#.########.##.....#....######..##......#.#...##..##.#.####..
|
||||
.##.....###..######..#...#......#..#....##.##...#.##...#.#.###...##...#.#.#..#.#..#.#..#.##..###.###
|
||||
#..#....#...###.#..#########..##.#.......#.###..###...#....#..##.########.#....#.#..###.##.#......#.
|
||||
###..#..##....####...###.....#....###...#.#..#...#..#.#####...#.####.......#.##.#.....##.##...##.###
|
||||
..###..#.###..#.##.......###..##...##....#.#.##.#.....###..###.#..####.#####.#..#.#...###.#.####.#..
|
||||
#.##.#..##.####.#####.#.#.#...######.#.#.#....#.#.#.#...#.##.......###...#.#######...##..###.#.###.#
|
||||
..##.#....#####.#..##.#..#.#.#.#.#####.#.###...#..##.#.#.####.#.#....##..###.#.##....##..#####.###..
|
||||
.....#####.#..#.#.....##.#..###.#.##..#..#..#...#.#....#.##.#.#..#...####...#.#..#.##.##.##.#.#...#.
|
||||
##.##.######....#....#..##.##.##..###..##.#..####.#.##.#...##.#.##.###.######..#####.....#.##.##.###
|
||||
.#.##.#...#..#######.####.....###.#.#.#...###....#.#.#...#..#.#.....###...###.#...#.#.....##..#...##
|
||||
.#####..##.####.##.###.##.##..##..####...#.#.###....#.#.....#...#####...###.##.####....#.###.##.####
|
||||
.#...#....###.########.##..##.##.##...###..#...#..###..#..#.#.###.#...#.#..##..###.#.....#...####.#.
|
||||
#.#.#..#.##..###.#.###.##.##...##.#.##.#.#.##......#.....###.#.####..##.#.##..#...###...#..##..#...#
|
||||
.##....######.#.##....#.#.#...#....###...##.##.#.#..##.#....#.##.###.#.####..##...###.#..#.....#.###
|
||||
...#.####......#.##...#...####......#..#######.#.#.##..##....####.##....##.##..#.##..###...####.#.#.
|
||||
####..####..##..#...#.#.....#..#..#.......#.##.#.....#.#.##.#..#####...##.#....##........#.........#
|
||||
.#.#.#......##..#.###.##....#.#..######.##.#.#..#...#...#....###.....###.###....##.#.##..#.#..##.#.#
|
||||
.##..###....#.#.#.#..#...##.#.##..#.#.##..#.#####.#...#..#...#####.###..##..#.....#.##..##.####.#.#.
|
||||
..#..##.####....##.##.#...##.##.#..##.###.#..#.###...#...##.#.##.##.#.#..##.##.##..#.....#..####.##.
|
||||
.#..#..#.#.#.###...###.##.##..##..##....##...#####.#.#...###.##.#.#....##.#..#...#.#..##...#.####...
|
||||
#####......##....#.##..##.##..#..#.##..#.##.#.######..##..##...#..#.#..#.###..####.#.###..#.#..###.#
|
||||
.####..#....#.##....#.##.#...#.###..###...##.##.##.#..#..##..#.....#.#########..#...#..####.##....##
|
||||
####.###..##.#.#.##.#.####.###.###.#...#####.....#.#....#..####.#.#...####.##....#..##.#....#.#.###.
|
||||
##.##...##...#.#####..#...#.#.##.#.##.#....#..#..####.#.#####.#...#...#..##.##.###..###.#....####..#
|
||||
.##.####..###..#.####.#.....###....#...#..#...###.....#.####.#....##.####..#.###..#.###...#....##...
|
||||
#....#...###.#...#.##.#.....#.##.###.....#.##...#...##.##...###.##...##..#####...#....#....#..###.#.
|
||||
#.#...##.#.#..##..##..###..##...####.#.#..##..##.##..##.#.###.##...###.#.##.##.##..##..###..###..#.#
|
||||
.##..###...#.####..#####.#.###....###.#..##..####.##..#.##.....###...#...#..##.###.#.#######.....#..
|
||||
.####....##..##......##.#......#.##..##.##.###..###.......###....####.#.##..#.####..##.#.#.#.##.#..#
|
||||
##...#####.#.....##..###...###.#...##..#####.#..###...#####..###......#...#.###.##..##...#.###...###
|
||||
..###.#...###..#.##.##.##.#.##.....##.###..##..##.##..###....###..#.......###.##...##....#..##..##.#
|
||||
#..#...##.###.#...#.##...#.##.###.##...##.#...##.#.#.#..#....###.#.......#.##.#..###.#.##.##..####.#
|
||||
##...####.......#..##.#.#.#..#.##....#.##.##.#.####..##....###.####.#.###..#.##..##......#.#.#..####
|
||||
###...#..##.#.......##..#.#...##...#...##..##.#.#..#.#.#.####.##.##.###..#.##.####..####....####.#..
|
||||
#..###.##.....###..##.##.###.###.#.#....##.#######....#####.##.#....###.##..#...#..#.##.#.#.#.#..#..
|
||||
.#.....#..###..##.#..##.##.###.##..#....###...##........#....####..#.##########...#....###.#...##.##
|
||||
#.....#.#.#####.#.######.#....##..#...#.##.#..##..#####...######.#.####...#.####.###..#.##....##...#
|
||||
.#.#...#.#..#.##.#..####..#..#.....##.#....#.#######.#.#..#.#.#.#.###...##..####..##.##.##..#.###...
|
||||
.#..#.##.#..##.#.##....##..###..#........#.##.#.##.#..##.#.###.#.#..#...#..####.##...#.....#.###...#
|
||||
..#....##..#..#.##.##.#..###......#.#..#.####..##.#.######..#######..##.##.#..##....#.##.....#.###..
|
||||
.#....#..#....#...#.###...#.#...##..#..##.######..#..###.##..###.#.##...#.#..#.###.#..###.##...#..#.
|
||||
##...##.####.##..####.#.#....#....#.###.##.###.##.##..#.#.#.....##...#.#..#####.##..#.#.....#.#.####
|
||||
.....#.#.##..######....#...#.##..#...#..#...#.##..##..##.....#...##..#.#.####......#.#.##..#.#.#..#.
|
||||
#.##...##.##..###..#....#...####..##....#.#....#..#.#.....######.....##....#..###.......##......#.#.
|
||||
#.##.....##.#.#...#.#######.###..#..#...##...#.#.####.#########...#..#....#.....##.#.#.###.##..#.#..
|
||||
.#.......#.##.....#####.#..#...###.##...#.#..#.###.#.#.#.#########.##.###...####...##.##...###.#.#.#
|
||||
"""
|
101
2021/day21.swift
Normal file
101
2021/day21.swift
Normal file
|
@ -0,0 +1,101 @@
|
|||
@main
|
||||
struct Day21: Puzzle {
|
||||
func run() {
|
||||
part1()
|
||||
part2()
|
||||
}
|
||||
let player1 = Player(position: 6)
|
||||
let player2 = Player(position: 7)
|
||||
|
||||
func part1() {
|
||||
var die = Die()
|
||||
var player1 = player1
|
||||
var player2 = player2
|
||||
|
||||
while true {
|
||||
if player1.move(die.roll3()) >= 1000 {
|
||||
print("Part 1: Player 1 won. ", die.rolls * player2.score)
|
||||
break
|
||||
}
|
||||
|
||||
if player2.move(die.roll3()) >= 1000 {
|
||||
print("Part 1: Player 2 won. ", die.rolls * player1.score)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func part2() {
|
||||
var universes: [Universe: Int] = [Universe(player1: player1, player2: player2): 1]
|
||||
var player1Wins = 0
|
||||
var player2Wins = 0
|
||||
while !universes.isEmpty {
|
||||
var newUniverses: [Universe: Int] = [:]
|
||||
for (universe, universeCount) in universes {
|
||||
for (offset, player1RollCount) in rollCounts.enumerated() {
|
||||
var u = universe
|
||||
if u.player1.move(offset + minRoll) >= quantumMax {
|
||||
player1Wins += universeCount * player1RollCount
|
||||
continue
|
||||
}
|
||||
|
||||
for (offset, player2RollCount) in rollCounts.enumerated() {
|
||||
var u2 = u
|
||||
if u2.player2.move(offset + minRoll) >= quantumMax {
|
||||
player2Wins += universeCount * player1RollCount * player2RollCount
|
||||
continue
|
||||
}
|
||||
|
||||
newUniverses[u2, default: 0] += universeCount * player1RollCount * player2RollCount
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
universes = newUniverses
|
||||
}
|
||||
|
||||
print("Part 2: ", max(player1Wins, player2Wins))
|
||||
}
|
||||
|
||||
let quantumMax = 21
|
||||
|
||||
let minRoll = 3
|
||||
// 3 4 5 6 7 8 9
|
||||
let rollCounts = [1, 3, 6, 7, 6, 3, 1]
|
||||
|
||||
struct Universe: Hashable {
|
||||
var player1: Player
|
||||
var player2: Player
|
||||
}
|
||||
|
||||
struct Player: Hashable {
|
||||
var position: Int
|
||||
var score: Int = 0
|
||||
|
||||
mutating func move(_ roll: Int) -> Int {
|
||||
position = 1 + (position + roll - 1) % 10
|
||||
score += position
|
||||
return score
|
||||
}
|
||||
}
|
||||
|
||||
struct Die {
|
||||
|
||||
var rolls = 0
|
||||
var nextRoll = 1
|
||||
|
||||
mutating func roll() -> Int {
|
||||
defer {
|
||||
rolls += 1
|
||||
nextRoll += 1
|
||||
}
|
||||
|
||||
return nextRoll
|
||||
}
|
||||
|
||||
mutating func roll3() -> Int {
|
||||
roll() + roll() + roll()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
564
2021/day22.swift
Normal file
564
2021/day22.swift
Normal file
|
@ -0,0 +1,564 @@
|
|||
import Foundation
|
||||
|
||||
@main
|
||||
struct Day22: Puzzle {
|
||||
func run() {
|
||||
let scanner = Scanner(string: input)
|
||||
var cubes: [Cube] = []
|
||||
|
||||
while !scanner.isAtEnd {
|
||||
cubes.append(scanner.cube())
|
||||
}
|
||||
|
||||
var xStepsSet: Set<Int> = []
|
||||
var yStepsSet: Set<Int> = []
|
||||
var zStepsSet: Set<Int> = []
|
||||
|
||||
for cube in cubes {
|
||||
xStepsSet.insert(cube.start.x)
|
||||
xStepsSet.insert(cube.end.x + 1)
|
||||
yStepsSet.insert(cube.start.y)
|
||||
yStepsSet.insert(cube.end.y + 1)
|
||||
zStepsSet.insert(cube.start.z)
|
||||
zStepsSet.insert(cube.end.z + 1)
|
||||
}
|
||||
|
||||
var xSteps = xStepsSet.sorted()
|
||||
var ySteps = yStepsSet.sorted()
|
||||
var zSteps = zStepsSet.sorted()
|
||||
|
||||
let firstX = xSteps.removeFirst()
|
||||
let firstY = ySteps.removeFirst()
|
||||
let firstZ = zSteps.removeFirst()
|
||||
|
||||
var part1 = 0
|
||||
var part2 = 0
|
||||
|
||||
var x0 = firstX
|
||||
for x in xSteps {
|
||||
let possibleX = cubes.filter { $0.xRange.overlaps(x0..<x) }
|
||||
var y0 = firstY
|
||||
|
||||
let px0 = max(x0, -50)
|
||||
let px = min(x, 50)
|
||||
|
||||
for y in ySteps {
|
||||
let possibleY = possibleX.filter { $0.yRange.overlaps(y0..<y) }
|
||||
var z0 = firstZ
|
||||
|
||||
let py0 = max(y0, -50)
|
||||
let py = min(y, 50)
|
||||
|
||||
for z in zSteps {
|
||||
let state = possibleY.lazy.reversed().first { $0.zRange.overlaps(z0..<z) }?.state ?? false
|
||||
|
||||
if state {
|
||||
let pz0 = max(z0, -50)
|
||||
let pz = min(z, 50)
|
||||
|
||||
if px0 < px && py0 < py && pz0 < pz {
|
||||
part1 += (px - px0) * (py - py0) * (pz - pz0)
|
||||
}
|
||||
|
||||
part2 += (x - x0) * (y - y0) * (z - z0)
|
||||
}
|
||||
z0 = z
|
||||
}
|
||||
y0 = y
|
||||
}
|
||||
x0 = x
|
||||
}
|
||||
|
||||
print("Part 1:", part1)
|
||||
print("Part 2:", part2)
|
||||
}
|
||||
}
|
||||
|
||||
struct Point: Hashable {
|
||||
var x: Int
|
||||
var y: Int
|
||||
var z: Int
|
||||
}
|
||||
|
||||
struct Cube {
|
||||
var start: Point
|
||||
var end: Point
|
||||
var state: Bool
|
||||
|
||||
var xRange: ClosedRange<Int> { start.x...end.x }
|
||||
var yRange: ClosedRange<Int> { start.y...end.y }
|
||||
var zRange: ClosedRange<Int> { start.z...end.z }
|
||||
|
||||
func contains(_ point: Point) -> Bool {
|
||||
xRange.contains(point.x) && yRange.contains(point.y) && zRange.contains(point.z)
|
||||
}
|
||||
}
|
||||
|
||||
extension Scanner {
|
||||
func onOff() -> Bool {
|
||||
if scanString("on") != nil {
|
||||
return true
|
||||
}
|
||||
|
||||
if (scanString("off") != nil) {
|
||||
return false
|
||||
}
|
||||
|
||||
fatalError("Invalid command")
|
||||
}
|
||||
|
||||
func range() -> ClosedRange<Int> {
|
||||
guard let min = scanInt(),
|
||||
scanString("..") != nil,
|
||||
let max = scanInt()
|
||||
else {
|
||||
fatalError("Invalid range")
|
||||
}
|
||||
|
||||
return min...max
|
||||
}
|
||||
|
||||
func line() -> (Bool, ClosedRange<Int>, ClosedRange<Int>, ClosedRange<Int>) {
|
||||
let command = onOff()
|
||||
guard scanString("x=") != nil else { fatalError() }
|
||||
let xRange = range()
|
||||
guard scanString(",y=") != nil else { fatalError() }
|
||||
let yRange = range()
|
||||
guard scanString(",z=") != nil else { fatalError() }
|
||||
let zRange = range()
|
||||
return (command, xRange, yRange, zRange)
|
||||
}
|
||||
|
||||
func cube() -> Cube {
|
||||
let (state, xrange, yrange, zrange) = line()
|
||||
return Cube(
|
||||
start: Point(x: xrange.lowerBound, y: yrange.lowerBound, z: zrange.lowerBound),
|
||||
end: Point(x: xrange.upperBound, y: yrange.upperBound, z: zrange.upperBound),
|
||||
state: state
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
let input = """
|
||||
on x=-28..25,y=-34..15,z=-36..13
|
||||
on x=-9..36,y=-2..43,z=-47..5
|
||||
on x=-27..26,y=-7..41,z=-8..46
|
||||
on x=-28..26,y=-11..39,z=-32..17
|
||||
on x=-13..41,y=-30..24,z=-47..1
|
||||
on x=-4..45,y=-48..-3,z=-39..13
|
||||
on x=-49..-3,y=-29..20,z=-39..7
|
||||
on x=-29..20,y=2..46,z=-31..15
|
||||
on x=-10..34,y=-12..41,z=-15..32
|
||||
on x=-12..41,y=-6..42,z=-22..28
|
||||
off x=-8..9,y=-31..-21,z=-30..-11
|
||||
on x=1..47,y=-30..16,z=-9..38
|
||||
off x=-34..-16,y=-48..-31,z=9..25
|
||||
on x=-29..19,y=-38..15,z=-34..20
|
||||
off x=-3..12,y=25..34,z=-43..-32
|
||||
on x=-36..17,y=-23..31,z=-29..16
|
||||
off x=14..27,y=-30..-21,z=3..21
|
||||
on x=-31..14,y=-36..8,z=-36..12
|
||||
off x=24..34,y=-27..-10,z=-34..-17
|
||||
on x=-33..14,y=-45..6,z=-42..2
|
||||
on x=-84084..-49906,y=-34022..-13687,z=-26508..-7161
|
||||
on x=-5505..17661,y=15376..39557,z=64634..85669
|
||||
on x=-77470..-55853,y=-25906..-5142,z=-42096..-20083
|
||||
on x=-44899..-13829,y=5050..26536,z=67119..86305
|
||||
on x=-63460..-40980,y=33003..59169,z=25378..44440
|
||||
on x=-17311..-1574,y=-86884..-62730,z=-54963..-35830
|
||||
on x=26480..34369,y=39725..55309,z=-77095..-43655
|
||||
on x=22634..49093,y=-13808..7138,z=-79760..-60071
|
||||
on x=2496..13198,y=-73951..-53407,z=-43731..-30331
|
||||
on x=-27451..-20414,y=1868..32906,z=-75318..-62730
|
||||
on x=31848..53483,y=-73320..-63684,z=-24860..-14722
|
||||
on x=6461..28672,y=1908..29124,z=-84376..-68877
|
||||
on x=16931..39395,y=37598..63107,z=47860..60054
|
||||
on x=14945..40546,y=-7317..549,z=-93498..-67762
|
||||
on x=-85540..-58126,y=7461..23740,z=-29051..-17311
|
||||
on x=38640..49114,y=55796..68805,z=-35888..-8915
|
||||
on x=-25483..8215,y=32431..39809,z=70198..82364
|
||||
on x=-3703..17675,y=61466..90313,z=16909..48922
|
||||
on x=44604..75529,y=-22304..-6299,z=45999..60729
|
||||
on x=-70454..-38359,y=25776..59602,z=-45661..-30347
|
||||
on x=-20074..9993,y=56063..71942,z=-49242..-17209
|
||||
on x=35569..59289,y=-52746..-21591,z=33105..49948
|
||||
on x=-69553..-46700,y=-21120..10014,z=-78684..-51923
|
||||
on x=-64276..-54684,y=41723..63992,z=-20013..-7784
|
||||
on x=-1824..9573,y=66316..76607,z=23895..46349
|
||||
on x=-54006..-31537,y=9127..34043,z=57224..87032
|
||||
on x=61803..80774,y=-50282..-13511,z=-35593..-9531
|
||||
on x=-65653..-36057,y=-71428..-40824,z=-50428..-20504
|
||||
on x=-35635..-12972,y=-6991..2475,z=-88189..-59265
|
||||
on x=67324..77277,y=12215..17359,z=9446..16623
|
||||
on x=46320..63691,y=23806..30377,z=-62984..-38536
|
||||
on x=-6894..13135,y=-44916..-38815,z=49846..79849
|
||||
on x=-67348..-54769,y=-57422..-29061,z=25855..36474
|
||||
on x=-28019..-23220,y=-60400..-37046,z=49526..71048
|
||||
on x=-42960..-30831,y=-78337..-64643,z=-22038..12986
|
||||
on x=-43601..-27531,y=-35599..-20965,z=52822..83732
|
||||
on x=-85892..-68621,y=-10994..9023,z=-20838..-9147
|
||||
on x=59413..97068,y=-22230..-1408,z=-3604..19485
|
||||
on x=62228..85826,y=-31716..-2979,z=12114..36300
|
||||
on x=46514..66369,y=-35480..1374,z=36011..51592
|
||||
on x=-48685..-36357,y=55919..77922,z=-20577..-12176
|
||||
on x=63584..82792,y=11027..31562,z=-43607..-35346
|
||||
on x=-13917..12041,y=-73682..-62007,z=35642..62665
|
||||
on x=45316..56476,y=13007..26619,z=45798..63220
|
||||
on x=-58080..-47733,y=8079..17846,z=53185..62392
|
||||
on x=2479..30325,y=-52517..-31422,z=-70357..-52270
|
||||
on x=-39911..-29141,y=52574..71764,z=-33493..-5376
|
||||
on x=75460..84989,y=-7735..-6452,z=-5685..823
|
||||
on x=45533..71393,y=-47931..-13874,z=30994..40795
|
||||
on x=-14338..7548,y=-96290..-65900,z=-14911..-8244
|
||||
on x=39472..46973,y=-45007..-16123,z=-68972..-43340
|
||||
on x=15323..43991,y=-79867..-60758,z=-46..13763
|
||||
on x=-34857..-7822,y=70341..75898,z=22751..44742
|
||||
on x=60051..71299,y=6656..26788,z=-46635..-29393
|
||||
on x=46242..67391,y=-60111..-42428,z=-63406..-43389
|
||||
on x=-35622..-13029,y=61821..88175,z=-19300..-3468
|
||||
on x=45267..78654,y=940..23235,z=34829..52055
|
||||
on x=-64544..-32718,y=-52424..-32259,z=-51391..-42170
|
||||
on x=-45310..-38884,y=60663..76511,z=-20350..6437
|
||||
on x=-19546..3011,y=-85555..-56269,z=-48635..-31142
|
||||
on x=76489..97638,y=-35407..-9542,z=-22900..679
|
||||
on x=-34856..-12798,y=57873..72105,z=28432..41250
|
||||
on x=-12695..5075,y=-51326..-34170,z=60410..74327
|
||||
on x=48950..55957,y=21833..41299,z=33762..48570
|
||||
on x=-72062..-57619,y=-30380..-10079,z=-68295..-30427
|
||||
on x=9722..29351,y=-48714..-33393,z=-78170..-44048
|
||||
on x=8231..26025,y=-77925..-54037,z=-47724..-25194
|
||||
on x=-95495..-73464,y=-7621..14339,z=-29593..-13088
|
||||
on x=55959..79890,y=-5967..31737,z=-67844..-36315
|
||||
on x=53044..74610,y=-30723..-8664,z=-43868..-14796
|
||||
on x=-4307..16454,y=35270..42969,z=-81647..-68472
|
||||
on x=45874..60812,y=-69404..-54747,z=-8298..-3138
|
||||
on x=-41808..-29758,y=-75803..-46116,z=23276..33715
|
||||
on x=-65837..-40686,y=-69179..-53790,z=-47995..-22105
|
||||
on x=-9912..23894,y=-1700..23494,z=-97303..-62588
|
||||
on x=19429..37260,y=-67376..-50156,z=-53512..-16652
|
||||
on x=-57067..-52828,y=-12667..-9591,z=-67443..-58160
|
||||
on x=-3523..27218,y=74994..90403,z=-3493..14395
|
||||
on x=14169..48854,y=-1568..28900,z=-71852..-52553
|
||||
on x=32821..57220,y=47717..78952,z=-34811..-13134
|
||||
on x=-79129..-71287,y=-18716..3046,z=21374..41841
|
||||
on x=-11439..14964,y=-16250..3021,z=65364..90013
|
||||
on x=-38129..-32162,y=58740..80207,z=-9827..9520
|
||||
on x=40614..58324,y=-11736..-1046,z=47782..68564
|
||||
on x=68136..85433,y=19038..53903,z=-31789..4892
|
||||
on x=6721..20772,y=74233..93387,z=-17766..5311
|
||||
on x=-38118..-12460,y=-57425..-34797,z=55638..66558
|
||||
on x=2737..32272,y=-76998..-55030,z=43688..49155
|
||||
on x=12198..38223,y=-73791..-64926,z=31631..39745
|
||||
on x=-20261..-2856,y=-74905..-54211,z=7861..34791
|
||||
on x=19178..35422,y=-11638..11563,z=58261..77953
|
||||
on x=-31001..1243,y=11174..27421,z=-83906..-70511
|
||||
on x=26738..51818,y=41573..66947,z=5480..38191
|
||||
on x=-4120..27825,y=-85989..-63889,z=-33571..-17260
|
||||
on x=65955..73858,y=-30937..-20357,z=19699..51919
|
||||
on x=59986..81449,y=-17094..-6765,z=-21325..4146
|
||||
on x=-15287..13119,y=-67414..-61189,z=-46979..-43603
|
||||
on x=-82390..-66004,y=-10271..3338,z=-38978..-23333
|
||||
on x=48845..69167,y=43156..62169,z=6515..37326
|
||||
on x=-29512..-18622,y=66618..85799,z=16557..37597
|
||||
on x=-13680..11486,y=-73990..-52854,z=34292..59824
|
||||
on x=16528..41696,y=-88669..-71438,z=6756..28376
|
||||
on x=47386..68246,y=26567..41173,z=32881..45573
|
||||
on x=41552..60418,y=-13177..5608,z=40188..72493
|
||||
on x=-17271..1089,y=66757..90442,z=-8173..4840
|
||||
on x=-83957..-59723,y=-5356..22092,z=-46860..-26958
|
||||
on x=-66297..-47544,y=-37434..-22806,z=-60731..-47364
|
||||
on x=-14961..-8051,y=-82471..-63555,z=-17655..1207
|
||||
on x=4207..34538,y=61925..92475,z=-30435..-15910
|
||||
on x=-17617..-10570,y=-95348..-63368,z=-16210..14719
|
||||
on x=38496..55233,y=-64106..-40918,z=16863..31642
|
||||
on x=50719..79640,y=-61152..-34221,z=-10774..9297
|
||||
on x=-42969..-7619,y=-26388..-18715,z=70740..87672
|
||||
on x=-47929..-35133,y=49347..82369,z=-14714..10853
|
||||
on x=-82604..-63475,y=-34831..-12713,z=-11929..4941
|
||||
on x=29358..63182,y=8015..29986,z=54315..82349
|
||||
on x=-20131..-1839,y=60333..80914,z=7967..29376
|
||||
on x=9353..36272,y=59895..89044,z=-25822..3230
|
||||
on x=43168..59888,y=-66721..-49667,z=32648..46482
|
||||
on x=10941..29136,y=-72555..-53370,z=-54573..-35565
|
||||
on x=11496..31590,y=-44959..-13029,z=53082..87310
|
||||
on x=-43159..-20524,y=-3743..13835,z=-87866..-52777
|
||||
on x=26627..54751,y=-43550..-24270,z=49732..64107
|
||||
on x=28255..59585,y=43842..68816,z=-44115..-40179
|
||||
on x=-66412..-55612,y=12166..35074,z=39006..51003
|
||||
on x=6312..30405,y=57804..74608,z=39542..48278
|
||||
on x=-14943..3493,y=10401..33502,z=-94020..-67669
|
||||
on x=35476..48357,y=-61493..-38961,z=-71382..-32979
|
||||
on x=20435..28523,y=7481..28051,z=-78353..-58295
|
||||
on x=-83068..-71048,y=-23721..6279,z=-22062..-4203
|
||||
on x=-51208..-17644,y=46982..85355,z=-40990..-15261
|
||||
on x=547..20809,y=60044..87576,z=22999..55796
|
||||
on x=-17902..-14415,y=-31625..-509,z=-87372..-60462
|
||||
on x=566..30656,y=65157..93943,z=-10094..25356
|
||||
on x=-57372..-44522,y=-43215..-4269,z=47571..76802
|
||||
on x=51928..61917,y=27192..61997,z=16462..35892
|
||||
on x=-91859..-77183,y=-25309..-6900,z=-6636..4658
|
||||
on x=35451..49841,y=42840..59899,z=27902..37733
|
||||
on x=46697..63066,y=-61951..-35956,z=-43402..-31431
|
||||
on x=56820..85532,y=22368..37611,z=8181..29028
|
||||
on x=3479..28543,y=-92950..-65707,z=-20147..3586
|
||||
on x=-30715..-8102,y=-74389..-38791,z=41838..65462
|
||||
on x=53923..84954,y=21345..48479,z=-31117..-22707
|
||||
on x=30692..68472,y=51381..74010,z=-43163..-26289
|
||||
on x=3963..13629,y=-82301..-68766,z=-32189..-28695
|
||||
on x=-26230..-18986,y=48059..75879,z=33800..57890
|
||||
on x=-11868..364,y=-17805..-6376,z=-87840..-69361
|
||||
on x=-62123..-34039,y=53323..65684,z=-18759..11519
|
||||
on x=-49686..-22329,y=44482..62763,z=-50165..-42433
|
||||
on x=8295..16668,y=-21473..2954,z=72427..92773
|
||||
on x=61061..82812,y=-34561..-15760,z=12195..29626
|
||||
on x=18871..46026,y=45645..74462,z=34738..47404
|
||||
on x=45250..66555,y=-51615..-23083,z=11910..48756
|
||||
on x=-74771..-44970,y=-21127..-11037,z=-64988..-33929
|
||||
on x=-28575..-24424,y=71792..78110,z=-18221..-8555
|
||||
on x=-25338..-6923,y=-8631..16382,z=-96932..-68836
|
||||
on x=-15816..8291,y=23502..46422,z=61737..75046
|
||||
on x=24012..60280,y=-83721..-54294,z=7578..28977
|
||||
on x=11501..29155,y=3402..11782,z=75736..82902
|
||||
on x=-57546..-26246,y=36304..67304,z=-45286..-27281
|
||||
on x=-6325..5065,y=22635..45274,z=-81700..-68260
|
||||
on x=-66720..-54631,y=-61236..-46412,z=-5425..22854
|
||||
on x=-72710..-48798,y=50508..64307,z=1333..13462
|
||||
on x=13865..37998,y=51466..65722,z=36006..59077
|
||||
on x=-28281..-7465,y=-68705..-40266,z=50853..66666
|
||||
on x=-38630..-17127,y=-7930..4812,z=-74660..-58504
|
||||
on x=20647..33497,y=-62711..-45250,z=-65188..-41498
|
||||
on x=-81459..-63994,y=11465..40585,z=18212..44406
|
||||
on x=-52840..-33789,y=-40941..-18153,z=40378..62402
|
||||
on x=-53664..-41652,y=19752..32228,z=50381..70997
|
||||
on x=-1080..23636,y=-33517..-25727,z=-86099..-57148
|
||||
on x=-23319..-3146,y=24049..42456,z=-71419..-57820
|
||||
on x=9982..44125,y=-22469..-5211,z=-89475..-57073
|
||||
on x=-59300..-41829,y=25692..39878,z=-65256..-42734
|
||||
on x=-47735..-38054,y=57249..66648,z=-43826..-25726
|
||||
on x=-39553..-32542,y=5165..28643,z=55369..70627
|
||||
on x=-12872..3087,y=-36519..-10753,z=60621..76591
|
||||
on x=59192..83731,y=18036..35836,z=20877..51212
|
||||
on x=26020..48490,y=12554..14377,z=-87022..-63383
|
||||
on x=-11854..-4515,y=-12639..-5946,z=-85165..-60021
|
||||
on x=-52581..-30843,y=59055..82392,z=-11397..22455
|
||||
on x=-36423..-16444,y=29020..41390,z=-71107..-58690
|
||||
on x=55463..71190,y=-39991..-27121,z=29306..33897
|
||||
on x=-41896..-15502,y=-51414..-28802,z=-67096..-46901
|
||||
on x=21576..51776,y=-40007..-10272,z=-84715..-46191
|
||||
on x=8292..28045,y=6514..32122,z=66114..83717
|
||||
on x=-66406..-58191,y=-43227..-14898,z=-59859..-26427
|
||||
on x=65446..83471,y=-7820..13657,z=-50600..-32289
|
||||
on x=35134..36286,y=-59572..-40161,z=-60756..-35239
|
||||
on x=9254..29476,y=67387..82064,z=-6059..20274
|
||||
on x=-53418..-42461,y=-25344..-8754,z=-68658..-59076
|
||||
on x=-20702..-12302,y=61483..82828,z=-4045..12127
|
||||
on x=-15861..5533,y=65152..81160,z=13062..33238
|
||||
on x=-67682..-56916,y=-59758..-23693,z=-36108..-26134
|
||||
on x=-19546..10161,y=-85094..-56733,z=-41987..-28045
|
||||
on x=48091..80455,y=-55246..-43231,z=-2817..22958
|
||||
on x=-77749..-58276,y=50507..63707,z=-10508..8335
|
||||
on x=-64911..-37001,y=-62267..-44370,z=-47966..-28755
|
||||
on x=62326..86674,y=-51021..-17862,z=-32602..-1819
|
||||
on x=-70525..-48780,y=-47797..-19221,z=25331..55925
|
||||
on x=-50427..-25959,y=-48504..-28133,z=49547..73361
|
||||
on x=-73330..-63515,y=-35500..-23379,z=-5114..19001
|
||||
off x=51657..61655,y=-4634..27427,z=-69455..-41980
|
||||
off x=-84315..-77210,y=19373..36993,z=-21053..15930
|
||||
on x=-22479..10246,y=-36815..-4914,z=-83609..-58867
|
||||
off x=-55431..-27453,y=-5767..21070,z=60471..70160
|
||||
off x=-5688..3205,y=873..13973,z=77366..82873
|
||||
off x=-53425..-21862,y=41423..59744,z=-55084..-43328
|
||||
on x=-22427..5852,y=-74250..-39007,z=37690..67662
|
||||
on x=-63041..-49752,y=-75175..-41598,z=-28260..4287
|
||||
off x=15413..50919,y=-63278..-30199,z=54233..71948
|
||||
off x=37405..60088,y=-30130..-3727,z=50275..74270
|
||||
on x=44953..76055,y=45013..54715,z=3402..24097
|
||||
on x=4477..16728,y=585..26623,z=-96312..-73210
|
||||
off x=-60707..-37806,y=33556..55805,z=-55830..-34506
|
||||
on x=-43041..-34231,y=-75795..-62433,z=-39802..-6990
|
||||
on x=7577..34465,y=63182..75089,z=-51613..-28445
|
||||
on x=-40656..-32795,y=39054..59670,z=39143..61093
|
||||
on x=61949..77774,y=-8028..6257,z=-25989..-7928
|
||||
off x=62480..84973,y=-25581..6076,z=-51280..-37961
|
||||
on x=-72929..-40057,y=-35351..-8508,z=-65932..-29811
|
||||
off x=-65518..-39994,y=-279..16674,z=-73725..-40504
|
||||
off x=-37297..-22465,y=-75675..-45041,z=39399..60052
|
||||
off x=-52661..-19343,y=49842..69777,z=-49307..-28892
|
||||
on x=16218..47208,y=-36176..-16797,z=62683..80721
|
||||
off x=-46068..-21667,y=60526..77312,z=4157..8754
|
||||
off x=34070..60691,y=-41133..-30172,z=-53958..-38014
|
||||
off x=64392..81661,y=-45176..-23170,z=-14523..15457
|
||||
off x=-15744..-7180,y=58905..69594,z=43007..61745
|
||||
off x=-52963..-30458,y=-10496..7448,z=-83916..-66777
|
||||
off x=69857..81390,y=-25485..-7871,z=5030..29910
|
||||
on x=-60959..-46201,y=50105..71526,z=-45080..-16114
|
||||
on x=18978..27486,y=55295..76687,z=-58694..-25206
|
||||
off x=-6820..20202,y=61572..82949,z=17286..19675
|
||||
on x=1728..22714,y=-70670..-51775,z=39263..62822
|
||||
off x=-45895..-27411,y=-82575..-60562,z=-35050..-16558
|
||||
off x=34247..55770,y=-32892..-572,z=49237..79617
|
||||
off x=6279..24334,y=-76907..-57315,z=-58904..-36830
|
||||
off x=-29510..-16989,y=69568..77772,z=14319..29972
|
||||
on x=60510..76515,y=-9611..13786,z=-33980..-20539
|
||||
on x=5371..24846,y=-53948..-32082,z=-72848..-59739
|
||||
on x=-16322..-10658,y=-42921..-29325,z=-82769..-55636
|
||||
on x=-33676..-21096,y=37528..59995,z=-58072..-30498
|
||||
off x=-47215..-31769,y=55087..91254,z=-14424..-5524
|
||||
off x=51272..71648,y=-9020..25748,z=48474..57714
|
||||
on x=-14910..-9150,y=-31157..-7755,z=-86976..-75518
|
||||
off x=-55245..-27776,y=-49766..-31808,z=42101..67152
|
||||
on x=-69367..-63985,y=-2671..13295,z=-53128..-27235
|
||||
on x=58929..86759,y=24302..53114,z=-4060..16704
|
||||
off x=-47623..-41234,y=52703..55259,z=-54922..-38332
|
||||
off x=234..33436,y=-38688..-18973,z=-78624..-64983
|
||||
on x=-77931..-67269,y=-25142..-18496,z=2965..13641
|
||||
off x=-35975..-19833,y=3648..26277,z=-89061..-67038
|
||||
off x=47790..55618,y=38688..74556,z=10070..21478
|
||||
on x=40666..45048,y=-82962..-64543,z=-4571..9994
|
||||
on x=11044..15406,y=66273..95175,z=-5970..10319
|
||||
off x=27658..45091,y=-13546..1126,z=47771..81258
|
||||
off x=-51366..-27007,y=-44699..-24577,z=46267..69042
|
||||
on x=-7039..14125,y=-67429..-36525,z=55266..77835
|
||||
off x=-14528..14651,y=60280..82464,z=-5661..19789
|
||||
off x=6049..22392,y=57922..78173,z=-68277..-33899
|
||||
on x=5350..16965,y=-67738..-44461,z=50282..75195
|
||||
on x=-29214..-16694,y=-8319..-575,z=66463..75789
|
||||
off x=-15036..-8425,y=70237..95064,z=-4849..24023
|
||||
off x=-53599..-37851,y=41971..53928,z=41571..46610
|
||||
on x=-13677..2807,y=78384..91484,z=-25356..-8582
|
||||
off x=24528..48582,y=62896..85790,z=12460..18522
|
||||
on x=-48176..-33364,y=14289..15341,z=54092..87843
|
||||
on x=-46960..-30174,y=-12120..6661,z=61935..70809
|
||||
on x=3481..27256,y=12288..22963,z=-97219..-62916
|
||||
off x=-28747..5507,y=17194..46753,z=-91768..-56220
|
||||
off x=42783..58738,y=51060..58581,z=820..24693
|
||||
on x=-49353..-37799,y=6360..36216,z=48187..77532
|
||||
on x=52517..57152,y=-57632..-40065,z=-52048..-22663
|
||||
off x=45577..82271,y=-53151..-34086,z=7606..27599
|
||||
on x=-49439..-39837,y=30695..51461,z=-60976..-40779
|
||||
off x=-66635..-46630,y=49057..63361,z=3526..12518
|
||||
on x=54010..66216,y=36321..55042,z=-6269..24374
|
||||
off x=4695..7233,y=455..14476,z=62747..89572
|
||||
off x=-85493..-66739,y=2471..22091,z=-36223..-29382
|
||||
off x=7884..18171,y=-68024..-45024,z=55300..75806
|
||||
off x=43549..76092,y=49654..69738,z=1376..15517
|
||||
off x=12346..17191,y=-4032..16643,z=72903..90015
|
||||
on x=60703..73244,y=-20825..-3421,z=-57128..-36177
|
||||
off x=-9866..20026,y=16321..41773,z=60404..85148
|
||||
on x=29431..48382,y=48462..74606,z=41279..44993
|
||||
on x=62612..79405,y=-5487..10920,z=-40427..-31710
|
||||
off x=11859..30527,y=-34097..-19197,z=-73407..-51576
|
||||
off x=63862..89056,y=21916..38067,z=-5939..30841
|
||||
on x=40214..68256,y=25471..56425,z=-62984..-30420
|
||||
on x=-25366..-18100,y=66147..95119,z=3805..18767
|
||||
off x=68425..79895,y=-47516..-25384,z=15293..41106
|
||||
on x=30487..56428,y=-1794..5876,z=51906..74514
|
||||
off x=46653..51836,y=-76040..-44634,z=18181..37159
|
||||
off x=-41608..-12051,y=72020..86112,z=-8983..14501
|
||||
on x=-88247..-62536,y=-8129..11276,z=-24055..-4427
|
||||
off x=3323..10767,y=59354..66158,z=-59632..-39108
|
||||
on x=-76419..-67309,y=3713..37240,z=-37530..-11311
|
||||
off x=-2144..12919,y=-54075..-34178,z=57045..63905
|
||||
off x=62020..79582,y=-31594..-23121,z=-26597..-24909
|
||||
off x=-17401..-9352,y=73039..84740,z=-44057..-13270
|
||||
off x=-24093..-6768,y=57829..80320,z=-61101..-38285
|
||||
on x=-11495..16269,y=-13453..-6215,z=63349..88399
|
||||
on x=36287..58675,y=59742..70305,z=-17524..18377
|
||||
off x=56801..73533,y=19040..42381,z=-1979..-474
|
||||
on x=-58575..-33767,y=-25457..8768,z=-73498..-64326
|
||||
off x=-12572..14666,y=-1123..34793,z=-83475..-75872
|
||||
on x=-3033..9242,y=17802..28168,z=74794..85676
|
||||
on x=2218..27568,y=67949..82818,z=-25004..-15400
|
||||
off x=-6346..-4816,y=56884..81616,z=-27429..-3943
|
||||
on x=854..25707,y=22958..43224,z=-82067..-52397
|
||||
on x=32311..41886,y=-68875..-42153,z=-52635..-38254
|
||||
off x=26308..38287,y=-83310..-60192,z=28347..48640
|
||||
on x=-32295..-7848,y=-87573..-75370,z=-12081..5422
|
||||
on x=-42105..-23185,y=-29547..-19413,z=-72177..-51007
|
||||
on x=-14692..-9809,y=73589..83475,z=-36237..-2728
|
||||
off x=-73543..-55115,y=23711..51688,z=-3991..1464
|
||||
off x=-14534..22568,y=-54527..-44508,z=57714..69383
|
||||
on x=-63081..-39714,y=-45491..-26566,z=-49886..-38562
|
||||
off x=-93619..-68748,y=-16696..-4661,z=-30558..-4126
|
||||
on x=-66806..-44552,y=37360..55716,z=35175..52862
|
||||
on x=-6316..26070,y=-54927..-28748,z=-69954..-47453
|
||||
off x=-78871..-50085,y=17954..32161,z=-36569..-23985
|
||||
on x=6369..25338,y=67499..88203,z=-26047..-4496
|
||||
on x=24755..54569,y=-67118..-37387,z=32897..50992
|
||||
off x=46528..63982,y=-54598..-26438,z=37906..65831
|
||||
on x=4634..24098,y=-45650..-35611,z=-67709..-58572
|
||||
off x=44078..48115,y=-75447..-53188,z=-5442..33129
|
||||
off x=-62868..-56634,y=46581..58996,z=-29362..-5667
|
||||
on x=-6024..8438,y=65634..74871,z=-38003..-30673
|
||||
off x=-59956..-46026,y=41808..66700,z=10165..36114
|
||||
off x=-32873..-20372,y=-88729..-60899,z=-19758..7186
|
||||
on x=-67393..-60159,y=-56680..-32136,z=-8305..17511
|
||||
off x=-20681..3599,y=-92468..-57916,z=12916..28612
|
||||
on x=-7301..9140,y=37170..58369,z=-72713..-47101
|
||||
on x=66247..85599,y=3262..12242,z=-7260..4927
|
||||
off x=-40965..-24082,y=-82146..-62002,z=20400..46309
|
||||
off x=-70415..-51837,y=-56997..-42331,z=-875..19799
|
||||
on x=57902..75722,y=35482..60227,z=-26389..-9051
|
||||
off x=-22870..7672,y=-4882..25620,z=-87984..-60436
|
||||
on x=3155..35881,y=-80545..-67121,z=-6933..22549
|
||||
off x=-65134..-44685,y=-66218..-45701,z=21040..41162
|
||||
on x=36126..69247,y=23453..60238,z=38126..59678
|
||||
on x=55937..67003,y=6113..21587,z=45836..60761
|
||||
off x=18451..41277,y=-70926..-44655,z=-60498..-33470
|
||||
on x=-59038..-40083,y=-53819..-22588,z=-55419..-43900
|
||||
on x=-22584..6019,y=59421..80916,z=29210..42933
|
||||
on x=-33931..-15311,y=-76316..-51022,z=21445..40518
|
||||
on x=42213..72279,y=-36048..-15004,z=26488..50017
|
||||
on x=-28842..-8697,y=-68609..-44348,z=40673..64865
|
||||
off x=-7167..8781,y=-3621..17677,z=-93905..-64435
|
||||
off x=-82972..-60284,y=6678..34439,z=-3504..-1846
|
||||
off x=-67834..-53928,y=-58517..-42067,z=-42608..-8421
|
||||
off x=-4855..22956,y=9296..23886,z=-94874..-60207
|
||||
off x=-79569..-70626,y=2629..27696,z=-22941..3340
|
||||
on x=-10965..20710,y=51680..63775,z=45787..69225
|
||||
off x=46280..63357,y=42031..64449,z=3459..25386
|
||||
on x=-254..28129,y=-81371..-67737,z=21692..52613
|
||||
on x=-2383..5437,y=66740..96837,z=10033..17517
|
||||
off x=17147..30452,y=-91140..-71945,z=1097..25760
|
||||
on x=-47454..-28074,y=-77661..-55440,z=-24637..-384
|
||||
off x=-57862..-35813,y=19453..29451,z=39191..70727
|
||||
off x=-57539..-22945,y=22003..33680,z=-67047..-49723
|
||||
off x=-3162..20231,y=-54634..-42988,z=53582..62417
|
||||
on x=-81550..-64507,y=-27996..-14746,z=-10531..-7267
|
||||
off x=20586..40845,y=-81557..-67548,z=6923..34475
|
||||
off x=22518..23900,y=-66351..-34420,z=51370..64347
|
||||
on x=-49052..-35860,y=-19130..11213,z=61999..78547
|
||||
off x=-34188..-18864,y=-81419..-70168,z=-37648..-12239
|
||||
off x=77362..83490,y=2745..18791,z=8832..18419
|
||||
on x=-32402..-14262,y=68320..76432,z=-35620..-15790
|
||||
off x=67237..90757,y=4695..12771,z=-19624..10840
|
||||
off x=27845..36686,y=-50404..-33761,z=-80878..-55141
|
||||
off x=36370..69461,y=33759..65210,z=-54985..-28791
|
||||
on x=-59135..-46273,y=7474..26326,z=-65975..-58673
|
||||
on x=26877..52927,y=-79947..-54801,z=-2779..22702
|
||||
off x=-71675..-51921,y=-59152..-34586,z=-8374..19519
|
||||
on x=6403..17478,y=-75737..-58369,z=-71127..-34808
|
||||
on x=13332..40836,y=-40399..-31096,z=-85343..-51700
|
||||
off x=-67594..-49756,y=11777..23306,z=-64433..-55048
|
||||
off x=21971..44163,y=52916..80818,z=-13270..-4413
|
||||
on x=66677..74076,y=22958..42365,z=5671..22730
|
||||
on x=-17496..17047,y=2018..35721,z=62177..87439
|
||||
off x=-46335..-30771,y=12773..50699,z=45373..69810
|
||||
on x=-82592..-68036,y=-13665..-9385,z=185..18296
|
||||
off x=31849..55495,y=-68614..-40470,z=37173..62475
|
||||
on x=-57887..-33776,y=-71721..-40636,z=-45..25174
|
||||
off x=35969..44108,y=-5435..14452,z=-88200..-55792
|
||||
on x=60659..86542,y=7942..20443,z=4839..32918
|
||||
off x=50661..57689,y=-33927..-25875,z=46713..54231
|
||||
on x=-30700..-7902,y=71035..78599,z=-30964..-7588
|
||||
off x=769..24000,y=-68842..-41325,z=-63861..-53498
|
||||
on x=-83517..-62573,y=-23803..5911,z=20605..50776
|
||||
off x=-77447..-65015,y=-7232..20379,z=36322..47544
|
||||
off x=54759..77852,y=-9847..18404,z=-54569..-25017
|
||||
on x=8814..38891,y=44583..61983,z=27053..54606
|
||||
off x=-32755..-26721,y=-27446..-17253,z=-80334..-52377
|
||||
on x=23465..37441,y=-37240..-20297,z=-68128..-49025
|
||||
on x=-5136..18927,y=17373..30697,z=66878..78408
|
||||
on x=-29189..-6136,y=-76807..-52880,z=26943..52440
|
||||
"""
|
||||
|
284
2021/day23.swift
Normal file
284
2021/day23.swift
Normal file
|
@ -0,0 +1,284 @@
|
|||
|
||||
@main
|
||||
struct Day23: Puzzle {
|
||||
func run() {
|
||||
part1()
|
||||
part2()
|
||||
}
|
||||
|
||||
func part1() {
|
||||
var board = Board(height: 3)
|
||||
board.fillHomeRow(for: .a, pieces: [.c, .c])
|
||||
board.fillHomeRow(for: .b, pieces: [.b, .d])
|
||||
board.fillHomeRow(for: .c, pieces: [.a, .a])
|
||||
board.fillHomeRow(for: .d, pieces: [.d, .b])
|
||||
board.show()
|
||||
print("Part 1:", find(start: board))
|
||||
}
|
||||
|
||||
func part2() {
|
||||
var board = Board(height: 5)
|
||||
board.fillHomeRow(for: .a, pieces: [.c, .d, .d, .c])
|
||||
board.fillHomeRow(for: .b, pieces: [.b, .c, .b, .d])
|
||||
board.fillHomeRow(for: .c, pieces: [.a, .b, .a, .a])
|
||||
board.fillHomeRow(for: .d, pieces: [.d, .a, .c, .b])
|
||||
board.show()
|
||||
print("Part 2:", find(start: board))
|
||||
}
|
||||
|
||||
func find(start: Board) -> Int {
|
||||
let target = Board.makeGoal(height: start.height)
|
||||
var current = start
|
||||
var totalCost = 0
|
||||
|
||||
var possible: [Board: Int] = [:]
|
||||
var visited: Set<Board> = []
|
||||
|
||||
|
||||
while current != target {
|
||||
visited.insert(current)
|
||||
|
||||
for (next, cost) in current.possibleMoves() where !visited.contains(next) {
|
||||
possible[next] = min(possible[next, default: .max], totalCost + cost)
|
||||
}
|
||||
|
||||
(current, totalCost) = possible.min { $0.value < $1.value }!
|
||||
|
||||
possible.removeValue(forKey: current)
|
||||
}
|
||||
|
||||
return totalCost
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct Board: Hashable {
|
||||
enum Piece: CaseIterable, Hashable, CustomStringConvertible {
|
||||
case a, b, c, d
|
||||
|
||||
var homeColumn: Int {
|
||||
switch self {
|
||||
case .a:
|
||||
return 2
|
||||
case .b:
|
||||
return 4
|
||||
case .c:
|
||||
return 6
|
||||
case .d:
|
||||
return 8
|
||||
}
|
||||
}
|
||||
|
||||
var cost: Int {
|
||||
switch self {
|
||||
case .a:
|
||||
return 1
|
||||
case .b:
|
||||
return 10
|
||||
case .c:
|
||||
return 100
|
||||
case .d:
|
||||
return 1000
|
||||
}
|
||||
}
|
||||
|
||||
var sign: Character {
|
||||
switch self {
|
||||
case .a:
|
||||
return "A"
|
||||
case .b:
|
||||
return "B"
|
||||
case .c:
|
||||
return "C"
|
||||
case .d:
|
||||
return "D"
|
||||
}
|
||||
}
|
||||
|
||||
var description: String { String(sign) }
|
||||
}
|
||||
enum Cell: Hashable {
|
||||
case piece(Piece)
|
||||
case empty
|
||||
case outside
|
||||
}
|
||||
|
||||
var width = 11
|
||||
var height = 3
|
||||
|
||||
var board: [Cell]
|
||||
|
||||
init(height: Int) {
|
||||
self.height = height
|
||||
board = Array(repeating: .outside, count: width * height)
|
||||
for x in 0..<width {
|
||||
self[x, 0] = .empty
|
||||
}
|
||||
}
|
||||
|
||||
mutating func fillHomeRow(for piece: Piece, pieces: [Piece]) {
|
||||
precondition(pieces.count == height - 1)
|
||||
let x = piece.homeColumn
|
||||
for (y, piece) in pieces.enumerated() {
|
||||
self[x, y + 1] = .piece(piece)
|
||||
}
|
||||
}
|
||||
|
||||
static func makeGoal(height: Int) -> Self {
|
||||
var board = Self(height: height)
|
||||
for piece in Piece.allCases {
|
||||
for y in 1..<board.height {
|
||||
board[piece.homeColumn, y] = .piece(piece)
|
||||
}
|
||||
}
|
||||
return board
|
||||
}
|
||||
|
||||
func movablePieces() -> [(Piece, Int, Int)] {
|
||||
var result: [(Piece, Int, Int)] = []
|
||||
for x in 0..<width {
|
||||
if case .piece(let piece) = self[x, 0] {
|
||||
result.append((piece, x, 0))
|
||||
}
|
||||
}
|
||||
|
||||
for home in Piece.allCases {
|
||||
let x = home.homeColumn
|
||||
var y = 1
|
||||
while y < height, case .empty = self[x, y] {
|
||||
y += 1
|
||||
}
|
||||
if y < height, case let .piece(piece) = self[x, y] {
|
||||
result.append((piece, x, y))
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func possibleMoves() -> [(Board, Int)] {
|
||||
let pieces = movablePieces()
|
||||
.filter { !isHome(piece: $0.0, x: $0.1, y: $0.2) }
|
||||
|
||||
var result: [(Board, Int)] = []
|
||||
for (piece, x, y) in pieces {
|
||||
if let newY = freeHomeRowPosition(piece: piece), freeCorridor(from: x, to: piece.homeColumn) {
|
||||
result.append(move(piece: piece, from: (x, y), to: (piece.homeColumn, newY)))
|
||||
}
|
||||
|
||||
for newX in openCorridorPositions(x: x) {
|
||||
result.append(move(piece: piece, from: (x, y), to: (newX, 0)))
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func freeCorridor(from x0: Int, to x1: Int) -> Bool {
|
||||
let minX: Int
|
||||
let maxX: Int
|
||||
|
||||
if x0 < x1 { (minX, maxX) = (x0 + 1, x1) }
|
||||
else { (minX, maxX) = (x1, x0 - 1) }
|
||||
|
||||
for x in minX...maxX {
|
||||
if self[x, 0] != .empty {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func move(piece: Piece, from: (Int, Int), to: (Int, Int)) -> (Board, Int) {
|
||||
let (x, y) = from
|
||||
let (newX, newY) = to
|
||||
|
||||
precondition(self[newX,newY] == .empty)
|
||||
|
||||
let cost = (y + distance((x, 0), (newX, newY))) * piece.cost
|
||||
var board = self
|
||||
board[x, y] = .empty
|
||||
board[newX, newY] = .piece(piece)
|
||||
|
||||
return (board, cost)
|
||||
}
|
||||
|
||||
func freeHomeRowPosition(piece: Piece) -> Int? {
|
||||
let x = piece.homeColumn
|
||||
var depth = height - 1
|
||||
|
||||
loop: while depth > 0 {
|
||||
switch self[x, depth] {
|
||||
case .piece(piece): break
|
||||
case .piece: return nil
|
||||
case .empty: break loop
|
||||
case .outside: preconditionFailure("Invalid board")
|
||||
}
|
||||
depth -= 1
|
||||
}
|
||||
|
||||
return depth
|
||||
}
|
||||
|
||||
static let homeColumns = Set(Piece.allCases.map(\.homeColumn))
|
||||
|
||||
func openCorridorPositions(x: Int) -> [Int] {
|
||||
var xmin = x
|
||||
var xmax = x
|
||||
|
||||
while xmin > 0 && self[xmin, 0] == .empty {
|
||||
xmin -= 1
|
||||
}
|
||||
|
||||
while xmax < width && self[xmax, 0] == .empty {
|
||||
xmax += 1
|
||||
}
|
||||
|
||||
let result = (xmin..<xmax).filter { !Self.homeColumns.contains($0) && self[$0,0] == .empty }
|
||||
return result
|
||||
}
|
||||
|
||||
func distance(_ a: (Int, Int), _ b: (Int, Int)) -> Int {
|
||||
let (x0, y0) = a
|
||||
let (x1, y1) = b
|
||||
|
||||
return abs(x1 - x0) + abs(y1 - y0)
|
||||
}
|
||||
|
||||
func isHome(piece: Piece, x: Int, y: Int) -> Bool {
|
||||
guard x == piece.homeColumn && y > 0 else { return false }
|
||||
for otherY in (y + 1)..<height {
|
||||
if self[x, otherY] != .piece(piece) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func show() {
|
||||
print(String(repeating: "#", count: width + 2))
|
||||
for y in 0..<height {
|
||||
var line = ""
|
||||
for x in 0..<width {
|
||||
switch self[x, y] {
|
||||
case .outside:
|
||||
line += "#"
|
||||
case .empty: line += "."
|
||||
case .piece(let piece): line.append(piece.sign)
|
||||
}
|
||||
}
|
||||
print("#\(line)#")
|
||||
}
|
||||
print(String(repeating: "#", count: width + 2))
|
||||
}
|
||||
|
||||
subscript(x: Int, y: Int) -> Cell {
|
||||
get {
|
||||
board[x + width * y]
|
||||
}
|
||||
set {
|
||||
board[x + width * y] = newValue
|
||||
}
|
||||
}
|
||||
}
|
453
2021/day24.swift
Normal file
453
2021/day24.swift
Normal file
|
@ -0,0 +1,453 @@
|
|||
import Foundation
|
||||
|
||||
@main
|
||||
struct Day24: Puzzle {
|
||||
|
||||
func run() {
|
||||
let program = readInput()
|
||||
|
||||
var alus: [(Alu, min: Int, max: Int)] = [(Alu(), 0, 0)]
|
||||
|
||||
for instruction in program {
|
||||
if case .inp(let register) = instruction {
|
||||
buildNextAlus(&alus, register: register)
|
||||
} else {
|
||||
for index in alus.indices {
|
||||
alus[index].0.run(instruction)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let serialNumbers = alus
|
||||
.lazy
|
||||
.filter { $0.0[Alu.resultRegister] == 0 }
|
||||
|
||||
print("Part 1:", serialNumbers.map(\.max).max()!)
|
||||
print("Part 2:", serialNumbers.map(\.min).min()!)
|
||||
}
|
||||
|
||||
func buildNextAlus(_ alus: inout [(Alu, min: Int, max: Int)], register: RegisterId) {
|
||||
var table: [Alu: Int] = [:]
|
||||
|
||||
var newAlus: [(Alu, Int, Int)] = []
|
||||
|
||||
for digit: Alu.Register in 1...9 {
|
||||
for (alu, oldMin, oldMax) in alus {
|
||||
var alu = alu
|
||||
alu[register] = digit
|
||||
let newMin = oldMin * 10 + Int(digit)
|
||||
let newMax = oldMax * 10 + Int(digit)
|
||||
|
||||
if let index = table[alu] {
|
||||
newAlus[index].1 = min(newAlus[index].1, newMin)
|
||||
newAlus[index].2 = max(newAlus[index].2, newMax)
|
||||
} else {
|
||||
table[alu] = newAlus.count
|
||||
newAlus.append((alu, newMin, newMax))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print("Alu count", newAlus.count)
|
||||
alus = newAlus
|
||||
}
|
||||
|
||||
func readInput() -> [Instruction] {
|
||||
let scanner = Scanner(string: input)
|
||||
var program: [Instruction] = []
|
||||
while !scanner.isAtEnd {
|
||||
program.append(scanner.instruction())
|
||||
}
|
||||
return program
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
struct Alu: Hashable {
|
||||
static let resultRegister: RegisterId = 3
|
||||
typealias Register = Int
|
||||
var w: Register = 0
|
||||
var x: Register = 0
|
||||
var y: Register = 0
|
||||
var z: Register = 0
|
||||
|
||||
func getValue(_ operand: Operand) -> Register {
|
||||
switch operand {
|
||||
case .register(let registerId):
|
||||
return self[registerId]
|
||||
case .number(let int):
|
||||
return Register(int)
|
||||
}
|
||||
}
|
||||
|
||||
subscript(register: RegisterId) -> Register {
|
||||
_read {
|
||||
switch register {
|
||||
case 0: yield w
|
||||
case 1: yield x
|
||||
case 2: yield y
|
||||
case 3: yield z
|
||||
default: fatalError()
|
||||
}
|
||||
}
|
||||
|
||||
_modify {
|
||||
switch register {
|
||||
case 0: yield &w
|
||||
case 1: yield &x
|
||||
case 2: yield &y
|
||||
case 3: yield &z
|
||||
default: fatalError()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mutating func run(_ instruction: Instruction) {
|
||||
switch instruction {
|
||||
case .inp:
|
||||
break
|
||||
|
||||
case .add(let registerId, let operand):
|
||||
self[registerId] += getValue(operand)
|
||||
|
||||
case .mul(let registerId, let operand):
|
||||
self[registerId] *= getValue(operand)
|
||||
|
||||
case .div(let registerId, let operand):
|
||||
self[registerId] /= getValue(operand)
|
||||
|
||||
case .mod(let registerId, let operand):
|
||||
self[registerId] %= getValue(operand)
|
||||
|
||||
case .eql(let registerId, let operand):
|
||||
self[registerId] = (self[registerId] == getValue(operand)) ? 1 : 0
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
typealias RegisterId = Int
|
||||
|
||||
enum Operand {
|
||||
case register(RegisterId)
|
||||
case number(Int)
|
||||
}
|
||||
|
||||
enum Instruction {
|
||||
case inp(RegisterId)
|
||||
case add(RegisterId, Operand)
|
||||
case mul(RegisterId, Operand)
|
||||
case div(RegisterId, Operand)
|
||||
case mod(RegisterId, Operand)
|
||||
case eql(RegisterId, Operand)
|
||||
}
|
||||
|
||||
extension Scanner {
|
||||
func register() -> RegisterId? {
|
||||
|
||||
if scanString("w") != nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
if scanString("x") != nil {
|
||||
return 1
|
||||
}
|
||||
|
||||
if scanString("y") != nil {
|
||||
return 2
|
||||
}
|
||||
|
||||
if scanString("z") != nil {
|
||||
return 3
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func operand() -> Operand {
|
||||
if let register = register() {
|
||||
return .register(register)
|
||||
}
|
||||
|
||||
if let int = scanInt() {
|
||||
return .number(int)
|
||||
}
|
||||
|
||||
fatalError()
|
||||
}
|
||||
|
||||
func instruction() -> Instruction {
|
||||
guard let command = scanUpToCharacters(from: .whitespaces),
|
||||
let target = register()
|
||||
else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
switch command {
|
||||
case "inp": return .inp(target)
|
||||
case "add": return .add(target, operand())
|
||||
case "mul": return .mul(target, operand())
|
||||
case "div": return .div(target, operand())
|
||||
case "mod": return .mod(target, operand())
|
||||
case "eql": return .eql(target, operand())
|
||||
default: fatalError()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let input = """
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 14
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 8
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 15
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 11
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 13
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 2
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -10
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 11
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 14
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 1
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -3
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 5
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -14
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 10
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 12
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 6
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 14
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 1
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 1
|
||||
add x 12
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 11
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -6
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 9
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -6
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 14
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -2
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 11
|
||||
mul y x
|
||||
add z y
|
||||
inp w
|
||||
mul x 0
|
||||
add x z
|
||||
mod x 26
|
||||
div z 26
|
||||
add x -9
|
||||
eql x w
|
||||
eql x 0
|
||||
mul y 0
|
||||
add y 25
|
||||
mul y x
|
||||
add y 1
|
||||
mul z y
|
||||
mul y 0
|
||||
add y w
|
||||
add y 2
|
||||
mul y x
|
||||
add z y
|
||||
"""
|
203
2021/day25.swift
Normal file
203
2021/day25.swift
Normal file
|
@ -0,0 +1,203 @@
|
|||
@main struct Day25: Puzzle {
|
||||
func run() {
|
||||
var current = input
|
||||
var stepCount = 0
|
||||
while true {
|
||||
let (next1, count1) = step(.right, input: current)
|
||||
let (next2, count2) = step(.down, input: next1)
|
||||
|
||||
stepCount += 1
|
||||
current = next2
|
||||
|
||||
if count1 + count2 == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
print("Part 1: ", stepCount)
|
||||
}
|
||||
}
|
||||
|
||||
func step(_ space: Space, input: [Space]) -> ([Space], Int) {
|
||||
var result: [Space] = input
|
||||
|
||||
var count = 0
|
||||
for y in 0..<height {
|
||||
for x in 0..<width where input[x, y] == space {
|
||||
let tx = (x + space.dx) % width
|
||||
let ty = (y + space.dy) % height
|
||||
|
||||
if input[tx, ty] == .empty {
|
||||
result[tx, ty] = space
|
||||
result[x, y] = .empty
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (result, count)
|
||||
}
|
||||
|
||||
extension Array {
|
||||
subscript(x: Int, y: Int) -> Element {
|
||||
get {
|
||||
self[x + width * y]
|
||||
}
|
||||
|
||||
set {
|
||||
self[x + width * y] = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum Space: Character {
|
||||
case right = ">"
|
||||
case down = "v"
|
||||
case empty = "."
|
||||
|
||||
var dx: Int { self == .right ? 1 : 0 }
|
||||
var dy: Int { self == .down ? 1 : 0 }
|
||||
}
|
||||
|
||||
let width = 139
|
||||
let height = 137
|
||||
|
||||
let input = """
|
||||
>>vv..>v..>vv.....>vv...>.>...>>......v>v>.v.v..>v..v>.>v.....v..>vvvv.>.>vv>v..v>.v>..v>>>>.>vv.>>vv>.>>v..>.v.v>v>v.>vv.>.......vv.>.>>v.
|
||||
v>.>v>.v....>>v.vvv>.>>..>....>.v>.v>vv.v..v.v..v>.>.v>.>..>>v.vvvvv..>>..v.v..>>v>vv>.v..vvv.>v..v>>>v.v..>>...>vv..>>v.v>>.>v>.>.v....>>.
|
||||
v.>vv....v>..v>>..v.>>.....vv..>.vvv>.....v.v>vvv>..v>>..v...>...>...vv.v..>.vvv>>.v>vv..v.>>>....vv.>.>..v..vv.>>v>.>>.>>.v>>>>.>v.v.>v..v
|
||||
.v.>>..v...v>v.>>>>v....>.....>...v.v..>.v...>.v.....>>.v>v...>.>.>..>v>>>>.v.>..>......>.v>>.>v..>.>vv.>.v>...v.>v.>>.>...>>>..>>>.vv>..v.
|
||||
.....v.>.v>........>>.>.>vvv.vv>>.>vvv.v.>vvv.....v..>v..>vvv.>.v>.>..v..vv.>...v>>>>vv>.v..v.>..>..vvvv.>.>vvv....v>..>...v...v.v>v.>..v.v
|
||||
>..>..>..v.>>..v>..vv....>vv.vv>..>v........>..vv>.>.v.>...v.>v...vvv>.....v..vv...vv>.......v>vv.vv.>.vv..v>..v.v.>..>>>.v..vv>...v>vv..>v
|
||||
.v.>..vv>.>>v>...>.>.>..>.vvv..v>v.v>>.v...v.vv..v..vvv..vv.v.vv...>v..v....>>>>..vvv>v..>.vv.v.>...>vv>......v...>.v...v....v....>v>.>>...
|
||||
>v.v.v>>.v.>..>>v>>>v.>v.....v>...>>..v.v>.v..>>..>.vvv...>...v>>v.v....v>.vv>.>.v>.>>>.v>>.v..vvv>.vv......v.v...v...>.vvvvv>.>..>>...vv>.
|
||||
vv>..v.>>v.>.>v.>..v.v>....vv.v..>>.>>v>>..>>>>v>..v>.>.>.>......vv>vv>>>v....>.>v..>.>>vv...>>v.....>>>....>.v.v>v>..v>v.>vv.v>..>.>.>v>..
|
||||
v.v.v>v.v..vv.v..>.>v.v.v..>.>.>.>...v.v.>>v>vv.>>....>>..vv...v.v.>..v>.>v.v..v.>.>.>..>...>.vvv...v.v>....vv.>..v>.vv.....>..v>>>.>v.>..v
|
||||
v...>.>.>v>.v....vv.v>...>v>vv.>..v...>>>..>.>........>..v.>>.v.....>.vvv...>v.>>.vv>v>>>>...>.vv.>...>.>..v..>>>...v.vv.>>v....>.vvv>>v.>.
|
||||
.>...vv.v........v.v......v>vvv.vv..>...vvv..vv.>.v.v...>vv.>>...>.v..>v>vv>.>v...v.v..vvv.v>>...>.>.vv.>v>v>.v.....>.v.v.>.>v>....>v..>v.>
|
||||
..v.vvvv.v....>.vvvv.....v.v...>>v>.>.>.vv>>vv.v.v.v.>.vv>vv.>.>v.vvv.>v..v>v.>...>.>>....>.v>...vv...>v>vv...vv>>vvvv..v.v.v>>.>v>..>v>>v.
|
||||
..>...v.v.....v.v.v>..>..v.>>>..v>v....>v>v..v>.v....>vv>..>.>.....v..>>v..>>v>...>v>v..>.v.>>....>vv.>...vv.........>v>.v..>>v.v.v>>v.v>>>
|
||||
vv>.v.v>vv.........v..>..>>>>v...>..v...v..v>..vvvv....v.v...v>..>>v.>.v.>v.v.v>..>....>...>v>>vv...>...>>>..vvvv..>.>>v.v>...v..>.v..v.v..
|
||||
.>.>vvv..v.>.v>.........v...>..v.>....v.v>.v.v.v..>.>.v..v...v.......v...vv.v.v..v..v>..v..>>>.v.v>...>..>.>>>v>>..>>..>..v...>v....>.....>
|
||||
v.v.vv.vv>..>>v.>>.>.>>v..>v.vv...>vv....>.>....v...v...>v...>..v>.v>v...>..vv>>..vvv>....>vv>vv>.....>v>>v.>>v..>.v...v..v>>..>.v..v..v...
|
||||
vv...>v.>...vv>.>.v>..v.....v.>...>.>v.>vvv>>>.>>.........>.>..>...v>..vv..v.v.v.>vv.v>>...>>.v..v>v......>v>v.v...vv....>>>..>>v>.vv......
|
||||
v>.v..v..>.v>>....>.>.>>v>.v.>v.v>.v.>v.v>..v>.>.v>v......>>.>......v..v.v.>.v>>v...>v>>..v....>.v..vv>...>.v..>....v.>.>......v.>.>v>v>..>
|
||||
>>v>.>>..vv>.>>v.v.>v.v...vv.>>.>>..v...v>v....vv...>>>.v>..vvvv.vv>v>>...v....vv.>.>.v....v>...>vv...v.>.v.vvv.v>.vvv>>vvv>.......>.>.vv.v
|
||||
...vv>v.v>..>.>.v...vvvv..vvv..>.v>..>.>v.>>>v....>..v>.vvv.>..v.>.>.v....>.......vvvv>.v>.>v.>>>.>vv..>.vv.>>...v..>>v.>>.>v..>vv.>v.>.>>.
|
||||
>.>>v>>>.....>vvv>.vv.>v..>.>..v>>...>>v..>....>>>v..>.>v..>>v>v.>.>v.vv.v>vv..v>v>>>v.>...>...>>>.v>.v>>>v..vv>v>>>>>v>>.........>v.v>.>>>
|
||||
.......vv....>v..>..v>v.>.v.v.v>>...v.v.v...v>v.>...v...v.v...>>>.v...>v.v>>.v.>....>>>..>.>v...v....>..>.v..>.v>.>..>>>.v>>.>v.>v>.>.v..>.
|
||||
..v.v...vvv..>>>vv....>>..>.v>..>>...v.>>v..v...v..v.>>.>...v>..>.........v.>..>.vv.>.v..>.>v.>v>.v.v.vv.>...>v..>.v.v.v...v..>.vv...vv>.v>
|
||||
v....>v.v>...>...>>.......v....vv>>....>....v...v>>.>v.>....>.>.vv>v.>>..>..>...v>v.v.>>>..>.>>..v>.>...>.v..........>..>>>.>v.v.>.v>.>>...
|
||||
>>.>.....v...>.>>>vvv>.>>>.v>.v>v..>v..vv>..v>vv.>.v.>v.....>>>v.v.>v.>..>>v..>>..v.v..v.v.>>.v.>..v..>.....v...v>..>>>.v..v....v.....v.>..
|
||||
....vv..vv.>..vv..>.>..v..v>.v.>v.>>.v...>.v..vv.>v.>>v...>...>..>v>.>...>vv.>.vv..v..>v>v>.v.>..>.>v>....v.>.v>..v...v>..v>>.>..vv.v>v.>.>
|
||||
v.....>>.>v>v..v..>>v>v>>vvv.v..>....>.>>..vv.....>>..>.....vv>.......v>.>.v..>..v>.v.>.>.>...>.v..v.>>..v.v.vvvv>.v..vv>.>v..>v.v>>.vv...>
|
||||
v>.v.>>...v.>..v.v>v.vv>..>...>v>>v.v>.v.>..v.>....>.>>v>.>>>vv.>..vvvv..>..>>>...>.....v>..v>>..v.v>..>>v....>.v.v..vv...>....>vv.>.vvvv>.
|
||||
vv>v>>..>v>>.vvv..>v>vv..>>.vv.v>vv>.v..vv.v...>>....>.v.v>>.>>.>v...v.>...v>>>.v.vv>>v...v.>>..v..vv..v.....>>>.>>v.v>..>.vv>>..>.>.....>.
|
||||
....vvv>..vv....v...v.v>v>>vvv>.v..vv.>>....>.>.v...>..>....v>...>..>v>vv..>..>>..v..>vv....vvv.>vvvv..v....>....>vv.vvvv.v..>vv.v.>v>.vvv>
|
||||
>>>>v>v.....vv..>v.v>>.v.v.>..vv.v>>...>v.v..v.v...v>>.>v.v...>..>.>>..>.>v.>>vv.vv.v....v>.v..v....v.v..v.>>....v.>>>>.......>v....>vv.>v.
|
||||
....v.v.>..v..>vv..v.>>>>.....vvv...v>>.v>..v.>.v>v..v.>v...v.>>>>.>..>..vv.v>.v>..>.>v.....v..>>..>.>v.v..v>v.>>.....>v.v>v.v.vvvv.>.v>>>>
|
||||
>.>>.vv....>>.>..>........>.>.v...v.>.v......>.>..v.>..v..vv>.vv...vv...v.>v.>....>>......>>>.>vv>.v.>..>vvv...vv.....v>vvv.v...>.vvv.v.>>.
|
||||
....v>...v...v.v...v...>...>.>v>v.>>...>...v>vv..vv.>.vv>...>v>..>>..>.>v..v>..>.>....v>..v...vv>.vv.>>.v>v.vvvv>.....v.v..>.v..vv>v>>v.>>v
|
||||
v>..>>v>v.......v.......>v>.>.>.>.v.>>.v.>v>.vv.v.v.v>.v>.v...v.>>..v.....vv.vv...v.>.....>...>..>>>v..v.v>.v>v>v.>..v>v.>.>..v>...>..>v..v
|
||||
.>..>>vv.>vv.v>v..v>>>....>>v.v..vv>>...>v....v>vvv>.....>.>.>..>v.>...vvv....v...vv..v.>...>...v.vvv..>>..>v.vv>.vvv>.>.>.v.>..>v.>vv..vv>
|
||||
....>vv.>>>.v..>>v.>vvv...v..>v..vv...vvv.v.vv.v.....>.>vv..v>..>....vvv>..>>.>.....>>>..>v....>..v.>v.v>.>>.v...vv>.v>.v>.v>v....v...vv..v
|
||||
>.v>....>>.>>...vv..v.>..>.v..>.v>..>.v.v.>v....v>>.v...>>v..>.>>vv..>v>>>.>..v>.>..>.vv.v....>.>.v...>.v.vv>v>v.vv..>.vv.v..vv...>.v..vv>>
|
||||
..v.vvvv.>>>.......>>>...........v.>.>>>v>v.>....>vv.>.v>..v..>>.>.v.vv>...v...vvvv.>v>vv...>>>.v.v....v.>.>..v.>>>>..>..v..>>..>>.>>>.>>..
|
||||
v>v>v....vv..v>v.>v..v.v..v..>.v.>>..>>v>....>...v.....>..>.vv.v.vv....>....vvv>.v.v.....>>v>...v.v>.>>>.vvv>>v.>>>.>v...v>.v..>......>>vvv
|
||||
.>.v.>..>>..>..v..v>v>...vvv>v>>v>.>.>..v>>...>v....v.v...v>vv>>v.v.v.>v>>..>...vvv.....v>>....v...v.v>.v.>...v>.vv...>v......v>>.v>vvv.vvv
|
||||
.v>.vv.>>..v.>.>...v>.v.>>.vv..>>>....>.>.>.vv..vv.....>v...v.>.>.....vv.v...>.v>v.vv>.>>v..v>>vvv>vv>>..v.v>>..>.>>>>v>...>v.v>.>v...vv...
|
||||
>>vv>...v.v>..v..>vv..v>...>......>..v.>.v.v>v........v.>vv>v..v>.v.>.v.vv..v....v.>...v>.v>v.v>...>..v....>....>>>v>>vv...vv>vv.>..>.>....
|
||||
.>.>>.>>.>.v>>...>.....>v..>.>vv.>.>v...vv..vvv....v.vv>v...v>.vv>.......v>.v.>....v>...vvv.>.v...v..>v.>>..v...v.>..v..>.>v...v>v>v>..>v>.
|
||||
..v..v..v.vv>.v..v.....v.>...v>..>..v.>>>v>>v..>.>...>.v.>...>vv>.v..v...>v>v...>v>v.v>v>>v.>v..>..>vv..v>v.v.v.vvvv.>v>>>.>v>v.v...>v..>>>
|
||||
..vvv>>..>v..v>>...v.>..v>>>>.....v.>>.........>....>.>..vv...v>..v.>......>.v>.v>..>..>>.vv.>>.>..v.>v...v>.>>>.v>.>.>.>v.>.....>>>vvvv>.v
|
||||
v..v...vv...>>>>....v..>..v>..>.............>v..v.........vv.>.v>vv...v.v.>>v...>...>..vv....v...>..>..>...>v.....v.>v.>..>>.vv.......>>...
|
||||
...>...>vv>>>.v>......v.>>>>>..>.>>..v>v>.>..v>>>v.>>......v.vv..vv.>>vv>v.v.>>>v>>.vvvv.>v...v..vvv>vv.....v...v>..vv...>...>>>..v.......v
|
||||
v>.>>.>v.v>>..v>v....v>>>...v.v>..v..v>>.v..v.v.vvv.v>..>..v.vv...v.v....>..v.>vv>v>..>..>vvvv.>.v.......>v>>...>.>..v>v>.>>>v..>v>..>.....
|
||||
..>.>.>>...>.v.>v..v..>...>..>v.>v.>..vv..v..>>..v.>>...>v...vv>>>>.>.v..v...>.v>.>v>...v.v.v>.vv......v..>v.....>.>.>.>.>>vv>>...>>.v.v.>.
|
||||
v.>>>...vv>.>v>.>>v......>>>v.v..>.>.>v>>v>.v.vv.v>>.....>.>.vv.>>v>v......v>>v.v.>>..vv..v..>.v..>.>.>>>.vvv.>v..>..v...>.v.vv>>..v...v..>
|
||||
vv.>.......v.v.....>.>.v.>>>vv..>v.v..>..v.v>vv.v>>..vv..vvv...>..>>.>.v..>.v>.>>v>.vv>.>v>vv.....v....>v>v>.v>.v..vv..v>.vv..v>...vvv..>.>
|
||||
..v......v..v.>........v...>..v>v>.v....>..v>.>>v>.>>....>>>>.>.>v>..>.v>vv>>.v....>..>.>v>..v....v>>.>.vvvv.vv....>v.v>..vv.......>>.>.>.>
|
||||
.>....v..>..vv....>.>....>vv>......v.>.vv...v>>....>>.v>.v>.>..>.>>..v..>....v.>>vvv..v.>>>>>.>>v..vv>v.v...vv.v.v>...>...v>.>vv.vv...v.>v.
|
||||
>v>.>.>v>v>v......>.>>v....v.>.v.....v..>.v>v..>.v..>>.v>>v>.....>>>.>v....>vv.v.v>v..vv..v>vvvvv...>>>...>..>.v...>.>>..v>v..>vv.>..>.v...
|
||||
v..>v.>..v..v>....v.>.>v..>....v>v.>.....>>vv.>>v...>v>.>v..vv.>>...v.>>..>v.>.>>.>>>>....v.>.vv>>v.....>.v....>.>..v>v..>.....>...>>.v....
|
||||
>.v>.vv..>..v.>.....vv.vv.v>>...v>>v..>.v..v..>>v.>.vv...>.v.>..>>v..v..v....v>.>..>.v>v.>......vv..>...>.v>v.....>.>>>.v.v....>>>.>>.vv>>>
|
||||
>..v>>...>.v..v.>..>v...v...v>..>.>v.v>.>.vvv.v..>.>..>>.>.>v.>vv....v>>.v>>.v>.v.v>v.v>..>.vv...vv.>.v......>>>v.>..>v..v....>v..>>...>.v>
|
||||
...v>.>vv>..v>v>.vv>.>.>..v......>>v.>.>>.vv>v>.v.v.v.>>..>..>>.v.>.v.>.....v..>..v.>>..v>v>>.>.>.vv.v>vvvvvv.>v>.>>v..v.>.v.>.>>..v.>..vvv
|
||||
v>..v.>v.......>.v.v>v>v.v.....v>.v>...>v>.>.>.v.vv..>v.>>..v>...v>.>.v>>.vv.v...v....vv.>..>.v>>...v..>>>.v>v....>v.>..>.v...v...>.>..v>..
|
||||
v>vvvv>vvv.>>...>>.>.v..v....v.>v......>.v.>>.vv....>v>>>>..v......>vv>...>>>.v.v.v>>v..vvv>....>..>v.>v...v.v..>..vv..>>.v..v..>.>.v.>v.>.
|
||||
......v.>....vv>>>.vv..>.>v>.v....>v..>..>.v.....vv>v....v>.v.vvvv.>.v...vv>.v.vv..>v.v.>>vvv...>vv.v>.v>.v..>.>.>.>>>..v.v>v>vv.vv>.......
|
||||
>...>v..v..>vv>.v....>.v>.v.v.>..>v>.>..v.>.>v.>.>.v..v.v.>v>>v.>v.>....vv.v..v.>..>>...>...v>>..>....v.v>>v.v>v>.>.v..v.>..v.>>>...>......
|
||||
....v>>v...v..>.v>.>.v..>>.>.>v..v>.>....v.v>..v>>vv>..vvvv>>...v....vv..>..v.vvv.>.vvvv>....v.>.>v...v...>....v..>.v>vv.v.vvv..v.v>.vvv>..
|
||||
...v.vv.>v>>v>>.v>..v>.vvv>v>>...v>v>v>.v.>.v..v>.vv>v.v....>.>>vvv..vvv>.v.vv..>..>...>v.>.v.v....v....v>>...v..>.vv.vv.vv.>.>.vv..v.>.>vv
|
||||
>....vvv>>..v.>.v.v>v.>.v>>>..>.>.vvv.>.>>vv>v.v.>..>...v.v>..v..v.v>v>........v.vv...v>v.>>..>.>...>v..vv>>.>>.>....>vvv>..>.>>....>..>v..
|
||||
v>>.>>v.>>vvv...v.>.....>.vv...v>>v..v..v.v>>.>..>>v.>>.>.>vvvv..vvvv.>v....>>....vv..v.v>v.>.>..v.>v...vv.>>.>>v.>...vv...v...v.v.>.vv.>..
|
||||
v..>>>v.>>...v>.>v>..v.v>.>..>>..vvv.v....v>v..>...v>>>.>.vv>v>v.v....vv.vv>>.........>........v.vv>.>v.vv.v.v..>vvvvvv...vv..>>>......v>..
|
||||
v>.....vvv>.vv>vv.>vv>v...>>v..>..>vvv..vvv....vvvvvvv.>v.>>..>v>>>>...>..v>.v..........>v>...>v>>..v..>>v....vvv..>......vv..v.>>v........
|
||||
v.....v>....>>v>.vv.>>v.vvv.v>>v>.>..v..>.v>.vv....>>>v>.>vvv>.v.>..>.>>.v.vv..>>.vv.>>.>.>>.>.vv>>..v.v.>.>........>vv>>v.>..>vv.>...vv.>v
|
||||
>v..>v.....v.....v..v>.v>v.>..>v.v>>>..v.v.>.>.v....>...v.>>v>v>..>..v>>.v......v>.v.v>.v..>v>..>.....vv.>>..>v.vv.vv.....>>.v..>.....v..>.
|
||||
.>.>>vv>...>>vv.>..>>.v.>v.>vv>.v>>...>..>....v>.v.v>vvv>.v.>>>..v.>.v...v..>......v...>.>>>v..>v.v.>..>.>>..vv.>v....vvv>.>.>>>>..>.vv...v
|
||||
>......>...v>..>.v.v>.vvv.v>v>..>...>vv..vv>v>>>...vv.>.vv.v>vv..v.v>v.v>>>.>v.>>.>>.v..>.>.>.>..>.vv..vv.v.v.....>..>v..v.vvvv>v......>.>v
|
||||
..v.v>v.>v.>v>vv>>.>..>..>v>>.vv...>....>v.v.v.vv.....>.>vv....>..v>.>.>.>.>..>>v>v...>....v.vv.>>.v>.>..>>.>v..vvv>....v.>.....v>.>...v..v
|
||||
v...>v....v....>..v....>vv.>.v.v.vv.......vv.v...>vv>>..>...>.....v.v>.v.v>>.....>>.v.....v.>.vv.v>.>.v..vv...v....>>.v.vvv.v....>.....>>.>
|
||||
...v.v>.>..>.>.>...vv....>....>v....>.>>vv..>v>v..>...>..v..v.>>>v>>vv...v..>>.>>..v.v.>>.>.v.>...>....v.>.>v.>...>>v....>>.>v.v......>>..v
|
||||
..vv.v.....v>...>..v...vv.........>.....v..vv>....>vvvv..>v>v.>>>>v.v>..v.v.>..>...>v...>.>...>.>v>>...vv.v..v.>>.....>....v>v>v..>..vv....
|
||||
..>v>>.>..v.....>v.v.v.v>.>.>v.v.>>>>vv>......>.v.v.>>.>.v>>..vv..v.>...>..v>v.>v>>vvv..v..vv.>.>...>>....v>v..v.......>v.vvvvv...>.>>..>..
|
||||
v.v..>>v..>.>v..>..v.>...>v.....>vvv..>.>v.v....>.v.v>..>.v>.>.>vvv..>..v...>...v>v.....>v..v.v.>vv..>>...>.v>..v>>.v..v.v>..v>..vvv>..>.v.
|
||||
.v.vvvvv.>.>>>>vvv>>v>>>....>vv..>..v>..v>>v...>..>v.vvv>....>.v.....>....>.v>.>vv.v>vv..>..>...vv>.v.>>..v.v.v>.>v>.>v>..v..>.>v...v>.v..>
|
||||
.v.v>..>....>.v>vv..>.>>.....>.>..>v>..vvv.v.v>..vv.>.>>.>..v.>>.>............v.vvv>.v>>>..v..>...>.>v>>...v..v.v...>>v>.>..>>v.v>v..>.>v>.
|
||||
v>>..v.>v.v.>.>>v......>v...>>...>>>..v...v...>.v...v>>v>>>>vv.>>..>...v....>>...>vv.>v...v.....vv.v.v..v.>...v.v.>....>.>..>v...>.>>.....v
|
||||
>.v.>.v...v.....>v.vv....>v.>.v.v.v....>.........>v..>....v.vv.v>.v.>...vvv.v.>>>vv.....>.....vv.>>>.>>.v>..>..>.>v.....vvv>v>....v.>..>.>v
|
||||
v>v.v.>...>.vv..>>.>>.>..v.>.>v.>.v..v>v.>.v.>..vv..>>v..>..v>.v.......v..v..v.>vv.>>v...>....v>..vv.>>..vv.v....v>...v.v....v>.>..v..vv.v.
|
||||
..>.v.v.>v...>>v>.>.>.vv..>..>v.....v.>>vv..v.>.>..>>..>.vv..v.v..vv...>>.vv>v...>vv>>>v....>vv.v.....>>.vvv.v>>>v....vv.v..v..>.>.v..>..>>
|
||||
v>..v>.>..>..>....>>v...v..v>..>..>v..>.v>...v...>.>.>.>...>...v.v>..v.>v>.>vv..>..vvv..v>vvv.>..v.v.v.>v..>>>>....v>>>>>v.v..v>>...v..v..v
|
||||
.>....v>.>...v.v>.....>v....>......>>..v..v..>>vv.vv.v.v.v......>..>.vvv.>>..>v.v.>.>.....v>.>.>>>.>.vv.....v>v.>>v....vv.>.v.v.v....v...>.
|
||||
v>v.....>.vvv.>....>.>>vv.>>vv>>>.v>>vv>..>..vv...>>>vv>>>..v..vv.>...vvvv>....>......v.v..v.v>..vvv..>.v>.v..>.v...v.vvvv>...v.v>.>>....>.
|
||||
>>.>v..v.>.v.>...>>.>..>vv.....>v...v...>..>>..>v>..vv>..v.vv>.v.....v....>v..>v.v.>....>>vv>...>v>>..vvv>.......vv..>.v>v.vv>vvvv...>v..>>
|
||||
..vv..>..vv.v>..v>>>>v....>>......>..v.v...v.v>vvv.>>>>vv..>v..>>..>.>.>v.v.>.>vvv>.v.v..vv...v.....v..vv.v....v.>.v.v.v>>v....v.....v.v>vv
|
||||
..v.v.>>....v...v>.>.....v.v>....v...v..v..v>.>vv.>v.v>v.v..>>>.v>.>>v>..v>vv.>vv......>v.v.........v..v>v>.vvv.>v>v..>v.v..v.vv.vv>.v>>.>.
|
||||
v...v.>v>.>..>v>..>>v.>.v>.v>.>.v....vv>..>..vv.>..>v..>v.vv.>.>..>>v..v>.>.....>....>>..vv.>>..>.>....>vv.v..v>.vv.vvv...>.>>......>>..v..
|
||||
.v..>>...>>..>...>v.>....>>..>.v..>>..>.>..>v>.v>.v.v..>v.>>v>...v.>.v..>..>....>...>.>.>.v....>vv>>>.>v>.vv...>.v.v>v..>>vv..>.>v.v.v.>.v>
|
||||
v..v...v..vv.>.>.vv...vv.v..>>vv.>..v.v>.>v..>>.>..>>...v..v.>>>.v>>...v.>v.v>>v..>..v>>>v.v..>..v.>vvv..v>>...v..>...>...>>..v..vvv>.>....
|
||||
...vv.v.>.....>>>vv.....v.>..v..>v..>>v>..>.>.v>.v..>>v.vv>>v...vv..>vv.>.v..v>v....>>....v.>>v...>>.v.v>>v..v.v..v>>>>vv>>..>...>v.....v.>
|
||||
>>.v..v.>.vv..v.>.v>.>.v>.v>>.>>v.>>..>..>.vvvv>>.v.>>..vv...>vv>.v.>...v>...>.v..>v>.v>v..>>>>.....v.>..v.vv.v.>....v.>.vvv.v>v>..>.>>v>.v
|
||||
....>.v>>..v.vv...>.v...v>....>v>..v>.>>...>>..vvv.>.vv>>>>v.vv>..>..>vv.v>>..>.>>>>..vv>>.>.....>.v.v>...>.>>>..vv..v...>.>..>>v..v.....>>
|
||||
>>>.v.v.>>.v..>v.v......>.v>..v>.>>..v>v...v...v>v>..v.>.v...>>v>.>..v...v>..>.>vv.>v.vvv>>.v>..........v.........>.v..>.>...v.....>..>..v.
|
||||
>.>>>>vv.>>..>.v>...vv..vv>..v>.>>.vv>.>..v...v>...>>.....>v.vv...>>.v>>>.v...>.>v>v.vv.....>>.v>.v...v>>.....>..>>v..v>.v....>v...v.....>v
|
||||
.v..>.v.v..>.v..v..v.>..v.v>v.v>>vv>vv...>..v.v.....>>..v.v>.v>>.>vv....>>>.>>vv>......v>>..v..>.>v>.>>>....v>vv..>.....>>vv.v..>..v...vv.v
|
||||
..v.>.>.>v>.v>.>...>..vv..vvv....v.vv..v....>.>.v.v...>....>v>v....v.v..v>vv...v>>v.v....v.v.>..vv..vv.v>>>..v....>>.v>.>.>v...v.v>>>>.v...
|
||||
v.v..>>.>vv.v>......>v>.>..v>.v.>...>......vv..vvv.v..>...v..v>.>.v>v...v..>....>.>.v.v..vv.>v.>v>.vv>v...v>.vv..v..v...>>.v.v....>>..>>vv.
|
||||
.vv...vvvv.>.v...v.>.v.>v......>vvv>>v..v>vv.>>.v>v.vv..>.>..>......v>...v.>>>>>.vvv.>>v...>>>v..v.v>>v>...>.....>vv..v.>v>......>>>v...vv>
|
||||
....>>...v>...>v>>>>v>>>.....>....>.>.>..>>..vv...vv...v.>vv.>>>...>>.>..v>>vv.v.>..vv..>.>v..v.>.v>..>.vv.>v>v>.>...v..v.v...v>.>v...v>>>.
|
||||
.v.v.v.v>.......v.vv......v..v.vv>>>...>..v.>.>..>......>v..>v>v>vv.>.v.v.>.v.>..v>.v.>>>v..>>..>.v..>...vv>.>>v>.....v..v.>.>.....vvv>..>.
|
||||
v.....vv>vv>.>vvv..>>...>>v.>v.vv...>....vv.v>>>vv>.>>v.v>>vv.vvv>.>>..>vv>.v...v...v...>...>.>>vv>>v...vvvvvv>..v..>.v..>>>..>.vvv...>vv>v
|
||||
>..>>>.vvv..vv>>...v.v>...>...vv...>>v.v.>v....v>.....>v.v.>...>v>vv>>.>>.>.>..>v>..v.>>v.v.v.>...>>vv.>>.>.>..v>.v.v....vv..v>.>...v>v.>.>
|
||||
>v>...v..vv...>.>.v.>>...v>>>.>v.v.v.v.>...vvv.>.v....v....>....v>v>.>vv.>v...v>...v.......>.v.......>v..v...v>.>..v>..>..v>.v..>vv.>v>vv..
|
||||
vv.>>..v>>vv.v..v.vv>>>>>v>>......v..v...v>vv>>v.v..>.v>vv>v..v......>>>>v>v..>v>.v..v.>..v....vv..v...v>>>..>....>...v...>>>.vv>..>v....>>
|
||||
..>.v.v.>>.vv...>v>>>v>>.v..>>.>>>.....>>.vv>v>>>>...v...v...v.>>..>>..>>v.>>>>v...>.>v..>.>.>..>.v.>..>v>v.v.vvv>....vvv.v..v.v...v.v>v...
|
||||
>v.>>>.v.>v.v.>.>v>.v>.>>>vvv.>.v>..>vvv..v..>.>.vv>v.>..vv..v...v.>>v.v>..>.>vv.v.vvv.v...vv>v.vv..>v.v>..vv...>>.......v....>>...>vv..vv>
|
||||
vv>.>v>.v.vv..>.>.>..>>vv>>v>......v>.v.v>.v.v.....>.>>..>v>v.>>.>..>v.v>v.v>...vv>v>...>>vv..>.>.>>.>>.v.v...vv....>v.v..v>v.>>..v>>..v.>.
|
||||
.>v>.v.>>...v....>...v..>v>v.>...v.>.....v.>.>.>v......v>>.>v.>.v..>.>>...v..vv..>v..v.>..vv>>..>.>.v..vv.>.>.....>....>.vv.v...v.>v.>v..v>
|
||||
>v>.>vv..>.>>v>..>v>v.>...>.v.vv>>.>.vvv..>...>....v>.>vv>>..>>>.v>>v>.v..>..v..v>...v.>v...>>..v>>..>.v.>>..v..vv..vv.....v.v..v..vvv....v
|
||||
vv....>vvv.>.>>>....>.>v>.>vv..v>.>..>.>v>.vv.v.vv.>v>.>>.>>vv>>.....v....>>>vv>>....>vv.v..>.v.vv>..>v....>.>>>>..>.>..vvvv.v.......v...v.
|
||||
>>..>.>.>vvvv>.>v>>v.v.>>>.v>..>.>.....v>.....vv.>...>>v.>v.>>...>>.>.vvvv>v.....v>v.v>>..v..>..>>.v.>.>...v>...vv>.>v>..vvv......v.>v....>
|
||||
.vvv...vv.>.>.v..vv>>.>...v>.vv....vv.v..v>........>v.>>>...>.>.....v..>.v.>v.v..>..v..v>.>..>>>vv>..>.v...v>...vvv.v.v.>.v.vv..>>>v..v.>v.
|
||||
>v.v>>>....vv>v..v..vv>.v.>.....vv.>..v..v>vvv.>>v.v.>.>.>v.>..v>v.v>.v.v...v..v.>.v.>v.>v>.v>v.........v..>v.>v>v.v.v.>..>.>....vvvvvv>.>.
|
||||
...vv.>v.vv.>v>..v..v.>v>v..>.....>.>>.v.>>.>..>>.v.vv..>v.v>v..>v...v.vv.>.>.v>vv...vv.vv.v.vvv...>v>vvv......v...>>>>.>.v>..vv..>.v>>>..>
|
||||
>.v...v....v.vv.....>>v..>....vv..vv....>..>>..>.>vvvvv>v..>.>>>>>..>v..v.>>>.v>....v..v>...>...vvvvv...>>.......>>vvvv.>v..v...>..>>>.....
|
||||
.v.>v..>vv...v>......>vv..v.....v....>.vv.>vvvv.>v>v.>.>v..v......v.>>.>....v.>>v>>v.>v>>v....>.v>.v>...v>.v>v>.>..v>...>>>v>..>>>>>...v.v>
|
||||
.>>.v>.>.>>>..v.v.v.v>>v..v>.>>v..v>v>>.>>......>v>..>.>vvv.>...>>...>.>>.>>..>>v.....v..>......>...v>vv..v>..v>.vvv.vvv....>.>..vv>>..v>v.
|
||||
v.>.....v>>vv.v.v>>vvvv.>>vvv...>v>.v.v...>..>>v.>v>.>v>>>....>v..v..v>..>..vv>>.v.v.vv.v..v....v>.v.v.vv...v...>.>.>v....v.>>v..vv.>>.>...
|
||||
>v>vv.>v...>.v..v.vvv>.>.>>vv>..>>>...>v.>v..vv>vv..v.>>v.>v>v.>..>...v..v>>>vv..>>v...>.v.>.v.>.v>.v.>.>v...v>>>v..vv..v>.v>.vvvv>v.>.v.>.
|
||||
.>..v..>.vv.>vv.>v.>......>..v....v>.v>vv>...>vv....v...>v>.v..vv>>.......v>v.>v>>....v.>....vv.vv..>.>>v.v...>.>v.>.v.vv.>.>v...v..>>.v...
|
||||
>.....vv...>v.>v>.>>.vv>>>..vvv.>vvv>..>v..v..v>v>>vvv>v>>..>>v..>..v.v.>v..>...v>.>v....v.v>>..v....v.vvvv...>....v.>..v.>v....v.>.>vv...>
|
||||
>v..>>.v>>.vv>..>v.>..>>v>v..>..v...>>v.v.>v............>vv.v.vv..>>vv...>..>>.>...v.v>>..>>v..v>.vv..v.v>v..>.vv>>.>>>v>.v>>.>v.vv>..v.v.>
|
||||
.v..vv....v..v.v.v.........v>>.>v...>v..v>.v.>..vv>...v...v.vv.v>v..>..vv.vv..>vv.v.>.v>vv.>..........>>vv...>v>.....vv..v.>.>v.v>...>....v
|
||||
.>>.>...v.>v....>.....v>.>v.>.....v.>>..v...>.>v.>>.>>>.vv..>>.>v..v>.>>...>..>.vv.v....>.v..>vv.v...>>.v>.vvv.>.>v.vv..v.>.>>>>.>>...v>v..
|
||||
...vv>>>v..>..v>vv.>.>>v..v>vvv>..vv.>v>.v..vvvvv.....vv>>.v>v..>..>>.v.v...v...v...>v.v..vv.v.>v>.>v..>v.>.vvv..>.>.v..>.vv..>v>...>>v.>..
|
||||
v.vv.>>>..v>.vv>...v>....>v>..>v.>.....>vv..>>......>>.>.vv.v..>>..>.>.v.....vv..v.v.....>.v>v.>.>>.>.v>>>.v.>..v..vv..>.v...>..v.>.>>..v.v
|
||||
..vv...v.>v>.........v>>v.....v..vv.>vv.>.>.>...>>.......>...vv.>vv>.....v.>>.>......>....>>.vv..>....vv.v.vv..v..v....>...v.......>v>..>.>
|
||||
.>.v..v.....>.>>.v.>>...v.>.v>.v>..v....>>v>>v>.>..>.v.vv.v.>..v>>...vv.v.>>>...v.>>.v>vv.v.vv...>v.>>....v.v....vv>.v.v...>...>...>v.>v...
|
||||
.v.vv>>v.v.vv>..>.>.>.v.v.>.....vv>>v>vvv.....>>>v.>.v..>>..>.vv>v..v.>vv.>v.>..v.>vv>v>...v>v>>.v.>.....>..v>.>..v>v..........vv......>.vv
|
||||
.vv..>>>>..v.>.v.>..>.v>.....v.>>v.>.......vv>>v.v>..>>.>v>>>.....>..v......>..v>.vv.>.v.>v>.>.v....>v.>v.v.v..v.vv...v.vv>.v>.....>..v>..v
|
||||
.v..v>v>>....v....vv>...vv..v>...v..>...>...>..>v..>>>.vv.v....v...>v.>.......v.v.>v....v..v>...........v..>v>>.>.>>v....v.>.v...v.>.v>..v.
|
||||
""".compactMap { Space(rawValue: $0) }
|
||||
|
1078
2021/day3.hs
Normal file
1078
2021/day3.hs
Normal file
File diff suppressed because it is too large
Load diff
788
2021/day4.hs
Normal file
788
2021/day4.hs
Normal file
|
@ -0,0 +1,788 @@
|
|||
import Data.Maybe ( catMaybes )
|
||||
import Data.List ( find )
|
||||
|
||||
randoms :: [Int]
|
||||
randoms = [13,47,64,52,60,69,80,85,57,1,2,6,30,81,86,40,27,26,97,77,70,92,43,94,8,78,3,88,93,17,55,49,32,59,51,28,33,41,83,67,11,91,53,36,96,7,34,79,98,72,39,56,31,75,82,62,99,66,29,58,9,50,54,12,45,68,4,46,38,21,24,18,44,48,16,61,19,0,90,35,65,37,73,20,22,89,42,23,15,87,74,10,71,25,14,76,84,5,63,95]
|
||||
|
||||
update 0 (_:rest) newValue = newValue : rest
|
||||
update n (first:rest) newValue = first : update (n - 1) rest newValue
|
||||
update _ [] _ = []
|
||||
|
||||
updateMatrix :: (Int, Int) -> [[t]] -> t -> [[t]]
|
||||
updateMatrix (x, y) matrix newValue = update y matrix $ update x (matrix !! y) newValue
|
||||
|
||||
|
||||
newtype Board = Board [[Maybe Int]] deriving Show
|
||||
|
||||
board :: [[Int]] -> Board
|
||||
board list = Board $ (map $ map Just) list
|
||||
|
||||
boards :: [Board]
|
||||
boards = [
|
||||
board [
|
||||
[88, 67, 20, 19, 15],
|
||||
[22, 76, 86, 44, 73],
|
||||
[ 7, 42, 6, 69, 25],
|
||||
[12, 68, 92, 21, 75],
|
||||
[97, 45, 13, 52, 70]
|
||||
],
|
||||
board [
|
||||
[75, 98, 24, 18, 77],
|
||||
[17, 93, 46, 49, 13],
|
||||
[92, 56, 97, 57, 66],
|
||||
[44, 0, 65, 54, 74],
|
||||
[23, 6, 53, 42, 20]
|
||||
],
|
||||
board [
|
||||
[92, 94, 9, 27, 41],
|
||||
[73, 28, 62, 90, 40],
|
||||
[78, 3, 12, 37, 32],
|
||||
[ 8, 86, 91, 16, 30],
|
||||
[84, 38, 68, 11, 19]
|
||||
],
|
||||
board [
|
||||
[51, 5, 12, 76, 97],
|
||||
[72, 31, 15, 61, 71],
|
||||
[38, 32, 55, 87, 10],
|
||||
[91, 4, 85, 84, 53],
|
||||
[59, 79, 28, 69, 23]
|
||||
],
|
||||
board [
|
||||
[35, 48, 10, 81, 60],
|
||||
[25, 86, 24, 43, 15],
|
||||
[44, 55, 12, 54, 62],
|
||||
[94, 89, 95, 2, 23],
|
||||
[64, 63, 45, 50, 66]
|
||||
],
|
||||
board [
|
||||
[80, 87, 49, 88, 39],
|
||||
[33, 81, 95, 68, 55],
|
||||
[83, 46, 36, 41, 54],
|
||||
[90, 74, 3, 52, 7],
|
||||
[71, 40, 35, 8, 77]
|
||||
],
|
||||
board [
|
||||
[34, 21, 24, 8, 97],
|
||||
[99, 23, 94, 70, 9],
|
||||
[14, 98, 2, 11, 10],
|
||||
[16, 38, 92, 13, 35],
|
||||
[82, 25, 76, 42, 39]
|
||||
],
|
||||
board [
|
||||
[52, 76, 98, 25, 3],
|
||||
[24, 41, 13, 39, 56],
|
||||
[11, 72, 77, 47, 86],
|
||||
[50, 32, 26, 88, 48],
|
||||
[18, 99, 22, 78, 58]
|
||||
],
|
||||
board [
|
||||
[22, 24, 53, 84, 80],
|
||||
[26, 97, 42, 95, 11],
|
||||
[ 1, 59, 81, 7, 35],
|
||||
[47, 14, 40, 63, 30],
|
||||
[37, 31, 10, 50, 43]
|
||||
],
|
||||
board [
|
||||
[26, 86, 85, 69, 45],
|
||||
[81, 43, 96, 12, 42],
|
||||
[ 7, 36, 5, 28, 95],
|
||||
[55, 90, 54, 4, 46],
|
||||
[52, 30, 79, 59, 87]
|
||||
],
|
||||
board [
|
||||
[76, 87, 62, 13, 38],
|
||||
[40, 44, 75, 2, 37],
|
||||
[51, 22, 58, 84, 57],
|
||||
[ 1, 29, 82, 67, 35],
|
||||
[39, 20, 31, 77, 32]
|
||||
],
|
||||
board [
|
||||
[53, 62, 61, 26, 95],
|
||||
[78, 44, 9, 5, 97],
|
||||
[83, 11, 18, 69, 2],
|
||||
[94, 66, 8, 14, 27],
|
||||
[ 1, 6, 7, 73, 76]
|
||||
],
|
||||
board [
|
||||
[87, 34, 62, 93, 43],
|
||||
[49, 20, 63, 29, 22],
|
||||
[30, 94, 11, 5, 69],
|
||||
[74, 9, 89, 41, 37],
|
||||
[98, 38, 72, 13, 97]
|
||||
],
|
||||
board [
|
||||
[69, 39, 15, 59, 14],
|
||||
[42, 84, 56, 23, 1],
|
||||
[99, 16, 62, 83, 89],
|
||||
[32, 36, 33, 24, 3],
|
||||
[22, 31, 55, 10, 13]
|
||||
],
|
||||
board [
|
||||
[22, 44, 75, 3, 17],
|
||||
[51, 79, 37, 59, 19],
|
||||
[98, 4, 86, 35, 34],
|
||||
[36, 20, 85, 5, 23],
|
||||
[62, 92, 43, 7, 90]
|
||||
],
|
||||
board [
|
||||
[ 3, 68, 95, 51, 71],
|
||||
[20, 62, 47, 4, 30],
|
||||
[60, 91, 27, 86, 73],
|
||||
[14, 76, 66, 97, 85],
|
||||
[79, 65, 8, 11, 36]
|
||||
],
|
||||
board [
|
||||
[38, 63, 1, 64, 14],
|
||||
[10, 52, 17, 90, 98],
|
||||
[28, 61, 29, 20, 55],
|
||||
[49, 58, 43, 3, 7],
|
||||
[88, 81, 67, 32, 68]
|
||||
],
|
||||
board [
|
||||
[63, 65, 15, 61, 57],
|
||||
[47, 94, 6, 14, 49],
|
||||
[42, 3, 83, 96, 31],
|
||||
[23, 77, 1, 70, 18],
|
||||
[45, 36, 64, 48, 35]
|
||||
],
|
||||
board [
|
||||
[ 8, 92, 88, 32, 95],
|
||||
[26, 41, 34, 11, 48],
|
||||
[81, 35, 36, 62, 28],
|
||||
[64, 33, 52, 97, 82],
|
||||
[ 7, 37, 78, 0, 86]
|
||||
],
|
||||
board [
|
||||
[75, 64, 84, 80, 60],
|
||||
[17, 5, 55, 95, 70],
|
||||
[ 0, 90, 68, 53, 93],
|
||||
[ 8, 50, 38, 9, 65],
|
||||
[97, 35, 26, 30, 6]
|
||||
],
|
||||
board [
|
||||
[76, 87, 36, 5, 74],
|
||||
[79, 94, 82, 48, 20],
|
||||
[24, 88, 90, 62, 45],
|
||||
[ 9, 40, 78, 22, 68],
|
||||
[73, 71, 35, 42, 66]
|
||||
],
|
||||
board [
|
||||
[52, 11, 17, 9, 72],
|
||||
[45, 13, 90, 0, 80],
|
||||
[93, 77, 37, 51, 96],
|
||||
[ 3, 68, 94, 61, 1],
|
||||
[26, 78, 12, 29, 66]
|
||||
],
|
||||
board [
|
||||
[49, 14, 74, 11, 48],
|
||||
[73, 58, 54, 3, 40],
|
||||
[90, 38, 62, 18, 26],
|
||||
[53, 93, 19, 41, 94],
|
||||
[35, 63, 7, 80, 68]
|
||||
],
|
||||
board [
|
||||
[13, 19, 92, 38, 1],
|
||||
[63, 69, 4, 99, 36],
|
||||
[53, 57, 54, 21, 80],
|
||||
[97, 17, 2, 44, 29],
|
||||
[ 0, 3, 89, 45, 58]
|
||||
],
|
||||
board [
|
||||
[ 9, 26, 45, 57, 67],
|
||||
[72, 10, 59, 79, 88],
|
||||
[32, 2, 87, 42, 60],
|
||||
[62, 98, 1, 93, 28],
|
||||
[24, 99, 41, 44, 29]
|
||||
],
|
||||
board [
|
||||
[57, 60, 54, 36, 84],
|
||||
[28, 5, 32, 66, 77],
|
||||
[13, 19, 42, 39, 37],
|
||||
[56, 89, 74, 50, 55],
|
||||
[ 8, 71, 78, 0, 80]
|
||||
],
|
||||
board [
|
||||
[62, 38, 24, 44, 4],
|
||||
[17, 8, 70, 77, 86],
|
||||
[98, 6, 9, 88, 23],
|
||||
[85, 63, 78, 60, 72],
|
||||
[71, 48, 36, 69, 81]
|
||||
],
|
||||
board [
|
||||
[84, 19, 8, 20, 17],
|
||||
[40, 88, 33, 52, 81],
|
||||
[29, 83, 11, 36, 92],
|
||||
[66, 6, 73, 32, 82],
|
||||
[44, 39, 26, 60, 63]
|
||||
],
|
||||
board [
|
||||
[13, 73, 45, 32, 42],
|
||||
[69, 20, 83, 8, 84],
|
||||
[82, 61, 11, 89, 25],
|
||||
[ 6, 92, 99, 52, 57],
|
||||
[88, 22, 46, 26, 86]
|
||||
],
|
||||
board [
|
||||
[74, 65, 17, 64, 94],
|
||||
[19, 34, 40, 69, 80],
|
||||
[43, 83, 45, 77, 87],
|
||||
[41, 49, 13, 51, 89],
|
||||
[91, 72, 54, 1, 60]
|
||||
],
|
||||
board [
|
||||
[38, 10, 16, 51, 46],
|
||||
[80, 60, 64, 62, 70],
|
||||
[89, 71, 58, 49, 39],
|
||||
[37, 5, 35, 88, 40],
|
||||
[93, 72, 98, 42, 13]
|
||||
],
|
||||
board [
|
||||
[ 9, 47, 91, 69, 68],
|
||||
[27, 1, 49, 60, 13],
|
||||
[ 6, 17, 95, 59, 35],
|
||||
[26, 14, 75, 57, 11],
|
||||
[15, 18, 19, 46, 74]
|
||||
],
|
||||
board [
|
||||
[88, 66, 25, 89, 6],
|
||||
[63, 4, 56, 73, 8],
|
||||
[57, 0, 51, 5, 36],
|
||||
[68, 96, 84, 67, 53],
|
||||
[49, 82, 7, 32, 9]
|
||||
],
|
||||
board [
|
||||
[81, 75, 92, 1, 62],
|
||||
[ 0, 96, 27, 63, 46],
|
||||
[76, 31, 93, 67, 12],
|
||||
[74, 78, 59, 5, 60],
|
||||
[69, 33, 25, 94, 43]
|
||||
],
|
||||
board [
|
||||
[40, 72, 79, 58, 22],
|
||||
[16, 24, 99, 96, 44],
|
||||
[69, 4, 87, 90, 26],
|
||||
[34, 43, 56, 15, 35],
|
||||
[63, 88, 89, 52, 54]
|
||||
],
|
||||
board [
|
||||
[43, 7, 44, 31, 24],
|
||||
[71, 18, 84, 17, 64],
|
||||
[ 8, 47, 93, 85, 36],
|
||||
[72, 29, 22, 67, 74],
|
||||
[69, 41, 58, 98, 61]
|
||||
],
|
||||
board [
|
||||
[55, 21, 72, 14, 3],
|
||||
[75, 12, 69, 91, 54],
|
||||
[80, 40, 78, 39, 4],
|
||||
[44, 88, 84, 76, 25],
|
||||
[96, 57, 49, 52, 28]
|
||||
],
|
||||
board [
|
||||
[54, 74, 32, 40, 64],
|
||||
[ 5, 94, 71, 80, 22],
|
||||
[82, 92, 79, 93, 16],
|
||||
[53, 33, 98, 85, 14],
|
||||
[29, 49, 9, 47, 12]
|
||||
],
|
||||
board [
|
||||
[98, 67, 8, 10, 6],
|
||||
[58, 13, 77, 99, 81],
|
||||
[ 5, 55, 21, 19, 1],
|
||||
[ 0, 26, 44, 70, 93],
|
||||
[41, 96, 31, 91, 27]
|
||||
],
|
||||
board [
|
||||
[50, 28, 48, 13, 18],
|
||||
[96, 43, 25, 2, 78],
|
||||
[88, 60, 0, 16, 73],
|
||||
[12, 32, 15, 68, 22],
|
||||
[95, 74, 10, 80, 21]
|
||||
],
|
||||
board [
|
||||
[18, 49, 85, 55, 21],
|
||||
[11, 68, 80, 59, 41],
|
||||
[56, 94, 14, 62, 60],
|
||||
[32, 20, 40, 6, 2],
|
||||
[42, 66, 98, 71, 17]
|
||||
],
|
||||
board [
|
||||
[13, 38, 1, 63, 82],
|
||||
[33, 55, 54, 53, 92],
|
||||
[36, 20, 39, 84, 83],
|
||||
[67, 43, 70, 73, 75],
|
||||
[94, 77, 76, 29, 16]
|
||||
],
|
||||
board [
|
||||
[82, 27, 25, 18, 86],
|
||||
[73, 3, 36, 28, 1],
|
||||
[11, 96, 40, 23, 93],
|
||||
[58, 90, 88, 35, 64],
|
||||
[ 9, 38, 69, 8, 43]
|
||||
],
|
||||
board [
|
||||
[87, 90, 16, 56, 67],
|
||||
[41, 75, 89, 1, 80],
|
||||
[22, 62, 5, 45, 69],
|
||||
[28, 36, 19, 96, 71],
|
||||
[26, 63, 88, 76, 31]
|
||||
],
|
||||
board [
|
||||
[68, 80, 83, 95, 20],
|
||||
[75, 0, 16, 38, 21],
|
||||
[34, 89, 87, 36, 14],
|
||||
[94, 47, 53, 73, 71],
|
||||
[63, 8, 61, 96, 50]
|
||||
],
|
||||
board [
|
||||
[81, 23, 6, 14, 26],
|
||||
[86, 42, 82, 95, 85],
|
||||
[77, 52, 38, 2, 33],
|
||||
[69, 98, 54, 37, 4],
|
||||
[78, 39, 3, 75, 80]
|
||||
],
|
||||
board [
|
||||
[92, 99, 93, 28, 44],
|
||||
[ 5, 8, 67, 45, 10],
|
||||
[61, 79, 63, 85, 81],
|
||||
[ 2, 87, 76, 68, 18],
|
||||
[69, 52, 22, 16, 12]
|
||||
],
|
||||
board [
|
||||
[95, 50, 21, 82, 60],
|
||||
[ 5, 8, 6, 28, 26],
|
||||
[52, 3, 38, 70, 74],
|
||||
[75, 0, 53, 51, 44],
|
||||
[10, 30, 34, 47, 71]
|
||||
],
|
||||
board [
|
||||
[71, 44, 65, 48, 51],
|
||||
[78, 57, 75, 6, 86],
|
||||
[95, 58, 66, 12, 92],
|
||||
[22, 61, 68, 88, 50],
|
||||
[ 4, 36, 45, 28, 54]
|
||||
],
|
||||
board [
|
||||
[37, 17, 5, 2, 52],
|
||||
[57, 47, 4, 53, 39],
|
||||
[11, 72, 66, 81, 46],
|
||||
[27, 0, 67, 40, 83],
|
||||
[98, 19, 10, 35, 84]
|
||||
],
|
||||
board [
|
||||
[43, 59, 30, 72, 17],
|
||||
[66, 50, 12, 84, 65],
|
||||
[49, 60, 14, 1, 29],
|
||||
[89, 75, 62, 82, 47],
|
||||
[33, 5, 9, 58, 45]
|
||||
],
|
||||
board [
|
||||
[14, 9, 3, 47, 74],
|
||||
[69, 29, 57, 62, 22],
|
||||
[ 4, 90, 40, 64, 15],
|
||||
[21, 27, 30, 2, 63],
|
||||
[97, 96, 99, 55, 41]
|
||||
],
|
||||
board [
|
||||
[75, 73, 3, 59, 80],
|
||||
[65, 34, 52, 20, 72],
|
||||
[50, 84, 81, 69, 41],
|
||||
[97, 77, 19, 85, 39],
|
||||
[88, 46, 15, 35, 87]
|
||||
],
|
||||
board [
|
||||
[96, 42, 74, 38, 78],
|
||||
[58, 73, 67, 70, 10],
|
||||
[62, 8, 82, 64, 16],
|
||||
[65, 25, 13, 3, 89],
|
||||
[40, 30, 53, 95, 51]
|
||||
],
|
||||
board [
|
||||
[ 7, 16, 92, 88, 38],
|
||||
[14, 52, 46, 93, 64],
|
||||
[49, 48, 8, 76, 51],
|
||||
[97, 67, 89, 75, 19],
|
||||
[69, 9, 29, 43, 82]
|
||||
],
|
||||
board [
|
||||
[81, 51, 24, 57, 9],
|
||||
[46, 43, 77, 11, 35],
|
||||
[83, 5, 14, 25, 84],
|
||||
[70, 99, 47, 37, 16],
|
||||
[ 3, 39, 75, 97, 80]
|
||||
],
|
||||
board [
|
||||
[18, 74, 64, 6, 94],
|
||||
[12, 59, 46, 48, 31],
|
||||
[73, 77, 33, 1, 39],
|
||||
[ 0, 69, 10, 24, 56],
|
||||
[83, 66, 5, 76, 58]
|
||||
],
|
||||
board [
|
||||
[40, 48, 72, 65, 2],
|
||||
[19, 28, 93, 53, 44],
|
||||
[75, 85, 42, 68, 66],
|
||||
[99, 49, 55, 31, 41],
|
||||
[94, 35, 78, 13, 61]
|
||||
],
|
||||
board [
|
||||
[ 4, 20, 54, 33, 21],
|
||||
[50, 61, 17, 53, 64],
|
||||
[69, 30, 24, 90, 95],
|
||||
[82, 51, 39, 52, 67],
|
||||
[43, 73, 44, 62, 83]
|
||||
],
|
||||
board [
|
||||
[31, 32, 63, 42, 60],
|
||||
[39, 41, 28, 51, 53],
|
||||
[15, 20, 24, 54, 5],
|
||||
[ 9, 65, 70, 57, 99],
|
||||
[50, 29, 35, 4, 47]
|
||||
],
|
||||
board [
|
||||
[40, 99, 95, 72, 35],
|
||||
[10, 14, 52, 83, 19],
|
||||
[ 5, 51, 87, 49, 16],
|
||||
[60, 66, 13, 63, 93],
|
||||
[68, 57, 31, 6, 78]
|
||||
],
|
||||
board [
|
||||
[58, 96, 49, 87, 28],
|
||||
[95, 50, 54, 53, 52],
|
||||
[24, 16, 64, 9, 5],
|
||||
[ 7, 63, 8, 4, 17],
|
||||
[59, 98, 3, 31, 25]
|
||||
],
|
||||
board [
|
||||
[31, 83, 61, 58, 93],
|
||||
[94, 52, 97, 30, 98],
|
||||
[99, 2, 13, 66, 73],
|
||||
[69, 71, 68, 40, 19],
|
||||
[74, 84, 45, 25, 77]
|
||||
],
|
||||
board [
|
||||
[58, 85, 45, 64, 74],
|
||||
[18, 88, 91, 53, 2],
|
||||
[93, 0, 92, 55, 39],
|
||||
[75, 49, 87, 80, 4],
|
||||
[89, 97, 57, 14, 54]
|
||||
],
|
||||
board [
|
||||
[20, 92, 64, 50, 25],
|
||||
[52, 90, 80, 31, 38],
|
||||
[55, 54, 10, 76, 21],
|
||||
[95, 97, 4, 77, 19],
|
||||
[30, 26, 12, 39, 11]
|
||||
],
|
||||
board [
|
||||
[71, 10, 84, 68, 77],
|
||||
[48, 82, 69, 75, 3],
|
||||
[93, 24, 16, 42, 60],
|
||||
[15, 62, 76, 36, 20],
|
||||
[21, 18, 94, 22, 45]
|
||||
],
|
||||
board [
|
||||
[10, 91, 66, 56, 75],
|
||||
[ 6, 8, 45, 59, 83],
|
||||
[52, 93, 48, 81, 87],
|
||||
[99, 78, 43, 64, 84],
|
||||
[21, 12, 61, 71, 9]
|
||||
],
|
||||
board [
|
||||
[98, 77, 95, 63, 15],
|
||||
[30, 14, 39, 12, 20],
|
||||
[13, 32, 27, 0, 5],
|
||||
[86, 80, 51, 40, 99],
|
||||
[68, 44, 26, 29, 91]
|
||||
],
|
||||
board [
|
||||
[92, 79, 49, 44, 33],
|
||||
[88, 4, 34, 3, 90],
|
||||
[51, 46, 31, 50, 47],
|
||||
[61, 11, 94, 6, 24],
|
||||
[72, 18, 98, 65, 57]
|
||||
],
|
||||
board [
|
||||
[88, 94, 93, 11, 33],
|
||||
[75, 77, 53, 54, 51],
|
||||
[97, 15, 89, 38, 76],
|
||||
[47, 64, 55, 22, 0],
|
||||
[40, 56, 34, 19, 3]
|
||||
],
|
||||
board [
|
||||
[36, 55, 51, 86, 91],
|
||||
[49, 21, 78, 6, 58],
|
||||
[90, 1, 88, 45, 33],
|
||||
[37, 69, 75, 41, 50],
|
||||
[81, 24, 34, 38, 93]
|
||||
],
|
||||
board [
|
||||
[21, 73, 99, 50, 65],
|
||||
[72, 77, 86, 7, 68],
|
||||
[24, 63, 71, 26, 25],
|
||||
[ 9, 12, 29, 93, 87],
|
||||
[81, 23, 22, 94, 67]
|
||||
],
|
||||
board [
|
||||
[37, 47, 66, 89, 73],
|
||||
[49, 23, 79, 31, 86],
|
||||
[58, 52, 21, 39, 15],
|
||||
[60, 38, 82, 50, 36],
|
||||
[74, 30, 25, 35, 99]
|
||||
],
|
||||
board [
|
||||
[ 6, 18, 53, 36, 87],
|
||||
[ 3, 59, 50, 2, 75],
|
||||
[69, 61, 57, 19, 63],
|
||||
[44, 77, 42, 22, 7],
|
||||
[89, 29, 45, 35, 71]
|
||||
],
|
||||
board [
|
||||
[28, 26, 53, 47, 21],
|
||||
[31, 71, 27, 58, 85],
|
||||
[10, 20, 74, 59, 42],
|
||||
[89, 44, 12, 91, 54],
|
||||
[32, 87, 36, 22, 7]
|
||||
],
|
||||
board [
|
||||
[62, 17, 61, 75, 51],
|
||||
[44, 60, 37, 14, 76],
|
||||
[96, 0, 1, 52, 5],
|
||||
[57, 42, 97, 66, 90],
|
||||
[12, 23, 50, 98, 25]
|
||||
],
|
||||
board [
|
||||
[42, 30, 86, 89, 66],
|
||||
[41, 98, 39, 29, 23],
|
||||
[75, 73, 20, 79, 90],
|
||||
[38, 60, 45, 16, 18],
|
||||
[17, 10, 47, 5, 13]
|
||||
],
|
||||
board [
|
||||
[ 4, 10, 26, 74, 38],
|
||||
[66, 84, 60, 23, 57],
|
||||
[30, 59, 58, 2, 49],
|
||||
[83, 82, 70, 64, 43],
|
||||
[71, 31, 35, 90, 0]
|
||||
],
|
||||
board [
|
||||
[27, 99, 33, 56, 3],
|
||||
[41, 97, 1, 68, 88],
|
||||
[43, 63, 81, 89, 22],
|
||||
[30, 32, 59, 64, 12],
|
||||
[84, 58, 10, 39, 76]
|
||||
],
|
||||
board [
|
||||
[98, 16, 75, 27, 57],
|
||||
[ 0, 9, 3, 79, 50],
|
||||
[ 5, 34, 93, 6, 21],
|
||||
[52, 70, 87, 31, 49],
|
||||
[58, 46, 24, 20, 45]
|
||||
],
|
||||
board [
|
||||
[78, 24, 19, 13, 30],
|
||||
[83, 59, 79, 37, 72],
|
||||
[84, 81, 99, 17, 77],
|
||||
[10, 93, 3, 33, 70],
|
||||
[29, 35, 49, 6, 5]
|
||||
],
|
||||
board [
|
||||
[47, 6, 82, 94, 53],
|
||||
[83, 19, 25, 54, 64],
|
||||
[ 9, 56, 39, 31, 96],
|
||||
[ 1, 81, 66, 41, 5],
|
||||
[55, 48, 43, 12, 14]
|
||||
],
|
||||
board [
|
||||
[47, 55, 86, 31, 17],
|
||||
[89, 45, 65, 34, 56],
|
||||
[99, 88, 18, 97, 3],
|
||||
[52, 21, 14, 68, 13],
|
||||
[ 9, 26, 22, 7, 32]
|
||||
],
|
||||
board [
|
||||
[75, 27, 62, 19, 72],
|
||||
[20, 49, 7, 21, 85],
|
||||
[53, 46, 1, 59, 99],
|
||||
[61, 71, 87, 24, 83],
|
||||
[ 5, 77, 41, 51, 73]
|
||||
],
|
||||
board [
|
||||
[57, 59, 82, 77, 52],
|
||||
[99, 49, 81, 37, 54],
|
||||
[70, 89, 23, 20, 90],
|
||||
[31, 1, 21, 98, 66],
|
||||
[86, 35, 46, 36, 18]
|
||||
],
|
||||
board [
|
||||
[37, 39, 70, 76, 27],
|
||||
[68, 84, 25, 1, 33],
|
||||
[50, 82, 77, 20, 44],
|
||||
[18, 11, 51, 62, 54],
|
||||
[80, 67, 35, 89, 30]
|
||||
],
|
||||
board [
|
||||
[85, 96, 1, 3, 73],
|
||||
[25, 47, 10, 46, 98],
|
||||
[ 2, 33, 91, 71, 35],
|
||||
[ 0, 32, 11, 55, 67],
|
||||
[14, 81, 17, 5, 94]
|
||||
],
|
||||
board [
|
||||
[68, 84, 46, 43, 81],
|
||||
[42, 35, 48, 89, 30],
|
||||
[ 4, 17, 65, 77, 6],
|
||||
[49, 97, 85, 12, 66],
|
||||
[75, 25, 13, 90, 51]
|
||||
],
|
||||
board [
|
||||
[94, 42, 46, 58, 56],
|
||||
[97, 50, 86, 84, 15],
|
||||
[52, 9, 28, 32, 59],
|
||||
[26, 96, 91, 57, 83],
|
||||
[29, 99, 18, 31, 43]
|
||||
],
|
||||
board [
|
||||
[ 2, 19, 31, 10, 32],
|
||||
[81, 16, 50, 59, 7],
|
||||
[76, 30, 63, 44, 95],
|
||||
[82, 54, 61, 75, 36],
|
||||
[85, 78, 12, 67, 9]
|
||||
],
|
||||
board [
|
||||
[92, 1, 72, 27, 37],
|
||||
[22, 13, 91, 4, 34],
|
||||
[53, 82, 76, 70, 19],
|
||||
[99, 38, 59, 33, 52],
|
||||
[ 0, 61, 36, 67, 75]
|
||||
],
|
||||
board [
|
||||
[94, 41, 5, 57, 1],
|
||||
[37, 36, 99, 34, 47],
|
||||
[40, 93, 62, 32, 76],
|
||||
[61, 75, 48, 42, 73],
|
||||
[35, 69, 54, 13, 50]
|
||||
],
|
||||
board [
|
||||
[76, 12, 51, 11, 74],
|
||||
[30, 83, 73, 33, 78],
|
||||
[95, 77, 15, 14, 80],
|
||||
[86, 37, 91, 50, 10],
|
||||
[52, 67, 3, 60, 17]
|
||||
],
|
||||
board [
|
||||
[68, 7, 42, 81, 15],
|
||||
[46, 58, 9, 31, 18],
|
||||
[91, 1, 28, 34, 37],
|
||||
[17, 57, 6, 2, 70],
|
||||
[97, 54, 20, 27, 44]
|
||||
],
|
||||
board [
|
||||
[44, 80, 45, 28, 14],
|
||||
[94, 47, 29, 50, 54],
|
||||
[64, 67, 96, 95, 93],
|
||||
[76, 36, 82, 39, 43],
|
||||
[30, 55, 97, 3, 2]
|
||||
],
|
||||
board [
|
||||
[43, 2, 15, 99, 34],
|
||||
[97, 75, 26, 9, 67],
|
||||
[30, 63, 74, 12, 82],
|
||||
[18, 6, 49, 48, 55],
|
||||
[47, 36, 41, 56, 83]
|
||||
],
|
||||
board [
|
||||
[26, 70, 87, 80, 89],
|
||||
[17, 50, 61, 21, 96],
|
||||
[43, 83, 85, 46, 64],
|
||||
[66, 75, 23, 47, 69],
|
||||
[22, 72, 55, 52, 8]
|
||||
],
|
||||
board [
|
||||
[67, 54, 11, 29, 42],
|
||||
[16, 45, 56, 86, 66],
|
||||
[ 4, 80, 43, 72, 91],
|
||||
[90, 87, 63, 39, 50],
|
||||
[32, 6, 59, 27, 89]
|
||||
],
|
||||
board [
|
||||
[14, 92, 78, 47, 59],
|
||||
[98, 0, 63, 85, 31],
|
||||
[52, 8, 84, 70, 91],
|
||||
[43, 3, 76, 65, 57],
|
||||
[87, 22, 99, 94, 58]
|
||||
],
|
||||
board [
|
||||
[26, 53, 58, 52, 1],
|
||||
[82, 57, 32, 40, 20],
|
||||
[72, 21, 74, 46, 43],
|
||||
[41, 15, 98, 2, 11],
|
||||
[ 5, 96, 22, 18, 55]
|
||||
]
|
||||
]
|
||||
|
||||
row n (Board board) = board !! n
|
||||
column n (Board board) = [ x !! n | x <- board ]
|
||||
|
||||
score :: Board -> Int
|
||||
score (Board board) = sum $ catMaybes $ concat board
|
||||
|
||||
mark :: Board -> (Int, Int) -> Either Board Int
|
||||
mark (Board board) pos = if isWin then Right $ score newBoard else Left newBoard
|
||||
where
|
||||
newBoard = Board $ updateMatrix pos board Nothing
|
||||
isWin = row y newBoard == cleared || column x newBoard == cleared
|
||||
(x, y) = pos
|
||||
cleared = replicate 5 Nothing
|
||||
|
||||
findPosition :: Board -> Int -> Maybe (Int, Int)
|
||||
findPosition (Board board) value = find (\(x,y) -> board !! y !! x == Just value) indexes
|
||||
where
|
||||
indexes = [(x,y) | x <- [0..4], y <- [0..4]]
|
||||
|
||||
markTile :: Board -> Int -> Either Board Int
|
||||
markTile board num = case pos of
|
||||
Nothing -> Left board
|
||||
Just pos -> mark board pos
|
||||
where
|
||||
pos = findPosition board num
|
||||
|
||||
markAll :: [Board] -> Int -> Either [Board] Int
|
||||
markAll boards num = getResult $ map (`markTile` num) boards
|
||||
where
|
||||
getResult [] = Left []
|
||||
getResult (Right score : rest) = Right score
|
||||
getResult (Left board : rest) = case getResult rest of
|
||||
Left boards -> Left $ board : boards
|
||||
Right score -> Right score
|
||||
|
||||
|
||||
markAllUntilLast :: [Board] -> Int -> Either [Board] Int
|
||||
markAllUntilLast boards num = getResult $ map (`markTile` num) boards
|
||||
where
|
||||
getResult [] = Left []
|
||||
getResult [Right score] = Right score
|
||||
getResult (Right _ : rest) = getResult rest
|
||||
getResult (Left board : rest) = case getResult rest of
|
||||
Left boards -> Left $ board : boards
|
||||
Right _ -> Left [board]
|
||||
|
||||
|
||||
play :: [Board] -> [Int] -> ([Board] -> Int -> Either [Board] Int) -> Maybe Int
|
||||
play boards numbers markAll = playRound numbers boards
|
||||
where
|
||||
playRound [] _ = Nothing
|
||||
playRound (cur:rest) boards = case markAll boards cur of
|
||||
Left newBoards -> playRound rest newBoards
|
||||
Right score -> Just (score * cur)
|
||||
|
||||
|
||||
{-
|
||||
|
||||
>>> play boards randoms markAll
|
||||
Just 49686
|
||||
|
||||
>>> play boards randoms markAllUntilLast
|
||||
Just 26878
|
||||
|
||||
-}
|
554
2021/day5.hs
Normal file
554
2021/day5.hs
Normal file
|
@ -0,0 +1,554 @@
|
|||
example :: [((Int, Int), (Int, Int))]
|
||||
example = [
|
||||
((0,9), (5,9)),
|
||||
((8,0), (0,8)),
|
||||
((9,4), (3,4)),
|
||||
((2,2), (2,1)),
|
||||
((7,0), (7,4)),
|
||||
((6,4), (2,0)),
|
||||
((0,9), (2,9)),
|
||||
((3,4), (1,4)),
|
||||
((0,0), (8,8)),
|
||||
((5,5), (8,2))
|
||||
]
|
||||
|
||||
isHorizontalOrVertical :: ((Int, Int), (Int, Int)) -> Bool
|
||||
isHorizontalOrVertical ((x1, y1), (x2, y2)) = x1 == x2 || y1 == y2
|
||||
|
||||
atPoint (x,y) p = minX p <= x && x <= maxX p && minY p <= y && y <= maxY p
|
||||
|
||||
minX ((x1, _), (x2, _)) = min x1 x2
|
||||
minY ((_, y1), (_, y2)) = min y1 y2
|
||||
|
||||
|
||||
maxX ((x1, _), (x2, _)) = max x1 x2
|
||||
maxY ((_, y1), (_, y2)) = max y1 y2
|
||||
|
||||
|
||||
bounds :: (Ord b, Ord a) => [((a, b), (a, b))] -> ((a, b), (a, b))
|
||||
bounds input = ((x0, y0), (x1, y1))
|
||||
where
|
||||
x0 = minimum $ map minX input
|
||||
y0 = minimum $ map minY input
|
||||
x1 = maximum $ map maxX input
|
||||
y1 = maximum $ map maxY input
|
||||
|
||||
grid ((x0, y0), (x1, y1)) = [ (x, y) | x <- [x0..x1], y <- [y0..y1] ]
|
||||
|
||||
counts input = length $ filter (>= 2) intersectionCounts
|
||||
where
|
||||
intersectionCounts = map (\pos -> length $ filter (atPoint pos) input) gridIndexes
|
||||
gridIndexes = grid $ bounds input
|
||||
|
||||
|
||||
inputs :: [((Int, Int), (Int, Int))]
|
||||
inputs = [
|
||||
((911, 808), (324, 221)),
|
||||
((161, 890), (808, 243)),
|
||||
((174, 59), (174, 760)),
|
||||
((983, 983), (10, 10)),
|
||||
((321, 12), (870, 12)),
|
||||
((66, 936), (941, 61)),
|
||||
((670, 141), (670, 550)),
|
||||
((783, 935), (496, 648)),
|
||||
((973, 651), (635, 989)),
|
||||
((535, 47), (535, 154)),
|
||||
((355, 183), (754, 582)),
|
||||
((172, 111), (892, 111)),
|
||||
((353, 66), (907, 620)),
|
||||
((741, 960), (741, 805)),
|
||||
((113, 895), (946, 895)),
|
||||
((777, 280), (563, 280)),
|
||||
((679, 815), (626, 815)),
|
||||
((651, 848), (651, 673)),
|
||||
((205, 834), (205, 599)),
|
||||
((895, 118), (82, 931)),
|
||||
((685, 303), (93, 895)),
|
||||
((973, 38), (62, 949)),
|
||||
((867, 23), (867, 300)),
|
||||
((784, 947), (784, 47)),
|
||||
((96, 168), (755, 827)),
|
||||
((909, 321), (909, 716)),
|
||||
((59, 881), (692, 881)),
|
||||
((964, 19), (69, 914)),
|
||||
((752, 869), (67, 184)),
|
||||
((974, 877), (138, 41)),
|
||||
((432, 389), (137, 684)),
|
||||
((458, 822), (458, 402)),
|
||||
((818, 852), (308, 342)),
|
||||
((882, 484), (441, 925)),
|
||||
((82, 959), (976, 65)),
|
||||
((117, 487), (117, 429)),
|
||||
((214, 673), (429, 673)),
|
||||
((72, 955), (72, 829)),
|
||||
((587, 109), (587, 368)),
|
||||
((576, 17), (576, 872)),
|
||||
((685, 102), (685, 905)),
|
||||
((563, 394), (716, 394)),
|
||||
((966, 145), (150, 961)),
|
||||
((555, 582), (555, 385)),
|
||||
((453, 31), (453, 207)),
|
||||
((639, 815), (547, 723)),
|
||||
((431, 869), (431, 811)),
|
||||
((646, 938), (599, 938)),
|
||||
((215, 513), (900, 513)),
|
||||
((809, 82), (798, 82)),
|
||||
((768, 344), (244, 868)),
|
||||
((39, 962), (39, 601)),
|
||||
((675, 186), (61, 186)),
|
||||
((861, 967), (28, 967)),
|
||||
((860, 550), (538, 550)),
|
||||
((283, 740), (571, 740)),
|
||||
((72, 297), (72, 645)),
|
||||
((727, 801), (727, 526)),
|
||||
((799, 519), (799, 497)),
|
||||
((915, 24), (174, 765)),
|
||||
((795, 943), (136, 943)),
|
||||
((518, 971), (599, 971)),
|
||||
((594, 676), (594, 461)),
|
||||
((850, 799), (363, 799)),
|
||||
((958, 575), (958, 231)),
|
||||
((752, 576), (398, 576)),
|
||||
((891, 433), (398, 433)),
|
||||
((524, 126), (397, 126)),
|
||||
((10, 890), (796, 104)),
|
||||
((57, 228), (168, 228)),
|
||||
((168, 521), (338, 691)),
|
||||
((230, 83), (777, 83)),
|
||||
((865, 677), (640, 452)),
|
||||
((866, 821), (825, 821)),
|
||||
((17, 143), (17, 596)),
|
||||
((113, 916), (113, 601)),
|
||||
((268, 187), (551, 470)),
|
||||
((794, 167), (220, 167)),
|
||||
((459, 17), (459, 931)),
|
||||
((211, 31), (526, 31)),
|
||||
((680, 57), (756, 57)),
|
||||
((926, 190), (926, 800)),
|
||||
((85, 284), (63, 284)),
|
||||
((44, 988), (44, 701)),
|
||||
((110, 941), (176, 941)),
|
||||
((480, 163), (480, 112)),
|
||||
((574, 538), (574, 371)),
|
||||
((584, 473), (69, 473)),
|
||||
((303, 621), (303, 380)),
|
||||
((762, 652), (762, 89)),
|
||||
((286, 195), (276, 185)),
|
||||
((957, 87), (217, 827)),
|
||||
((561, 858), (561, 437)),
|
||||
((384, 55), (81, 55)),
|
||||
((19, 977), (981, 15)),
|
||||
((454, 747), (938, 263)),
|
||||
((425, 836), (425, 617)),
|
||||
((860, 135), (775, 50)),
|
||||
((633, 131), (633, 651)),
|
||||
((904, 912), (242, 250)),
|
||||
((880, 177), (480, 577)),
|
||||
((470, 162), (964, 656)),
|
||||
((585, 376), (585, 470)),
|
||||
((696, 760), (594, 862)),
|
||||
((534, 225), (534, 717)),
|
||||
((258, 816), (258, 847)),
|
||||
((990, 244), (990, 93)),
|
||||
((463, 462), (463, 533)),
|
||||
((434, 928), (537, 825)),
|
||||
((813, 734), (533, 734)),
|
||||
((498, 673), (395, 673)),
|
||||
((564, 312), (55, 312)),
|
||||
((280, 550), (939, 550)),
|
||||
((591, 247), (396, 52)),
|
||||
((127, 516), (127, 235)),
|
||||
((850, 425), (552, 127)),
|
||||
((894, 428), (894, 598)),
|
||||
((366, 960), (592, 960)),
|
||||
((579, 488), (170, 488)),
|
||||
((775, 92), (775, 586)),
|
||||
((49, 909), (930, 28)),
|
||||
((856, 113), (284, 685)),
|
||||
((263, 175), (120, 175)),
|
||||
((332, 592), (276, 592)),
|
||||
((920, 157), (141, 157)),
|
||||
((349, 776), (316, 776)),
|
||||
((187, 863), (279, 863)),
|
||||
((218, 872), (83, 872)),
|
||||
((465, 430), (410, 430)),
|
||||
((710, 218), (857, 218)),
|
||||
((797, 314), (184, 314)),
|
||||
((387, 327), (49, 665)),
|
||||
((950, 812), (205, 67)),
|
||||
((803, 133), (803, 682)),
|
||||
((125, 972), (545, 552)),
|
||||
((353, 901), (840, 414)),
|
||||
((936, 843), (202, 109)),
|
||||
((11, 904), (856, 59)),
|
||||
((725, 757), (954, 986)),
|
||||
((227, 697), (345, 697)),
|
||||
((187, 520), (187, 441)),
|
||||
((860, 262), (135, 987)),
|
||||
((700, 95), (976, 371)),
|
||||
((86, 946), (869, 163)),
|
||||
((898, 806), (461, 806)),
|
||||
((717, 796), (717, 195)),
|
||||
((882, 127), (835, 127)),
|
||||
((133, 48), (133, 191)),
|
||||
((521, 51), (521, 927)),
|
||||
((384, 806), (957, 233)),
|
||||
((570, 139), (570, 842)),
|
||||
((949, 819), (949, 350)),
|
||||
((592, 230), (283, 230)),
|
||||
((315, 856), (741, 856)),
|
||||
((870, 674), (549, 353)),
|
||||
((857, 306), (857, 889)),
|
||||
((428, 217), (267, 217)),
|
||||
((47, 93), (898, 944)),
|
||||
((636, 238), (665, 238)),
|
||||
((202, 910), (202, 737)),
|
||||
((246, 432), (617, 803)),
|
||||
((985, 24), (48, 961)),
|
||||
((965, 876), (956, 867)),
|
||||
((618, 650), (810, 458)),
|
||||
((292, 356), (575, 356)),
|
||||
((394, 585), (910, 585)),
|
||||
((137, 453), (137, 178)),
|
||||
((509, 737), (509, 665)),
|
||||
((193, 350), (531, 688)),
|
||||
((805, 219), (107, 219)),
|
||||
((975, 506), (907, 506)),
|
||||
((435, 303), (435, 380)),
|
||||
((344, 83), (344, 224)),
|
||||
((47, 66), (47, 115)),
|
||||
((570, 516), (857, 516)),
|
||||
((162, 91), (926, 91)),
|
||||
((759, 417), (759, 460)),
|
||||
((445, 942), (445, 699)),
|
||||
((421, 340), (421, 743)),
|
||||
((590, 590), (434, 434)),
|
||||
((453, 38), (453, 327)),
|
||||
((865, 134), (865, 773)),
|
||||
((842, 609), (18, 609)),
|
||||
((662, 282), (62, 882)),
|
||||
((489, 32), (344, 32)),
|
||||
((135, 496), (93, 454)),
|
||||
((552, 211), (421, 211)),
|
||||
((620, 678), (642, 678)),
|
||||
((782, 158), (585, 355)),
|
||||
((733, 509), (733, 574)),
|
||||
((932, 383), (369, 946)),
|
||||
((843, 705), (843, 725)),
|
||||
((747, 414), (676, 343)),
|
||||
((294, 218), (962, 886)),
|
||||
((844, 175), (844, 420)),
|
||||
((255, 489), (531, 213)),
|
||||
((555, 532), (821, 532)),
|
||||
((533, 15), (533, 161)),
|
||||
((631, 778), (631, 401)),
|
||||
((75, 282), (468, 282)),
|
||||
((903, 838), (903, 957)),
|
||||
((46, 293), (543, 790)),
|
||||
((30, 834), (30, 948)),
|
||||
((591, 720), (591, 965)),
|
||||
((624, 36), (339, 36)),
|
||||
((425, 323), (425, 442)),
|
||||
((234, 939), (234, 963)),
|
||||
((482, 912), (968, 912)),
|
||||
((228, 614), (189, 614)),
|
||||
((969, 472), (969, 692)),
|
||||
((871, 494), (871, 172)),
|
||||
((101, 624), (848, 624)),
|
||||
((424, 918), (69, 563)),
|
||||
((929, 671), (93, 671)),
|
||||
((81, 187), (707, 813)),
|
||||
((348, 923), (348, 924)),
|
||||
((921, 524), (921, 828)),
|
||||
((678, 454), (678, 364)),
|
||||
((904, 227), (904, 596)),
|
||||
((163, 344), (609, 790)),
|
||||
((206, 180), (206, 59)),
|
||||
((145, 519), (145, 717)),
|
||||
((317, 679), (317, 417)),
|
||||
((503, 724), (221, 724)),
|
||||
((353, 448), (413, 448)),
|
||||
((363, 643), (837, 643)),
|
||||
((594, 54), (359, 54)),
|
||||
((866, 117), (45, 938)),
|
||||
((939, 210), (284, 865)),
|
||||
((410, 556), (410, 801)),
|
||||
((905, 111), (673, 111)),
|
||||
((983, 167), (574, 167)),
|
||||
((595, 758), (97, 758)),
|
||||
((785, 10), (437, 10)),
|
||||
((517, 414), (517, 734)),
|
||||
((691, 567), (186, 62)),
|
||||
((842, 51), (31, 862)),
|
||||
((36, 199), (282, 199)),
|
||||
((864, 758), (864, 610)),
|
||||
((639, 918), (951, 918)),
|
||||
((245, 516), (245, 474)),
|
||||
((951, 203), (557, 203)),
|
||||
((176, 728), (176, 171)),
|
||||
((322, 217), (387, 217)),
|
||||
((149, 208), (836, 895)),
|
||||
((661, 298), (609, 298)),
|
||||
((46, 47), (981, 982)),
|
||||
((769, 45), (769, 610)),
|
||||
((988, 932), (988, 459)),
|
||||
((901, 97), (901, 908)),
|
||||
((195, 395), (121, 395)),
|
||||
((197, 403), (327, 533)),
|
||||
((159, 456), (857, 456)),
|
||||
((480, 981), (881, 580)),
|
||||
((86, 958), (962, 82)),
|
||||
((375, 198), (763, 198)),
|
||||
((950, 381), (341, 381)),
|
||||
((504, 679), (504, 598)),
|
||||
((756, 659), (680, 583)),
|
||||
((146, 328), (886, 328)),
|
||||
((930, 412), (492, 850)),
|
||||
((954, 54), (954, 940)),
|
||||
((790, 498), (790, 305)),
|
||||
((83, 270), (83, 242)),
|
||||
((939, 268), (939, 563)),
|
||||
((423, 756), (916, 263)),
|
||||
((583, 756), (583, 34)),
|
||||
((957, 639), (614, 639)),
|
||||
((484, 523), (521, 560)),
|
||||
((497, 809), (497, 419)),
|
||||
((76, 17), (979, 920)),
|
||||
((49, 39), (943, 933)),
|
||||
((110, 289), (110, 247)),
|
||||
((874, 868), (874, 172)),
|
||||
((576, 127), (53, 650)),
|
||||
((871, 879), (12, 20)),
|
||||
((436, 711), (592, 711)),
|
||||
((132, 285), (225, 285)),
|
||||
((245, 147), (514, 147)),
|
||||
((158, 882), (956, 84)),
|
||||
((21, 984), (937, 68)),
|
||||
((42, 275), (219, 275)),
|
||||
((877, 143), (889, 143)),
|
||||
((593, 841), (508, 756)),
|
||||
((414, 289), (132, 289)),
|
||||
((687, 655), (767, 655)),
|
||||
((453, 981), (459, 987)),
|
||||
((635, 433), (635, 324)),
|
||||
((671, 347), (170, 848)),
|
||||
((412, 579), (915, 579)),
|
||||
((269, 677), (269, 596)),
|
||||
((587, 121), (367, 341)),
|
||||
((153, 883), (153, 709)),
|
||||
((524, 580), (508, 580)),
|
||||
((541, 232), (651, 232)),
|
||||
((93, 948), (284, 757)),
|
||||
((168, 745), (872, 41)),
|
||||
((831, 657), (925, 563)),
|
||||
((908, 389), (442, 389)),
|
||||
((462, 445), (234, 445)),
|
||||
((735, 493), (895, 493)),
|
||||
((274, 624), (296, 646)),
|
||||
((153, 130), (153, 160)),
|
||||
((466, 214), (466, 769)),
|
||||
((474, 499), (686, 711)),
|
||||
((540, 428), (788, 676)),
|
||||
((858, 215), (959, 215)),
|
||||
((788, 91), (788, 410)),
|
||||
((552, 505), (988, 505)),
|
||||
((978, 312), (978, 202)),
|
||||
((108, 321), (616, 829)),
|
||||
((903, 359), (903, 770)),
|
||||
((480, 331), (480, 769)),
|
||||
((503, 842), (34, 842)),
|
||||
((613, 732), (323, 442)),
|
||||
((767, 949), (654, 949)),
|
||||
((514, 589), (386, 589)),
|
||||
((38, 554), (284, 308)),
|
||||
((689, 268), (689, 711)),
|
||||
((860, 66), (190, 736)),
|
||||
((253, 865), (622, 865)),
|
||||
((87, 658), (698, 47)),
|
||||
((506, 892), (829, 569)),
|
||||
((680, 910), (594, 824)),
|
||||
((824, 603), (958, 603)),
|
||||
((576, 802), (562, 802)),
|
||||
((67, 27), (67, 489)),
|
||||
((969, 461), (517, 913)),
|
||||
((674, 763), (674, 226)),
|
||||
((223, 955), (218, 955)),
|
||||
((147, 540), (569, 962)),
|
||||
((455, 703), (596, 703)),
|
||||
((746, 899), (746, 403)),
|
||||
((516, 476), (756, 476)),
|
||||
((897, 674), (373, 150)),
|
||||
((120, 395), (120, 49)),
|
||||
((722, 443), (722, 244)),
|
||||
((724, 924), (724, 39)),
|
||||
((809, 930), (109, 930)),
|
||||
((822, 816), (874, 816)),
|
||||
((796, 539), (895, 539)),
|
||||
((340, 88), (560, 88)),
|
||||
((223, 158), (593, 158)),
|
||||
((779, 977), (856, 900)),
|
||||
((617, 461), (973, 817)),
|
||||
((515, 62), (515, 140)),
|
||||
((12, 586), (724, 586)),
|
||||
((870, 50), (391, 50)),
|
||||
((308, 123), (308, 696)),
|
||||
((119, 164), (863, 908)),
|
||||
((755, 599), (448, 599)),
|
||||
((129, 526), (633, 526)),
|
||||
((478, 668), (102, 668)),
|
||||
((237, 637), (237, 743)),
|
||||
((270, 102), (72, 300)),
|
||||
((115, 470), (115, 427)),
|
||||
((948, 233), (948, 731)),
|
||||
((983, 135), (468, 650)),
|
||||
((748, 439), (748, 642)),
|
||||
((62, 862), (352, 572)),
|
||||
((765, 901), (660, 901)),
|
||||
((917, 807), (917, 587)),
|
||||
((55, 81), (116, 81)),
|
||||
((954, 972), (102, 120)),
|
||||
((340, 503), (294, 549)),
|
||||
((970, 661), (522, 213)),
|
||||
((618, 92), (618, 247)),
|
||||
((688, 965), (965, 965)),
|
||||
((94, 241), (94, 292)),
|
||||
((15, 132), (15, 492)),
|
||||
((979, 927), (488, 927)),
|
||||
((509, 26), (984, 26)),
|
||||
((840, 530), (840, 95)),
|
||||
((55, 956), (849, 162)),
|
||||
((297, 297), (297, 472)),
|
||||
((338, 780), (369, 780)),
|
||||
((487, 292), (37, 292)),
|
||||
((122, 117), (206, 201)),
|
||||
((66, 807), (564, 309)),
|
||||
((643, 242), (906, 242)),
|
||||
((909, 833), (909, 441)),
|
||||
((129, 128), (818, 817)),
|
||||
((406, 42), (406, 297)),
|
||||
((53, 20), (967, 934)),
|
||||
((235, 285), (601, 285)),
|
||||
((275, 625), (275, 539)),
|
||||
((199, 732), (430, 963)),
|
||||
((639, 187), (639, 265)),
|
||||
((549, 740), (549, 824)),
|
||||
((603, 140), (603, 748)),
|
||||
((35, 455), (176, 455)),
|
||||
((888, 611), (888, 271)),
|
||||
((134, 154), (484, 154)),
|
||||
((694, 820), (694, 814)),
|
||||
((535, 584), (187, 932)),
|
||||
((642, 510), (642, 249)),
|
||||
((191, 886), (268, 886)),
|
||||
((918, 353), (881, 390)),
|
||||
((977, 13), (343, 13)),
|
||||
((380, 243), (271, 134)),
|
||||
((410, 758), (410, 670)),
|
||||
((613, 551), (519, 645)),
|
||||
((963, 84), (124, 923)),
|
||||
((702, 252), (821, 252)),
|
||||
((405, 237), (405, 22)),
|
||||
((21, 139), (21, 510)),
|
||||
((548, 499), (132, 499)),
|
||||
((196, 104), (196, 680)),
|
||||
((739, 145), (476, 145)),
|
||||
((751, 746), (91, 746)),
|
||||
((975, 628), (975, 847)),
|
||||
((935, 520), (935, 450)),
|
||||
((803, 372), (803, 393)),
|
||||
((872, 77), (872, 373)),
|
||||
((339, 130), (339, 103)),
|
||||
((226, 886), (226, 45)),
|
||||
((794, 647), (794, 257)),
|
||||
((90, 922), (889, 123)),
|
||||
((615, 971), (615, 574)),
|
||||
((26, 278), (26, 719)),
|
||||
((838, 88), (806, 88)),
|
||||
((263, 691), (804, 150)),
|
||||
((309, 721), (910, 721)),
|
||||
((510, 496), (960, 946)),
|
||||
((195, 236), (46, 236)),
|
||||
((610, 143), (610, 610)),
|
||||
((891, 412), (891, 268)),
|
||||
((714, 21), (156, 579)),
|
||||
((320, 935), (320, 96)),
|
||||
((240, 782), (449, 782)),
|
||||
((754, 472), (48, 472)),
|
||||
((105, 481), (529, 57)),
|
||||
((451, 301), (451, 965)),
|
||||
((796, 638), (796, 185)),
|
||||
((908, 553), (771, 553)),
|
||||
((98, 543), (490, 935)),
|
||||
((481, 159), (762, 159)),
|
||||
((593, 527), (419, 353)),
|
||||
((86, 391), (216, 521)),
|
||||
((260, 716), (42, 716)),
|
||||
((734, 538), (375, 179)),
|
||||
((24, 974), (975, 23)),
|
||||
((402, 466), (787, 851)),
|
||||
((344, 409), (262, 327)),
|
||||
((803, 443), (685, 443)),
|
||||
((986, 152), (249, 152)),
|
||||
((125, 738), (90, 773)),
|
||||
((184, 772), (184, 746)),
|
||||
((729, 829), (729, 340)),
|
||||
((226, 527), (226, 375)),
|
||||
((936, 231), (222, 945)),
|
||||
((254, 333), (254, 167)),
|
||||
((451, 234), (451, 273)),
|
||||
((915, 790), (568, 443)),
|
||||
((869, 794), (504, 429)),
|
||||
((11, 878), (836, 53)),
|
||||
((821, 231), (522, 530)),
|
||||
((285, 419), (732, 866)),
|
||||
((191, 272), (191, 679)),
|
||||
((41, 651), (225, 651)),
|
||||
((30, 13), (879, 862)),
|
||||
((980, 488), (20, 488)),
|
||||
((27, 187), (27, 348)),
|
||||
((53, 238), (53, 514)),
|
||||
((778, 306), (379, 705)),
|
||||
((425, 399), (425, 60)),
|
||||
((162, 859), (57, 859)),
|
||||
((652, 926), (652, 589)),
|
||||
((962, 489), (555, 896)),
|
||||
((197, 378), (436, 617)),
|
||||
((310, 190), (310, 760)),
|
||||
((678, 20), (678, 713)),
|
||||
((390, 653), (985, 58)),
|
||||
((938, 351), (656, 69)),
|
||||
((881, 39), (18, 902)),
|
||||
((313, 681), (323, 681)),
|
||||
((910, 907), (288, 907)),
|
||||
((739, 977), (739, 132)),
|
||||
((856, 479), (154, 479)),
|
||||
((893, 785), (761, 785)),
|
||||
((405, 247), (405, 901)),
|
||||
((58, 933), (808, 183)),
|
||||
((643, 156), (676, 189)),
|
||||
((149, 773), (357, 773)),
|
||||
((479, 518), (434, 518)),
|
||||
((389, 518), (556, 685)),
|
||||
((858, 449), (533, 774)),
|
||||
((503, 133), (409, 133)),
|
||||
((340, 315), (219, 194)),
|
||||
((183, 701), (183, 242)),
|
||||
((810, 151), (195, 151)),
|
||||
((446, 686), (446, 912)),
|
||||
((968, 482), (49, 482)),
|
||||
((203, 20), (203, 667)),
|
||||
((493, 516), (647, 516)),
|
||||
((900, 91), (634, 91)),
|
||||
((660, 554), (119, 13)),
|
||||
((964, 864), (964, 919)),
|
||||
((871, 293), (344, 293)),
|
||||
((895, 258), (972, 258))
|
||||
]
|
||||
|
||||
{-
|
||||
5167
|
||||
|
||||
|
||||
-}
|
||||
|
||||
|
584
2021/day5part2.swift
Normal file
584
2021/day5part2.swift
Normal file
|
@ -0,0 +1,584 @@
|
|||
import CoreGraphics
|
||||
import ImageIO
|
||||
import Foundation
|
||||
import UniformTypeIdentifiers
|
||||
|
||||
@main
|
||||
struct Day5Part2 {
|
||||
let input: [(Point, Point)] = [
|
||||
((911, 808), (324, 221)),
|
||||
((161, 890), (808, 243)),
|
||||
((174, 59), (174, 760)),
|
||||
((983, 983), (10, 10)),
|
||||
((321, 12), (870, 12)),
|
||||
((66, 936), (941, 61)),
|
||||
((670, 141), (670, 550)),
|
||||
((783, 935), (496, 648)),
|
||||
((973, 651), (635, 989)),
|
||||
((535, 47), (535, 154)),
|
||||
((355, 183), (754, 582)),
|
||||
((172, 111), (892, 111)),
|
||||
((353, 66), (907, 620)),
|
||||
((741, 960), (741, 805)),
|
||||
((113, 895), (946, 895)),
|
||||
((777, 280), (563, 280)),
|
||||
((679, 815), (626, 815)),
|
||||
((651, 848), (651, 673)),
|
||||
((205, 834), (205, 599)),
|
||||
((895, 118), (82, 931)),
|
||||
((685, 303), (93, 895)),
|
||||
((973, 38), (62, 949)),
|
||||
((867, 23), (867, 300)),
|
||||
((784, 947), (784, 47)),
|
||||
((96, 168), (755, 827)),
|
||||
((909, 321), (909, 716)),
|
||||
((59, 881), (692, 881)),
|
||||
((964, 19), (69, 914)),
|
||||
((752, 869), (67, 184)),
|
||||
((974, 877), (138, 41)),
|
||||
((432, 389), (137, 684)),
|
||||
((458, 822), (458, 402)),
|
||||
((818, 852), (308, 342)),
|
||||
((882, 484), (441, 925)),
|
||||
((82, 959), (976, 65)),
|
||||
((117, 487), (117, 429)),
|
||||
((214, 673), (429, 673)),
|
||||
((72, 955), (72, 829)),
|
||||
((587, 109), (587, 368)),
|
||||
((576, 17), (576, 872)),
|
||||
((685, 102), (685, 905)),
|
||||
((563, 394), (716, 394)),
|
||||
((966, 145), (150, 961)),
|
||||
((555, 582), (555, 385)),
|
||||
((453, 31), (453, 207)),
|
||||
((639, 815), (547, 723)),
|
||||
((431, 869), (431, 811)),
|
||||
((646, 938), (599, 938)),
|
||||
((215, 513), (900, 513)),
|
||||
((809, 82), (798, 82)),
|
||||
((768, 344), (244, 868)),
|
||||
((39, 962), (39, 601)),
|
||||
((675, 186), (61, 186)),
|
||||
((861, 967), (28, 967)),
|
||||
((860, 550), (538, 550)),
|
||||
((283, 740), (571, 740)),
|
||||
((72, 297), (72, 645)),
|
||||
((727, 801), (727, 526)),
|
||||
((799, 519), (799, 497)),
|
||||
((915, 24), (174, 765)),
|
||||
((795, 943), (136, 943)),
|
||||
((518, 971), (599, 971)),
|
||||
((594, 676), (594, 461)),
|
||||
((850, 799), (363, 799)),
|
||||
((958, 575), (958, 231)),
|
||||
((752, 576), (398, 576)),
|
||||
((891, 433), (398, 433)),
|
||||
((524, 126), (397, 126)),
|
||||
((10, 890), (796, 104)),
|
||||
((57, 228), (168, 228)),
|
||||
((168, 521), (338, 691)),
|
||||
((230, 83), (777, 83)),
|
||||
((865, 677), (640, 452)),
|
||||
((866, 821), (825, 821)),
|
||||
((17, 143), (17, 596)),
|
||||
((113, 916), (113, 601)),
|
||||
((268, 187), (551, 470)),
|
||||
((794, 167), (220, 167)),
|
||||
((459, 17), (459, 931)),
|
||||
((211, 31), (526, 31)),
|
||||
((680, 57), (756, 57)),
|
||||
((926, 190), (926, 800)),
|
||||
((85, 284), (63, 284)),
|
||||
((44, 988), (44, 701)),
|
||||
((110, 941), (176, 941)),
|
||||
((480, 163), (480, 112)),
|
||||
((574, 538), (574, 371)),
|
||||
((584, 473), (69, 473)),
|
||||
((303, 621), (303, 380)),
|
||||
((762, 652), (762, 89)),
|
||||
((286, 195), (276, 185)),
|
||||
((957, 87), (217, 827)),
|
||||
((561, 858), (561, 437)),
|
||||
((384, 55), (81, 55)),
|
||||
((19, 977), (981, 15)),
|
||||
((454, 747), (938, 263)),
|
||||
((425, 836), (425, 617)),
|
||||
((860, 135), (775, 50)),
|
||||
((633, 131), (633, 651)),
|
||||
((904, 912), (242, 250)),
|
||||
((880, 177), (480, 577)),
|
||||
((470, 162), (964, 656)),
|
||||
((585, 376), (585, 470)),
|
||||
((696, 760), (594, 862)),
|
||||
((534, 225), (534, 717)),
|
||||
((258, 816), (258, 847)),
|
||||
((990, 244), (990, 93)),
|
||||
((463, 462), (463, 533)),
|
||||
((434, 928), (537, 825)),
|
||||
((813, 734), (533, 734)),
|
||||
((498, 673), (395, 673)),
|
||||
((564, 312), (55, 312)),
|
||||
((280, 550), (939, 550)),
|
||||
((591, 247), (396, 52)),
|
||||
((127, 516), (127, 235)),
|
||||
((850, 425), (552, 127)),
|
||||
((894, 428), (894, 598)),
|
||||
((366, 960), (592, 960)),
|
||||
((579, 488), (170, 488)),
|
||||
((775, 92), (775, 586)),
|
||||
((49, 909), (930, 28)),
|
||||
((856, 113), (284, 685)),
|
||||
((263, 175), (120, 175)),
|
||||
((332, 592), (276, 592)),
|
||||
((920, 157), (141, 157)),
|
||||
((349, 776), (316, 776)),
|
||||
((187, 863), (279, 863)),
|
||||
((218, 872), (83, 872)),
|
||||
((465, 430), (410, 430)),
|
||||
((710, 218), (857, 218)),
|
||||
((797, 314), (184, 314)),
|
||||
((387, 327), (49, 665)),
|
||||
((950, 812), (205, 67)),
|
||||
((803, 133), (803, 682)),
|
||||
((125, 972), (545, 552)),
|
||||
((353, 901), (840, 414)),
|
||||
((936, 843), (202, 109)),
|
||||
((11, 904), (856, 59)),
|
||||
((725, 757), (954, 986)),
|
||||
((227, 697), (345, 697)),
|
||||
((187, 520), (187, 441)),
|
||||
((860, 262), (135, 987)),
|
||||
((700, 95), (976, 371)),
|
||||
((86, 946), (869, 163)),
|
||||
((898, 806), (461, 806)),
|
||||
((717, 796), (717, 195)),
|
||||
((882, 127), (835, 127)),
|
||||
((133, 48), (133, 191)),
|
||||
((521, 51), (521, 927)),
|
||||
((384, 806), (957, 233)),
|
||||
((570, 139), (570, 842)),
|
||||
((949, 819), (949, 350)),
|
||||
((592, 230), (283, 230)),
|
||||
((315, 856), (741, 856)),
|
||||
((870, 674), (549, 353)),
|
||||
((857, 306), (857, 889)),
|
||||
((428, 217), (267, 217)),
|
||||
((47, 93), (898, 944)),
|
||||
((636, 238), (665, 238)),
|
||||
((202, 910), (202, 737)),
|
||||
((246, 432), (617, 803)),
|
||||
((985, 24), (48, 961)),
|
||||
((965, 876), (956, 867)),
|
||||
((618, 650), (810, 458)),
|
||||
((292, 356), (575, 356)),
|
||||
((394, 585), (910, 585)),
|
||||
((137, 453), (137, 178)),
|
||||
((509, 737), (509, 665)),
|
||||
((193, 350), (531, 688)),
|
||||
((805, 219), (107, 219)),
|
||||
((975, 506), (907, 506)),
|
||||
((435, 303), (435, 380)),
|
||||
((344, 83), (344, 224)),
|
||||
((47, 66), (47, 115)),
|
||||
((570, 516), (857, 516)),
|
||||
((162, 91), (926, 91)),
|
||||
((759, 417), (759, 460)),
|
||||
((445, 942), (445, 699)),
|
||||
((421, 340), (421, 743)),
|
||||
((590, 590), (434, 434)),
|
||||
((453, 38), (453, 327)),
|
||||
((865, 134), (865, 773)),
|
||||
((842, 609), (18, 609)),
|
||||
((662, 282), (62, 882)),
|
||||
((489, 32), (344, 32)),
|
||||
((135, 496), (93, 454)),
|
||||
((552, 211), (421, 211)),
|
||||
((620, 678), (642, 678)),
|
||||
((782, 158), (585, 355)),
|
||||
((733, 509), (733, 574)),
|
||||
((932, 383), (369, 946)),
|
||||
((843, 705), (843, 725)),
|
||||
((747, 414), (676, 343)),
|
||||
((294, 218), (962, 886)),
|
||||
((844, 175), (844, 420)),
|
||||
((255, 489), (531, 213)),
|
||||
((555, 532), (821, 532)),
|
||||
((533, 15), (533, 161)),
|
||||
((631, 778), (631, 401)),
|
||||
((75, 282), (468, 282)),
|
||||
((903, 838), (903, 957)),
|
||||
((46, 293), (543, 790)),
|
||||
((30, 834), (30, 948)),
|
||||
((591, 720), (591, 965)),
|
||||
((624, 36), (339, 36)),
|
||||
((425, 323), (425, 442)),
|
||||
((234, 939), (234, 963)),
|
||||
((482, 912), (968, 912)),
|
||||
((228, 614), (189, 614)),
|
||||
((969, 472), (969, 692)),
|
||||
((871, 494), (871, 172)),
|
||||
((101, 624), (848, 624)),
|
||||
((424, 918), (69, 563)),
|
||||
((929, 671), (93, 671)),
|
||||
((81, 187), (707, 813)),
|
||||
((348, 923), (348, 924)),
|
||||
((921, 524), (921, 828)),
|
||||
((678, 454), (678, 364)),
|
||||
((904, 227), (904, 596)),
|
||||
((163, 344), (609, 790)),
|
||||
((206, 180), (206, 59)),
|
||||
((145, 519), (145, 717)),
|
||||
((317, 679), (317, 417)),
|
||||
((503, 724), (221, 724)),
|
||||
((353, 448), (413, 448)),
|
||||
((363, 643), (837, 643)),
|
||||
((594, 54), (359, 54)),
|
||||
((866, 117), (45, 938)),
|
||||
((939, 210), (284, 865)),
|
||||
((410, 556), (410, 801)),
|
||||
((905, 111), (673, 111)),
|
||||
((983, 167), (574, 167)),
|
||||
((595, 758), (97, 758)),
|
||||
((785, 10), (437, 10)),
|
||||
((517, 414), (517, 734)),
|
||||
((691, 567), (186, 62)),
|
||||
((842, 51), (31, 862)),
|
||||
((36, 199), (282, 199)),
|
||||
((864, 758), (864, 610)),
|
||||
((639, 918), (951, 918)),
|
||||
((245, 516), (245, 474)),
|
||||
((951, 203), (557, 203)),
|
||||
((176, 728), (176, 171)),
|
||||
((322, 217), (387, 217)),
|
||||
((149, 208), (836, 895)),
|
||||
((661, 298), (609, 298)),
|
||||
((46, 47), (981, 982)),
|
||||
((769, 45), (769, 610)),
|
||||
((988, 932), (988, 459)),
|
||||
((901, 97), (901, 908)),
|
||||
((195, 395), (121, 395)),
|
||||
((197, 403), (327, 533)),
|
||||
((159, 456), (857, 456)),
|
||||
((480, 981), (881, 580)),
|
||||
((86, 958), (962, 82)),
|
||||
((375, 198), (763, 198)),
|
||||
((950, 381), (341, 381)),
|
||||
((504, 679), (504, 598)),
|
||||
((756, 659), (680, 583)),
|
||||
((146, 328), (886, 328)),
|
||||
((930, 412), (492, 850)),
|
||||
((954, 54), (954, 940)),
|
||||
((790, 498), (790, 305)),
|
||||
((83, 270), (83, 242)),
|
||||
((939, 268), (939, 563)),
|
||||
((423, 756), (916, 263)),
|
||||
((583, 756), (583, 34)),
|
||||
((957, 639), (614, 639)),
|
||||
((484, 523), (521, 560)),
|
||||
((497, 809), (497, 419)),
|
||||
((76, 17), (979, 920)),
|
||||
((49, 39), (943, 933)),
|
||||
((110, 289), (110, 247)),
|
||||
((874, 868), (874, 172)),
|
||||
((576, 127), (53, 650)),
|
||||
((871, 879), (12, 20)),
|
||||
((436, 711), (592, 711)),
|
||||
((132, 285), (225, 285)),
|
||||
((245, 147), (514, 147)),
|
||||
((158, 882), (956, 84)),
|
||||
((21, 984), (937, 68)),
|
||||
((42, 275), (219, 275)),
|
||||
((877, 143), (889, 143)),
|
||||
((593, 841), (508, 756)),
|
||||
((414, 289), (132, 289)),
|
||||
((687, 655), (767, 655)),
|
||||
((453, 981), (459, 987)),
|
||||
((635, 433), (635, 324)),
|
||||
((671, 347), (170, 848)),
|
||||
((412, 579), (915, 579)),
|
||||
((269, 677), (269, 596)),
|
||||
((587, 121), (367, 341)),
|
||||
((153, 883), (153, 709)),
|
||||
((524, 580), (508, 580)),
|
||||
((541, 232), (651, 232)),
|
||||
((93, 948), (284, 757)),
|
||||
((168, 745), (872, 41)),
|
||||
((831, 657), (925, 563)),
|
||||
((908, 389), (442, 389)),
|
||||
((462, 445), (234, 445)),
|
||||
((735, 493), (895, 493)),
|
||||
((274, 624), (296, 646)),
|
||||
((153, 130), (153, 160)),
|
||||
((466, 214), (466, 769)),
|
||||
((474, 499), (686, 711)),
|
||||
((540, 428), (788, 676)),
|
||||
((858, 215), (959, 215)),
|
||||
((788, 91), (788, 410)),
|
||||
((552, 505), (988, 505)),
|
||||
((978, 312), (978, 202)),
|
||||
((108, 321), (616, 829)),
|
||||
((903, 359), (903, 770)),
|
||||
((480, 331), (480, 769)),
|
||||
((503, 842), (34, 842)),
|
||||
((613, 732), (323, 442)),
|
||||
((767, 949), (654, 949)),
|
||||
((514, 589), (386, 589)),
|
||||
((38, 554), (284, 308)),
|
||||
((689, 268), (689, 711)),
|
||||
((860, 66), (190, 736)),
|
||||
((253, 865), (622, 865)),
|
||||
((87, 658), (698, 47)),
|
||||
((506, 892), (829, 569)),
|
||||
((680, 910), (594, 824)),
|
||||
((824, 603), (958, 603)),
|
||||
((576, 802), (562, 802)),
|
||||
((67, 27), (67, 489)),
|
||||
((969, 461), (517, 913)),
|
||||
((674, 763), (674, 226)),
|
||||
((223, 955), (218, 955)),
|
||||
((147, 540), (569, 962)),
|
||||
((455, 703), (596, 703)),
|
||||
((746, 899), (746, 403)),
|
||||
((516, 476), (756, 476)),
|
||||
((897, 674), (373, 150)),
|
||||
((120, 395), (120, 49)),
|
||||
((722, 443), (722, 244)),
|
||||
((724, 924), (724, 39)),
|
||||
((809, 930), (109, 930)),
|
||||
((822, 816), (874, 816)),
|
||||
((796, 539), (895, 539)),
|
||||
((340, 88), (560, 88)),
|
||||
((223, 158), (593, 158)),
|
||||
((779, 977), (856, 900)),
|
||||
((617, 461), (973, 817)),
|
||||
((515, 62), (515, 140)),
|
||||
((12, 586), (724, 586)),
|
||||
((870, 50), (391, 50)),
|
||||
((308, 123), (308, 696)),
|
||||
((119, 164), (863, 908)),
|
||||
((755, 599), (448, 599)),
|
||||
((129, 526), (633, 526)),
|
||||
((478, 668), (102, 668)),
|
||||
((237, 637), (237, 743)),
|
||||
((270, 102), (72, 300)),
|
||||
((115, 470), (115, 427)),
|
||||
((948, 233), (948, 731)),
|
||||
((983, 135), (468, 650)),
|
||||
((748, 439), (748, 642)),
|
||||
((62, 862), (352, 572)),
|
||||
((765, 901), (660, 901)),
|
||||
((917, 807), (917, 587)),
|
||||
((55, 81), (116, 81)),
|
||||
((954, 972), (102, 120)),
|
||||
((340, 503), (294, 549)),
|
||||
((970, 661), (522, 213)),
|
||||
((618, 92), (618, 247)),
|
||||
((688, 965), (965, 965)),
|
||||
((94, 241), (94, 292)),
|
||||
((15, 132), (15, 492)),
|
||||
((979, 927), (488, 927)),
|
||||
((509, 26), (984, 26)),
|
||||
((840, 530), (840, 95)),
|
||||
((55, 956), (849, 162)),
|
||||
((297, 297), (297, 472)),
|
||||
((338, 780), (369, 780)),
|
||||
((487, 292), (37, 292)),
|
||||
((122, 117), (206, 201)),
|
||||
((66, 807), (564, 309)),
|
||||
((643, 242), (906, 242)),
|
||||
((909, 833), (909, 441)),
|
||||
((129, 128), (818, 817)),
|
||||
((406, 42), (406, 297)),
|
||||
((53, 20), (967, 934)),
|
||||
((235, 285), (601, 285)),
|
||||
((275, 625), (275, 539)),
|
||||
((199, 732), (430, 963)),
|
||||
((639, 187), (639, 265)),
|
||||
((549, 740), (549, 824)),
|
||||
((603, 140), (603, 748)),
|
||||
((35, 455), (176, 455)),
|
||||
((888, 611), (888, 271)),
|
||||
((134, 154), (484, 154)),
|
||||
((694, 820), (694, 814)),
|
||||
((535, 584), (187, 932)),
|
||||
((642, 510), (642, 249)),
|
||||
((191, 886), (268, 886)),
|
||||
((918, 353), (881, 390)),
|
||||
((977, 13), (343, 13)),
|
||||
((380, 243), (271, 134)),
|
||||
((410, 758), (410, 670)),
|
||||
((613, 551), (519, 645)),
|
||||
((963, 84), (124, 923)),
|
||||
((702, 252), (821, 252)),
|
||||
((405, 237), (405, 22)),
|
||||
((21, 139), (21, 510)),
|
||||
((548, 499), (132, 499)),
|
||||
((196, 104), (196, 680)),
|
||||
((739, 145), (476, 145)),
|
||||
((751, 746), (91, 746)),
|
||||
((975, 628), (975, 847)),
|
||||
((935, 520), (935, 450)),
|
||||
((803, 372), (803, 393)),
|
||||
((872, 77), (872, 373)),
|
||||
((339, 130), (339, 103)),
|
||||
((226, 886), (226, 45)),
|
||||
((794, 647), (794, 257)),
|
||||
((90, 922), (889, 123)),
|
||||
((615, 971), (615, 574)),
|
||||
((26, 278), (26, 719)),
|
||||
((838, 88), (806, 88)),
|
||||
((263, 691), (804, 150)),
|
||||
((309, 721), (910, 721)),
|
||||
((510, 496), (960, 946)),
|
||||
((195, 236), (46, 236)),
|
||||
((610, 143), (610, 610)),
|
||||
((891, 412), (891, 268)),
|
||||
((714, 21), (156, 579)),
|
||||
((320, 935), (320, 96)),
|
||||
((240, 782), (449, 782)),
|
||||
((754, 472), (48, 472)),
|
||||
((105, 481), (529, 57)),
|
||||
((451, 301), (451, 965)),
|
||||
((796, 638), (796, 185)),
|
||||
((908, 553), (771, 553)),
|
||||
((98, 543), (490, 935)),
|
||||
((481, 159), (762, 159)),
|
||||
((593, 527), (419, 353)),
|
||||
((86, 391), (216, 521)),
|
||||
((260, 716), (42, 716)),
|
||||
((734, 538), (375, 179)),
|
||||
((24, 974), (975, 23)),
|
||||
((402, 466), (787, 851)),
|
||||
((344, 409), (262, 327)),
|
||||
((803, 443), (685, 443)),
|
||||
((986, 152), (249, 152)),
|
||||
((125, 738), (90, 773)),
|
||||
((184, 772), (184, 746)),
|
||||
((729, 829), (729, 340)),
|
||||
((226, 527), (226, 375)),
|
||||
((936, 231), (222, 945)),
|
||||
((254, 333), (254, 167)),
|
||||
((451, 234), (451, 273)),
|
||||
((915, 790), (568, 443)),
|
||||
((869, 794), (504, 429)),
|
||||
((11, 878), (836, 53)),
|
||||
((821, 231), (522, 530)),
|
||||
((285, 419), (732, 866)),
|
||||
((191, 272), (191, 679)),
|
||||
((41, 651), (225, 651)),
|
||||
((30, 13), (879, 862)),
|
||||
((980, 488), (20, 488)),
|
||||
((27, 187), (27, 348)),
|
||||
((53, 238), (53, 514)),
|
||||
((778, 306), (379, 705)),
|
||||
((425, 399), (425, 60)),
|
||||
((162, 859), (57, 859)),
|
||||
((652, 926), (652, 589)),
|
||||
((962, 489), (555, 896)),
|
||||
((197, 378), (436, 617)),
|
||||
((310, 190), (310, 760)),
|
||||
((678, 20), (678, 713)),
|
||||
((390, 653), (985, 58)),
|
||||
((938, 351), (656, 69)),
|
||||
((881, 39), (18, 902)),
|
||||
((313, 681), (323, 681)),
|
||||
((910, 907), (288, 907)),
|
||||
((739, 977), (739, 132)),
|
||||
((856, 479), (154, 479)),
|
||||
((893, 785), (761, 785)),
|
||||
((405, 247), (405, 901)),
|
||||
((58, 933), (808, 183)),
|
||||
((643, 156), (676, 189)),
|
||||
((149, 773), (357, 773)),
|
||||
((479, 518), (434, 518)),
|
||||
((389, 518), (556, 685)),
|
||||
((858, 449), (533, 774)),
|
||||
((503, 133), (409, 133)),
|
||||
((340, 315), (219, 194)),
|
||||
((183, 701), (183, 242)),
|
||||
((810, 151), (195, 151)),
|
||||
((446, 686), (446, 912)),
|
||||
((968, 482), (49, 482)),
|
||||
((203, 20), (203, 667)),
|
||||
((493, 516), (647, 516)),
|
||||
((900, 91), (634, 91)),
|
||||
((660, 554), (119, 13)),
|
||||
((964, 864), (964, 919)),
|
||||
((871, 293), (344, 293)),
|
||||
((895, 258), (972, 258)),
|
||||
]
|
||||
|
||||
func run() {
|
||||
var minX = 0
|
||||
var maxX = 0
|
||||
var minY = 0
|
||||
var maxY = 0
|
||||
for line in input {
|
||||
minX = min(minX, line.0.x, line.1.x)
|
||||
maxX = max(maxX, line.0.x, line.1.x)
|
||||
minY = min(minY, line.0.y, line.1.y)
|
||||
maxY = max(maxY, line.0.y, line.1.y)
|
||||
}
|
||||
|
||||
var grid = Grid(minX: minX, minY: minY, maxX: maxX, maxY: maxY)
|
||||
for line in input { grid.line(line) }
|
||||
|
||||
|
||||
print(grid.grid.lazy.filter { $0 >= 2 }.count)
|
||||
|
||||
let data = CGDataProvider(dataInfo: nil, data: &grid.grid, size: grid.grid.count, releaseData: {_,_,_ in })
|
||||
let image = CGImage(width: maxX - minX, height: maxY - minY, bitsPerComponent: 8, bitsPerPixel: 8, bytesPerRow: maxX - minX, space: .init(name: CGColorSpace.linearGray)!, bitmapInfo: [], provider: data!, decode: nil, shouldInterpolate: false, intent: .defaultIntent)
|
||||
|
||||
let url = URL(fileURLWithPath: "/Users/sven/test.png")
|
||||
let dest = CGImageDestinationCreateWithURL(url as CFURL, UTType.png.identifier as CFString, 1, nil)
|
||||
CGImageDestinationAddImage(dest!, image!, nil)
|
||||
CGImageDestinationFinalize(dest!)
|
||||
}
|
||||
|
||||
struct Grid {
|
||||
let minX: Int
|
||||
let minY: Int
|
||||
let width: Int
|
||||
var grid: [UInt8]
|
||||
|
||||
init(minX: Int, minY: Int, maxX: Int, maxY: Int) {
|
||||
self.minX = minX
|
||||
self.minY = minY
|
||||
width = maxX - minX + 1
|
||||
let height = maxY - minY + 1
|
||||
|
||||
grid = Array(repeating: 0, count: width * height)
|
||||
}
|
||||
|
||||
subscript(x: Int, y:Int) -> UInt8 {
|
||||
get { grid[(y - minY) * width + x - minX] }
|
||||
set { grid[(y - minY) * width + x - minX] = newValue }
|
||||
}
|
||||
|
||||
mutating func line(_ line: (Point, Point)) {
|
||||
let ((minX, minY), (maxX, maxY)) = line
|
||||
|
||||
var x = minX
|
||||
var y = minY
|
||||
|
||||
let xStep = minX == maxX ? 0 : minX < maxX ? 1 : -1
|
||||
let yStep = minY == maxY ? 0 : minY < maxY ? 1 : -1
|
||||
|
||||
while true {
|
||||
self[x, y] += 1
|
||||
if x == maxX && y == maxY {
|
||||
break
|
||||
}
|
||||
x += xStep
|
||||
y += yStep
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
typealias Point = (x: Int, y: Int)
|
||||
|
||||
static func main() {
|
||||
Self().run()
|
||||
}
|
||||
}
|
36
2021/day6.swift
Normal file
36
2021/day6.swift
Normal file
|
@ -0,0 +1,36 @@
|
|||
@main
|
||||
struct Day6 {
|
||||
let input = [3,3,2,1,4,1,1,2,3,1,1,2,1,2,1,1,1,1,1,1,4,1,1,5,2,1,1,2,1,1,1,3,5,1,5,5,1,1,1,1,3,1,1,3,2,1,1,1,1,1,1,4,1,1,1,1,1,1,1,4,1,3,3,1,1,3,1,3,1,2,1,3,1,1,4,1,2,4,4,5,1,1,1,1,1,1,4,1,5,1,1,5,1,1,3,3,1,3,2,5,2,4,1,4,1,2,4,5,1,1,5,1,1,1,4,1,1,5,2,1,1,5,1,1,1,5,1,1,1,1,1,3,1,5,3,2,1,1,2,2,1,2,1,1,5,1,1,4,5,1,4,3,1,1,1,1,1,1,5,1,1,1,5,2,1,1,1,5,1,1,1,4,4,2,1,1,1,1,1,1,1,3,1,1,4,4,1,4,1,1,5,3,1,1,1,5,2,2,4,2,1,1,3,1,5,5,1,1,1,4,1,5,1,1,1,4,3,3,3,1,3,1,5,1,4,2,1,1,5,1,1,1,5,5,1,1,2,1,1,1,3,1,1,1,2,3,1,2,2,3,1,3,1,1,4,1,1,2,1,1,1,1,3,5,1,1,2,1,1,1,4,1,1,1,1,1,2,4,1,1,5,3,1,1,1,2,2,2,1,5,1,3,5,3,1,1,4,1,1,4]
|
||||
|
||||
var population: [Int] = .init(repeating: 0, count: 9)
|
||||
|
||||
func step() -> [Int] {
|
||||
var result = Array(repeating: 0, count: 9)
|
||||
for (age, count) in population.enumerated() {
|
||||
if age == 0 {
|
||||
result[6] += count
|
||||
result[8] += count
|
||||
} else {
|
||||
result[age - 1] += count
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
mutating func run() {
|
||||
for age in input {
|
||||
population[age] += 1
|
||||
}
|
||||
|
||||
for day in 0..<256 {
|
||||
population = step()
|
||||
}
|
||||
|
||||
print(population.reduce(0) { $0 + $1 })
|
||||
}
|
||||
|
||||
static func main() {
|
||||
var x = Self()
|
||||
x.run()
|
||||
}
|
||||
}
|
267
2021/day8part2.swift
Normal file
267
2021/day8part2.swift
Normal file
|
@ -0,0 +1,267 @@
|
|||
|
||||
@main
|
||||
struct Day8Part2 {
|
||||
|
||||
mutating func run() {
|
||||
var sum = 0
|
||||
|
||||
for line in input.split(separator: "\n") {
|
||||
let parts = line.split(separator: " ")
|
||||
.filter { $0 != "|" }
|
||||
.map { Set($0) }
|
||||
|
||||
let mapping = self.findMapping(parts[0..<10])
|
||||
sum += self.decode(parts[10...], with: mapping)
|
||||
}
|
||||
|
||||
print(sum)
|
||||
}
|
||||
|
||||
func findMapping(_ input: ArraySlice<Set<Character>>) -> [String: Int] {
|
||||
var result: [String: Int] = [:]
|
||||
var input = input
|
||||
|
||||
let one = input.removeFirst { $0.count == 2 }!
|
||||
let seven = input.removeFirst { $0.count == 3 }!
|
||||
let four = input.removeFirst { $0.count == 4 }!
|
||||
|
||||
let three = input.removeFirst { $0.count == 5 && $0.isSuperset(of: one) }!
|
||||
let nine = input.removeFirst { $0.count == 6 && $0.isSuperset(of: three) }!
|
||||
|
||||
let five = input.removeFirst { $0.count == 5 && $0.subtracting(nine).isEmpty }!
|
||||
let two = input.removeFirst { $0.count == 5 }!
|
||||
|
||||
let zero = input.removeFirst { $0.count == 6 && $0.subtracting(one).count == 4 }!
|
||||
let six = input.removeFirst { $0.count == 6 }!
|
||||
|
||||
result[String(zero.sorted())] = 0
|
||||
result[String(one.sorted())] = 1
|
||||
result[String(two.sorted())] = 2
|
||||
result[String(three.sorted())] = 3
|
||||
result[String(four.sorted())] = 4
|
||||
result[String(five.sorted())] = 5
|
||||
result[String(six.sorted())] = 6
|
||||
result[String(seven.sorted())] = 7
|
||||
result["abcdefg"] = 8
|
||||
result[String(nine.sorted())] = 9
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
func decode(_ input: ArraySlice<Set<Character>>, with mapping: [String: Int]) -> Int {
|
||||
var result = 0
|
||||
for digit in input {
|
||||
result = result * 10 + mapping[String(digit.sorted())]!
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
static func main() {
|
||||
var result = Self()
|
||||
result.run()
|
||||
}
|
||||
|
||||
let input = """
|
||||
fgcae ebafc cabdef eg abecfg abgfed feg gafdc bceg ebgcadf | defagbc faecg cfdag gecb
|
||||
eagd cad fgadbc aefdcg dcebfg fcegd cbeaf ad dbgfeca defca | cfdeg gdcabf fcgde afgced
|
||||
gfdeca aeb eb fbdag eafdc adfbe cefdab bdaegcf efbc ecadgb | eb dbafe eab faecd
|
||||
facbdge efdg gcafd daegc caegb aecfdb ade ed gafbdc dgfeac | de abcdef faedcg dfgca
|
||||
dcaegbf bc dcgeab cbgad cebg cdfaeb fbadg acdge cefdga cdb | gdcfae gbec gdace cgadfe
|
||||
ceagfbd fbaeg fadge fbegad abgecf dafcg ed edab ged dfcbeg | gebfa de gbafec ed
|
||||
acedbf adfbg cgafedb geac cgb befcgd bcgaf bfgace cg bfeac | bcdfeg fecba cafgeb bgdfa
|
||||
egadc cea ac agbcedf cgab bgcade fbcaed eadfbg fegdc ebdag | fdecabg fcged cdbage efgdab
|
||||
cbfge gdc cdea efdag dc cdfeg gfbcad gcdeaf cdeagbf egfadb | dfcge egcfd fcdbag dc
|
||||
gaedb fbced gcdbef cge gc decgb dcbgfea cgfb cgdfea fbcade | fdegbac fecbd ecg degba
|
||||
geaf bcfedg agbcd bfeagd dgfbe cbdaef beacdfg abe agebd ea | fbecdg geaf gebfad adgbc
|
||||
bed afgebd adecf bafgedc dbca cfegb becdf fabdce bd gcfdea | gfdaeb ebfgad dbefc cbda
|
||||
gacfebd ag bedfca agbfde egfcab dfga degab fbade bag bdecg | dgaf abcfed agb bfecag
|
||||
afebg afdeg gcbe acebdf cfbage cafeb gab decgabf bg gcfdba | gb caebf abgef acfebd
|
||||
efdab fabdgce gcbfa eg gacbfe beg ecag beafg dfabcg bgecfd | bge fgdcbe gcfdba ebdaf
|
||||
aecbd bdagef gd bfega aefgcbd gfde gfdcab dbg edgba febagc | dg dagfbc dgfe eabdgf
|
||||
gdfba egfacbd gdcefa baf gcba fdagcb dgfac ab dcfeba ebgdf | dcfag bfa gafcd cbag
|
||||
afbe bdagc cedfb defcab ebfdgac gfedbc cbfad af adgcfe adf | dafbc dfbac fdcegb gadcb
|
||||
fcgedb ca fdcage cagdbef ceab acedfb fdbce cafdb cda afgbd | ac dcafb efgdac ebcfda
|
||||
fbad gbcda dcefgb cfeadg dgbcaf bcafdeg ad gcabe adc dfbcg | gbcdef bcfdg cgbfd bfadgc
|
||||
afcgeb bedag bdecafg agb bedfga fdagce bg bgfd dfgea cdabe | badge cagdfe efdag afegbd
|
||||
gfed dcaef ge bafdce daceg acebfg cefadg egc ecdabfg gacdb | bcgad bcegaf agecd degcafb
|
||||
deacb adcge ab acb fbdce faedbgc fgadec gabd deabgc ecbfag | dfbec ab cbagfe bcfgae
|
||||
gcabfde ecf cbdeg bacgf fedg ecfgb gfedcb fcaedb cebdag fe | dbcegf bcgdfe gfde defg
|
||||
daefb bfg gedafb fabge dbafec cfega bdga cgbdfe gb gbacedf | aecfg bcedaf begdcf dgba
|
||||
bagce bf bdacfeg efbg fcb cefab gbfadc cafebg ecdfa bacdge | fegb cegba bagce efbg
|
||||
becag cfeg cefgbad fbace gfeacb acdegb bef ef adbcf fdabge | ef bdfac cbegad gbeac
|
||||
egb afcbe fbaeg eabgfdc gcab gb gfdea fgbecd bcdafe gafbec | fcdgeb edcgbfa gbe fgeba
|
||||
dga caebd ecdag cegfd abdfce dafbge ecbgda bcdgefa ga agbc | afdbec ecfdab gdaec gad
|
||||
fc gbdefc cfe ebdaf fcbeda gbafde edacg bfcdgae dacef cabf | decgfba cdbefg cf ecdabf
|
||||
febgd dafgbc caed cgd ceadgf fbecga dcgfe aegfc gbedfca cd | dgfeb fgced dcafebg agdfce
|
||||
ecdafgb bgade bgd fabd gbaef bd egadbf ceadg cfbgea dgbfec | edagc bdage bfda dbgae
|
||||
cgeba aefgcd dfceagb dc ced facbed cdfb dbaec adfeb fgedba | fbdea bgcae efbda fcdeag
|
||||
caegbf dcfga afcedgb afgdcb fcedag ab edbcg dbfa gdcab abg | bag cbdag agb ab
|
||||
gadfecb befc fgdbea cf fedagc fac bcgfa agbfe adgcb feagcb | gbcda cgbad bcgfa cf
|
||||
dae aefcb dgabec dacfg afebdc ebfd afecgb aedcf fbcagde ed | ecabfgd bedf bcadef egdacfb
|
||||
abcf fcega fdgce fegbda eafdcgb ac gabecd gbfae beagfc eca | edbgca edbfga cae gface
|
||||
bgedcf afcdbg ag gcbaef fcedgab afgdb cfgbd befda acdg agf | fdbga ceadbfg egfbac fag
|
||||
bad edafc bdeg abcgde ecafgbd gfadcb bgaec db edcba geafcb | cdafe fdcabg cdfageb dbge
|
||||
geb bgcf agfcde gb befag gfbcae defab gabdec eacfg gabecfd | afbedgc gceabf abgef egacf
|
||||
fdeac acg cfegda cbeadf fegdbca ag acefg adge bfdgca gbcfe | gecdaf efgca cgbafd cfgeb
|
||||
begdf bdfgc ebcf adfcg cdegbf dgeafb cbg cb bfeagdc gbdcea | acgedb fagdbe bgfde dfgac
|
||||
afcgdb aedc bedgf egafcd afdge gecaf fcgebda gda da ceabfg | gedbf gacfe adg agdef
|
||||
bdeafg acgebdf dgcfa fa cafe dgfbc gaf edagfc cgabde agedc | fadbge bdgfcea dgcefa cgeda
|
||||
gacfbde defag cbgef gbca efadcb afcbeg cgbdfe ba eba gefab | fegab abe ebfcgd fbgae
|
||||
gfbdec fbcade cabdegf ebdg bfd dcfgb cadgf gebcf db fcabge | eacdgfb bdge ebdg ecafdb
|
||||
egcfba fdcae fcdaeb gcfdae fabd ba cdeab fcdbaeg eba decbg | cabed facbed cbade dfcea
|
||||
agdfe acfdeg fcdbeg dgf gdaec df cadf ceagbfd abgfe gbdaec | bgcdef abfge gbefcd df
|
||||
dgebf afgdb bfa fcbade af dcafgb agcf gcbda dabgecf gadecb | dbcga abcdge fadgbce eagcbd
|
||||
dbcga bea egacdf dageb be efbd abgfce gadfe fcbegad aebfdg | eba be bdage bedga
|
||||
gcbd egbdafc fgc fbgedc gc aedbfg cefgb fedbg cfaegd efabc | bface egfbc bgdacfe gc
|
||||
fdgae dc ced gbcd gbcefd decfba becfg ecfabg cgfde gbcadfe | edbcfg cd cafgbe cdegbf
|
||||
geadcf efg gadef fg fecad acbgfe dagecbf dcgf gadbe afbdce | edafcg bgcfade gfdc abedg
|
||||
edcba ecgdb aedbcf aebf dabfc fdacge badgfc ae ead gfcbade | gcebdaf degbc ebfadc efdcba
|
||||
caedbg dbgec dcbf ecgdbf cgdef dgf bgaedcf egacf afebgd fd | cdfbeg ecfbgda gcbfed cbgedf
|
||||
bdag acdeb ecgdb egbcfa fcdbega gb dbecag cbdafe ebg gdcef | bedgc abdfcge efagcb cdgef
|
||||
bfade bfdga dfbgec cagbfd dfgacbe gba gacf ag gdcbf abgedc | cfag abdcge ebafd abefd
|
||||
agcdef bcfda bdgca aebdfcg eagdc gb dbg gbea cedagb bfgdec | dfabgec eafdgc acdge gdecab
|
||||
ebacdfg cgbfad egdbc bdgfa daef bae gabed febadg ae gacbef | fagdb daebgf fgdab bea
|
||||
dcgbf cbedf degc bgc fcgdbea fbadg cfdgbe gc efacgb fdbace | edfcb cfeabg cg edbacf
|
||||
bcdagfe dfacb cbfdge bgcdf fdgeac acd agbd acbef da dcgfba | cbgdf dgab ad gbdcaf
|
||||
edgfbca gbe be ceba bdaecg gefcd dbagc egbadf dcegb dfgabc | gcfde gfceabd gfbcad eagfdb
|
||||
dfcbg fcdga efgb gecbfd gecbda dfbgaec bedfc dgb bfadce bg | dbcgf bfge dacgf dfgcbe
|
||||
cga ebdgaf bfdag cbgfe bfadgc gbfeadc ac cagfb cdba cgadef | bfdag agedcf aegcbfd gcfab
|
||||
gcead gfdbec cbdge gabfce eb dfgcba ecfdgab befd dgcbf ebg | cdgae fbdegc bcdge gcdfb
|
||||
da ebgfda fcdeagb acgbfe gedba dbegc agdecf dae bafeg bfda | gdafec fegba edfbga aed
|
||||
fbagec gdfba bcg gebcfd cbafg bcdfgea ebac cefag faedcg bc | gfbac baegcfd fabegc dgeacbf
|
||||
dfbeag fabdg fdbe abdeg eb dcega gcefba cfdbag dgcfbae geb | cgbafd bdef dcage eb
|
||||
abdcfe gba dagf cagbefd fdbea bfega ag dafbge dcbeag gfceb | afbcde ecgfb dfbega bdgeca
|
||||
dg dge gdbc cfdae bcgae cbdage abgfde cfedagb cdgae eacgbf | eabgc bgeac bcdg cagbe
|
||||
bfd dgaeb gcabde fd bfgce dgfa dbefg gadbfce dbafge fabcde | edfcba efbcg df bdf
|
||||
gcbfd agbecd fedc edcbfg fdb eadfbg bcfag fd gedcb gbacdef | fgbac bdagfec gfbdaec aegbdc
|
||||
cgbdfe ce acedg adcfeg bcfegad fcea ceg abdeg afbdcg fcgda | ecg aefdcg dacge ec
|
||||
egbdfca efacb agcdbe cbaed bdafgc dfaecg debg bd bda agced | geadbc efbca gabfdc bd
|
||||
edcfb bfgecd ecabfd eca abcd fgeab fedcag abfedgc ac bfeca | bgfae eca cdgfeb bfaec
|
||||
cadef cebdga ebd bacdfe dagfec dbfa fcebg ecbgfad db fdecb | befcd acgdeb abdf dbfa
|
||||
gbfecda bfd cdagb fbdacg fgdbec gbaf cbadf aefdc eadcgb bf | adcgb dfbca agbf dafcb
|
||||
abedg acbgf fd gaefcb cagbdef cdaf dcbfeg bdagf dgcbfa bfd | gbadcef df fadgb gabcdf
|
||||
fbgadc dbcfg dcega cgdfe cfedbg caefgb ef gef gfaebcd fedb | fcedg febd gbcdfa cdgfab
|
||||
bg adgb fcaedbg cgfda fcbae bcg dfacge fgcdba decgfb bcagf | cgafb dbfcage bdgcfe dbga
|
||||
ed afbdg acefb aecbfg cfdabeg gedfcb fcdabe ecda def ebdfa | gbafd gedfcb dfegcb dfgba
|
||||
gcdfae efgdb abdfcg fde gdabf dbcegfa fedgab efab ef ebdcg | eafb gbfda gacedf cbdge
|
||||
edagfc gfaecbd bgced cbegfd cb gefdc badgfc bdc efbc adegb | dgbec cegafd dcbgef dgecb
|
||||
gedcab beg eg cafgb fbegc gdfe bdgfec gabcedf bdafce bcdfe | gcefb afcbed ge gdfe
|
||||
fdbagc cdgefab edacf ceba ea cfbaed ecfdg abfegd adfbc eda | ea beadfc abcgdef ecdgf
|
||||
fbc gfbacd fecda cbdfa dbgf dceabg gbcdfea efbgac cdabg bf | gbdf agbced gaedbc gfdb
|
||||
aegcb bfgecd fbegad fcagdbe dfgce fcbd gdeacf fb bgf bgfce | bgafedc gcdaef dgfcbe eadgcf
|
||||
def dbce agdfeb ed fdgbcea dgcfb aegfc dfgbac gecfd cdfgbe | cdfegb ed cdgfaeb ebdc
|
||||
ecbfad afdb eagbfc caebgdf edfcb dgfec cgdbae bd bcafe bdc | bfacegd fbdcae dbc bgfdcea
|
||||
dfgba eg cfbead gde bfedgc dceab cabfdge gdbae aecg aedgcb | egd adebg gde debcfa
|
||||
cadfb egfb afgbc adbegc ecgadf ecagb fga ecfgab bgacfde fg | afcbg cgfba gf dacbge
|
||||
cegbf dec efcdg facdge dfae dcbafge ed adgfc fdbagc cgaebd | dce gbcfe afcdgbe dcgabf
|
||||
cfabe fa eabgfc cgaf fba gfbce dcfbge edbgcfa efbadg acebd | cfebga bfa fedcagb abfce
|
||||
acdfb dbagf afcebgd beag afgedb gfdea gbd fgdcbe gb cdeagf | dafge gafed gfacde gb
|
||||
gdfeac dfgce ebfadcg edagc dacf baegdc fd gdf egcfb dabgef | degfbac cfdeg daebgf cdeagb
|
||||
fcgabe ebcd ecfdg dabcgf gfecabd cfd ebcfg dc bcfegd adefg | agedf cd bcefg dc
|
||||
cbaeg bcfea fb feb gfaceb gdfbec dagbec gfab deacf bgcaedf | acbfge bf afgb efb
|
||||
egdba cadgfbe efadbg cg begc bfgdca caegd abcegd dcg acdfe | fbegcad bceg gcd cdgebaf
|
||||
agbcd dafcgb cfdg ceadb fdgeba eafbcg gfdab gbc bgdcafe cg | gfadcbe fbagd decba gc
|
||||
gfbec adgc dge egdcfa abgfde abgdfce dg eacfdb fdaec gdfce | fecgd gd fgcbe acdef
|
||||
fdbceg bfedc af fegcad cbdag daf efab dabcef fbeadgc cbfad | fcabd cbfad gcfdbe gadbc
|
||||
ebgac fabdeg bedca cg aegdcfb geacbf ceg efgba facg fbedcg | gecdfb aebfg fagc ceg
|
||||
eagb dcgeb ba abd cbeagd cdgafb fecbdga fgedcb dacfe dacbe | bdfeacg cadgbf bgedfc fcdae
|
||||
dbac cfgae cbfgde ba bga gcfbad dcfebga gcdbf feagbd cgbaf | cgafb fagbdc dcfbg afgebd
|
||||
adbgfe fgb egdafc cbafd dfegbc edgafbc egfcd cegb gfcdb gb | bg fdacge efcadg egdfba
|
||||
agfbe cgaefdb gbdf edagb afg cdgafe gfedab fg egcdba fabec | fcbdega fag agf agf
|
||||
cae edabfc cdfega ca cfba gadeb fdecb ecagfbd cbgdef acdeb | facdeb fgecad bfadce efcgbad
|
||||
facb dbfec dceabf efgcd cb aecfbgd dgfbae eafdb ebdagc bcd | bfedc cdegab cbdfe adefb
|
||||
fecbga badgc dga bfgadec dg geacb cgedba dfebag gcde fcabd | decg gda baceg gd
|
||||
gecbd gcbdfea cbfg bg bge egbcdf dcbef beafdc cdeag bfgeda | agcde dceag gfabde beg
|
||||
gefba gacfbe facdeg cg cgab gfc efbdcag cfgeb cefbd afegbd | gfc afbge dafegb aebcgf
|
||||
egd aebfgd gefc ge gedbfca bdcfe dfcegb gecdb edbacf cdbag | dacbg edcfbg bcdfe ge
|
||||
df ebdga gcdefa cfbd bgdfa afgcb dfeagbc bfacgd fgd facebg | gaebd gecbaf fdcb dfbag
|
||||
fag cegfdab cadebg dabcgf abefg eafc ecafgb ebacg fbdge fa | ebfag dbcgfae gbecad fdbgac
|
||||
gecbd gefa gfc fabdcg bfaecd ecgafbd fg befgc efabc gecbfa | gfae gcf egbdafc edgbc
|
||||
bfgae fcebag fdbe fd fedag adgfbc fdbgea ecagd agcbfed fad | fgabe dfeb ebfd gefba
|
||||
ecdgfb afge bdage ebcda eg abdgef fgadb gabcfd dge bcdagef | gdebfa eg agfbdec afeg
|
||||
dbc acefd cegadbf fbcde afcb fdcaeg bc acdbge febdac debfg | ceafd caefd gfbaced dcb
|
||||
fecgb fgacd gdcefba de gbafce febd gecfd edc fecdbg ecbgda | becdfg ed becgad gcdeba
|
||||
agfdbe fbac bcd edacfb bgecfd cb cdeba cfgdeab acged edfab | cb dbc adbce bdfae
|
||||
dgacef bdfa ecgbf ab fegba dgafe efdbgca abg acebdg afbdge | gefda ecgafd ecfbg begcad
|
||||
gbfcea bgfa afdebc aegdcb af bgcdfea bgeac gecdf afc fgace | bfgecad fca afc abfg
|
||||
cfe dgcfe fdagcb gebdc egfa gbcdefa dcebfa fe agdfc fgaedc | dfgac fe fce fcdbega
|
||||
fecgab gcbdef cbaefgd dfgbe dgcfe eb bfe dbfga edbc acfegd | fbdeg fdgeca agefbc egcfd
|
||||
aecd bac dfacbe cafdb ac gefcab gfcdbe fcbde gbdaf cbdegaf | gcdbefa fbgcae ecad fagecb
|
||||
eagbf cagedf geafdbc fdgbce adefb aecfd adcb deb faecbd bd | ebd deabf fadcge cdagfe
|
||||
gadefcb bfcga eadcgb egdbfc deag ecg edabc acedbf eg abgce | gdea bagce gce gce
|
||||
agcfe bec gecab gbeda facb dbfgec fcegab gfacde gfdaceb cb | cb cefdgb cadefgb bc
|
||||
fdgb df egabcf fegda cedga fegab efdbac def cgdefba gafedb | facdbe bafceg agedf fdebga
|
||||
fdaecg dbcafg abfgec dc caefg cedg aecfd abdgfce eadbf fcd | cgefab gbfacd fbegac fabecg
|
||||
dfecabg bcfeag gdafce dagbfc cdefb dca gafbc dbag da bcadf | dca bagfce cbfda cdagbf
|
||||
dabfgec febadg gbcdae gfbe adebf ef cabdf edfgca ebgda eaf | gfacbed abgced egdfca egfb
|
||||
cfdea dc fdagebc fegcbd agdc gcfade fcabe cfd efdgba gfead | bdfcge agdc dgefa cfd
|
||||
gbfca febadcg bc bdegcf beca begaf gabedf cgfbae cgfad cbg | bcg dcaefgb dfgceb afebdg
|
||||
cg cgbf bedcg fcagde adefbcg efdgcb ebacd cgd edbfg egdafb | cfgedb bgcf acegdf cfgb
|
||||
bfad adcgbe faceg fagbdc df afdgc efcbdag dfbegc gfd badcg | gfd abgcd fgd abfd
|
||||
bcadgf cgdfb adgcb gf gafc dcfeabg bdagce dgf dfbega cebdf | adcbfg gfca fdcbe gfac
|
||||
daebf fcabgde bgdcef gab ga edbcga afcg ebfga aefbgc egbcf | ebcfg ebcgfa fcgebd agcf
|
||||
gedab fg afgecb cfgd feg cfabed befdc fgdcbe gdceafb befgd | ecafbg ecfbd febdc gf
|
||||
gcbadf ce gfcdb fec feabd gbecdf dbcfage febdc agcdfe egbc | bafed gcbe gefcbd egcb
|
||||
cbdfg gbcafd feb gaecf gcbfe gfbdae be fcgabde bdgcef becd | abgedf gdfebc aedgfb fbe
|
||||
edacgbf fbdae edgac bg gab bagdec dagfce fadbgc cebg bgdea | aedgb bg cebg adcge
|
||||
bda gbfea gedcab gfbceda bgdfa bfcdg febcdg bagcfd cfad da | dbecag bgfdc gdbfa facd
|
||||
ceabd dabfe acgde bc fbca cgbfde febgda dfecagb ebafdc bdc | cbdae dbfea fgdceb gbfedc
|
||||
acg fadbgce cfgdeb dbgce efdca ag dbga cagbef egacd cdgbea | gdecabf gcbfea ecbdg gac
|
||||
dfgacb ged egfdab efcgbda gcefbd debga ebadc ge aegf gfdab | cdfgab cdafgb bfcgda ge
|
||||
gdbeca bcfde eafg cefbgad dgafcb ge degfb adefbg dgfba bge | bdfeg begdf ebfadg eabdfgc
|
||||
cfbdgae gbaec bagfcd gfcba dcaeg bacfeg dbeacf bec efgb eb | ceb egcab cagfb dgcae
|
||||
fdcagb gdaecb fcadg bcdgaef gd dfcea gbcaf aecgfb cgd dgbf | gfadc gfdb badgfc gbfca
|
||||
bcafed defgcab fgcb cfbae cagde agebfc gbcae gbe gadefb gb | bg gfcaeb bg aedgc
|
||||
bcfadeg gbfd eacfbd gdafe afebg bafegd geafcd gebca fb bfa | agdefc eafbdg fgead gedaf
|
||||
fcgeabd dgeaf ebgfad gceafb geadc ac aec ebcdg cafd adgefc | gbfadec egcbd acfd dgabef
|
||||
eac fbdgec ea eadb cbaeg agfdecb eafdgc dcgbe bcfga adcbeg | aec abde eac ea
|
||||
cedb gcadbe ed edgfbac fbega abdge gacdb fdacgb dcefag aed | cdagb gbcafd gdefac gedafc
|
||||
cae agfbec ae begcd feab fadgbc ecfadg ecabg cdgbefa cabfg | ecgba afcgb efba dgeafc
|
||||
fecgabd badf efadg abedfg fea fdgceb fedgb aebfgc af gdcae | ebfgca fae fea af
|
||||
bgedac gbfae dcbefg acbf fb gaedf cagedbf aebgc gebfca fgb | aedgf fdgea bgfae bfdgeac
|
||||
bagcfe eadcb gb facegdb bgc fdcag efbcad beadgc bgadc ebgd | gbc fbcage becad gbfcae
|
||||
cagde gbca dcgbea gc efcad dbgfea dfgecb caedbfg adgbe cdg | gc egdfbc bcga cg
|
||||
efgcbd aebgcd dfe eadfb abged abdcefg bacfd ef bdfaeg faeg | fgae cgdaeb adefb afcbd
|
||||
cgbfea gcbda gefdcb eadf febag bdf fd febgad fadbegc bgadf | gebcfd fgdbea dfb dbf
|
||||
dg cdgfe gecfad dfbce bgefda fgd eafcg efcbag dgac bcdagfe | afdebg gfd aecgf gfcea
|
||||
edfga cgefda gcdbe fbae ab egdabf cfgbda deabg bad adefcgb | ebadg agdeb fbae gbdae
|
||||
gbdcfa gbade ebgac ecbfa adfgbec badecf bgc gcef fbgace gc | gc fcge gacefdb ebgca
|
||||
acefgd ebgaf egfda egcd bgfaecd dgcfa ed abcefd efd abdgcf | def ebgaf fed befcda
|
||||
fecag cag cfagbd agfcbde fabec eabg fdcge cgbfea fadebc ag | cfgbda dfgbeca efdcg dfgcaeb
|
||||
bgecfda ecdag dgfcbe bdgac adbgf afgdbe bfac gdcabf cbd bc | bc acbgefd fagcdb fcba
|
||||
ba efacg cfbgde cfdbg bacgf bgfdea abf bcad cfbeadg bgcfad | bcdgef fdgaeb ab cagfe
|
||||
cbdaf bafdgc eacbd fd dcf fcabg bcdfeg bedgcfa dgfa agbecf | dfga bgfac df agdf
|
||||
edcabf cadbf bgfdcea bgcfad bgcde dfg fg bdfgc cgadfe abfg | adfecg gfbcd acgdfeb cbgdaf
|
||||
badgfc dg bagcde bceda dbcfea beafg debag adg fcbadeg edgc | gebda dcagbf dceba egfab
|
||||
edcf dacfbg dbcefag fbd df bdegfc ebdagc bgfea begcd bfedg | dgebc cbgde dgfbac bdf
|
||||
bdcfg acegfb acebfd fdcag egadcf da daf cgeaf edag bafcegd | gdcaf fgaec bafdec fdaecb
|
||||
cagefd fde gdfba fcgaedb abefd ef dafbeg ebfg afcbgd ebdca | egdbfa bceda dfabg bdace
|
||||
fcgb gcdae bg gfadeb cbfegd fcabed bdg gcdbe fdcbe adbefcg | dgb gfbdec befdc gfbc
|
||||
fabde bgfde bgecda cedgb gf cabfdeg ebfdgc fgbeac fcdg gfb | fgbde efdgb edgbc afedb
|
||||
ebacf cedfab fde eabfd fd baecgf bagde agdebfc dfcb egfadc | ebfdgac acdegf abdefc ebfad
|
||||
gdcb cd cfgae cgbedf fbegd efgdc fadcbe gfeacdb dce dfagbe | gbcd cde gacfe gefdbc
|
||||
geb afedgb bfegca bgade eg dgef gadbc eafdb afebdcg fcbead | cagbd defcba dbafec geafcb
|
||||
fgbdc gbfade gba gefa dbafg cbadge bfgecda ga edbafc dfabe | afbdeg dgfba bgdfa dcfgb
|
||||
agef badce ef febad cabfdg gdfab cbgeafd egfbdc defgba fbe | abefd geaf gafdbe ebcad
|
||||
gd gad bfdg gecba fedabcg fcgeda aedfbc adebf agbdfe dgeab | ebcdaf agd gcfbdae egacb
|
||||
cedbfa ba cgbfa abf dfegac cafeg gabe befgca ebdfcag cbfdg | fab aegcf faecbd fdcebga
|
||||
daefg febdga aegfdbc efgdca eafb bge eb agbdec febgd gbdfc | gbcfd edbfg egb bacegd
|
||||
fbdecg bdafec cfaeb gedac def dceaf abfd fd gfecba gfdaecb | ebfac bdfa gbcdef fd
|
||||
fcbga cbdfeag bafgce fdacg dc fcd fcgbad fadge efcdgb cdab | gaefcb bafegcd acdb abcgf
|
||||
ecgabd acgdf abge ae bcfead fgdaceb ead daegc bcdefg gcbed | egba gaecd cgadbe gdbce
|
||||
aegfbc gf afebdc agebdfc ebcdf feg dcefg bdfg dcgea bgedcf | edbfcg fdgb bdgafce febgcd
|
||||
dcg bcdefa dbfceg fdeacg acbeg bfeagcd cfdae dg dfag agdec | dfcgea dg egdca edagc
|
||||
agcfeb fagbed fdbceg bag gebfd afgd agbfcde acbed ag badeg | cbdea fcedgb gfebac abcegf
|
||||
adbegfc fgdace cadge afcg ebdfca ebgad eac bfgdce cgefd ca | acged fcedg ebagd dgacefb
|
||||
gfeadb gfeab bcfa agebcfd aebgfc fecgbd efc fc gadec egcfa | fgbace fc debgcf afgceb
|
||||
bacg ab cfgbd bfadge acfed fgdecb agedcbf fcabgd bfa dbafc | gfdcb cbga abcg afecbdg
|
||||
ge beagc cfgabd bgaced bgcda fbadgec age ecdagf egbd fcbae | aeg gedbac cadfeg fbgcda
|
||||
dgbafe abfdgec gdf fd agebcf gadec dfcgba befd edfga aebfg | abcgefd dagec dfg df
|
||||
edfcga bcegd baeg cbgdae agdbc gce acgdebf eg gfadbc cefbd | dcbeg bgedc cedbg edcbg
|
||||
adfbe dg cagef dfgb gdbeca aefdg gda edcbaf fdgeba gdecbfa | cdabef eafbd bafcegd dg
|
||||
cd edcbfg dbage fcaebdg facd bgcfea afbedc afbec dbc adecb | adegb bcefag abegd cbgedf
|
||||
gdcbf da ecgbfda adc adgb bagcfd dfbcea egfac dfbceg gdacf | gdba cfdbg adbfec fcaeg
|
||||
bcg bc gdcbae dbca abfgde gdeba ebfacdg egcba faceg dgfbce | geadb badecg ecbfgd baecg
|
||||
"""
|
||||
}
|
186
2021/day9.swift
Normal file
186
2021/day9.swift
Normal file
|
@ -0,0 +1,186 @@
|
|||
@main
|
||||
struct Day9: Puzzle {
|
||||
|
||||
let matrix = Self.input.compactMap { $0.wholeNumberValue }
|
||||
let width = 100
|
||||
let height = 100
|
||||
|
||||
subscript(x: Int, y: Int) -> Int {
|
||||
get {
|
||||
return matrix[x + width * y]
|
||||
}
|
||||
}
|
||||
|
||||
func isMinimum(x: Int, y: Int) -> Bool {
|
||||
let value = self[x, y]
|
||||
let smallerLeft = x == 0 || self[x - 1, y] > value
|
||||
let smallerRight = x == width - 1 || self[x + 1, y] > value
|
||||
let smallerTop = y == 0 || self[x, y - 1] > value
|
||||
let smallerBottom = y == height - 1 || self[x, y + 1] > value
|
||||
|
||||
return smallerLeft && smallerRight && smallerTop && smallerBottom
|
||||
}
|
||||
|
||||
func run() {
|
||||
var lowPoints: [(Int, Int)] = []
|
||||
var riskSum = 0
|
||||
for y in 0..<height {
|
||||
for x in 0..<width {
|
||||
if isMinimum(x: x, y: y) {
|
||||
riskSum += self[x,y] + 1
|
||||
lowPoints.append((x,y))
|
||||
}
|
||||
}
|
||||
}
|
||||
print("Part 1:", riskSum)
|
||||
|
||||
let basins = lowPoints.map { basinSize(x: $0.0, y: $0.1) }
|
||||
.sorted(by: { $0 > $1 })
|
||||
.prefix(3)
|
||||
.reduce(1, *)
|
||||
|
||||
print("Part 2:", basins)
|
||||
}
|
||||
|
||||
func basinSize(x: Int, y: Int) -> Int {
|
||||
basinAt(Point(x: x, y: y)).count
|
||||
}
|
||||
|
||||
subscript(point: Point) -> Int {
|
||||
self[point.x, point.y]
|
||||
}
|
||||
|
||||
func basinAt(_ p: Point) -> Set<Point> {
|
||||
var set: Set<Point> = []
|
||||
findBasin(at: p, value: self[p] - 1, visited: &set)
|
||||
return set
|
||||
}
|
||||
|
||||
func findBasin(at point: Point, value: Int, visited: inout Set<Point>) {
|
||||
guard !visited.contains(point) else { return }
|
||||
guard point.x >= 0 && point.y >= 0 && point.x < width && point.y < height else { return }
|
||||
let currentValue = self[point]
|
||||
guard currentValue != 9 && currentValue > value else { return }
|
||||
|
||||
visited.insert(point)
|
||||
findBasin(at: point.left, value: currentValue, visited: &visited)
|
||||
findBasin(at: point.up, value: currentValue, visited: &visited)
|
||||
findBasin(at: point.right, value: currentValue, visited: &visited)
|
||||
findBasin(at: point.down, value: currentValue, visited: &visited)
|
||||
}
|
||||
|
||||
struct Point: Hashable {
|
||||
var x: Int
|
||||
var y: Int
|
||||
|
||||
var left: Point { .init(x: x - 1, y: y) }
|
||||
var right: Point { .init(x: x + 1, y: y) }
|
||||
var up: Point { .init(x: x, y: y - 1) }
|
||||
var down: Point { .init(x: x, y: y + 1) }
|
||||
}
|
||||
|
||||
|
||||
static let input = """
|
||||
5796798621237995498765434567987542999765679987545679109878999877899789876532123456998999876887899921
|
||||
4645976434456789349654321298997679898654698987635678998767897656789698765432012347897899865676798799
|
||||
3234987545978993298795410989998989789543256897646789498756789546896579877842123456976789954345985678
|
||||
4356798679989999019987329878999798679765345689856991296545890134789467998956899967895698643239874579
|
||||
6467999789999898934976598967987676568996457999967999987636789345691346789769987898934987651098763456
|
||||
7598997999987796899989987959876543456789569898998998765125678956910298899898776799123998862987652345
|
||||
8789876789865685578999876645987665567998689656789876554034899999891989998987564679099789879876543456
|
||||
9898765498974324456799865534598786788998798645889985432126954987789878987654323567988698989987664678
|
||||
9989997987543212367987654323459897899549895434569876556437899876599967996543212459876587898998798789
|
||||
9877989997662101456798765434567998967932987624778989787548999989679459987687301349875456967899899893
|
||||
8765678998983232367899896765788939346891295434999999899659879699894349899796532656954344756910923964
|
||||
9874789019894343456789949878999321235799987545678945998778964578942139769898543769843212345891949765
|
||||
7965678998765764567893433989876542346987898656789236799889653989943298652999678989754523456789898976
|
||||
6598789109976975698921012398999763457896559867997647989998799899874569541098799798765676579896687897
|
||||
5439898929989989789962123457899894568989435998998799878999989798765798432149898649987787899965456989
|
||||
5212987898999999899854336568999989879979326569109989567898879689878987544234995434599898999874345679
|
||||
4309875987999876998765687679989878998765412458929875467987854599989698955679989323459979899993214589
|
||||
5996954676799984329877788989878969899874324567899765359876743489996549877789878912398767789984323456
|
||||
9875432545789743212989899998967659789985595678998868249965312679865435998898767899598954698765467567
|
||||
2994321036897654101996936987654543679999989789997854198764301569979423459999954678997643789978578978
|
||||
0987432128998763219875424698763212478998978999876543298773212458998901267898767889598732345988789989
|
||||
9876544346789979329876512349998401569897569234987994987654343457897892478999878993349891234899998695
|
||||
9989875679899898939984701459886212398786456946799889998795464567896789989896999321234989345678987544
|
||||
9997987889998797998743212598765323987654397899989778999989978679945698999765678930349878956999898433
|
||||
8986798999987676789655329679876439876541289998878656899867898791239956799954345959499867897899765321
|
||||
7845679219878565678976598999987556998732378997667545798656789892398745999765237898987656789998654310
|
||||
6434798998765454567897987898798677899543467896553234987545878989499636878992156987975345899219964324
|
||||
0123987999874343456789876799549789987654598998421056989434767879976521767989249876543234998909878434
|
||||
4339876798955102367898985678939891099967899876542159875323854568965410156978956997684456797899989545
|
||||
5498765986543234488987894799012999129878999987653249986210123467894321249769767898795867956789199656
|
||||
6599754397654545589996789899993998949999998799767998975351237998995432398758998989986788946999098789
|
||||
7988732198765657678975698999879876898946999544979877989876456789987643459647899876097899534878999899
|
||||
9876546019878767889984567899968765667939896532989966592987887893298754598756789965198997323456799989
|
||||
0998757898989899992099789988754543457898789540199854301298998984129866789998999954249986412345899878
|
||||
1299898987699954954299999876543212348987698921598763212349999873234977995679439765356897601234988767
|
||||
2989999876569999895989986987654103467896567892349854334568989964345698934678921976897996532349875756
|
||||
9879899988698988789878995498976215989995456789498999965689879899456789323567890197998987656756994345
|
||||
8765677899987677697667896329865423499989997995987878897798768778968895438678991298969398967899873201
|
||||
8654546789766563459548994219876534578977789104986567789949654567899976657899789349543219988932965412
|
||||
8643437899854312998435689101987645689665679323975345678959868778957987798934679959654301299549876723
|
||||
6532126778969409876424578912498756796553568939863203456899979989646799899012567898976432358956987894
|
||||
8544434567998912998535689843569867989432459949954212568999989594535798989123467987976563567969799985
|
||||
9655566789897893479697897654567979879421267898767343467898795443123497679935679876899674789997659876
|
||||
9776789998656799567989998765678998967992349929876556578987654321012989567896798765678985999876642989
|
||||
9988899875434678979878999879889987657889458919997967689798865452199867456987987654567896798765431096
|
||||
8799943989545789999868799989999876545678967898789898797659979874987654347899999753459987979876532145
|
||||
7679969998656789987657678994323965432789979987679789896535989995998321234568939894567899764987687236
|
||||
7567898959767893976543467995909876645678989996545678965423599989899754359679421986789968973199875345
|
||||
3467987644978912987784989879899987856789999987434569653213679876789866468789439898993459792012989466
|
||||
6569999533989999798896797867789898987897999876424678962102398765898977578996598769322375679933496578
|
||||
8678998921296789679987896545698769399986789764312398993923499654567897689398999954201234567894987689
|
||||
9799867890145679542998987896789954234995698765101256789894987543458999791249899895312347899995798789
|
||||
2988656891237789869879998998996895999876789864212345996789987652377899910299756789436556799989999890
|
||||
3977545789347899998767899989434999879989898987423467895678993210466789321987645679987867989767899921
|
||||
9865437896556789999946799876545998767999987976534789954589997621245679459876437898798979876545978943
|
||||
9976545789697899987834689989699767656899876989675678932679876432556789598943218997659989765434567894
|
||||
9989867899989999986545678995987654545998965498797889321996997543457898797654323789943596986546789965
|
||||
8896978999879878997668789213986543234987894349898996549875698665678909998965534567892345697656798987
|
||||
7645989898765655689779898901987662129876789234989998698954539987899919879877645689931257898767967899
|
||||
9869998789964334578995937892397654398945689345678979987643012398967898767998776798890234999898957898
|
||||
6998789679892123457894325943498765987834568956889467898952134579656899656549887897789656799999546457
|
||||
5987654597651012349975434799579989865423567897992378999763245678947999743435998996549767987989432347
|
||||
4398753299843123457896545678992099654512455789209989398754356789439879842124999987638989876678954456
|
||||
1239854987653238768998956999989298743101234678998994298765768899598765431029892196547898965466795567
|
||||
0123995799768545678969869878979349543213455789997899109976779998789987532139789987656987654345789979
|
||||
3235986999879656789756999867668956975434696899986987912987899999894697643298678999987898543234567898
|
||||
9945799876998798897645987654456899876595989989765976899998999886989987659987567998998999864365788977
|
||||
8799895995439899986534598732367968988989878979954695678919998785468998798766456997899898765479899766
|
||||
5678923994323999876545987543478957999976556767893254589101987674378789899854349876799649876678987645
|
||||
4567919876214899987689998954989546898765432356789123678919986543245679998765467965678999987789298756
|
||||
3467898765436789998998999879995434999896521237895019789998997532135998899977569876789988798992109867
|
||||
2369929876545699999987899999876545689943210235994298999997989949239876789989778989899976569993298989
|
||||
3458910997676789899876989212987676899656432346789987889886979898949965679999899998998665478989987897
|
||||
4567899998787895798765678923598789998789545497899996779765765787898764567878921987999543289567976546
|
||||
6878978999898934989894569654589890249899876569999884568954654656989843458967899876998992123458997997
|
||||
7989569899919129878989678979678931239964998978998763477943212349879932123458998765876789012567919989
|
||||
8991356779909019767678989989899842498643239989987542356799302345965431014568919954345692139898929879
|
||||
9410124567898998654567891294998753679654134699876521245678913459876432323589109765457789256799598767
|
||||
4321267898987549876899910123987654598763245698776410234569865567997943434578999988767899767895349654
|
||||
6532356789876434987898943235698765679854659987654321345678976778999894565689989999878949878943298765
|
||||
7656467893987545998967896545699887998767998998765432456889988999998789689789878989999432989752129976
|
||||
8767589954899756899459987756989998919879897899876548668994599989987678999898769878997643496543234988
|
||||
9879678975798967987598999899878959102998766999988767899123678978986567894987653967898765789759449999
|
||||
2989789996987898998987899954969643213459945789799878943239989865454478923986542656949896899898998931
|
||||
1299899989776999129976899769878965425678996999656989965398798754342349435965421248956997899987687899
|
||||
0467999876545789098865689879989876566789987898768997897987659983210456949878543367899898999876546797
|
||||
2378988965434678987674778998999998987893598999879876798965434975672569898987665456789789998695435896
|
||||
4499877994323569876523467897988999999912459999989965689896323497883479767999787578995679876564326345
|
||||
9987656789212489986313568966767897899106598989999984878789212598965998956799898989664868975432101234
|
||||
8798878994323478965423459954456986798919987678999873165678943679879876545689939996543459876875212345
|
||||
9659989765434568976796567893299765987898765569898762054567894578998765434696549987654667998994323476
|
||||
8934599879876899997898879954987654496987654346789943123489965679539854323589998998767898989889456567
|
||||
7895678998987899998999998769876543345798765767898894344567896789329875434567897689998999878778967678
|
||||
6796989987698969799998789878998632134899878998946799465679987898919987645679976578999098767669898799
|
||||
5789995799549347689987678999986721023999999769434878987989998967898998767989787459989298653456789910
|
||||
4567894698432134567988566789875432335698798653212967999997859456987679878998643212578987832345679891
|
||||
3779992976553235679977455698998765487987689864343458999876543237897569989797652101459876543456789789
|
||||
9889689987664346798765323456789887569876598765454569986987652145789698795698768892368987956567895678
|
||||
4994567899865457999974313345699998798765439879875678955698767234999987654229878765456799767878934589
|
||||
2123456999876567899875101256789109999984321989989899543249878945678996542101989877667899878989123699
|
||||
"""
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue