├── day17 ├── sample.dat ├── input.dat └── day17.pl ├── day13 ├── sample.dat ├── input.dat └── day13.pl ├── day12 ├── sample.dat ├── day12.pl └── input.dat ├── day2 ├── test.dat ├── test_day2.py ├── star1.py ├── star2.py └── day2.pl ├── day5 ├── sample.dat ├── scr_day5.pl ├── day5.pl └── input.dat ├── day22 ├── loop.dat ├── sample.dat ├── input.dat └── day22.pl ├── day10 ├── sample.dat ├── sample2.dat ├── input.dat └── day10.pl ├── day14 ├── sample.dat ├── sample2.dat └── day14.pl ├── test ├── day11.lgt ├── day23.lgt ├── day17.lgt ├── day21.lgt ├── day24.lgt ├── day25.lgt ├── day2.lgt ├── day4.lgt ├── day5.lgt ├── day6.lgt ├── day7.lgt ├── day8.lgt ├── day1.lgt ├── day12.lgt ├── day15.lgt ├── day19.lgt ├── day22.lgt ├── day3.lgt ├── day9.lgt ├── day10.lgt ├── day13.lgt ├── day16.lgt ├── day20.lgt ├── day14.lgt └── day18.lgt ├── day8 ├── sample.dat ├── day8.pl └── input.dat ├── day18 ├── sample.dat └── day18.pl ├── day11 ├── sample.dat ├── day11.py ├── day112.py └── input.dat ├── day19 ├── sample.dat └── day19.pl ├── day21 ├── sample.dat ├── day21.pl └── input.dat ├── day16 ├── sample2.dat ├── sample.dat └── day16.pl ├── day3 ├── sample.dat ├── day3.pl └── input.dat ├── Makefile ├── day1 ├── test_day1.py ├── star1.py ├── star2.py ├── Test.hs ├── day1.pl ├── Day1.hs └── input.dat ├── day7 ├── sample.dat ├── demo.dat └── day7.pl ├── day4 ├── sample.dat ├── valid.dat └── day4.pl ├── pyproject.toml ├── .github └── workflows │ └── ci.yml ├── day20 ├── test.dat ├── sample.dat └── day20.pl ├── README.md ├── index.pl ├── day24 ├── sample.dat └── day24.pl ├── LICENSE ├── day15 └── day15.pl ├── day25 └── day25.pl ├── tester.lgt ├── day6 └── day6.pl ├── day9 ├── day9.pl └── input.dat ├── .gitignore ├── day23 ├── day23.py └── day23.pl └── poetry.lock /day17/sample.dat: -------------------------------------------------------------------------------- 1 | .#. 2 | ..# 3 | ### -------------------------------------------------------------------------------- /day13/sample.dat: -------------------------------------------------------------------------------- 1 | 939 2 | 7,13,x,x,59,x,31,19 3 | -------------------------------------------------------------------------------- /day12/sample.dat: -------------------------------------------------------------------------------- 1 | F10 2 | N3 3 | F7 4 | R90 5 | F11 6 | -------------------------------------------------------------------------------- /day2/test.dat: -------------------------------------------------------------------------------- 1 | 1-3 a: abcde 2 | 1-3 b: cdefg 3 | 2-9 c: ccccccccc -------------------------------------------------------------------------------- /day5/sample.dat: -------------------------------------------------------------------------------- 1 | BFFFBBFRRR 2 | FFFBBBFRRR 3 | BBFFBBFRLL 4 | -------------------------------------------------------------------------------- /day22/loop.dat: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 43 3 | 19 4 | 5 | Player 2: 6 | 2 7 | 29 8 | 14 9 | -------------------------------------------------------------------------------- /day10/sample.dat: -------------------------------------------------------------------------------- 1 | 16 2 | 10 3 | 15 4 | 5 5 | 1 6 | 11 7 | 7 8 | 19 9 | 6 10 | 12 11 | 4 12 | -------------------------------------------------------------------------------- /day14/sample.dat: -------------------------------------------------------------------------------- 1 | mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X 2 | mem[8] = 11 3 | mem[7] = 101 4 | mem[8] = 0 5 | -------------------------------------------------------------------------------- /test/day11.lgt: -------------------------------------------------------------------------------- 1 | :- object(day11, extends(lgtunit)). 2 | 3 | test(star1). 4 | test(star2). 5 | 6 | :- end_object. -------------------------------------------------------------------------------- /test/day23.lgt: -------------------------------------------------------------------------------- 1 | :- object(day23, extends(lgtunit)). 2 | 3 | test(star1). 4 | test(star2). 5 | 6 | :- end_object. -------------------------------------------------------------------------------- /day17/input.dat: -------------------------------------------------------------------------------- 1 | ##..#### 2 | .###.... 3 | #.###.## 4 | #....#.. 5 | ...#..#. 6 | #.#...## 7 | ..#.#.#. 8 | .##...#. 9 | -------------------------------------------------------------------------------- /day22/sample.dat: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 9 3 | 2 4 | 6 5 | 3 6 | 1 7 | 8 | Player 2: 9 | 5 10 | 8 11 | 4 12 | 7 13 | 10 14 | -------------------------------------------------------------------------------- /day8/sample.dat: -------------------------------------------------------------------------------- 1 | nop +0 2 | acc +1 3 | jmp +4 4 | acc +3 5 | jmp -3 6 | acc -99 7 | acc +1 8 | jmp -4 9 | acc +6 10 | -------------------------------------------------------------------------------- /day14/sample2.dat: -------------------------------------------------------------------------------- 1 | mask = 000000000000000000000000000000X1001X 2 | mem[42] = 100 3 | mask = 00000000000000000000000000000000X0XX 4 | mem[26] = 1 5 | -------------------------------------------------------------------------------- /test/day17.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day17/day17.pl'). 2 | 3 | :- object(day17, extends(lgtunit)). 4 | 5 | test(star1). 6 | test(star2). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day21.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day21/day21.pl'). 2 | 3 | :- object(day21, extends(lgtunit)). 4 | 5 | test(star1). 6 | test(star2). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day24.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day24/day24.pl'). 2 | 3 | :- object(day24, extends(lgtunit)). 4 | 5 | test(star1). 6 | test(star2). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /day18/sample.dat: -------------------------------------------------------------------------------- 1 | 2 * 3 + (4 * 5) 2 | 5 + (8 * 3 + 9 + 3 * 4 * 3) 3 | 5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4)) 4 | ((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2 5 | -------------------------------------------------------------------------------- /day11/sample.dat: -------------------------------------------------------------------------------- 1 | L.LL.LL.LL 2 | LLLLLLL.LL 3 | L.L.L..L.. 4 | LLLL.LL.LL 5 | L.LL.LL.LL 6 | L.LLLLL.LL 7 | ..L.L..... 8 | LLLLLLLLLL 9 | L.LLLLLL.L 10 | L.LLLLL.LL 11 | -------------------------------------------------------------------------------- /day19/sample.dat: -------------------------------------------------------------------------------- 1 | 0: 4 1 5 2 | 1: 2 3 | 3 2 3 | 2: 4 4 | 5 5 4 | 3: 4 5 | 5 4 5 | 4: "a" 6 | 5: "b" 7 | 8 | ababbb 9 | bababa 10 | abbbab 11 | aaabbb 12 | aaaabbb 13 | -------------------------------------------------------------------------------- /day21/sample.dat: -------------------------------------------------------------------------------- 1 | mxmxvkd kfcds sqjhc nhms (contains dairy fish) 2 | trh fvjkl sbzzf mxmxvkd (contains dairy) 3 | sqjhc fvjkl (contains soy) 4 | sqjhc mxmxvkd sbzzf (contains fish) 5 | -------------------------------------------------------------------------------- /test/day25.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day25/day25.pl'). 2 | 3 | :- object(day25, extends(lgtunit)). 4 | 5 | test(star1, true(X == 3286137)) :- day25:star(1, X). 6 | 7 | :- end_object. -------------------------------------------------------------------------------- /day16/sample2.dat: -------------------------------------------------------------------------------- 1 | class: 0-1 or 4-19 2 | row: 0-5 or 8-19 3 | seat: 0-13 or 16-19 4 | 5 | your ticket: 6 | 11,12,13 7 | 8 | nearby tickets: 9 | 3,9,18 10 | 15,1,5 11 | 5,14,9 12 | -------------------------------------------------------------------------------- /day3/sample.dat: -------------------------------------------------------------------------------- 1 | ..##....... 2 | #...#...#.. 3 | .#....#..#. 4 | ..#.#...#.# 5 | .#...##..#. 6 | ..#.##..... 7 | .#.#.#....# 8 | .#........# 9 | #.##...#... 10 | #...##....# 11 | .#..#...#.# 12 | -------------------------------------------------------------------------------- /day16/sample.dat: -------------------------------------------------------------------------------- 1 | class: 1-3 or 5-7 2 | row: 6-11 or 33-44 3 | seat: 13-40 or 45-50 4 | 5 | your ticket: 6 | 7,1,14 7 | 8 | nearby tickets: 9 | 7,3,47 10 | 40,4,50 11 | 55,2,20 12 | 38,6,12 13 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: python 2 | python: 3 | python3 -m pytest 4 | 5 | .PHONY: prolog 6 | prolog: 7 | swipl -s index.pl -g run_tests,halt -t 'halt(1)' 8 | 9 | .PHONY: lgtunit 10 | lgtunit: 11 | logtalk_tester -p swi -------------------------------------------------------------------------------- /test/day2.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day2/day2.pl'). 2 | 3 | :- object(day2, extends(lgtunit)). 4 | 5 | test(star1, true(X == 569)) :- day2:star(1, X). 6 | test(star2, true(X == 346)) :- day2:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day4.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day4/day4.pl'). 2 | 3 | :- object(day4, extends(lgtunit)). 4 | 5 | test(star1, true(X == 245)) :- day4:star(1, X). 6 | test(star2, true(X == 133)) :- day4:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day5.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day5/day5.pl'). 2 | 3 | :- object(day5, extends(lgtunit)). 4 | 5 | test(star1, true(X == 974)) :- day5:star(1, X). 6 | test(star2, true(X == 646)) :- day5:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /day2/test_day2.py: -------------------------------------------------------------------------------- 1 | from star1 import main as star1_main 2 | from star2 import main as star2_main 3 | 4 | def test_day2_star1(): 5 | assert star1_main() == 569 6 | 7 | def test_day2_star2(): 8 | assert star2_main() == 346 -------------------------------------------------------------------------------- /test/day6.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day6/day6.pl'). 2 | 3 | :- object(day6, extends(lgtunit)). 4 | 5 | test(star1, true(X == 6612)) :- day6:star(1, X). 6 | test(star2, true(X == 3268)) :- day6:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day7.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day7/day7.pl'). 2 | 3 | :- object(day7, extends(lgtunit)). 4 | 5 | test(star1, true(X == 119)) :- day7:star(1, X). 6 | test(star2, true(X == 155802)) :- day7:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day8.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day8/day8.pl'). 2 | 3 | :- object(day8, extends(lgtunit)). 4 | 5 | test(star1, true(X == 1600)) :- day8:star(1, X). 6 | test(star2, true(X == 1543)) :- day8:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day1.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day1/day1.pl'). 2 | 3 | :- object(day1, extends(lgtunit)). 4 | 5 | test(star1, true(X == 988771)) :- day1:star(1, X). 6 | test(star2, true(X == 171933104)) :- day1:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day12.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day12/day12.pl'). 2 | 3 | :- object(day12, extends(lgtunit)). 4 | 5 | test(star1, true(X == 1007)) :- day12:star(1, X). 6 | test(star2, true(X == 41212)) :- day12:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day15.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day15/day15.pl'). 2 | 3 | :- object(day15, extends(lgtunit)). 4 | 5 | test(star1, true(X == 700)) :- day15:star(1, X). 6 | test(star2, true(X == 51358)) :- day15:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day19.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day19/day19.pl'). 2 | 3 | :- object(day19, extends(lgtunit)). 4 | 5 | test(star1, true(X == 203)) :- day19:star(1, X). 6 | test(star2, true(X == 304)) :- day19:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day22.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day22/day22.pl'). 2 | 3 | :- object(day22, extends(lgtunit)). 4 | 5 | test(star1, true(X == 33400)) :- day22:star(1, X). 6 | test(star2, true(X == 33745)) :- day22:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day3.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day3/day3.pl'). 2 | 3 | :- object(day3, extends(lgtunit)). 4 | 5 | test(star1, true(X == 162)) :- day3:star(1, X). 6 | test(star2, true(X == 3064612320)) :- day3:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /day1/test_day1.py: -------------------------------------------------------------------------------- 1 | from star1 import main as star1_main 2 | from star2 import main as star2_main 3 | 4 | def test_day1_star1(): 5 | assert star1_main() == 988771 6 | 7 | def test_day1_star2(): 8 | assert star2_main() == 171933104 -------------------------------------------------------------------------------- /day13/input.dat: -------------------------------------------------------------------------------- 1 | 1000052 2 | 23,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,863,x,x,x,x,x,x,x,x,x,x,x,19,13,x,x,x,17,x,x,x,x,x,x,x,x,x,x,x,29,x,571,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41 3 | -------------------------------------------------------------------------------- /test/day9.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day9/day9.pl'). 2 | 3 | :- object(day9, extends(lgtunit)). 4 | 5 | test(star1, true(X == 400480901)) :- day9:star(1, X). 6 | test(star2, true(X == 67587168)) :- day9:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day10.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day10/day10.pl'). 2 | 3 | :- object(day10, extends(lgtunit)). 4 | 5 | test(star1, true(X == 1917)) :- day10:star(1, X). 6 | test(star2, true(X == 113387824750592)) :- day10:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day13.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day13/day13.pl'). 2 | 3 | :- object(day13, extends(lgtunit)). 4 | 5 | test(star1, true(X == 119)) :- day13:star(1, X). 6 | test(star2, true(X == 1106724616194525)) :- day13:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day16.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day16/day16.pl'). 2 | 3 | :- object(day16, extends(lgtunit)). 4 | 5 | test(star1, true(X == 20231)) :- day16:star(1, X). 6 | test(star2, true(X == 1940065747861)) :- day16:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day20.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day20/day20.pl'). 2 | 3 | :- object(day20, extends(lgtunit)). 4 | 5 | test(star1, true(X == 108603771107737)) :- day20:star(1, X). 6 | test(star2, true(X == 2129)) :- day20:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day14.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day14/day14.pl'). 2 | 3 | :- object(day14, extends(lgtunit)). 4 | 5 | test(star1, true(X == 11926135976176)) :- day14:star(1, X). 6 | test(star2, true(X == 4330547254348)) :- day14:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /test/day18.lgt: -------------------------------------------------------------------------------- 1 | :- use_module('../day18/day18.pl'). 2 | 3 | :- object(day18, extends(lgtunit)). 4 | 5 | test(star1, true(X == 209335026987)) :- day18:star(1, X). 6 | test(star2, true(X == 33331817392479)) :- day18:star(2, X). 7 | 8 | :- end_object. -------------------------------------------------------------------------------- /day10/sample2.dat: -------------------------------------------------------------------------------- 1 | 28 2 | 33 3 | 18 4 | 42 5 | 31 6 | 14 7 | 46 8 | 20 9 | 48 10 | 47 11 | 24 12 | 23 13 | 49 14 | 45 15 | 19 16 | 38 17 | 39 18 | 11 19 | 1 20 | 32 21 | 25 22 | 35 23 | 8 24 | 17 25 | 7 26 | 9 27 | 4 28 | 2 29 | 34 30 | 10 31 | 3 32 | -------------------------------------------------------------------------------- /day7/sample.dat: -------------------------------------------------------------------------------- 1 | shiny gold bags contain 2 dark red bags. 2 | dark red bags contain 2 dark orange bags. 3 | dark orange bags contain 2 dark yellow bags. 4 | dark yellow bags contain 2 dark green bags. 5 | dark green bags contain 2 dark blue bags. 6 | dark blue bags contain 2 dark violet bags. 7 | dark violet bags contain no other bags. 8 | -------------------------------------------------------------------------------- /day4/sample.dat: -------------------------------------------------------------------------------- 1 | ecl:gry pid:860033327 eyr:2020 hcl:#fffffd 2 | byr:1937 iyr:2017 cid:147 hgt:183cm 3 | 4 | iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 5 | hcl:#cfa07d byr:1929 6 | 7 | hcl:#ae17e1 iyr:2013 8 | eyr:2024 9 | ecl:brn pid:760753108 byr:1931 10 | hgt:179cm 11 | 12 | hcl:#cfa07d eyr:2025 pid:166559648 13 | iyr:2011 ecl:brn hgt:59in 14 | -------------------------------------------------------------------------------- /day4/valid.dat: -------------------------------------------------------------------------------- 1 | pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 2 | hcl:#623a2f 3 | 4 | eyr:2029 ecl:blu cid:129 byr:1989 5 | iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm 6 | 7 | hcl:#888785 8 | hgt:164cm byr:2001 iyr:2015 cid:88 9 | pid:545766238 ecl:hzl 10 | eyr:2022 11 | 12 | iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719 13 | -------------------------------------------------------------------------------- /day1/star1.py: -------------------------------------------------------------------------------- 1 | 2 | def main(): 3 | with open("day1/input.dat") as f: 4 | expenses = [int(n) for n in f.readlines()] 5 | result = None 6 | for a in expenses: 7 | for b in expenses: 8 | if a + b == 2020: 9 | result = a*b 10 | break 11 | return result 12 | 13 | if __name__ == "__main__": 14 | print(main()) -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "advent-of-code-2020" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Adrián Arroyo Calle "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.9" 9 | pytest = "^6.1.2" 10 | 11 | [tool.poetry.dev-dependencies] 12 | 13 | [build-system] 14 | requires = ["poetry-core>=1.0.0"] 15 | build-backend = "poetry.core.masonry.api" 16 | -------------------------------------------------------------------------------- /day22/input.dat: -------------------------------------------------------------------------------- 1 | Player 1: 2 | 45 3 | 10 4 | 43 5 | 46 6 | 25 7 | 36 8 | 16 9 | 38 10 | 30 11 | 15 12 | 26 13 | 34 14 | 9 15 | 2 16 | 44 17 | 1 18 | 4 19 | 40 20 | 5 21 | 24 22 | 49 23 | 3 24 | 41 25 | 19 26 | 13 27 | 28 | Player 2: 29 | 28 30 | 50 31 | 37 32 | 20 33 | 6 34 | 42 35 | 32 36 | 47 37 | 39 38 | 22 39 | 14 40 | 7 41 | 21 42 | 17 43 | 27 44 | 8 45 | 48 46 | 11 47 | 23 48 | 12 49 | 18 50 | 35 51 | 29 52 | 33 53 | 31 54 | -------------------------------------------------------------------------------- /day1/star2.py: -------------------------------------------------------------------------------- 1 | 2 | def main(): 3 | with open("day1/input.dat") as f: 4 | expenses = [int(n) for n in f.readlines()] 5 | result = None 6 | for a in expenses: 7 | for b in expenses: 8 | for c in expenses: 9 | if a + b + c == 2020: 10 | result = a*b*c 11 | break 12 | return result 13 | 14 | if __name__ == "__main__": 15 | print(main()) -------------------------------------------------------------------------------- /day7/demo.dat: -------------------------------------------------------------------------------- 1 | light red bags contain 1 bright white bag, 2 muted yellow bags. 2 | dark orange bags contain 3 bright white bags, 4 muted yellow bags. 3 | bright white bags contain 1 shiny gold bag. 4 | muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. 5 | shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. 6 | dark olive bags contain 3 faded blue bags, 4 dotted black bags. 7 | vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. 8 | faded blue bags contain no other bags. 9 | dotted black bags contain no other bags. 10 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Run Prolog tests 2 | on: [push] 3 | jobs: 4 | test: 5 | runs-on: ubuntu-20.04 6 | steps: 7 | - name: Checkout 8 | uses: actions/checkout@v2 9 | - name: Install SWI-Prolog backend 10 | uses: logtalk-actions/setup-swi-prolog@master 11 | with: 12 | swi-prolog-branch: stable 13 | swi-prolog-version: latest 14 | - name: Install Logtalk 15 | uses: logtalk-actions/setup-logtalk@master 16 | with: 17 | logtalk-version: git 18 | - name: Run Prolog tests 19 | run: make lgtunit -------------------------------------------------------------------------------- /day1/Test.hs: -------------------------------------------------------------------------------- 1 | import Data.Maybe (mapMaybe) 2 | import Text.Read ( readMaybe ) 3 | 4 | import Test.Tasty 5 | import Test.Tasty.HUnit 6 | 7 | import Day1 (triProd, cartProd, star, star2) 8 | 9 | main :: IO () 10 | main = do 11 | file <- readFile "input.dat" 12 | let numbers = mapMaybe readMaybe (lines file) 13 | defaultMain (day1Tests numbers) 14 | 15 | day1Tests :: [Int] -> TestTree 16 | day1Tests numbers = testGroup "Day 1 tests" [ 17 | testCase "Star 1" $ star (cartProd numbers numbers) @?= Just 988771, 18 | testCase "Star 2" $ star2 (triProd numbers) @?= Just 171933104 19 | ] -------------------------------------------------------------------------------- /day20/test.dat: -------------------------------------------------------------------------------- 1 | .#.#..#.##...#.##..##### 2 | ###....#.#....#..#...... 3 | ##.##.###.#.#..######... 4 | ###.#####...#.#####.#..# 5 | ##.#....#.##.####...#.## 6 | ...########.#....#####.# 7 | ....#..#...##..#.#.###.. 8 | .####...#..#.....#...... 9 | #..#.##..#..###.#.##.... 10 | #.####..#.####.#.#.###.. 11 | ###.#.#...#.######.#..## 12 | #.####....##..########.# 13 | ##..##.#...#...#.#.#.#.. 14 | ...#..#..#.#.##..###.### 15 | .#.#....#.##.#...###.##. 16 | ###.#...#..#.##.######.. 17 | .#.#.###.##.##.#..#.##.. 18 | .####.###.#...###.#..#.# 19 | ..#.#..#..#.#.#.####.### 20 | #..####...#.#.#.###.###. 21 | #####..#####...###....## 22 | #.##..#..#...#..####...# 23 | .#.###..##..##..####.##. 24 | ...###...##...#...#..### -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # advent-of-code-2020 2 | Solutions of Advent of Code 2020 3 | 4 | ## Python solutions 5 | 6 | Install environment: 7 | ``` 8 | poetry install 9 | poetry shell 10 | ``` 11 | 12 | Execute a day: 13 | ``` 14 | python day1/star1.py 15 | ``` 16 | 17 | Execute all tests: 18 | ``` 19 | make python 20 | ``` 21 | 22 | ## Prolog solutions 23 | 24 | Execute a day: 25 | ``` 26 | swipl day1/day1.pl 27 | ?- day1:star(1, X). 28 | ``` 29 | 30 | Execute all tests: 31 | ``` 32 | make prolog 33 | ``` 34 | 35 | ## Haskell solutions 36 | 37 | Execute a day: 38 | ``` 39 | cd day1 40 | ghc Day1.hs -main-is Day1 -o Day1 41 | ./Day1 42 | ``` 43 | 44 | Execute tests: 45 | ``` 46 | cd day1 47 | ghc Test.hs 48 | ./Test 49 | ``` -------------------------------------------------------------------------------- /index.pl: -------------------------------------------------------------------------------- 1 | :- use_module('day1/day1.pl'). 2 | :- use_module('day2/day2.pl'). 3 | :- use_module('day3/day3.pl'). 4 | :- use_module('day4/day4.pl'). 5 | :- use_module('day5/day5.pl'). 6 | :- use_module('day6/day6.pl'). 7 | :- use_module('day7/day7.pl'). 8 | :- use_module('day8/day8.pl'). 9 | :- use_module('day9/day9.pl'). 10 | :- use_module('day10/day10.pl'). 11 | :- use_module('day12/day12.pl'). 12 | :- use_module('day13/day13.pl'). 13 | % :- use_module('day14/day14.pl'). 14 | % :- use_module('day15/day15.pl'). 15 | :- use_module('day16/day16.pl'). 16 | :- use_module('day18/day18.pl'). 17 | :- use_module('day19/day19.pl'). 18 | :- use_module('day20/day20.pl'). 19 | :- use_module('day22/day22.pl'). 20 | :- use_module('day25/day25.pl'). -------------------------------------------------------------------------------- /day24/sample.dat: -------------------------------------------------------------------------------- 1 | sesenwnenenewseeswwswswwnenewsewsw 2 | neeenesenwnwwswnenewnwwsewnenwseswesw 3 | seswneswswsenwwnwse 4 | nwnwneseeswswnenewneswwnewseswneseene 5 | swweswneswnenwsewnwneneseenw 6 | eesenwseswswnenwswnwnwsewwnwsene 7 | sewnenenenesenwsewnenwwwse 8 | wenwwweseeeweswwwnwwe 9 | wsweesenenewnwwnwsenewsenwwsesesenwne 10 | neeswseenwwswnwswswnw 11 | nenwswwsewswnenenewsenwsenwnesesenew 12 | enewnwewneswsewnwswenweswnenwsenwsw 13 | sweneswneswneneenwnewenewwneswswnese 14 | swwesenesewenwneswnwwneseswwne 15 | enesenwswwswneneswsenwnewswseenwsese 16 | wnwnesenesenenwwnenwsewesewsesesew 17 | nenewswnwewswnenesenwnesewesw 18 | eneswnwswnwsenenwnwnwwseeswneewsenese 19 | neswnwewnwnwseenwseesewsenwsweewe 20 | wseweeenwnesenwwwswnew 21 | -------------------------------------------------------------------------------- /day10/input.dat: -------------------------------------------------------------------------------- 1 | 8 2 | 40 3 | 45 4 | 93 5 | 147 6 | 64 7 | 90 8 | 125 9 | 149 10 | 145 11 | 111 12 | 126 13 | 9 14 | 146 15 | 38 16 | 97 17 | 103 18 | 6 19 | 122 20 | 34 21 | 18 22 | 35 23 | 96 24 | 86 25 | 116 26 | 29 27 | 59 28 | 118 29 | 102 30 | 26 31 | 66 32 | 17 33 | 74 34 | 94 35 | 5 36 | 114 37 | 128 38 | 1 39 | 75 40 | 47 41 | 141 42 | 58 43 | 65 44 | 100 45 | 63 46 | 12 47 | 53 48 | 25 49 | 106 50 | 136 51 | 15 52 | 82 53 | 22 54 | 117 55 | 2 56 | 80 57 | 79 58 | 139 59 | 7 60 | 81 61 | 129 62 | 19 63 | 52 64 | 87 65 | 115 66 | 132 67 | 140 68 | 88 69 | 109 70 | 62 71 | 73 72 | 46 73 | 24 74 | 69 75 | 101 76 | 110 77 | 16 78 | 95 79 | 148 80 | 76 81 | 135 82 | 142 83 | 89 84 | 50 85 | 72 86 | 41 87 | 39 88 | 42 89 | 56 90 | 51 91 | 57 92 | 127 93 | 83 94 | 121 95 | 33 96 | 32 97 | 23 98 | -------------------------------------------------------------------------------- /day1/day1.pl: -------------------------------------------------------------------------------- 1 | :- module(day1, []). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | 6 | input([X|Data]) --> 7 | integer(X), 8 | "\n", 9 | input(Data). 10 | 11 | input([]) --> eos. 12 | 13 | load_data(Data) :- 14 | open('day1/input.dat', read, Stream), 15 | phrase_from_stream(input(Data), Stream). 16 | 17 | star(1, X) :- 18 | load_data(Numbers), 19 | member(A, Numbers), 20 | member(B, Numbers), 21 | A + B =:= 2020, 22 | X is A * B. 23 | 24 | star(2, X) :- 25 | load_data(Numbers), 26 | member(A, Numbers), 27 | member(B, Numbers), 28 | member(C, Numbers), 29 | A + B + C =:= 2020, 30 | X is A * B * C. 31 | 32 | :- begin_tests(day1). 33 | 34 | test(star1) :- star(1, 988771), !. 35 | test(star2) :- star(2, 171933104), !. 36 | 37 | :- end_tests(day1). -------------------------------------------------------------------------------- /day2/star1.py: -------------------------------------------------------------------------------- 1 | import re 2 | from dataclasses import dataclass 3 | from collections import Counter 4 | 5 | @dataclass 6 | class Policy: 7 | letter: str 8 | min: int 9 | max: int 10 | 11 | @dataclass 12 | class Password: 13 | password: str 14 | policy: Policy 15 | 16 | def is_valid(self): 17 | c = Counter(self.password) 18 | if length := c.get(self.policy.letter): 19 | return self.policy.min <= length <= self.policy.max 20 | else: 21 | return False 22 | 23 | def main(): 24 | with open("day2/input.dat") as f: 25 | lines = f.readlines() 26 | passwords = [] 27 | for line in lines: 28 | res = re.match(r"(\d+)-(\d+) (\w): (\w+)", line) 29 | passwords.append(Password(res.group(4), Policy(res.group(3), int(res.group(1)), int(res.group(2))))) 30 | 31 | valid = 0 32 | for password in passwords: 33 | if password.is_valid(): 34 | valid += 1 35 | return valid 36 | 37 | 38 | if __name__ == "__main__": 39 | print(main()) 40 | -------------------------------------------------------------------------------- /day1/Day1.hs: -------------------------------------------------------------------------------- 1 | module Day1 where 2 | 3 | import Data.Maybe (mapMaybe) 4 | import Text.Read ( readMaybe ) 5 | 6 | main :: IO () 7 | main = do 8 | file <- readFile "input.dat" 9 | let numbers = mapMaybe readMaybe (lines file) 10 | let pairs = cartProd numbers numbers 11 | let result = star pairs 12 | printResult result 13 | let tris = triProd numbers 14 | let result2 = star2 tris 15 | printResult result2 16 | 17 | 18 | printResult :: Maybe Int -> IO () 19 | printResult Nothing = putStrLn "No hay solución" 20 | printResult (Just x) = putStrLn ("Solución: " ++ show x) 21 | 22 | cartProd :: [Int] -> [Int] -> [(Int, Int)] 23 | cartProd xs ys = [(x,y) | x <- xs, y <- ys] 24 | 25 | star :: [(Int, Int)] -> Maybe Int 26 | star [] = Nothing 27 | star ((x, y):xs) = if x + y == 2020 then Just (x * y) else star xs 28 | 29 | triProd :: [Int] -> [(Int, Int, Int)] 30 | triProd xs = [(x, y, z) | x <- xs, y <- xs, z <- xs] 31 | 32 | star2 :: [(Int, Int, Int)] -> Maybe Int 33 | star2 [] = Nothing 34 | star2 ((x, y, z):xs) = if x + y + z == 2020 then Just (x * y * z) else star2 xs -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /day2/star2.py: -------------------------------------------------------------------------------- 1 | import re 2 | from dataclasses import dataclass 3 | from collections import Counter 4 | 5 | @dataclass 6 | class Policy: 7 | letter: str 8 | one: int 9 | two: int 10 | 11 | @dataclass 12 | class Password: 13 | password: str 14 | policy: Policy 15 | 16 | def is_valid(self): 17 | a = self.policy.one - 1 18 | b = self.policy.two - 1 19 | if a >= len(self.password) or b >= len(self.password): 20 | return False 21 | 22 | if self.password[a] == self.policy.letter and not (self.password[b] == self.policy.letter): 23 | return True 24 | if not (self.password[a] == self.policy.letter) and self.password[b] == self.policy.letter: 25 | return True 26 | return False 27 | 28 | 29 | def main(): 30 | with open("day2/input.dat") as f: 31 | lines = f.readlines() 32 | passwords = [] 33 | for line in lines: 34 | res = re.match(r"(\d+)-(\d+) (\w): (\w+)", line) 35 | passwords.append(Password(res.group(4), Policy(res.group(3), int(res.group(1)), int(res.group(2))))) 36 | 37 | valid = 0 38 | for password in passwords: 39 | if password.is_valid(): 40 | valid += 1 41 | return valid 42 | 43 | 44 | if __name__ == "__main__": 45 | print(main()) -------------------------------------------------------------------------------- /day15/day15.pl: -------------------------------------------------------------------------------- 1 | :- module(day15, []). 2 | 3 | :- use_module(library(assoc)). 4 | :- use_module(library(hashtable)). 5 | 6 | star(1, N) :- 7 | list_to_assoc([6-1,3-2,15-3,13-4,1-5], Store), 8 | find_position(7, 2020, 0, Store, N). 9 | 10 | star(2, N) :- 11 | ht_pairs(Store, [6-1,3-2,15-3,13-4,1-5]), 12 | find_position_ht(7, 30000000, 0, Store, N). 13 | 14 | find_position(N, To, Last, Store, X) :- 15 | OldN is N - 1, 16 | (get_assoc(Last, Store, Pos) -> 17 | ( 18 | NewLast is OldN - Pos, 19 | put_assoc(Last, Store, OldN, NewStore) 20 | );( 21 | NewLast is 0, 22 | put_assoc(Last, Store, OldN, NewStore) 23 | ) 24 | ), 25 | NewN is N + 1, 26 | (NewN > To -> 27 | NewLast = X 28 | ; find_position(NewN, To, NewLast, NewStore, X)). 29 | 30 | find_position_ht(N, To, Last, Store, X) :- 31 | OldN is N - 1, 32 | (ht_get(Store, Last, Pos) -> 33 | ( 34 | NewLast is OldN - Pos, 35 | ht_put(Store, Last, OldN) 36 | );( 37 | NewLast is 0, 38 | ht_put(Store, Last, OldN) 39 | ) 40 | ), 41 | NewN is N + 1, 42 | (NewN > To -> 43 | NewLast = X 44 | ; find_position_ht(NewN, To, NewLast, Store, X)). 45 | 46 | 47 | :- begin_tests(day15). 48 | 49 | test(star1) :- star(1, 700),!. 50 | test(star2) :- star(2, 51358),!. 51 | 52 | :- end_tests(day15). 53 | 54 | -------------------------------------------------------------------------------- /day25/day25.pl: -------------------------------------------------------------------------------- 1 | :- module(day25, []). 2 | 3 | star(1, N) :- 4 | PublicKeyCard = 14222596, 5 | PublicKeyDoor = 4057428, 6 | SubjectNumber = 7, 7 | public_key(SubjectNumber, LoopSizeCard, PublicKeyCard), 8 | public_key(SubjectNumber, LoopSizeDoor, PublicKeyDoor), 9 | dif(LoopSizeCard, LoopSizeDoor), 10 | gen_public_key(PublicKeyCard, LoopSizeDoor, Key), 11 | gen_public_key(PublicKeyDoor, LoopSizeCard, Key), 12 | N = Key. 13 | 14 | public_key(SubjectNumber, LoopSize, PublicKey) :- 15 | public_key_(SubjectNumber, LoopSize, PublicKey, 1, SubjectNumber). 16 | 17 | public_key_(_, _, _, 10000000, _) :- !,fail. 18 | 19 | public_key_(SubjectNumber, LoopSize, PublicKey, Loops, Value) :- 20 | NewValue is (Value * SubjectNumber) mod 20201227, 21 | NewLoops is Loops + 1, 22 | (NewValue = PublicKey -> 23 | LoopSize = NewLoops 24 | ; ( 25 | public_key_(SubjectNumber, LoopSize, PublicKey, NewLoops, NewValue) 26 | ) 27 | ). 28 | 29 | gen_public_key(SN, LoopSize, PublicKey) :- 30 | gen_public_key_(SN, LoopSize, PublicKey, 1, SN). 31 | 32 | gen_public_key_(_, Loops, Value, Loops, Value). 33 | gen_public_key_(SN, LoopSize, PublicKey, Loops, Value) :- 34 | NewValue is (Value * SN) mod 20201227, 35 | NewLoops is Loops + 1, 36 | gen_public_key_(SN, LoopSize, PublicKey, NewLoops, NewValue). 37 | 38 | :- begin_tests(day25). 39 | 40 | test(star1) :- star(1, 3286137),!. 41 | 42 | :- end_tests(day25). -------------------------------------------------------------------------------- /tester.lgt: -------------------------------------------------------------------------------- 1 | :- initialization(( 2 | set_logtalk_flag(report, warnings), 3 | logtalk_load(lgtunit(loader)), 4 | logtalk_load('test/day1', [hook(lgtunit)]), 5 | logtalk_load('test/day2', [hook(lgtunit)]), 6 | logtalk_load('test/day3', [hook(lgtunit)]), 7 | logtalk_load('test/day4', [hook(lgtunit)]), 8 | logtalk_load('test/day5', [hook(lgtunit)]), 9 | logtalk_load('test/day6', [hook(lgtunit)]), 10 | logtalk_load('test/day7', [hook(lgtunit)]), 11 | logtalk_load('test/day8', [hook(lgtunit)]), 12 | logtalk_load('test/day9', [hook(lgtunit)]), 13 | logtalk_load('test/day10', [hook(lgtunit)]), 14 | logtalk_load('test/day11', [hook(lgtunit)]), 15 | logtalk_load('test/day12', [hook(lgtunit)]), 16 | logtalk_load('test/day13', [hook(lgtunit)]), 17 | logtalk_load('test/day14', [hook(lgtunit)]), 18 | logtalk_load('test/day15', [hook(lgtunit)]), 19 | logtalk_load('test/day16', [hook(lgtunit)]), 20 | logtalk_load('test/day17', [hook(lgtunit)]), 21 | logtalk_load('test/day18', [hook(lgtunit)]), 22 | logtalk_load('test/day19', [hook(lgtunit)]), 23 | logtalk_load('test/day20', [hook(lgtunit)]), 24 | logtalk_load('test/day21', [hook(lgtunit)]), 25 | logtalk_load('test/day22', [hook(lgtunit)]), 26 | logtalk_load('test/day23', [hook(lgtunit)]), 27 | logtalk_load('test/day24', [hook(lgtunit)]), 28 | logtalk_load('test/day25', [hook(lgtunit)]), 29 | lgtunit::run_test_sets([day1, day2, day3, day4, day5, day6, day7, day8, day9, day10, day11, day12, day13, day16, day17, day18, day19, day20, day21, day22, day23, day24, day25]) 30 | )). -------------------------------------------------------------------------------- /day6/day6.pl: -------------------------------------------------------------------------------- 1 | :- module(day6, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | 8 | input([[]]) --> eos. 9 | input([[] | Data]) --> `\n`, input(Data). 10 | 11 | input(NewData) --> 12 | string(Person), 13 | `\n`, 14 | input(Data), 15 | { 16 | Data = [Group|OldData], 17 | string_chars(Person, Chars), 18 | append(Group, [Chars], NewGroup), 19 | NewData = [NewGroup|OldData] 20 | }. 21 | 22 | load_data(Answers) :- 23 | open('day6/input.dat', read, Stream), 24 | phrase_from_stream(input(Answers), Stream). 25 | 26 | star(1, X) :- 27 | load_data(Answers),!, 28 | maplist(unique_answers, Answers, UniqueAnswers), 29 | maplist(length, UniqueAnswers, NumUniqueAnswers), 30 | sum_list(NumUniqueAnswers, X). 31 | 32 | star(2, X) :- 33 | load_data(Answers),!, 34 | maplist(everyone_answers, Answers, EveryoneAnswers), 35 | maplist(length, EveryoneAnswers, NumUniqueAnswers), 36 | sum_list(NumUniqueAnswers, X). 37 | 38 | unique_answers(Answers, UniqueAnswers) :- 39 | foldl(append, Answers, [], AnswerList), 40 | list_to_set(AnswerList, UniqueAnswers). 41 | 42 | everyone_answers(Answers, EveryoneAnswers) :- 43 | unique_answers(Answers, UniqueAnswers), 44 | convlist(filter_answer(Answers), UniqueAnswers, EveryoneAnswers). 45 | 46 | filter_answer(Answers, Unique, Unique) :- 47 | forall(member(Answer, Answers), member(Unique, Answer)). 48 | 49 | :- begin_tests(day6). 50 | 51 | test(star1) :- star(1, 6612),!. 52 | test(star2) :- star(2, 3268),!. 53 | 54 | :- end_tests(day6). -------------------------------------------------------------------------------- /day20/sample.dat: -------------------------------------------------------------------------------- 1 | Tile 2311: 2 | ..##.#..#. 3 | ##..#..... 4 | #...##..#. 5 | ####.#...# 6 | ##.##.###. 7 | ##...#.### 8 | .#.#.#..## 9 | ..#....#.. 10 | ###...#.#. 11 | ..###..### 12 | 13 | Tile 1951: 14 | #.##...##. 15 | #.####...# 16 | .....#..## 17 | #...###### 18 | .##.#....# 19 | .###.##### 20 | ###.##.##. 21 | .###....#. 22 | ..#.#..#.# 23 | #...##.#.. 24 | 25 | Tile 1171: 26 | ####...##. 27 | #..##.#..# 28 | ##.#..#.#. 29 | .###.####. 30 | ..###.#### 31 | .##....##. 32 | .#...####. 33 | #.##.####. 34 | ####..#... 35 | .....##... 36 | 37 | Tile 1427: 38 | ###.##.#.. 39 | .#..#.##.. 40 | .#.##.#..# 41 | #.#.#.##.# 42 | ....#...## 43 | ...##..##. 44 | ...#.##### 45 | .#.####.#. 46 | ..#..###.# 47 | ..##.#..#. 48 | 49 | Tile 1489: 50 | ##.#.#.... 51 | ..##...#.. 52 | .##..##... 53 | ..#...#... 54 | #####...#. 55 | #..#.#.#.# 56 | ...#.#.#.. 57 | ##.#...##. 58 | ..##.##.## 59 | ###.##.#.. 60 | 61 | Tile 2473: 62 | #....####. 63 | #..#.##... 64 | #.##..#... 65 | ######.#.# 66 | .#...#.#.# 67 | .######### 68 | .###.#..#. 69 | ########.# 70 | ##...##.#. 71 | ..###.#.#. 72 | 73 | Tile 2971: 74 | ..#.#....# 75 | #...###... 76 | #.#.###... 77 | ##.##..#.. 78 | .#####..## 79 | .#..####.# 80 | #..#.#..#. 81 | ..####.### 82 | ..#.#.###. 83 | ...#.#.#.# 84 | 85 | Tile 2729: 86 | ...#.#.#.# 87 | ####.#.... 88 | ..#.#..... 89 | ....#..#.# 90 | .##..##.#. 91 | .#.####... 92 | ####.#.#.. 93 | ##.####... 94 | ##..#.##.. 95 | #.##...##. 96 | 97 | Tile 3079: 98 | #.#.#####. 99 | .#..###### 100 | ..#....... 101 | ######.... 102 | ####.#..#. 103 | .#...#.##. 104 | #.#####.## 105 | ..#.###... 106 | ..#....... 107 | ..#.###... 108 | 109 | -------------------------------------------------------------------------------- /day10/day10.pl: -------------------------------------------------------------------------------- 1 | :- module(day10, []). 2 | 3 | :- use_module(library(tabling)). 4 | :- use_module(library(pure_input)). 5 | :- use_module(library(dcg/basics)). 6 | 7 | input([X|Data]) --> 8 | integer(X), 9 | "\n", 10 | input(Data). 11 | 12 | input([]) --> eos. 13 | 14 | :- dynamic numbers/1. 15 | 16 | load_data(Numbers) :- 17 | open('day10/input.dat', read, Stream), 18 | phrase_from_stream(input(Numbers), Stream). 19 | 20 | star(1, N) :- 21 | load_data(Numbers), 22 | sort(Numbers, SortedNumbers), 23 | adapter(SortedNumbers, N1, N3), 24 | N is N1 * N3. 25 | 26 | star(2, N) :- 27 | load_data(Numbers), 28 | sort(Numbers, SortedNumbers), 29 | reverse(SortedNumbers, ReverseNumbers), 30 | assertz(numbers(ReverseNumbers)), 31 | max_list(ReverseNumbers, Max),!, 32 | n_solutions(Max, N). 33 | 34 | :- table n_solutions/2. 35 | 36 | n_solutions(0, 1) :- !. 37 | n_solutions(N, 0) :- 38 | numbers(Numbers), 39 | \+ member(N, Numbers),!. 40 | n_solutions(N, Sols) :- 41 | X1 is N - 1, 42 | X2 is N - 2, 43 | X3 is N - 3, 44 | n_solutions(X1, Sols1), 45 | n_solutions(X2, Sols2), 46 | n_solutions(X3, Sols3), 47 | Sols is Sols1 + Sols2 + Sols3. 48 | 49 | 50 | adapter([_Number], 1, 1). 51 | adapter([Number|Numbers], N1, N3) :- 52 | Numbers = [NumberNext|_], 53 | Dif is NumberNext - Number, 54 | adapter(Numbers, N10, N30), 55 | (Dif = 1 -> N1 is N10+1;N1 is N10), 56 | (Dif = 3 -> N3 is N30+1;N3 is N30). 57 | 58 | next_adapter(Numbers, N, Next) :- 59 | Next is N-1, 60 | member(Next, Numbers). 61 | 62 | next_adapter(Numbers, N, Next) :- 63 | Next is N-2, 64 | member(Next, Numbers). 65 | 66 | next_adapter(Numbers, N, Next) :- 67 | Next is N-3, 68 | member(Next, Numbers). 69 | 70 | :- begin_tests(day10). 71 | 72 | test(star1) :- star(1, 1917), !. 73 | test(star2) :- star(2, 113387824750592), !. 74 | 75 | :- end_tests(day10). -------------------------------------------------------------------------------- /day2/day2.pl: -------------------------------------------------------------------------------- 1 | :- module(day2, []). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | 6 | input([password(Password, Letter, Min, Max)|Data]) --> 7 | integer(Min), 8 | "-", 9 | integer(Max), 10 | " ", 11 | string(Letter), 12 | ":", 13 | !, 14 | " ", 15 | string(Password), 16 | "\n", 17 | input(Data). 18 | 19 | input([]) --> eos. 20 | 21 | load_data(Data) :- 22 | open('day2/input.dat', read, Stream), 23 | phrase_from_stream(input(Data), Stream). 24 | 25 | star(1, X) :- 26 | load_data(Passwords), 27 | findall(Password, ( 28 | member(Password, Passwords), 29 | policy(Password) 30 | ),ValidPasswords), 31 | length(ValidPasswords, X). 32 | 33 | star(2, X) :- 34 | load_data(Passwords), 35 | findall(Password, ( 36 | member(Password, Passwords), 37 | policy2(Password) 38 | ),ValidPasswords), 39 | length(ValidPasswords, X). 40 | 41 | count(_, [], 0) :- !. 42 | count(A, [A|Chars], N) :- 43 | !,count(A, Chars, N1), 44 | N is N1 + 1. 45 | count(A, [_Char|Chars], N) :- 46 | count(A, Chars, N). 47 | 48 | policy(password(Password, Letter, Min, Max)) :- 49 | string_chars(Password, PasswordChars), 50 | string_chars(Letter, [SingleLetter]), 51 | count(SingleLetter, PasswordChars, N), 52 | N >= Min, 53 | N =< Max. 54 | 55 | policy2(password(Password, Letter, A, B)) :- 56 | string_chars(Password, Text), 57 | string_chars(Letter, [SingleLetter]), 58 | nth1(A, Text, SingleLetter), 59 | \+ nth1(B, Text, SingleLetter). 60 | 61 | policy2(password(Password, Letter, A, B)) :- 62 | string_chars(Password, Text), 63 | string_chars(Letter, [SingleLetter]), 64 | \+ nth1(A, Text, SingleLetter), 65 | nth1(B, Text, SingleLetter). 66 | 67 | :- begin_tests(day2). 68 | 69 | test(star1) :- star(1, 569), !. 70 | test(star2) :- star(2, 346), !. 71 | 72 | :- end_tests(day2). -------------------------------------------------------------------------------- /day11/day11.py: -------------------------------------------------------------------------------- 1 | def get_cell(old_value, x, y, grid): 2 | width = len(grid[0]) 3 | height = len(grid) 4 | 5 | occupied = 0 6 | if x-1 >= 0 and grid[y][x-1] == "#": 7 | occupied += 1 8 | if x+1 < width and grid[y][x+1] == "#": 9 | occupied += 1 10 | if y-1 >= 0 and grid[y-1][x] == "#": 11 | occupied += 1 12 | if y+1 < height and grid[y+1][x] == "#": 13 | occupied += 1 14 | if x-1 >= 0 and y-1 >= 0 and grid[y-1][x-1] == "#": 15 | occupied += 1 16 | if x-1 >= 0 and y+1 < height and grid[y+1][x-1] == "#": 17 | occupied += 1 18 | if x+1 < width and y-1 >= 0 and grid[y-1][x+1] == "#": 19 | occupied += 1 20 | if x+1 < width and y+1 < height and grid[y+1][x+1] == "#": 21 | occupied += 1 22 | 23 | if old_value == "L" and occupied == 0: 24 | return "#" 25 | elif old_value == "#" and occupied >= 4: 26 | return "L" 27 | else: 28 | return old_value 29 | 30 | def main(): 31 | with open("day11/input.dat") as f: 32 | lines = f.readlines() 33 | 34 | grid = [] 35 | for line in lines: 36 | subgrid = [] 37 | for char in line.strip(): 38 | subgrid.append(char) 39 | grid.append(subgrid) 40 | 41 | changed = True 42 | while changed: 43 | changed = False 44 | new_grid = [] 45 | for y,line in enumerate(grid): 46 | new_subgrid = [] 47 | for x,_ in enumerate(line): 48 | old_value = grid[y][x] 49 | new_value = get_cell(old_value, x, y, grid) 50 | changed = changed or old_value != new_value 51 | new_subgrid.append(new_value) 52 | new_grid.append(new_subgrid) 53 | grid = new_grid 54 | 55 | seats = 0 56 | for line in grid: 57 | for x in line: 58 | if x == "#": 59 | seats += 1 60 | print(seats) 61 | 62 | 63 | if __name__ == "__main__": 64 | main() -------------------------------------------------------------------------------- /day3/day3.pl: -------------------------------------------------------------------------------- 1 | :- module(day3, []). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | 6 | input([X|Data]) --> 7 | string(X), 8 | "\n", 9 | input(Data). 10 | 11 | input([]) --> eos. 12 | 13 | load_data(Map) :- 14 | open('day3/input.dat', read, Stream), 15 | phrase_from_stream(input(Lines), Stream), 16 | maplist(string_chars, Lines, Map). 17 | 18 | star(1, N) :- 19 | load_data(Map), 20 | steps(0, 0, Map, N). 21 | 22 | star(2, N) :- 23 | load_data(Map), 24 | steps2(0, 0, 1, 1, Map, N1), 25 | steps2(0, 0, 3, 1, Map, N2), 26 | steps2(0, 0, 5, 1, Map, N3), 27 | steps2(0, 0, 7, 1, Map, N4), 28 | steps2(0, 0, 1, 2, Map, N5), 29 | N is N1 * N2 * N3 * N4 * N5. 30 | 31 | steps(X, Y, Map, N) :- 32 | NewY is Y + 1, 33 | nth0(NewY, Map, Line), 34 | length(Line, LineLength), 35 | NewX is (X + 3) mod LineLength, 36 | nth0(NewX, Line, '.'), 37 | steps(NewX, NewY, Map, N). 38 | 39 | steps(X, Y, Map, N) :- 40 | NewY is Y + 1, 41 | nth0(NewY, Map, Line), 42 | length(Line, LineLength), 43 | NewX is (X + 3) mod LineLength, 44 | nth0(NewX, Line, '#'), 45 | steps(NewX, NewY, Map, N1), 46 | N is N1 + 1. 47 | 48 | steps(_, _, _, 0). 49 | 50 | steps2(X, Y, SlopeX, SlopeY, Map, N) :- 51 | NewY is Y + SlopeY, 52 | nth0(NewY, Map, Line), 53 | length(Line, LineLength), 54 | NewX is (X + SlopeX) mod LineLength, 55 | nth0(NewX, Line, '.'), 56 | steps2(NewX, NewY, SlopeX, SlopeY, Map, N). 57 | 58 | steps2(X, Y, SlopeX, SlopeY, Map, N) :- 59 | NewY is Y + SlopeY, 60 | nth0(NewY, Map, Line), 61 | length(Line, LineLength), 62 | NewX is (X + SlopeX) mod LineLength, 63 | nth0(NewX, Line, '#'), 64 | steps2(NewX, NewY, SlopeX, SlopeY, Map, N1), 65 | N is N1 + 1. 66 | 67 | steps2(_, _, _, _, _, 0). 68 | 69 | 70 | :- begin_tests(day3). 71 | 72 | test(star1) :- star(1, 162), !. 73 | test(star2) :- star(2, 3064612320), !. 74 | 75 | :- end_tests(day3). -------------------------------------------------------------------------------- /day9/day9.pl: -------------------------------------------------------------------------------- 1 | :- module(day9, []). 2 | 3 | 4 | :- use_module(library(pure_input)). 5 | :- use_module(library(dcg/basics)). 6 | 7 | input([X|Data]) --> 8 | integer(X), 9 | "\n", 10 | input(Data). 11 | 12 | input([]) --> eos. 13 | 14 | load_data(Numbers) :- 15 | open('day9/input.dat', read, Stream), 16 | phrase_from_stream(input(Numbers), Stream). 17 | 18 | star(1, N) :- 19 | load_data(Numbers), 20 | select_preamble(Numbers, Preamble, N), 21 | \+ sum_in_preamble(N, Preamble). 22 | 23 | star(2, N) :- 24 | Sol1 is 400480901, 25 | load_data(Numbers), 26 | between(17, 100, Size), % in 17 is the answer, original answer was between(2, 100, Size) 27 | select_range(Numbers, Size, Range), 28 | sum_list(Range, Sol1), 29 | min_list(Range, MinX), 30 | max_list(Range, MaxX), 31 | N is MinX + MaxX. 32 | 33 | 34 | select_preamble(Numbers, Preamble, N) :- 35 | length(Numbers, L), 36 | between(25, L, ChoicePoint), 37 | nth0(ChoicePoint, Numbers, N), 38 | select_preamble_(Numbers, 25, ChoicePoint, Preamble). 39 | 40 | select_preamble_(_, 0, _, []). 41 | select_preamble_(Numbers, X, ChoicePoint, [Point|Preamble]) :- 42 | Index is ChoicePoint - X, 43 | nth0(Index, Numbers, Point), 44 | NewX is X - 1, 45 | select_preamble_(Numbers, NewX, ChoicePoint, Preamble). 46 | 47 | sum_in_preamble(N, Preamble) :- 48 | member(X, Preamble), 49 | member(Y, Preamble), 50 | N =:= X+Y. 51 | 52 | select_range(Numbers, Size, Range) :- 53 | length(Numbers, L), 54 | between(0, L, Index), 55 | End is Size+Index, 56 | select_range_(Numbers, Size, Index, End, Range). 57 | 58 | select_range_(_, _, Index, End, []) :- Index = End. 59 | select_range_(Numbers, Size, Index, End, [Point|Range]) :- 60 | nth0(Index, Numbers, Point), 61 | NewIndex is Index + 1, 62 | select_range_(Numbers, Size, NewIndex, End, Range). 63 | 64 | :- begin_tests(day9). 65 | 66 | test(star1) :- star(1, 400480901),!. 67 | test(star2) :- star(2, 67587168),!. 68 | 69 | :- end_tests(day9). -------------------------------------------------------------------------------- /day7/day7.pl: -------------------------------------------------------------------------------- 1 | :- module(day7, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(tabling)). 6 | :- use_module(library(pure_input)). 7 | :- use_module(library(dcg/basics)). 8 | :- use_module(library(readutil)). 9 | 10 | input([]) --> eos. 11 | 12 | input([[BagHead, BagRule]|Data]) --> 13 | string(BagHead), 14 | " bags contain ", 15 | input_bag(BagRule), 16 | input(Data). 17 | 18 | input_bag([]) --> 19 | ".\n". 20 | 21 | input_bag([]) --> 22 | "no other bags.\n". 23 | 24 | input_bag([BagRule|BagRules]) --> 25 | integer(BagNumber), 26 | " ", 27 | string(BagBody), 28 | (" bag, "|" bags, "|" bag" | " bags"), 29 | { 30 | BagRule = [BagNumber, BagBody] 31 | }, 32 | input_bag(BagRules). 33 | 34 | load_data(Rules) :- 35 | read_file_to_string('day7/input.dat', String, []), 36 | string_chars(String, Chars), 37 | phrase(input(Rules), Chars). 38 | 39 | star(1, X) :- 40 | load_data(Rules),!, 41 | convlist(find_shiny_gold(Rules), Rules, GoldRules), 42 | length(GoldRules, X). 43 | 44 | star(2, X) :- 45 | load_data(Rules),!, 46 | bag_count(Rules, [1, "shiny gold"], X0), 47 | X is X0-1. 48 | 49 | :- table find_shiny_gold/3. 50 | 51 | find_shiny_gold(_Rules, Rule, Rule) :- 52 | Rule = [_BagHead, BagRule], 53 | member([_N, "shiny gold"], BagRule). 54 | 55 | find_shiny_gold(Rules, Rule, Rule) :- 56 | Rule = [_BagHead, BagRule], 57 | member([_N, NewBagHead], BagRule), 58 | member([NewBagHead, NewBagRule], Rules), 59 | find_shiny_gold(Rules, [NewBagHead, NewBagRule], _). 60 | 61 | :- table bag_count/3. 62 | 63 | bag_count(Rules, [BagNumber, BagRule], N) :- 64 | member([BagRule, []], Rules), 65 | N is 1*BagNumber. 66 | 67 | bag_count(Rules, [BagNumber, BagRule], N) :- 68 | member([BagRule, BagBody], Rules), 69 | maplist(bag_count(Rules), BagBody, Count), 70 | sum_list(Count, N0), 71 | N is (N0+1)*BagNumber. 72 | 73 | :- begin_tests(day7). 74 | 75 | test(star1) :- star(1, 119),!. 76 | test(star2) :- star(2, 155802),!. 77 | 78 | :- end_tests(day7). -------------------------------------------------------------------------------- /day1/input.dat: -------------------------------------------------------------------------------- 1 | 1408 2 | 1335 3 | 1648 4 | 1458 5 | 1627 6 | 1928 7 | 1967 8 | 1827 9 | 1606 10 | 1569 11 | 1893 12 | 1866 13 | 1768 14 | 1795 15 | 1264 16 | 1684 17 | 1552 18 | 1343 19 | 1917 20 | 1675 21 | 1731 22 | 1800 23 | 1413 24 | 1879 25 | 1664 26 | 1350 27 | 1694 28 | 1372 29 | 1851 30 | 1743 31 | 1735 32 | 833 33 | 748 34 | 1265 35 | 1885 36 | 1874 37 | 2007 38 | 1661 39 | 1895 40 | 1537 41 | 1622 42 | 1355 43 | 762 44 | 1533 45 | 1771 46 | 1966 47 | 1978 48 | 1572 49 | 1833 50 | 1969 51 | 1805 52 | 1820 53 | 1536 54 | 1911 55 | 2009 56 | 1817 57 | 1268 58 | 1998 59 | 1759 60 | 2008 61 | 2002 62 | 1187 63 | 1896 64 | 1850 65 | 1734 66 | 1849 67 | 1589 68 | 1302 69 | 444 70 | 1280 71 | 1590 72 | 1959 73 | 902 74 | 1709 75 | 1932 76 | 1277 77 | 1561 78 | 1301 79 | 1831 80 | 1286 81 | 1693 82 | 1927 83 | 1467 84 | 1384 85 | 1662 86 | 1401 87 | 716 88 | 1634 89 | 1785 90 | 1801 91 | 1380 92 | 1971 93 | 1292 94 | 1828 95 | 185 96 | 1560 97 | 1322 98 | 1787 99 | 1545 100 | 1395 101 | 1445 102 | 1807 103 | 1750 104 | 1867 105 | 1433 106 | 1894 107 | 1821 108 | 1983 109 | 1578 110 | 1669 111 | 1610 112 | 1549 113 | 1556 114 | 1346 115 | 1616 116 | 1999 117 | 1925 118 | 1387 119 | 1659 120 | 1457 121 | 1237 122 | 1808 123 | 69 124 | 1906 125 | 1449 126 | 1723 127 | 1974 128 | 1919 129 | 1914 130 | 1338 131 | 1305 132 | 1347 133 | 1903 134 | 1929 135 | 1712 136 | 1607 137 | 1400 138 | 197 139 | 1575 140 | 1282 141 | 1296 142 | 1737 143 | 1396 144 | 2003 145 | 1453 146 | 1660 147 | 1646 148 | 1991 149 | 1565 150 | 1416 151 | 1995 152 | 1784 153 | 1367 154 | 1420 155 | 1593 156 | 1654 157 | 1306 158 | 1916 159 | 1797 160 | 1594 161 | 1471 162 | 1405 163 | 1698 164 | 1541 165 | 1900 166 | 1963 167 | 1696 168 | 1574 169 | 1853 170 | 511 171 | 1603 172 | 1889 173 | 1940 174 | 1843 175 | 1979 176 | 272 177 | 1726 178 | 1294 179 | 1877 180 | 1441 181 | 1697 182 | 1644 183 | 1956 184 | 1689 185 | 1665 186 | 1631 187 | 1717 188 | 1781 189 | 1450 190 | 1618 191 | 1317 192 | 1799 193 | 1950 194 | 1722 195 | 1960 196 | 1628 197 | 1941 198 | 1977 199 | 1775 200 | 1529 201 | -------------------------------------------------------------------------------- /day5/scr_day5.pl: -------------------------------------------------------------------------------- 1 | :- use_module(library(dcgs)). 2 | :- use_module(library(pio)). 3 | :- use_module(library(lists)). 4 | :- use_module(library(between)). 5 | 6 | 7 | %% SCRYER 8 | max_list([Max], Max). 9 | max_list([N|T], Max) :- 10 | max_list(T, Max1),!, 11 | Max is max(N, Max1). 12 | 13 | rows(128). 14 | columns(8). 15 | 16 | input([[[X1, X2, X3, X4, X5, X6, X7], [X8, X9, X10]]|Data]) --> 17 | [X1], 18 | [X2], 19 | [X3], 20 | [X4], 21 | [X5], 22 | [X6], 23 | [X7], 24 | [X8], 25 | [X9], 26 | [X10], 27 | "\n", 28 | input(Data). 29 | 30 | input([]) --> call(eos). 31 | 32 | eos([], []). 33 | 34 | load_data(Passes) :- 35 | phrase_from_file(input(Passes), 'input.dat'). 36 | 37 | star(1, X) :- 38 | load_data(Passes), 39 | maplist(seat, Passes, Seats), 40 | maplist(seat_id, Seats, SeatIDs), 41 | max_list(SeatIDs, X). 42 | 43 | star(2, N) :- 44 | load_data(Passes), 45 | maplist(seat, Passes, Seats), 46 | findall(MissingSeat,( 47 | between(20, 107, N), 48 | between(0, 7, M), 49 | MissingSeat = seat(N, M), 50 | \+ member(MissingSeat, Seats) 51 | ), MissingSeats), 52 | [Seat|_] = MissingSeats, 53 | seat_id(Seat, N). 54 | 55 | format_seat([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10], [[X1, X2, X3, X4, X5, X6, X7], [X8, X9, X10]]). 56 | 57 | seat([PassRow, PassColumn], seat(Row, Column)) :- 58 | rows(R), 59 | columns(C), 60 | seat_calc(PassRow, PassColumn, Row, Column, R, C). 61 | 62 | seat_calc([], [], 0, 0, _, _). 63 | 64 | seat_calc([], ['L'|PassColumn], 0, Column, _, M) :- 65 | Middle is M / 2, 66 | seat_calc([], PassColumn, 0, Column, _, Middle). 67 | 68 | seat_calc([], ['R'|PassColumn], 0, Column, _, M) :- 69 | Middle is M / 2, 70 | seat_calc([], PassColumn, 0, Column1, _, Middle), 71 | Column is Middle + Column1. 72 | 73 | seat_calc(['F'|PassRow], PassColumn, Row, Column, N, M) :- 74 | Middle is N / 2, 75 | seat_calc(PassRow, PassColumn, Row, Column, Middle, M). 76 | 77 | seat_calc(['B'|PassRow], PassColumn, Row, Column, N, M) :- 78 | Middle is N / 2, 79 | seat_calc(PassRow, PassColumn, Row1, Column, Middle, M), 80 | Row is Row1 + Middle. 81 | 82 | seat_id(seat(Row, Column), SeatID) :- 83 | SeatID is (Row * 8) + Column. 84 | -------------------------------------------------------------------------------- /day5/day5.pl: -------------------------------------------------------------------------------- 1 | :- module(day5, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | 9 | rows(128). 10 | columns(8). 11 | 12 | input([[[X1, X2, X3, X4, X5, X6, X7], [X8, X9, X10]]|Data]) --> 13 | [X1], 14 | [X2], 15 | [X3], 16 | [X4], 17 | [X5], 18 | [X6], 19 | [X7], 20 | [X8], 21 | [X9], 22 | [X10], 23 | "\n", 24 | input(Data). 25 | 26 | input([]) --> eos. 27 | 28 | load_data(Passes) :- 29 | read_file_to_string('day5/input.dat', String, []), 30 | string_chars(String, Chars), 31 | phrase(input(Passes), Chars). 32 | 33 | star(1, X) :- 34 | load_data(Passes), 35 | maplist(seat, Passes, Seats), 36 | maplist(seat_id, Seats, SeatIDs), 37 | max_list(SeatIDs, X). 38 | 39 | star(2, N) :- 40 | load_data(Passes), 41 | maplist(seat, Passes, Seats), 42 | findall(MissingSeat,( 43 | between(20, 107, N), 44 | between(0, 7, M), 45 | MissingSeat = seat(N, M), 46 | \+ member(MissingSeat, Seats) 47 | ), MissingSeats), 48 | [Seat|_] = MissingSeats, 49 | seat_id(Seat, N). 50 | 51 | format_seat([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10], [[X1, X2, X3, X4, X5, X6, X7], [X8, X9, X10]]). 52 | 53 | seat([PassRow, PassColumn], seat(Row, Column)) :- 54 | rows(R), 55 | columns(C), 56 | seat_calc(PassRow, PassColumn, Row, Column, R, C). 57 | 58 | seat_calc([], [], 0, 0, _, _). 59 | 60 | seat_calc([], ['L'|PassColumn], 0, Column, _, M) :- 61 | Middle is M / 2, 62 | seat_calc([], PassColumn, 0, Column, _, Middle). 63 | 64 | seat_calc([], ['R'|PassColumn], 0, Column, _, M) :- 65 | Middle is M / 2, 66 | seat_calc([], PassColumn, 0, Column1, _, Middle), 67 | Column is Middle + Column1. 68 | 69 | seat_calc(['F'|PassRow], PassColumn, Row, Column, N, M) :- 70 | Middle is N / 2, 71 | seat_calc(PassRow, PassColumn, Row, Column, Middle, M). 72 | 73 | seat_calc(['B'|PassRow], PassColumn, Row, Column, N, M) :- 74 | Middle is N / 2, 75 | seat_calc(PassRow, PassColumn, Row1, Column, Middle, M), 76 | Row is Row1 + Middle. 77 | 78 | seat_id(seat(Row, Column), SeatID) :- 79 | SeatID is (Row * 8) + Column. 80 | 81 | :- begin_tests(day5). 82 | 83 | test(star1) :- star(1, 974),!. 84 | test(star2) :- star(2, N), N = 646, !. 85 | 86 | :- end_tests(day5). -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /day13/day13.pl: -------------------------------------------------------------------------------- 1 | :- module(day13, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | 9 | input(ArriveTime, Buses) --> 10 | integer(ArriveTime), 11 | "\n", 12 | input_bus(Buses), 13 | "\n". 14 | 15 | input_bus([Bus|Buses]) --> 16 | (integer(Bus) | ("x", { Bus = x }) ), 17 | ",", 18 | input_bus(Buses). 19 | 20 | input_bus([Bus]) --> 21 | (integer(Bus) | ("x", { Bus = x })). 22 | 23 | load_data(ArriveTime, Buses) :- 24 | read_file_to_string('day13/input.dat', String, []), 25 | string_chars(String, Chars), 26 | phrase(input(ArriveTime, Buses), Chars). 27 | 28 | star(1, N) :- 29 | load_data(ArriveTime, Buses), 30 | maplist(multiply_until(ArriveTime), Buses, NearTime), 31 | min_list(NearTime, MinTime), 32 | nth0(BusN, NearTime, MinTime), 33 | nth0(BusN, Buses, BusID), 34 | N is BusID * (MinTime - ArriveTime). 35 | 36 | star(2, N) :- 37 | load_data(_, Buses), 38 | build_pairs(0, Buses, Pairs), 39 | crt(Pairs, N). 40 | 41 | multiply_until(_, x, 999999999999) :-!. 42 | multiply_until(ArriveTime, Bus, NearTime) :- 43 | multiply_until_(ArriveTime, Bus, Bus, NearTime). 44 | 45 | multiply_until_(ArriveTime, Bus, Time, NearTime) :- 46 | NewTime is Time + Bus, 47 | (ArriveTime =< NewTime -> 48 | NearTime = NewTime ; 49 | multiply_until_(ArriveTime, Bus, NewTime, NearTime)). 50 | 51 | build_pairs(_, [], []). 52 | build_pairs(N, [x|Buses], Pairs) :- 53 | NewN is N - 1, 54 | build_pairs(NewN, Buses, Pairs). 55 | build_pairs(N, [Bus|Buses], [Pair|Pairs]) :- 56 | Pair = N-Bus, 57 | NewN is N - 1, 58 | build_pairs(NewN, Buses, Pairs). 59 | 60 | % taken from https://rosettacode.org/wiki/Chinese_remainder_theorem#Prolog 61 | 62 | product(A, B, C) :- C is A*B. 63 | 64 | pair(X, Y, X-Y). 65 | 66 | egcd(_, 0, 1, 0) :- !. 67 | egcd(A, B, X, Y) :- 68 | divmod(A, B, Q, R), 69 | egcd(B, R, S, X), 70 | Y is S - Q*X. 71 | 72 | modinv(A, B, X) :- 73 | egcd(A, B, X, Y), 74 | A*X + B*Y =:= 1. 75 | 76 | crt_fold(A, M, P, R0, R1) :- % system of equations of (x = a) (mod m); p = M/m 77 | modinv(P, M, Inv), 78 | R1 is R0 + A*Inv*P. 79 | 80 | crt(Pairs, N) :- 81 | maplist(pair, As, Ms, Pairs), 82 | foldl(product, Ms, 1, M), 83 | maplist(divmod(M), Ms, Ps, _), % p(n) <- M/m(n) 84 | foldl(crt_fold, As, Ms, Ps, 0, N0), 85 | N is N0 mod M. 86 | 87 | 88 | :- begin_tests(day13). 89 | 90 | test(star1) :- star(1, 119), !. 91 | test(star2) :- star(2, 1106724616194525), !. 92 | 93 | :- end_tests(day13). -------------------------------------------------------------------------------- /day23/day23.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | 3 | class Node: 4 | def __init__(self, n, prev_node): 5 | self.n = n 6 | self.next = prev_node 7 | 8 | def __str__(self): 9 | return str(self.n) 10 | 11 | def __repl__(self): 12 | return self.__str__() 13 | 14 | class List: 15 | def __init__(self, iterable): 16 | self.map = dict() 17 | self.first_node = None 18 | for n in iterable[::-1]: 19 | node = Node(n, self.first_node) 20 | self.map[n] = node 21 | self.first_node = node 22 | 23 | 24 | def search(self, n): 25 | return self.map[n] 26 | 27 | def main2(): 28 | initial = build_list() 29 | circle = List(initial) 30 | circle.search(1000000).next = circle.search(3) 31 | selection = circle.first_node 32 | for _ in range(10000000): 33 | picked = (selection.next.n, selection.next.next.n, selection.next.next.next.n) 34 | selection.next = selection.next.next.next.next 35 | destination_n = destination_cup(selection.n, picked) 36 | destination = circle.search(destination_n) 37 | circle.search(picked[2]).next = destination.next 38 | destination.next = circle.search(picked[0]) 39 | selection = selection.next 40 | one = circle.search(1) 41 | n = one.next.n 42 | m = one.next.next.n 43 | output = n*m 44 | print(f"Resultado: {output}") 45 | 46 | 47 | def main(): 48 | initial = build_list() 49 | circle = deque(initial) 50 | #circle = deque([3, 8, 9, 1, 2, 5, 4, 6, 7]) 51 | for j in range(10000000): 52 | circle.rotate(-1) 53 | picked = (circle.popleft(), circle.popleft(), circle.popleft()) 54 | destination = destination_cup(circle[-1], picked) 55 | dest_index = (circle.index(destination) + 1)*-1 56 | circle.rotate(dest_index) 57 | circle.appendleft(picked[2]) 58 | circle.appendleft(picked[1]) 59 | circle.appendleft(picked[0]) 60 | circle.rotate((dest_index*-1)) 61 | if j % 100000 == 0: 62 | print(j) 63 | i = circle.index(1) 64 | n = circle[i+1] 65 | m = circle[i+2] 66 | output = n*m 67 | print(f"Resultado: {output}") 68 | 69 | def build_list(): 70 | l = [3, 1, 8, 9, 4, 6, 5, 7, 2] 71 | post = [x for x in range(10, 1000001)] 72 | l.extend(post) 73 | return l 74 | 75 | def destination_cup(n, picked): 76 | while True: 77 | n = n - 1 78 | if n > 0: 79 | if n not in picked: 80 | return n 81 | else: 82 | n = 1000001 83 | #n = 10 84 | 85 | 86 | 87 | if __name__ == "__main__": 88 | main2() -------------------------------------------------------------------------------- /day23/day23.pl: -------------------------------------------------------------------------------- 1 | star(1, N) :- 2 | Start = [3, 1, 8, 9, 4, 6, 5, 7, 2], 3 | moves(3, 100, Start, End), 4 | order(End, Order), 5 | append(N, [1], Order). 6 | 7 | star(2, N) :- 8 | list(10, 1000000, Post), 9 | append([3, 8, 9, 1, 2, 5, 4, 6, 7], Post, Start), 10 | moves2(3, 10000000, Start, End), 11 | next(1, X, End), 12 | next(X, Y, End), 13 | N is X * Y. 14 | 15 | moves(_, 0, End, End). 16 | moves(CurrentCup, N, Start, End) :- 17 | next(CurrentCup, Cup1, Start), 18 | next(Cup1, Cup2, Start), 19 | next(Cup2, Cup3, Start), 20 | selectchk(Cup1, Start, Start0), 21 | selectchk(Cup2, Start0, Start1), 22 | selectchk(Cup3, Start1, Start2), 23 | Picked = [Cup1, Cup2, Cup3], 24 | destination_cup(CurrentCup, Start2, DestinationCup), 25 | append(Pre, Post, Start2), 26 | last(Pre, DestinationCup), 27 | append(Pre, Picked, PreEnd), 28 | append(PreEnd, Post, End0), 29 | NewN is N - 1, 30 | next(CurrentCup, NewCurrentCup, End0),!, 31 | moves(NewCurrentCup, NewN, End0, End). 32 | 33 | 34 | moves2(_, 0, End, End). 35 | moves2(CurrentCup, N, Start, End) :- 36 | next(CurrentCup, Cup1, Start), 37 | next(Cup1, Cup2, Start), 38 | next(Cup2, Cup3, Start), 39 | selectchk(Cup1, Start, Start0), 40 | selectchk(Cup2, Start0, Start1), 41 | selectchk(Cup3, Start1, Start2), 42 | Picked = [Cup1, Cup2, Cup3], 43 | destination_cup2(CurrentCup, Picked, DestinationCup), 44 | append(Pre, Post, Start2), 45 | last(Pre, DestinationCup), 46 | append(Pre, Picked, PreEnd), 47 | append(PreEnd, Post, End0), 48 | NewN is N - 1, 49 | next(CurrentCup, NewCurrentCup, End0),!, 50 | (0 is N mod 100000 -> 51 | (write(N),nl) 52 | ; true 53 | ), 54 | moves2(NewCurrentCup, NewN, End0, End). 55 | 56 | next(Prev, Succ, List) :- 57 | nextto(Prev, Succ, List). 58 | 59 | next(Prev, Succ, List) :- 60 | last(List, Prev), 61 | List = [Succ|_]. 62 | 63 | 64 | destination_cup(0, Start, N) :- 65 | max_list(Start, N). 66 | destination_cup(CurrentCup, Start, Out) :- 67 | N is CurrentCup - 1, 68 | (member(N, Start) -> 69 | Out is N 70 | ; destination_cup(N, Start, Out) 71 | ). 72 | 73 | destination_cup2(0, Picked, Out) :- 74 | (Out = 1000000;Out = 999999;Out = 999998), 75 | \+ member(Out, Picked). 76 | destination_cup2(CurrentCup, Picked, Out) :- 77 | N is CurrentCup - 1, 78 | (memberchk(N, Picked) -> 79 | destination_cup2(N, Picked, Out) 80 | ; Out is N 81 | ). 82 | 83 | order(End, [N|Order]) :- 84 | next(1, N, End), 85 | order_(N, End, Order). 86 | 87 | order_(1, _, []). 88 | order_(N, End, [M|Order]) :- 89 | next(N, M, End), 90 | order_(M, End, Order). 91 | 92 | list(End, End, [End]). 93 | list(N, End, [N|List]) :- 94 | NewN is N + 1, 95 | list(NewN, End, List). 96 | -------------------------------------------------------------------------------- /day4/day4.pl: -------------------------------------------------------------------------------- 1 | :- module(day4, []). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | 6 | 7 | input([[]]) --> eos. 8 | input([[] | Data]) --> "\n", input(Data). 9 | 10 | input(NewData) --> 11 | string(Field), 12 | ":", 13 | string(Value), 14 | ( "\n" | " "), 15 | input(Data), 16 | { 17 | Data = [X|OldData], 18 | atom_string(AField, Field), 19 | atom_string(AValue, Value), 20 | Y =.. [AField, AValue], 21 | append(X, [Y], NewX), 22 | NewData = [NewX|OldData] 23 | }. 24 | 25 | load_data(Passports) :- 26 | open('day4/input.dat', read, Stream), 27 | phrase_from_stream(input(Passports), Stream). 28 | 29 | star(1, X) :- 30 | load_data(Passports),!, 31 | findall(Passport, ( 32 | member(Passport, Passports), 33 | valid_passport(Passport) 34 | ), ValidPasswords), 35 | length(ValidPasswords, X). 36 | 37 | star(2, X) :- 38 | load_data(Passports),!, 39 | findall(Passport, ( 40 | member(Passport, Passports), 41 | valid_passport_2(Passport) 42 | ), ValidPasswords), 43 | length(ValidPasswords, X). 44 | 45 | valid_passport(Passport) :- 46 | member(byr(_), Passport), 47 | member(iyr(_), Passport), 48 | member(eyr(_), Passport), 49 | member(hgt(_), Passport), 50 | member(hcl(_), Passport), 51 | member(ecl(_), Passport), 52 | member(pid(_), Passport). 53 | 54 | hgt --> 55 | integer(X), 56 | "cm", 57 | { 58 | X >= 150, 59 | X =< 193 60 | }. 61 | 62 | hgt --> 63 | integer(X), 64 | "in", 65 | { 66 | X >= 59, 67 | X =< 76 68 | }. 69 | 70 | hcl --> 71 | "#", 72 | xdigits(_). 73 | 74 | valid_ecl(amb). 75 | valid_ecl(blu). 76 | valid_ecl(brn). 77 | valid_ecl(gry). 78 | valid_ecl(grn). 79 | valid_ecl(hzl). 80 | valid_ecl(oth). 81 | 82 | valid_passport_2(Passport) :- 83 | member(byr(Byr), Passport), 84 | atom_number(Byr, NByr), 85 | NByr >= 1920, 86 | NByr =< 2002, 87 | member(iyr(Iyr), Passport), 88 | atom_number(Iyr, NIyr), 89 | NIyr >= 2010, 90 | NIyr =< 2020, 91 | member(eyr(Eyr), Passport), 92 | atom_number(Eyr, NEyr), 93 | NEyr >= 2020, 94 | NEyr =< 2030, 95 | member(hgt(Hgt), Passport), 96 | atom_codes(Hgt, HgtCodes), 97 | phrase(hgt, HgtCodes), 98 | member(hcl(Hcl), Passport), 99 | atom_codes(Hcl, HclCodes), 100 | phrase(hcl, HclCodes), 101 | member(ecl(Ecl), Passport), 102 | valid_ecl(Ecl), 103 | member(pid(Pid), Passport), 104 | atom_codes(Pid, PidCodes), 105 | length(PidCodes, 9), 106 | atom_number(Pid, _). 107 | 108 | :- begin_tests(day4). 109 | 110 | test(star1) :- star(1, 245), !. 111 | test(star2) :- star(2, 133), !. 112 | 113 | :- end_tests(day4). 114 | -------------------------------------------------------------------------------- /day18/day18.pl: -------------------------------------------------------------------------------- 1 | :- module(day18, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | 9 | lines([]) --> call(eos), !. 10 | lines([L|Ls]) --> line(L), lines(Ls). 11 | 12 | line([]) --> ( "\n" | call(eos) ), !. 13 | line([X|Cs]) --> integer(X),!,line(Cs). 14 | line(Cs) --> [C], line_(C, Cs). 15 | line_(*, [*|Cs]) --> line(Cs). 16 | line_(+, [+|Cs]) --> line(Cs). 17 | line_('(', ['('|Cs]) --> line(Cs). 18 | line_(')', [')'|Cs]) --> line(Cs). 19 | line_(' ', Cs) --> line(Cs). 20 | 21 | eos([], []). 22 | 23 | 24 | load_data(Lines) :- 25 | read_file_to_string('day18/input.dat', String, []), 26 | string_chars(String, Chars), 27 | phrase(lines(Lines), Chars). 28 | 29 | star(1, N) :- 30 | load_data(Lines), 31 | maplist(execute_line, Lines, Results), 32 | sum_list(Results, N). 33 | 34 | star(2, N) :- 35 | load_data(Lines), 36 | maplist(execute_line2, Lines, Results), 37 | sum_list(Results, N). 38 | 39 | execute_line(Line, Result) :- 40 | phrase(eval(0, Result), Line). 41 | 42 | execute_line2(Line, Result) :- 43 | phrase(expr(Result), Line). 44 | 45 | eval(0, Out) --> 46 | [N], 47 | { 48 | integer(N) 49 | }, 50 | eval(N, Out). 51 | 52 | eval(0, Out) --> 53 | "(", 54 | eval(0, N), 55 | ")", 56 | eval(N, Out). 57 | 58 | eval(In, Out) --> 59 | "+", 60 | [N], 61 | { 62 | integer(N), 63 | X is N + In 64 | }, 65 | eval(X, Out). 66 | 67 | eval(In, Out) --> 68 | "*", 69 | [N], 70 | { 71 | integer(N), 72 | X is N * In 73 | }, 74 | eval(X, Out). 75 | 76 | eval(In, Out) --> 77 | "+", 78 | "(", 79 | eval(0, N), 80 | ")", 81 | { 82 | X is N + In 83 | }, 84 | eval(X, Out). 85 | 86 | eval(In, Out) --> 87 | "*", 88 | "(", 89 | eval(0, N), 90 | ")", 91 | { 92 | X is N * In 93 | }, 94 | eval(X, Out). 95 | 96 | eval(X, X) --> []. 97 | 98 | :- table expr//1. 99 | :- table sum_expr//1. 100 | 101 | expr(X) --> 102 | "(", 103 | expr(X), 104 | ")". 105 | 106 | expr(X) --> 107 | sum_expr(X1), 108 | "*", 109 | expr(X2), 110 | { 111 | X is X1 * X2 112 | }. 113 | 114 | expr(X) --> sum_expr(X). 115 | 116 | expr(X) --> [X], { 117 | number(X) 118 | }. 119 | 120 | sum_expr(X) --> 121 | sum_expr(X1), 122 | "+", 123 | sum_expr(X2),{ 124 | X is X1 + X2 125 | }. 126 | 127 | sum_expr(X) --> [X], { 128 | number(X) 129 | }. 130 | sum_expr(X) --> 131 | "(", 132 | expr(X), 133 | ")". 134 | 135 | :- begin_tests(day18). 136 | 137 | test(star1) :- star(1, 209335026987),!. 138 | test(star2) :- star(2, 33331817392479),!. 139 | 140 | :- end_tests(day18). -------------------------------------------------------------------------------- /day11/day112.py: -------------------------------------------------------------------------------- 1 | def get_cell(old_value, x, y, grid): 2 | width = len(grid[0]) 3 | height = len(grid) 4 | 5 | occupied = 0 6 | for x1 in reversed(range(0, x)): 7 | if grid[y][x1] == "L": 8 | break 9 | if grid[y][x1] == "#": 10 | occupied += 1 11 | break 12 | for x1 in range(x+1, width): 13 | if grid[y][x1] == "L": 14 | break 15 | if grid[y][x1] == "#": 16 | occupied += 1 17 | break 18 | for y1 in reversed(range(0, y)): 19 | if grid[y1][x] == "L": 20 | break 21 | if grid[y1][x] == "#": 22 | occupied += 1 23 | break 24 | for y1 in range(y+1, height): 25 | if grid[y1][x] == "L": 26 | break 27 | if grid[y1][x] == "#": 28 | occupied += 1 29 | break 30 | for x1,y1 in zip(reversed(range(0, x)), reversed(range(0, y))): 31 | if grid[y1][x1] == "L": 32 | break 33 | if grid[y1][x1] == "#": 34 | occupied += 1 35 | break 36 | for x1,y1 in zip(range(x+1, width), reversed(range(0, y))): 37 | if grid[y1][x1] == "L": 38 | break 39 | if grid[y1][x1] == "#": 40 | occupied += 1 41 | break 42 | for x1,y1 in zip(reversed(range(0, x)), range(y+1, height)): 43 | if grid[y1][x1] == "L": 44 | break 45 | if grid[y1][x1] == "#": 46 | occupied += 1 47 | break 48 | for x1,y1 in zip(range(x+1, width), range(y+1, height)): 49 | if grid[y1][x1] == "L": 50 | break 51 | if grid[y1][x1] == "#": 52 | occupied += 1 53 | break 54 | 55 | if old_value == "L" and occupied == 0: 56 | return "#" 57 | elif old_value == "#" and occupied >= 5: 58 | return "L" 59 | else: 60 | return old_value 61 | 62 | def main(): 63 | with open("day11/input.dat") as f: 64 | lines = f.readlines() 65 | 66 | grid = [] 67 | for line in lines: 68 | subgrid = [] 69 | for char in line.strip(): 70 | subgrid.append(char) 71 | grid.append(subgrid) 72 | 73 | changed = True 74 | while changed: 75 | changed = False 76 | new_grid = [] 77 | for y,line in enumerate(grid): 78 | new_subgrid = [] 79 | for x,_ in enumerate(line): 80 | old_value = grid[y][x] 81 | new_value = get_cell(old_value, x, y, grid) 82 | changed = changed or old_value != new_value 83 | new_subgrid.append(new_value) 84 | new_grid.append(new_subgrid) 85 | grid = new_grid 86 | 87 | seats = 0 88 | for line in grid: 89 | for x in line: 90 | if x == "#": 91 | seats += 1 92 | print(seats) 93 | 94 | 95 | if __name__ == "__main__": 96 | main() 97 | -------------------------------------------------------------------------------- /day22/day22.pl: -------------------------------------------------------------------------------- 1 | :- module(day22, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | :- set_prolog_flag(stack_limit, 4_294_967_296). 5 | 6 | :- use_module(library(pure_input)). 7 | :- use_module(library(dcg/basics)). 8 | :- use_module(library(ordsets)). 9 | 10 | input_deck([Card|Deck]) --> 11 | integer(Card), 12 | "\n", 13 | input_deck(Deck). 14 | 15 | input_deck([]) --> []. 16 | 17 | input(Deck1, Deck2) --> 18 | "Player 1:\n", 19 | input_deck(Deck1), 20 | "\nPlayer 2:\n", 21 | input_deck(Deck2). 22 | 23 | load_data(Deck1, Deck2) :- 24 | read_file_to_string('day22/input.dat', String, []), 25 | string_chars(String, Chars), 26 | phrase(input(Deck1, Deck2), Chars). 27 | 28 | star(1, N) :- 29 | load_data(Deck1, Deck2), 30 | game(Deck1, Deck2, FinalDeck), 31 | score(FinalDeck, N). 32 | 33 | star(2, N) :- 34 | load_data(Deck1, Deck2), 35 | game2(Deck1, Deck2, FinalDeck1, FinalDeck2, []), 36 | append(FinalDeck1, FinalDeck2, FinalDeck), 37 | score(FinalDeck, N). 38 | 39 | game2(Deck1, Deck2, FinalDeck1, FinalDeck2, Games) :- 40 | (ord_memberchk(Deck1-Deck2, Games) -> 41 | ( 42 | FinalDeck1 = Deck1, 43 | FinalDeck2 = [] 44 | );( 45 | ord_add_element(Games, Deck1-Deck2, NewGames), 46 | game2_(Deck1, Deck2, FinalDeck1, FinalDeck2, NewGames) 47 | )). 48 | 49 | game2_([], Deck2, [], Deck2, _) :- \+ length(Deck2, 0). 50 | game2_(Deck1, [], Deck1, [], _) :- \+ length(Deck1, 0). 51 | 52 | 53 | game2_([Card1|Deck1], [Card2|Deck2], FinalDeck1, FinalDeck2, Games) :- 54 | length(SubDeck1, Card1), 55 | length(SubDeck2, Card2), 56 | append(SubDeck1, _, Deck1), 57 | append(SubDeck2, _, Deck2), 58 | game2(SubDeck1, SubDeck2, FinalDeck01, _FinalDeck02, []),!, 59 | ( 60 | FinalDeck01 = [] -> 61 | (append(Deck2, [Card2, Card1], NewDeck2), game2(Deck1, NewDeck2, FinalDeck1, FinalDeck2, Games)) 62 | ; (append(Deck1, [Card1, Card2], NewDeck1), game2(NewDeck1, Deck2, FinalDeck1, FinalDeck2, Games)) 63 | ). 64 | 65 | game2_([Card1|Deck1], [Card2|Deck2], FinalDeck1, FinalDeck2, Games) :- 66 | Card1 > Card2, 67 | append(Deck1, [Card1, Card2], NewDeck1), 68 | game2(NewDeck1, Deck2, FinalDeck1, FinalDeck2, Games). 69 | 70 | game2_([Card1|Deck1], [Card2|Deck2], FinalDeck1, FinalDeck2, Games) :- 71 | Card1 < Card2, 72 | append(Deck2, [Card2, Card1], NewDeck2), 73 | game2(Deck1, NewDeck2, FinalDeck1, FinalDeck2, Games). 74 | 75 | game([], Deck2, Deck2) :- \+ length(Deck2, 0). 76 | game(Deck1, [], Deck1) :- \+ length(Deck1, 0). 77 | 78 | game([Card1|Deck1], [Card2|Deck2], FinalDeck) :- 79 | Card1 > Card2, 80 | append(Deck1, [Card1, Card2], NewDeck1), 81 | game(NewDeck1, Deck2, FinalDeck). 82 | 83 | game([Card1|Deck1], [Card2|Deck2], FinalDeck) :- 84 | Card1 < Card2, 85 | append(Deck2, [Card2, Card1], NewDeck2), 86 | game(Deck1, NewDeck2, FinalDeck). 87 | 88 | score([], 0). 89 | score([Card|Deck], Score) :- 90 | score(Deck, Score0), 91 | length(Deck, N), 92 | Score is Score0 + (N+1)*Card. 93 | 94 | :- begin_tests(day22). 95 | 96 | test(star1) :- star(1, 33400),!. 97 | test(star2) :- star(2, 33745),!. 98 | 99 | :- end_tests(day22). -------------------------------------------------------------------------------- /day19/day19.pl: -------------------------------------------------------------------------------- 1 | :- module(day19, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | 8 | input_rules([rule(ID, char(C))|Rules]) --> 9 | integer(ID), 10 | ": \"", 11 | [C], 12 | "\"\n", 13 | input_rules(Rules). 14 | 15 | input_rules([rule(ID, or(Subrule1, Subrule2))|Rules]) --> 16 | integer(ID), 17 | ":", 18 | input_subrule(Subrule1), 19 | " |", 20 | input_subrule(Subrule2), 21 | "\n", 22 | input_rules(Rules). 23 | 24 | input_rules([rule(ID, single(Subrule))|Rules]) --> 25 | integer(ID), 26 | ":", 27 | input_subrule(Subrule), 28 | "\n", 29 | input_rules(Rules). 30 | 31 | input_rules([]) --> []. 32 | 33 | input_subrule([N|Subrule]) --> 34 | " ", 35 | integer(N), 36 | input_subrule(Subrule). 37 | 38 | input_subrule([]) --> []. 39 | 40 | input_messages([Msg|Messages]) --> 41 | string_without("\n", Msg), 42 | "\n", 43 | input_messages(Messages). 44 | 45 | input_messages([]) --> []. 46 | 47 | input(Rules, Messages) --> 48 | input_rules(Rules), 49 | "\n", 50 | input_messages(Messages). 51 | 52 | load_data(1, Rules, Messages) :- 53 | read_file_to_string('day19/input.dat', String, []), 54 | string_chars(String, Chars), 55 | phrase(input(Rules, Messages), Chars). 56 | 57 | load_data(2, Rules, Messages) :- 58 | read_file_to_string('day19/input2.dat', String, []), 59 | string_chars(String, Chars), 60 | phrase(input(Rules, Messages), Chars). 61 | 62 | star(X, N) :- 63 | load_data(X, Rules, Messages),!, 64 | include(phrase(msg(0, Rules)), Messages, ValidMessages), 65 | length(ValidMessages, N). 66 | 67 | msg(ID, Rules) --> 68 | { 69 | member(rule(ID, char(C)), Rules) 70 | }, 71 | [C]. 72 | 73 | msg(ID, Rules) --> 74 | { 75 | member(rule(ID, or(Rule1, Rule2)), Rules), 76 | Rule1 = [Rule11, Rule12], 77 | Rule2 = [Rule21, Rule22] 78 | },( 79 | ( msg(Rule11, Rules), msg(Rule12, Rules)) | 80 | ( msg(Rule21, Rules), msg(Rule22, Rules))). 81 | 82 | msg(ID, Rules) --> 83 | { 84 | member(rule(ID, or(Rule1, Rule2)), Rules), 85 | Rule1 = [Rule11, Rule12], 86 | Rule2 = [Rule21, Rule22, Rule23] 87 | },( 88 | ( msg(Rule11, Rules), msg(Rule12, Rules)) | 89 | ( msg(Rule21, Rules), msg(Rule22, Rules), msg(Rule23, Rules))). 90 | 91 | msg(ID, Rules) --> 92 | { 93 | member(rule(ID, or(Rule1, Rule2)), Rules), 94 | Rule1 = [Rule11], 95 | Rule2 = [Rule21] 96 | },( 97 | ( msg(Rule11, Rules) ) | 98 | ( msg(Rule21, Rules) ) ). 99 | 100 | msg(ID, Rules) --> 101 | { 102 | member(rule(ID, or(Rule1, Rule2)), Rules), 103 | Rule1 = [Rule11], 104 | Rule2 = [Rule21, Rule22] 105 | },( 106 | ( msg(Rule11, Rules) ) | 107 | ( msg(Rule21, Rules), msg(Rule22, Rules) ) ). 108 | 109 | msg(ID, Rules) --> 110 | { 111 | member(rule(ID, single(Rule)), Rules), 112 | Rule = [Rule1, Rule2, Rule3] 113 | }, 114 | msg(Rule1, Rules), 115 | msg(Rule2, Rules), 116 | msg(Rule3, Rules). 117 | 118 | msg(ID, Rules) --> 119 | { 120 | member(rule(ID, single(Rule)), Rules), 121 | Rule = [Rule1, Rule2] 122 | }, 123 | msg(Rule1, Rules), 124 | msg(Rule2, Rules). 125 | 126 | msg(ID, Rules) --> 127 | { 128 | member(rule(ID, single(Rule)), Rules), 129 | Rule = [Rule1] 130 | }, 131 | msg(Rule1, Rules). 132 | 133 | :- begin_tests(day19). 134 | 135 | test(star1) :- star(1, 203),!. 136 | test(star2) :- star(2, 304),!. 137 | 138 | :- end_tests(day19). 139 | -------------------------------------------------------------------------------- /day24/day24.pl: -------------------------------------------------------------------------------- 1 | :- set_prolog_flag(double_quotes, chars). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | 6 | input_tile([]) --> "\n". 7 | 8 | input_tile([e|Steps]) --> 9 | "e", 10 | input_tile(Steps). 11 | 12 | input_tile([se|Steps]) --> 13 | "se", 14 | input_tile(Steps). 15 | 16 | input_tile([sw|Steps]) --> 17 | "sw", 18 | input_tile(Steps). 19 | 20 | input_tile([w|Steps]) --> 21 | "w", 22 | input_tile(Steps). 23 | 24 | input_tile([nw|Steps]) --> 25 | "nw", 26 | input_tile(Steps). 27 | 28 | input_tile([ne|Steps]) --> 29 | "ne", 30 | input_tile(Steps). 31 | 32 | input([Tile|Tiles]) --> 33 | input_tile(Tile), 34 | input(Tiles). 35 | 36 | input([]) --> []. 37 | 38 | load_data(Tiles) :- 39 | read_file_to_string('day24/input.dat', String, []), 40 | string_chars(String, Chars), 41 | phrase(input(Tiles), Chars). 42 | 43 | star(1, N) :- 44 | load_data(StepsTiles), 45 | maplist(steps_tile, StepsTiles, Tiles), 46 | flip_tiles(Tiles, BlackTiles), 47 | length(BlackTiles, N). 48 | 49 | star(2, N) :- 50 | load_data(StepsTiles), 51 | maplist(steps_tile, StepsTiles, Tiles), 52 | flip_tiles(Tiles, BlackTiles), 53 | steps(100, BlackTiles, MapOut), 54 | length(MapOut, N). 55 | 56 | steps(0, Map, Map). 57 | steps(N, Map, MapOut) :- 58 | length(Map, M), 59 | format('~d: ~d', [N, M]),nl, 60 | include(keep_black(Map), Map, MapOut0), 61 | maplist(white_tiles(Map), Map, WhiteTiles0), 62 | flatten(WhiteTiles0, WhiteTiles1), 63 | list_to_set(WhiteTiles1, WhiteTiles), 64 | include(flip_black(Map), WhiteTiles, MapOut1), 65 | append(MapOut0, MapOut1, MapOut2), 66 | NewN is N - 1,!, 67 | steps(NewN, MapOut2, MapOut). 68 | 69 | direction([e]). 70 | direction([w]). 71 | direction([se]). 72 | direction([ne]). 73 | direction([sw]). 74 | direction([nw]). 75 | 76 | white_tiles(Map, X-Y, WhiteTails) :- 77 | findall(Tile, ( 78 | direction(Direction), 79 | step_tiles_(X-Y, Direction, Tile), 80 | \+ member(Tile, Map) 81 | ), WhiteTails). 82 | 83 | flip_black(Map, X-Y) :- 84 | findall(Tile, ( 85 | direction(Direction), 86 | step_tiles_(X-Y, Direction, Tile), 87 | member(Tile, Map) 88 | ), Tiles), 89 | length(Tiles, 2). 90 | 91 | keep_black(Map, X-Y) :- 92 | findall(Tile, ( 93 | direction(Direction), 94 | step_tiles_(X-Y, Direction, Tile), 95 | member(Tile, Map) 96 | ), Tiles), 97 | length(Tiles, N), 98 | (N = 1; N = 2). 99 | 100 | steps_tile(Steps, Tile) :- 101 | step_tiles_(0-0, Steps, Tile). 102 | 103 | step_tiles_(X-Y, [], X-Y). 104 | step_tiles_(X-Y, [w|Steps], Tile) :- 105 | NewX is X - 1, 106 | step_tiles_(NewX-Y, Steps, Tile). 107 | step_tiles_(X-Y, [e|Steps], Tile) :- 108 | NewX is X + 1, 109 | step_tiles_(NewX-Y, Steps, Tile). 110 | step_tiles_(X-Y, [sw|Steps], Tile) :- 111 | NewX is X - (Y mod 2), 112 | NewY is Y - 1, 113 | step_tiles_(NewX-NewY, Steps, Tile). 114 | step_tiles_(X-Y, [se|Steps], Tile) :- 115 | NewX is X + (1 - (Y mod 2)), 116 | NewY is Y - 1, 117 | step_tiles_(NewX-NewY, Steps, Tile). 118 | step_tiles_(X-Y, [nw|Steps], Tile) :- 119 | NewX is X - (Y mod 2), 120 | NewY is Y + 1, 121 | step_tiles_(NewX-NewY, Steps, Tile). 122 | step_tiles_(X-Y, [ne|Steps], Tile) :- 123 | NewX is X + (1 - (Y mod 2)), 124 | NewY is Y + 1, 125 | step_tiles_(NewX-NewY, Steps, Tile). 126 | 127 | flip_tiles([], []). 128 | flip_tiles([Tile|Tiles], BlackTiles) :- 129 | flip_tiles(Tiles, BlackTiles0), 130 | (member(Tile, BlackTiles0) -> 131 | delete(BlackTiles0, Tile, BlackTiles) 132 | ; BlackTiles = [Tile|BlackTiles0] 133 | ). 134 | -------------------------------------------------------------------------------- /day16/day16.pl: -------------------------------------------------------------------------------- 1 | :- module(day16, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | :- use_module(library(tabling)). 9 | :- use_module(library(clpfd)). 10 | 11 | 12 | input_fields([field(FieldName, [range(X1, X2), range(Y1, Y2)], _Position)|Fields]) --> 13 | string_without(":", FieldName), 14 | ": ", 15 | integer(X1), 16 | "-", 17 | integer(X2), 18 | " or ", 19 | integer(Y1), 20 | "-", 21 | integer(Y2), 22 | "\n", 23 | input_fields(Fields). 24 | 25 | input_fields([]) --> []. 26 | 27 | ticket([X|Ticket]) --> 28 | integer(X), 29 | ",", 30 | ticket(Ticket). 31 | 32 | ticket([X]) --> 33 | integer(X), 34 | "\n". 35 | 36 | input_tickets([Ticket|Tickets]) --> 37 | ticket(Ticket), 38 | input_tickets(Tickets). 39 | 40 | input_tickets([]) --> []. 41 | 42 | input(Fields, MyTicket, Tickets) --> 43 | input_fields(Fields), 44 | "\nyour ticket:\n", 45 | ticket(MyTicket), 46 | "\nnearby tickets:\n", 47 | input_tickets(Tickets). 48 | 49 | load_data(Fields, MyTicket, Tickets) :- 50 | read_file_to_string('day16/input.dat', String, []), 51 | string_chars(String, Chars), 52 | phrase(input(Fields, MyTicket, Tickets), Chars). 53 | 54 | star(1, N) :- 55 | load_data(Fields, _MyTicket, Tickets), 56 | findall(Field, ( 57 | member(Ticket, Tickets), 58 | member(Field, Ticket), 59 | \+ ticket_field(Field, Fields) 60 | ), InvalidFields), 61 | sum_list(InvalidFields, N). 62 | 63 | star(2, N) :- 64 | load_data(Fields, MyTicket, Tickets), 65 | include(all_fields_valid(Fields), Tickets, ValidTickets), 66 | length(MyTicket, Length), 67 | maplist(get_all_positions(Length, ValidTickets), Fields, FieldsPositions), 68 | select_field(Fields, FieldsPositions), 69 | foldl(product_departure(MyTicket), Fields, 1, N). 70 | 71 | select_field(Fields, FieldsPositions) :- 72 | member(Positions, FieldsPositions), 73 | length(Positions, 1), 74 | nth1(Index, FieldsPositions, Positions), 75 | nth1(Index, Fields, Field), 76 | Positions = [Position], 77 | Field = field(_, _, Position), 78 | maplist(remove_position(Position), FieldsPositions, NewFieldsPositions), 79 | select_field(Fields, NewFieldsPositions). 80 | 81 | select_field(_, FieldsPositions) :- 82 | forall(member(Positions, FieldsPositions),(length(Positions, 0))). 83 | 84 | remove_position(Position, Field, NewField) :- 85 | delete(Field, Position, NewField). 86 | 87 | all_fields_valid(Fields, Ticket) :- 88 | forall(member(Field, Ticket), ticket_field(Field, Fields)). 89 | 90 | get_all_positions(Length, Tickets, Field, Positions) :- 91 | findall(Position,( 92 | field_position(Length, Tickets, Field), 93 | Field = field(_, _, Position) 94 | ), Positions). 95 | 96 | field_position(Length, Tickets, field(Name, [range(X1, X2), range(Y1, Y2)], Position)) :- 97 | between(1, Length, Position), 98 | forall(member(Ticket, Tickets),( 99 | nth1(Position, Ticket, N), 100 | (between(X1, X2, N);between(Y1, Y2, N)) 101 | )). 102 | 103 | get_position(field(_, _, Position), X, [Position|X]). 104 | 105 | product_departure(Ticket, field(Name, _, Position), AccIn, AccOut) :- 106 | ( 107 | append("departure", _, Name) -> 108 | nth1(Position, Ticket, X) 109 | ; X is 1 110 | ), 111 | AccOut is AccIn * X. 112 | 113 | 114 | ticket_field(Field, Fields) :- 115 | member(field(_, Ranges, _), Fields), 116 | member(range(X1, X2), Ranges), 117 | between(X1, X2, Field). 118 | 119 | :- begin_tests(day16). 120 | 121 | test(star1) :- star(1, 20231), !. 122 | test(star2) :- star(2, 1940065747861),!. 123 | 124 | :- end_tests(day16). -------------------------------------------------------------------------------- /day8/day8.pl: -------------------------------------------------------------------------------- 1 | :- module(day8, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | :- use_module(library(ordsets)). 9 | 10 | input([]) --> eos. 11 | 12 | input([step(acc, Arg)|Steps]) --> 13 | "acc", 14 | " ", 15 | input_number(Arg), 16 | "\n", 17 | input(Steps). 18 | 19 | input([step(jmp, Arg)|Steps]) --> 20 | "jmp", 21 | " ", 22 | input_number(Arg), 23 | "\n", 24 | input(Steps). 25 | 26 | input([step(nop, Arg)|Steps]) --> 27 | "nop", 28 | " ", 29 | input_number(Arg), 30 | "\n", 31 | input(Steps). 32 | 33 | input_number(N) --> 34 | "-", 35 | integer(N0), 36 | { 37 | N is N0 * -1 38 | }. 39 | 40 | input_number(N) --> 41 | "+", 42 | integer(N). 43 | 44 | load_data(Steps) :- 45 | read_file_to_string('day8/input.dat', String, []), 46 | string_chars(String, Chars), 47 | phrase(input(Steps), Chars). 48 | 49 | star(1, X) :- 50 | load_data(Steps),!, 51 | Pc is 0, 52 | AccIn is 0, 53 | Visited = [], 54 | execute(Pc, Steps, AccIn, Visited, AccOut), 55 | X is AccOut. 56 | 57 | star(2, X) :- 58 | load_data(Steps),!, 59 | Pc is 0, 60 | AccIn is 0, 61 | Visited = [], 62 | length(Steps, L1), 63 | L is L1 - 1, 64 | !, 65 | between(0, L, Exchange), 66 | exchanged_steps(Steps, ExchangedSteps, Exchange, 0), 67 | execute2(Pc, ExchangedSteps, AccIn, Visited, AccOut), 68 | X is AccOut. 69 | 70 | execute(Pc, _Steps, AccIn, Visited, AccOut) :- 71 | length(Visited, L1), 72 | ord_add_element(Visited, Pc, NewVisited), 73 | length(NewVisited, L1), 74 | AccOut = AccIn. 75 | 76 | execute(Pc, Steps, AccIn, Visited, AccOut) :- 77 | nth0(Pc, Steps, step(nop, _)), 78 | ord_add_element(Visited, Pc, NewVisited), 79 | NewPc is Pc + 1, 80 | execute(NewPc, Steps, AccIn, NewVisited, AccOut). 81 | 82 | execute(Pc, Steps, AccIn, Visited, AccOut) :- 83 | nth0(Pc, Steps, step(acc, Int)), 84 | ord_add_element(Visited, Pc, NewVisited), 85 | NewPc is Pc + 1, 86 | NewAccIn is AccIn + Int, 87 | execute(NewPc, Steps, NewAccIn, NewVisited, AccOut). 88 | 89 | execute(Pc, Steps, AccIn, Visited, AccOut) :- 90 | nth0(Pc, Steps, step(jmp, Int)), 91 | ord_add_element(Visited, Pc, NewVisited), 92 | NewPc is Pc + Int, 93 | execute(NewPc, Steps, AccIn, NewVisited, AccOut). 94 | 95 | execute2(Pc, _Steps, _AccIn, Visited, _AccOut) :- 96 | length(Visited, L1), 97 | ord_add_element(Visited, Pc, NewVisited), 98 | length(NewVisited, L1), 99 | !, 100 | fail. 101 | 102 | execute2(Pc, Steps, AccIn, _Visited, AccOut) :- 103 | \+ nth0(Pc, Steps, _), 104 | AccOut = AccIn. 105 | 106 | execute2(Pc, Steps, AccIn, Visited, AccOut) :- 107 | nth0(Pc, Steps, step(nop, _)), 108 | ord_add_element(Visited, Pc, NewVisited), 109 | NewPc is Pc + 1, 110 | execute2(NewPc, Steps, AccIn, NewVisited, AccOut). 111 | 112 | execute2(Pc, Steps, AccIn, Visited, AccOut) :- 113 | nth0(Pc, Steps, step(acc, Int)), 114 | ord_add_element(Visited, Pc, NewVisited), 115 | NewPc is Pc + 1, 116 | NewAccIn is AccIn + Int, 117 | execute2(NewPc, Steps, NewAccIn, NewVisited, AccOut). 118 | 119 | execute2(Pc, Steps, AccIn, Visited, AccOut) :- 120 | nth0(Pc, Steps, step(jmp, Int)), 121 | ord_add_element(Visited, Pc, NewVisited), 122 | NewPc is Pc + Int, 123 | execute2(NewPc, Steps, AccIn, NewVisited, AccOut). 124 | 125 | exchange_step(step(nop, Arg), step(jmp, Arg)) :- Arg \= 0. 126 | exchange_step(step(jmp, Arg), step(nop, Arg)). 127 | 128 | exchanged_steps([], [], _, _). 129 | exchanged_steps([Step|Steps], [NewStep|Steps], Exchange, Exchange) :- 130 | exchange_step(Step, NewStep). 131 | 132 | exchanged_steps([Step|StepIn], [Step|StepOut], Exchange, N) :- 133 | Exchange \= N, 134 | N0 is N + 1, 135 | exchanged_steps(StepIn, StepOut, Exchange, N0). 136 | 137 | :- begin_tests(day8). 138 | 139 | test(star1) :- star(1, 1600),!. 140 | test(star2) :- star(2, 1543),!. 141 | 142 | :- end_tests(day8). -------------------------------------------------------------------------------- /day14/day14.pl: -------------------------------------------------------------------------------- 1 | :- module(day14, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | 9 | input([]) --> eos. 10 | input(Steps) --> 11 | "mask = ", 12 | string_without("\n", Mask), 13 | "\n", 14 | input_mem(Mem), 15 | input(Steps0), { 16 | S1 = [mask(Mask)|Mem], 17 | S = [S1|Steps0], 18 | flatten(S, Steps) 19 | }. 20 | 21 | input_mem([mem(Address, Value)|Mems]) --> 22 | "mem[", 23 | integer(Address), 24 | "] = ", 25 | integer(Value), 26 | "\n", 27 | input_mem(Mems). 28 | 29 | input_mem([]) --> []. 30 | 31 | load_data(Steps) :- 32 | read_file_to_string('day14/input.dat', String, []), 33 | string_chars(String, Chars), 34 | phrase(input(Steps), Chars). 35 | 36 | star(1, N) :- 37 | load_data(Steps),!, 38 | apply_steps(Steps, [], MemOut), 39 | foldl(sum_values, MemOut, 0, N). 40 | 41 | star(2, N) :- 42 | load_data(Steps),!, 43 | apply_steps2(Steps, [], MemOut), 44 | foldl(sum_values, MemOut, 0, N). 45 | 46 | apply_steps([], _, []). 47 | apply_steps([mask(Mask)|Mems], _, MemOut) :- 48 | reverse(Mask, ReverseMask), 49 | apply_steps(Mems, ReverseMask, MemOut). 50 | apply_steps([mem(Address, Value)|Mems], Mask, MemOut) :- 51 | integer_to_bits(Value, Bits), 52 | mask(Bits, Mask, MaskedValue), 53 | bits_to_integer(MaskedValue, FinalValue), 54 | apply_steps(Mems, Mask, MemOut0),!, 55 | (member(mem(Address, _), MemOut0) -> MemOut = MemOut0; MemOut = [mem(Address, FinalValue)|MemOut0]). 56 | 57 | apply_steps2([], _, []). 58 | apply_steps2([mask(Mask)|Mems], _, MemOut) :- 59 | reverse(Mask, ReverseMask), 60 | apply_steps2(Mems, ReverseMask, MemOut). 61 | apply_steps2([mem(Address, Value)|Mems], Mask, MemOut) :- 62 | integer_to_bits(Address, Bits),!, 63 | apply_steps2(Mems, Mask, MemOut1), 64 | findall(Mem, ( 65 | mask2(Bits, Mask, BitsMaskedAddress), 66 | bits_to_integer(BitsMaskedAddress, MaskedAddress), 67 | Mem = mem(MaskedAddress, Value), 68 | \+ member(mem(MaskedAddress, _), MemOut1) 69 | ), MemOut0), 70 | append(MemOut0, MemOut1, MemOut). 71 | 72 | sum_values(mem(_, Value), AccIn, AccOut) :- 73 | AccOut is AccIn + Value. 74 | 75 | integer_to_bits(0, [0]) :- !. 76 | integer_to_bits(1, [1]) :- !. 77 | integer_to_bits(Int, [Bit|Bits]) :- 78 | Bit is Int mod 2, 79 | IntRest is Int // 2, 80 | integer_to_bits(IntRest, Bits). 81 | 82 | bits_to_integer(Bits, Out) :- !,bits_to_integer_(0, Bits, Out). 83 | bits_to_integer_(_, [], 0). 84 | bits_to_integer_(N, [Bit|Bits], Out) :- 85 | NewN is N + 1, 86 | bits_to_integer_(NewN, Bits, Out0),!, 87 | Out is Out0 + Bit*2^N. 88 | 89 | mask([], [], []). 90 | mask([], ['X'|Masks], [Value|Values]) :- 91 | Value = 0, 92 | mask([], Masks, Values). 93 | 94 | mask([], ['0'|Masks], [Value|Values]) :- 95 | Value = 0, 96 | mask([], Masks, Values). 97 | 98 | mask([], ['1'|Masks], [Value|Values]) :- 99 | Value = 1, 100 | mask([], Masks, Values). 101 | 102 | mask([Bit|Bits], ['X'|Masks], [Value|Values]) :- 103 | Bit = Value, 104 | mask(Bits, Masks, Values). 105 | 106 | mask([_Bit|Bits], ['1'|Masks], [Value|Values]) :- 107 | Value = 1, 108 | mask(Bits, Masks, Values). 109 | 110 | mask([_Bit|Bits], ['0'|Masks], [Value|Values]) :- 111 | Value = 0, 112 | mask(Bits, Masks, Values). 113 | 114 | mask2([], [], []). 115 | mask2([], ['X'|Masks], [Value|Values]) :- 116 | (Value = 0;Value = 1), 117 | mask2([], Masks, Values). 118 | 119 | mask2([], ['0'|Masks], [Value|Values]) :- 120 | Value = 0, 121 | mask2([], Masks, Values). 122 | 123 | mask2([], ['1'|Masks], [Value|Values]) :- 124 | Value = 1, 125 | mask2([], Masks, Values). 126 | 127 | mask2([_Bit|Bits], ['X'|Masks], [Value|Values]) :- 128 | (Value = 0;Value = 1), 129 | mask2(Bits, Masks, Values). 130 | 131 | mask2([_Bit|Bits], ['1'|Masks], [Value|Values]) :- 132 | Value = 1, 133 | mask2(Bits, Masks, Values). 134 | 135 | mask2([Bit|Bits], ['0'|Masks], [Value|Values]) :- 136 | Value = Bit, 137 | mask2(Bits, Masks, Values). 138 | 139 | :- begin_tests(day14). 140 | 141 | test(star1) :- star(1, 11926135976176),!. 142 | test(star2) :- star(2, 4330547254348),!. 143 | 144 | :- end_tests(day14). -------------------------------------------------------------------------------- /day21/day21.pl: -------------------------------------------------------------------------------- 1 | :- set_prolog_flag(double_quotes, chars). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | :- use_module(library(pairs)). 6 | 7 | input_ingredients([Ingredient|Ingredients]) --> 8 | string_without(" (", Ingredient), 9 | " ", 10 | input_ingredients(Ingredients). 11 | 12 | input_ingredients([]) --> []. 13 | 14 | input_allergens([Allergen|Allergens]) --> 15 | string_without(" )", Allergen), 16 | ((" ", input_allergens(Allergens))|(")", { Allergens = [] })). 17 | 18 | input([recipe(Ingredients, Allergens)|Recipes]) --> 19 | input_ingredients(Ingredients), 20 | "(contains ", 21 | input_allergens(Allergens), 22 | "\n", 23 | input(Recipes). 24 | 25 | input([]) --> eos. 26 | 27 | load_data(Recipes) :- 28 | read_file_to_string('day21/input.dat', String, []), 29 | string_chars(String, Chars), 30 | phrase(input(Recipes), Chars). 31 | 32 | star(backtracking1, N) :- 33 | load_data(Recipes), 34 | recipes_ingredients(Recipes, Ingredients), 35 | maplist(ingredient_build, Ingredients, IngredientsAllergens),!, 36 | maplist(recipe_allergens(IngredientsAllergens), Recipes),!, 37 | convlist(non_allergen_ingredients, IngredientsAllergens, SafeIngredients), 38 | merge_ingredients(Recipes, AllIngredients), 39 | foldl(count_safe(SafeIngredients), AllIngredients, 0, N). 40 | 41 | star(2, N) :- 42 | load_data(Recipes), 43 | allergen_list(Recipes, AllergensList), 44 | sort(AllergensList, SortedAllergensList), 45 | group_pairs_by_key(SortedAllergensList, AllergensLists), 46 | maplist(intersect_ingredients, AllergensLists, AllergensSet), 47 | allergens(AllergensSet, IngredientsAllergens), 48 | maplist(pair_term, IngredientsAllergens, TermIngredientsAllergens), 49 | sort(2, @=<, TermIngredientsAllergens, SortedIngredientsAllergens), 50 | forall(member(danger(I, _), SortedIngredientsAllergens),format('~s,', [I])). 51 | 52 | star(1, N) :- 53 | load_data(Recipes), 54 | allergen_list(Recipes, AllergensList), 55 | sort(AllergensList, SortedAllergensList), 56 | group_pairs_by_key(SortedAllergensList, AllergensLists), 57 | maplist(intersect_ingredients, AllergensLists, AllergensSet), 58 | allergens(AllergensSet, IngredientsAllergens0), 59 | recipes_ingredients(Recipes, Ingredients), 60 | maplist(ingredient_build, Ingredients, IngredientsAllergens1), 61 | union(IngredientsAllergens0, IngredientsAllergens1, IngredientsAllergens), 62 | convlist(non_allergen_ingredients, IngredientsAllergens, SafeIngredients), 63 | merge_ingredients(Recipes, AllIngredients), 64 | foldl(count_safe(SafeIngredients), AllIngredients, 0, N). 65 | 66 | pair_term(Ingredient-Allergen, danger(Ingredient, Allergen)). 67 | 68 | allergens(Set, []) :- 69 | pairs_keys_values(Set, _, Lists), maplist(=([]), Lists). 70 | allergens(Set, Allergens) :- 71 | member(Allergen-List, Set), 72 | [Ingredient] = List, 73 | maplist(remove_ingredient(Ingredient), Set, Set0), 74 | allergens(Set0, Allergens0), 75 | Allergens = [Ingredient-Allergen|Allergens0]. 76 | 77 | remove_ingredient(Ingredient, Allergen-ListIn, Allergen-ListOut) :- 78 | delete(ListIn, Ingredient, ListOut). 79 | 80 | intersect_ingredients(Allergen-List, Allergen-Set) :- 81 | intersect_ingredients_(List, Set). 82 | 83 | intersect_ingredients_([X], X). 84 | intersect_ingredients_([X|Xs], S) :- 85 | intersect_ingredients_(Xs, S0), 86 | intersection(S0, X, S). 87 | 88 | allergen_list([], []). 89 | allergen_list([recipe(Ingredients, Allergens)|Recipes], List) :- 90 | allergen_list(Recipes, List0), 91 | findall(Elem,( 92 | member(Allergen, Allergens), 93 | Elem = Allergen-Ingredients 94 | ), List1), 95 | append(List0, List1, List). 96 | 97 | 98 | count_safe(SafeIngredients, Ingredient, In, Out) :- 99 | ( member(Ingredient, SafeIngredients) -> 100 | Out is In + 1 101 | ; Out is In 102 | ). 103 | 104 | merge_ingredients([], []). 105 | merge_ingredients([recipe(I, _)|Recipes], Ingredients) :- 106 | merge_ingredients(Recipes, Ingredients0), 107 | append(Ingredients0, I, Ingredients). 108 | 109 | non_allergen_ingredients(Ingredient-Allergen, Ingredient) :- var(Allergen). 110 | 111 | no_duplicated_allergens(IngredientsAllergens) :- 112 | maplist(get_allergens, IngredientsAllergens, Allergens), 113 | list_to_set(Allergens, Allergens). 114 | 115 | get_allergens(_-Allergen, Allergen). 116 | 117 | ingredient_build(Ingredient, Ingredient-_). 118 | 119 | recipes_ingredients([], []). 120 | recipes_ingredients([Recipe|Recipes], Ingredients) :- 121 | recipes_ingredients(Recipes, IngredientsIn), 122 | Recipe = recipe(X, _), 123 | union(X, IngredientsIn, Ingredients). 124 | 125 | recipe_allergens(IngredientsAllergens, recipe(Ingredients, Allergens)) :- 126 | maplist(check_allergens(Ingredients, IngredientsAllergens), Allergens). 127 | 128 | check_allergens(Ingredients, IngredientsAllergens, Allergen) :- 129 | member(Ingredient, Ingredients), 130 | member(Ingredient-Allergen, IngredientsAllergens), 131 | no_duplicated_allergens(IngredientsAllergens). -------------------------------------------------------------------------------- /day12/day12.pl: -------------------------------------------------------------------------------- 1 | :- module(day12, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(readutil)). 8 | 9 | input([]) --> eos. 10 | 11 | input([step('N', Arg)|Steps]) --> 12 | "N", 13 | integer(Arg), 14 | "\n", 15 | input(Steps). 16 | 17 | input([step('S', Arg)|Steps]) --> 18 | "S", 19 | integer(Arg), 20 | "\n", 21 | input(Steps). 22 | 23 | input([step('E', Arg)|Steps]) --> 24 | "E", 25 | integer(Arg), 26 | "\n", 27 | input(Steps). 28 | 29 | input([step('W', Arg)|Steps]) --> 30 | "W", 31 | integer(Arg), 32 | "\n", 33 | input(Steps). 34 | 35 | input([step('L', Arg)|Steps]) --> 36 | "L", 37 | integer(Arg), 38 | "\n", 39 | input(Steps). 40 | 41 | input([step('R', Arg)|Steps]) --> 42 | "R", 43 | integer(Arg), 44 | "\n", 45 | input(Steps). 46 | 47 | input([step('F', Arg)|Steps]) --> 48 | "F", 49 | integer(Arg), 50 | "\n", 51 | input(Steps). 52 | 53 | load_data(Steps) :- 54 | read_file_to_string('day12/input.dat', String, []), 55 | string_chars(String, Chars), 56 | phrase(input(Steps), Chars). 57 | 58 | star(1, N) :- 59 | load_data(Steps),!, 60 | StateIn = state('E', 0, 0), 61 | execute(Steps, StateIn, StateOut), 62 | StateOut = state(_, X, Y), 63 | N is abs(X)+abs(Y). 64 | 65 | star(2, N) :- 66 | load_data(Steps),!, 67 | StateIn = state('E', ship(0, 0), waypoint(-10, 1)), 68 | execute2(Steps, StateIn, StateOut), 69 | StateOut = state(_, ship(X, Y), waypoint(_, _)), 70 | N is abs(X)+abs(Y). 71 | 72 | execute([], StateOut, StateOut). 73 | 74 | execute([step('N', Arg)|Steps], state(Face, X, Y), StateOut) :- 75 | NewY is Y + Arg, 76 | NewState = state(Face, X, NewY), 77 | execute(Steps, NewState, StateOut). 78 | 79 | execute([step('S', Arg)|Steps], state(Face, X, Y), StateOut) :- 80 | NewY is Y - Arg, 81 | NewState = state(Face, X, NewY), 82 | execute(Steps, NewState, StateOut). 83 | 84 | execute([step('E', Arg)|Steps], state(Face, X, Y), StateOut) :- 85 | NewX is X - Arg, 86 | NewState = state(Face, NewX, Y), 87 | execute(Steps, NewState, StateOut). 88 | 89 | execute([step('W', Arg)|Steps], state(Face, X, Y), StateOut) :- 90 | NewX is X + Arg, 91 | NewState = state(Face, NewX, Y), 92 | execute(Steps, NewState, StateOut). 93 | 94 | execute([step('L', Arg)|Steps], state(Face, X, Y), StateOut) :- 95 | face('L', Arg, Face, NewFace), 96 | NewState = state(NewFace, X, Y), 97 | execute(Steps, NewState, StateOut). 98 | 99 | execute([step('R', Arg)|Steps], state(Face, X, Y), StateOut) :- 100 | face('R', Arg, Face, NewFace), 101 | NewState = state(NewFace, X, Y), 102 | execute(Steps, NewState, StateOut). 103 | 104 | execute([step('F', Arg)|Steps], state(Face, X, Y), StateOut) :- 105 | execute([step(Face, Arg)|Steps], state(Face, X, Y), StateOut). 106 | 107 | execute2([], StateOut, StateOut). 108 | 109 | execute2([step('N', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 110 | NewY is Y + Arg, 111 | NewState = state(Face, Ship, waypoint(X, NewY)), 112 | execute2(Steps, NewState, StateOut). 113 | 114 | execute2([step('S', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 115 | NewY is Y - Arg, 116 | NewState = state(Face, Ship, waypoint(X, NewY)), 117 | execute2(Steps, NewState, StateOut). 118 | 119 | execute2([step('E', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 120 | NewX is X - Arg, 121 | NewState = state(Face, Ship, waypoint(NewX, Y)), 122 | execute2(Steps, NewState, StateOut). 123 | 124 | execute2([step('W', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 125 | NewX is X + Arg, 126 | NewState = state(Face, Ship, waypoint(NewX, Y)), 127 | execute2(Steps, NewState, StateOut). 128 | 129 | execute2([step('L', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 130 | face2('L', Arg, X, Y, NewWX, NewWY), 131 | execute2(Steps, state(Face, Ship, waypoint(NewWX, NewWY)), StateOut). 132 | 133 | execute2([step('R', Arg)|Steps], state(Face, Ship, waypoint(X, Y)), StateOut) :- 134 | face2('R', Arg, X, Y, NewWX, NewWY), 135 | execute2(Steps, state(Face, Ship, waypoint(NewWX, NewWY)), StateOut). 136 | 137 | execute2([step('F', Arg)|Steps], state(Face, ship(X, Y), waypoint(WX, WY)), StateOut) :- 138 | NewX is X + WX*Arg, 139 | NewY is Y + WY*Arg, 140 | execute2(Steps, state(Face, ship(NewX, NewY), waypoint(WX, WY)), StateOut). 141 | 142 | face('R', 90, 'E', 'S'). 143 | face('R', 90, 'S', 'W'). 144 | face('R', 90, 'W', 'N'). 145 | face('R', 90, 'N', 'E'). 146 | 147 | face('L', 90, 'E', 'N'). 148 | face('L', 90, 'N', 'W'). 149 | face('L', 90, 'W', 'S'). 150 | face('L', 90, 'S', 'E'). 151 | 152 | face(Rotation, 180, Face, NewFace) :- 153 | face(Rotation, 90, Face, Face1), 154 | face(Rotation, 90, Face1, NewFace). 155 | 156 | face(Rotation, 270, Face, NewFace) :- 157 | face(Rotation, 90, Face, Face1), 158 | face(Rotation, 90, Face1, Face2), 159 | face(Rotation, 90, Face2, NewFace). 160 | 161 | face2('R', 90, X, Y, NewX, NewY) :- 162 | NewY is X, 163 | NewX is Y * -1. 164 | 165 | face2('L', 90, X, Y, NewX, NewY) :- 166 | NewX is Y, 167 | NewY is X * -1. 168 | 169 | face2(Rotation, 180, X, Y, NewX, NewY) :- 170 | face2(Rotation, 90, X, Y, X1, Y1), 171 | face2(Rotation, 90, X1, Y1, NewX, NewY). 172 | 173 | face2(Rotation, 270, X, Y, NewX, NewY) :- 174 | face2(Rotation, 90, X, Y, X1, Y1), 175 | face2(Rotation, 90, X1, Y1, X2, Y2), 176 | face2(Rotation, 90, X2, Y2, NewX, NewY). 177 | 178 | :- begin_tests(day12). 179 | 180 | test(star1) :- star(1, 1007),!. 181 | test(star2) :- star(2, 41212),!. 182 | 183 | :- end_tests(day12). -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "atomicwrites" 3 | version = "1.4.0" 4 | description = "Atomic file writes." 5 | category = "main" 6 | optional = false 7 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 8 | 9 | [[package]] 10 | name = "attrs" 11 | version = "20.3.0" 12 | description = "Classes Without Boilerplate" 13 | category = "main" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 16 | 17 | [package.extras] 18 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] 19 | docs = ["furo", "sphinx", "zope.interface"] 20 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] 21 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] 22 | 23 | [[package]] 24 | name = "colorama" 25 | version = "0.4.4" 26 | description = "Cross-platform colored terminal text." 27 | category = "main" 28 | optional = false 29 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 30 | 31 | [[package]] 32 | name = "iniconfig" 33 | version = "1.1.1" 34 | description = "iniconfig: brain-dead simple config-ini parsing" 35 | category = "main" 36 | optional = false 37 | python-versions = "*" 38 | 39 | [[package]] 40 | name = "packaging" 41 | version = "20.7" 42 | description = "Core utilities for Python packages" 43 | category = "main" 44 | optional = false 45 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 46 | 47 | [package.dependencies] 48 | pyparsing = ">=2.0.2" 49 | 50 | [[package]] 51 | name = "pluggy" 52 | version = "0.13.1" 53 | description = "plugin and hook calling mechanisms for python" 54 | category = "main" 55 | optional = false 56 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 57 | 58 | [package.extras] 59 | dev = ["pre-commit", "tox"] 60 | 61 | [[package]] 62 | name = "py" 63 | version = "1.9.0" 64 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 65 | category = "main" 66 | optional = false 67 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 68 | 69 | [[package]] 70 | name = "pyparsing" 71 | version = "2.4.7" 72 | description = "Python parsing module" 73 | category = "main" 74 | optional = false 75 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 76 | 77 | [[package]] 78 | name = "pytest" 79 | version = "6.1.2" 80 | description = "pytest: simple powerful testing with Python" 81 | category = "main" 82 | optional = false 83 | python-versions = ">=3.5" 84 | 85 | [package.dependencies] 86 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 87 | attrs = ">=17.4.0" 88 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 89 | iniconfig = "*" 90 | packaging = "*" 91 | pluggy = ">=0.12,<1.0" 92 | py = ">=1.8.2" 93 | toml = "*" 94 | 95 | [package.extras] 96 | checkqa_mypy = ["mypy (==0.780)"] 97 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 98 | 99 | [[package]] 100 | name = "toml" 101 | version = "0.10.2" 102 | description = "Python Library for Tom's Obvious, Minimal Language" 103 | category = "main" 104 | optional = false 105 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 106 | 107 | [metadata] 108 | lock-version = "1.1" 109 | python-versions = "^3.9" 110 | content-hash = "a8a5846f2d918c08efeeab7a5540a3da39d9abfe337f90319a938bd57d79611c" 111 | 112 | [metadata.files] 113 | atomicwrites = [ 114 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 115 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 116 | ] 117 | attrs = [ 118 | {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, 119 | {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, 120 | ] 121 | colorama = [ 122 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 123 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 124 | ] 125 | iniconfig = [ 126 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 127 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 128 | ] 129 | packaging = [ 130 | {file = "packaging-20.7-py2.py3-none-any.whl", hash = "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"}, 131 | {file = "packaging-20.7.tar.gz", hash = "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236"}, 132 | ] 133 | pluggy = [ 134 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 135 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 136 | ] 137 | py = [ 138 | {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, 139 | {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, 140 | ] 141 | pyparsing = [ 142 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 143 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 144 | ] 145 | pytest = [ 146 | {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, 147 | {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, 148 | ] 149 | toml = [ 150 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 151 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 152 | ] 153 | -------------------------------------------------------------------------------- /day12/input.dat: -------------------------------------------------------------------------------- 1 | L90 2 | N5 3 | L180 4 | L180 5 | S4 6 | F21 7 | W4 8 | S1 9 | R270 10 | F18 11 | S4 12 | F44 13 | R90 14 | N5 15 | F18 16 | E5 17 | R270 18 | F1 19 | L90 20 | W5 21 | N4 22 | W5 23 | F37 24 | R90 25 | S1 26 | W2 27 | S1 28 | L90 29 | W5 30 | R90 31 | N1 32 | W2 33 | L180 34 | L90 35 | E3 36 | N1 37 | L90 38 | F30 39 | E4 40 | N2 41 | E2 42 | F76 43 | R90 44 | W4 45 | S3 46 | R90 47 | F2 48 | L90 49 | S3 50 | R180 51 | N5 52 | E4 53 | L90 54 | W4 55 | F1 56 | N2 57 | E1 58 | F8 59 | R90 60 | F88 61 | R180 62 | F60 63 | W2 64 | R90 65 | E3 66 | N3 67 | W5 68 | F56 69 | S1 70 | E5 71 | F5 72 | L90 73 | E4 74 | N3 75 | R90 76 | E2 77 | F34 78 | W4 79 | L90 80 | F100 81 | W4 82 | L90 83 | F40 84 | L90 85 | F51 86 | E5 87 | F52 88 | N1 89 | F45 90 | W2 91 | N2 92 | F56 93 | N2 94 | W3 95 | R180 96 | F14 97 | N3 98 | L90 99 | N2 100 | F18 101 | L180 102 | E1 103 | R90 104 | N2 105 | E3 106 | L180 107 | S5 108 | F87 109 | L90 110 | F32 111 | E1 112 | F92 113 | N1 114 | W3 115 | F89 116 | E2 117 | N1 118 | R90 119 | W1 120 | F9 121 | E1 122 | F74 123 | S1 124 | L270 125 | S1 126 | F99 127 | L90 128 | W1 129 | R90 130 | F78 131 | L90 132 | W4 133 | S2 134 | R180 135 | E3 136 | S4 137 | L90 138 | F78 139 | E5 140 | L90 141 | S5 142 | W2 143 | R90 144 | N1 145 | E5 146 | F33 147 | W1 148 | R180 149 | S1 150 | W4 151 | N1 152 | F69 153 | S5 154 | R90 155 | N5 156 | F89 157 | L90 158 | W1 159 | F91 160 | L90 161 | F19 162 | E5 163 | L90 164 | F53 165 | L90 166 | S5 167 | L90 168 | S4 169 | W1 170 | S2 171 | L180 172 | F3 173 | N5 174 | N5 175 | F78 176 | E3 177 | S1 178 | L180 179 | F79 180 | L90 181 | W4 182 | R180 183 | W3 184 | N4 185 | W5 186 | F84 187 | S4 188 | L180 189 | S1 190 | S3 191 | E2 192 | S4 193 | R90 194 | N1 195 | E5 196 | S4 197 | W4 198 | R90 199 | F44 200 | R90 201 | E5 202 | S5 203 | W1 204 | N4 205 | F37 206 | N2 207 | F41 208 | R90 209 | F58 210 | L90 211 | F5 212 | R90 213 | W4 214 | L90 215 | F45 216 | N4 217 | F48 218 | S1 219 | E2 220 | S1 221 | R90 222 | F30 223 | W2 224 | L90 225 | F53 226 | L90 227 | W5 228 | R90 229 | N2 230 | E1 231 | S3 232 | F29 233 | N5 234 | L270 235 | S2 236 | F87 237 | S4 238 | F86 239 | S4 240 | R90 241 | W5 242 | F59 243 | N2 244 | F35 245 | L90 246 | W5 247 | N3 248 | E3 249 | L90 250 | S2 251 | E2 252 | N2 253 | L90 254 | R90 255 | N5 256 | L270 257 | N5 258 | R90 259 | N4 260 | E2 261 | S3 262 | W2 263 | F55 264 | E4 265 | S1 266 | L90 267 | W3 268 | S4 269 | F95 270 | W5 271 | E2 272 | R90 273 | S3 274 | F54 275 | L90 276 | N5 277 | F69 278 | R90 279 | N1 280 | W3 281 | N4 282 | F49 283 | N4 284 | E5 285 | S2 286 | W5 287 | S5 288 | R90 289 | N1 290 | F76 291 | S5 292 | E4 293 | S5 294 | L90 295 | N2 296 | R90 297 | F68 298 | L90 299 | S1 300 | R90 301 | F67 302 | L90 303 | N3 304 | E1 305 | F51 306 | S1 307 | F94 308 | S3 309 | E5 310 | N3 311 | F76 312 | R180 313 | F53 314 | R90 315 | R90 316 | F96 317 | L270 318 | N1 319 | R90 320 | E3 321 | L90 322 | F57 323 | S5 324 | F39 325 | N2 326 | F95 327 | R270 328 | W1 329 | S4 330 | N5 331 | N4 332 | F5 333 | L90 334 | F83 335 | L180 336 | E4 337 | F82 338 | N5 339 | R90 340 | F52 341 | L90 342 | F13 343 | N5 344 | R90 345 | L90 346 | F10 347 | N5 348 | F80 349 | E4 350 | L180 351 | N1 352 | R90 353 | E1 354 | R180 355 | E5 356 | F25 357 | S3 358 | L180 359 | F29 360 | N1 361 | W1 362 | F20 363 | W1 364 | R180 365 | F56 366 | E5 367 | S2 368 | L90 369 | F67 370 | N4 371 | W3 372 | E2 373 | R180 374 | E1 375 | F16 376 | F59 377 | R180 378 | E5 379 | F21 380 | E2 381 | R90 382 | N4 383 | E5 384 | S5 385 | E3 386 | L90 387 | W1 388 | L90 389 | E2 390 | S3 391 | R90 392 | F59 393 | W4 394 | F44 395 | S2 396 | W1 397 | S1 398 | N5 399 | W1 400 | S3 401 | E1 402 | N3 403 | R90 404 | E2 405 | F39 406 | R90 407 | F2 408 | E1 409 | N5 410 | W5 411 | F24 412 | E3 413 | L90 414 | S3 415 | E2 416 | F57 417 | E2 418 | R90 419 | F12 420 | R90 421 | N2 422 | W3 423 | L180 424 | N4 425 | F78 426 | R180 427 | N4 428 | F92 429 | L90 430 | L180 431 | N2 432 | W4 433 | R90 434 | F7 435 | S4 436 | E3 437 | S4 438 | E1 439 | S4 440 | L180 441 | S2 442 | F81 443 | E5 444 | L90 445 | F3 446 | N4 447 | F39 448 | S2 449 | W4 450 | F28 451 | R90 452 | F75 453 | W1 454 | S3 455 | W5 456 | S1 457 | F67 458 | E3 459 | F62 460 | R90 461 | N3 462 | R180 463 | W2 464 | F67 465 | S2 466 | W1 467 | L90 468 | L90 469 | S2 470 | E3 471 | R90 472 | N5 473 | S4 474 | F14 475 | R180 476 | N2 477 | R90 478 | W3 479 | L180 480 | F37 481 | W1 482 | S4 483 | E1 484 | F45 485 | W4 486 | S5 487 | L180 488 | S2 489 | W1 490 | L90 491 | N4 492 | R90 493 | F44 494 | S1 495 | E3 496 | S4 497 | W5 498 | N4 499 | W4 500 | R270 501 | S1 502 | W3 503 | L90 504 | R90 505 | F95 506 | N1 507 | R90 508 | S1 509 | F48 510 | L90 511 | F53 512 | E2 513 | R180 514 | N5 515 | F46 516 | W5 517 | F98 518 | S3 519 | F81 520 | N5 521 | F98 522 | N4 523 | F67 524 | S1 525 | E1 526 | F10 527 | R90 528 | F66 529 | W3 530 | N1 531 | L180 532 | N1 533 | F27 534 | F54 535 | W2 536 | F3 537 | R90 538 | F68 539 | E2 540 | E4 541 | F30 542 | L90 543 | F62 544 | S2 545 | L90 546 | F99 547 | R90 548 | F48 549 | E4 550 | S4 551 | F96 552 | W4 553 | N5 554 | W5 555 | F44 556 | F90 557 | N1 558 | L90 559 | F68 560 | N4 561 | W1 562 | F83 563 | S5 564 | E1 565 | N3 566 | R90 567 | W4 568 | N5 569 | F59 570 | R90 571 | L180 572 | W2 573 | F14 574 | L90 575 | N1 576 | F58 577 | R90 578 | E2 579 | L90 580 | S5 581 | F30 582 | R90 583 | F17 584 | W1 585 | F29 586 | E3 587 | R90 588 | S3 589 | R90 590 | W1 591 | N2 592 | S3 593 | W2 594 | S2 595 | R90 596 | W2 597 | N2 598 | L90 599 | W1 600 | F55 601 | S3 602 | W4 603 | R180 604 | N3 605 | W1 606 | L90 607 | F59 608 | E5 609 | L90 610 | L180 611 | F70 612 | W1 613 | F41 614 | L180 615 | S5 616 | F22 617 | S5 618 | L270 619 | F11 620 | R90 621 | S3 622 | W2 623 | N4 624 | R90 625 | W5 626 | R180 627 | F17 628 | R90 629 | F99 630 | L180 631 | F26 632 | R90 633 | W5 634 | R180 635 | S5 636 | F28 637 | N5 638 | W1 639 | N5 640 | F100 641 | S4 642 | E2 643 | L270 644 | N4 645 | F100 646 | S1 647 | R180 648 | F81 649 | S5 650 | W5 651 | L180 652 | F1 653 | R90 654 | W5 655 | L90 656 | R90 657 | N4 658 | F69 659 | W5 660 | L180 661 | F68 662 | S5 663 | F21 664 | E4 665 | L180 666 | W3 667 | S3 668 | R90 669 | E3 670 | R90 671 | E2 672 | R90 673 | F19 674 | N3 675 | R90 676 | F81 677 | S1 678 | R90 679 | F1 680 | N1 681 | L90 682 | R90 683 | W1 684 | S4 685 | F93 686 | W5 687 | F31 688 | W1 689 | N1 690 | W1 691 | F59 692 | L180 693 | W5 694 | S4 695 | L90 696 | S1 697 | R270 698 | N1 699 | R90 700 | S3 701 | R90 702 | W2 703 | R90 704 | W2 705 | R180 706 | F83 707 | S3 708 | R90 709 | F99 710 | R90 711 | F25 712 | S2 713 | F81 714 | F33 715 | F55 716 | R90 717 | F40 718 | N5 719 | L90 720 | N5 721 | E5 722 | F56 723 | L180 724 | S2 725 | F52 726 | E4 727 | F99 728 | S2 729 | E1 730 | L180 731 | F47 732 | S3 733 | W4 734 | W3 735 | L90 736 | N1 737 | F26 738 | R90 739 | W5 740 | R90 741 | W5 742 | L90 743 | E2 744 | N1 745 | F35 746 | L90 747 | S3 748 | F20 749 | W5 750 | F29 751 | L90 752 | S2 753 | W4 754 | L180 755 | N5 756 | F27 757 | L90 758 | F80 759 | S1 760 | L90 761 | R180 762 | F37 763 | -------------------------------------------------------------------------------- /day17/day17.pl: -------------------------------------------------------------------------------- 1 | :- set_prolog_flag(double_quotes, chars). 2 | 3 | :- use_module(library(pure_input)). 4 | :- use_module(library(dcg/basics)). 5 | :- use_module(library(readutil)). 6 | 7 | lines([]) --> call(eos), !. 8 | lines([L|Ls]) --> line(L), lines(Ls). 9 | 10 | line([]) --> ( "\n" | call(eos) ), !. 11 | line([C|Cs]) --> [C], line(Cs). 12 | 13 | eos([], []). 14 | 15 | 16 | 17 | load_data(1, Vertexs) :- 18 | read_file_to_string('day17/input.dat', String, []), 19 | string_chars(String, Chars), 20 | phrase(lines(Lines), Chars), 21 | lines_vertexs(Lines, Vertexs). 22 | 23 | load_data(2, Hypers) :- 24 | read_file_to_string('day17/input.dat', String, []), 25 | string_chars(String, Chars), 26 | phrase(lines(Lines), Chars), 27 | lines_hypers(Lines, Hypers). 28 | 29 | lines_vertexs(Lines, Vertexs) :- 30 | findall(Vertex, ( 31 | nth0(X, Lines, Line), 32 | nth0(Y, Line, Value), 33 | Vertex = vertex(X, Y, 0, Value) 34 | ),Vertexs). 35 | 36 | lines_hypers(Lines, Hypers) :- 37 | findall(Hyper, ( 38 | nth0(X, Lines, Line), 39 | nth0(Y, Line, Value), 40 | Hyper = hyper(X, Y, 0, 0, Value) 41 | ), Hypers). 42 | 43 | star(1, N) :- 44 | load_data(1, Vertexs), 45 | loop(6, Vertexs, VertexsOut), 46 | foldl(count_active, VertexsOut, 0, N). 47 | 48 | star(2, N) :- 49 | load_data(2, Hypers), 50 | loop2(6, Hypers, HypersOut), 51 | foldl(count_active2, HypersOut, 0, N). 52 | 53 | loop(0, Vertexs, Vertexs). 54 | loop(N, VertexsIn, VertexsOut) :- 55 | map_expand(VertexsIn, VertexsExpand), 56 | maplist(step(VertexsExpand), VertexsExpand, VertexsMid), 57 | NewN is N - 1, 58 | loop(NewN, VertexsMid, VertexsOut). 59 | 60 | loop2(0, Hypers, Hypers). 61 | loop2(N, HypersIn, HypersOut) :- 62 | map_expand2(HypersIn, HypersExpand), 63 | maplist(step2(HypersExpand), HypersExpand, HypersMid), 64 | NewN is N - 1, 65 | loop2(NewN, HypersMid, HypersOut). 66 | 67 | map_expand(Vertexs, VertexsExpand) :- 68 | bounds(Vertexs, MinX, MaxX, MinY, MaxY, MinZ, MaxZ), 69 | SafeMinX is MinX - 1, 70 | SafeMaxX is MaxX + 1, 71 | SafeMinY is MinY - 1, 72 | SafeMaxY is MaxY + 1, 73 | SafeMinZ is MinZ - 1, 74 | SafeMaxZ is MaxZ + 1, 75 | findall(NewVertex, ( 76 | between(SafeMinX, SafeMaxX, X), 77 | between(SafeMinY, SafeMaxY, Y), 78 | between(SafeMinZ, SafeMaxZ, Z), 79 | NewVertex = vertex(X, Y, Z, _), 80 | \+ member(NewVertex, Vertexs), 81 | NewVertex = vertex(X, Y, Z, '.') 82 | ),NewVertexs), 83 | append(Vertexs, NewVertexs, VertexsExpand). 84 | 85 | map_expand2(Hypers, HypersExpand) :- 86 | bounds2(Hypers, MinX, MaxX, MinY, MaxY, MinZ, MaxZ, MinW, MaxW), 87 | SafeMinX is MinX - 1, 88 | SafeMaxX is MaxX + 1, 89 | SafeMinY is MinY - 1, 90 | SafeMaxY is MaxY + 1, 91 | SafeMinZ is MinZ - 1, 92 | SafeMaxZ is MaxZ + 1, 93 | SafeMinW is MinW - 1, 94 | SafeMaxW is MaxW + 1, 95 | findall(NewHyper, ( 96 | between(SafeMinX, SafeMaxX, X), 97 | between(SafeMinY, SafeMaxY, Y), 98 | between(SafeMinZ, SafeMaxZ, Z), 99 | between(SafeMinW, SafeMaxW, W), 100 | NewHyper = hyper(X, Y, Z, W, _), 101 | \+ member(NewHyper, Hypers), 102 | NewHyper = hyper(X, Y, Z, W, '.') 103 | ),NewHypers), 104 | append(Hypers, NewHypers, HypersExpand). 105 | 106 | bounds([], 0, 0, 0, 0, 0, 0). 107 | bounds([vertex(X, Y, Z, '#')|Vertexs], MinX, MaxX, MinY, MaxY, MinZ, MaxZ) :- 108 | bounds(Vertexs, MinX0, MaxX0, MinY0, MaxY0, MinZ0, MaxZ0), 109 | MinX is min(X, MinX0), 110 | MaxX is max(X, MaxX0), 111 | MinY is min(Y, MinY0), 112 | MaxY is max(Y, MaxY0), 113 | MinZ is min(Z, MinZ0), 114 | MaxZ is max(Z, MaxZ0). 115 | 116 | bounds([vertex(X, Y, Z, '.')|Vertexs], MinX, MaxX, MinY, MaxY, MinZ, MaxZ) :- 117 | bounds(Vertexs, MinX, MaxX, MinY, MaxY, MinZ, MaxZ). 118 | 119 | bounds2([], 0, 0, 0, 0, 0, 0, 0, 0). 120 | bounds2([hyper(X, Y, Z, W, '#')|Hypers], MinX, MaxX, MinY, MaxY, MinZ, MaxZ, MinW, MaxW) :- 121 | bounds2(Hypers, MinX0, MaxX0, MinY0, MaxY0, MinZ0, MaxZ0, MinW0, MaxW0), 122 | MinX is min(X, MinX0), 123 | MaxX is max(X, MaxX0), 124 | MinY is min(Y, MinY0), 125 | MaxY is max(Y, MaxY0), 126 | MinZ is min(Z, MinZ0), 127 | MaxZ is max(Z, MaxZ0), 128 | MinW is min(W, MinW0), 129 | MaxW is max(W, MaxW0). 130 | 131 | bounds2([hyper(X, Y, Z, W, '.')|Hypers], MinX, MaxX, MinY, MaxY, MinZ, MaxZ, MinW, MaxW) :- 132 | bounds2(Hypers, MinX, MaxX, MinY, MaxY, MinZ, MaxZ, MinW, MaxW). 133 | 134 | count_active(Vertex, AccIn, AccOut) :- 135 | (Vertex = vertex(_, _, _, '#') -> 136 | AccOut is AccIn + 1 137 | ; AccOut is AccIn 138 | ). 139 | 140 | count_active2(Hyper, AccIn, AccOut) :- 141 | (Hyper = hyper(_, _, _, _, '#') -> 142 | AccOut is AccIn + 1 143 | ; AccOut is AccIn 144 | ). 145 | 146 | step(Vertexs, VertexIn, VertexOut) :- 147 | VertexIn = vertex(X, Y, Z, '#'), 148 | findall(Active, ( 149 | member(Active, Vertexs), 150 | Active = vertex(_, _, _, '#'), 151 | dif(Active, VertexIn), 152 | neighbour_vertex(Active, VertexIn) 153 | ), ActiveNeighbours), 154 | length(ActiveNeighbours, Actives), 155 | ( (Actives = 2; Actives = 3) -> 156 | VertexOut = vertex(X, Y, Z, '#') 157 | ; VertexOut = vertex(X, Y, Z, '.') 158 | ). 159 | 160 | step(Vertexs, VertexIn, VertexOut) :- 161 | VertexIn = vertex(X, Y, Z, '.'), 162 | findall(Active, ( 163 | member(Active, Vertexs), 164 | Active = vertex(_, _, _, '#'), 165 | dif(Active, VertexIn), 166 | neighbour_vertex(Active, VertexIn) 167 | ), ActiveNeighbours), 168 | length(ActiveNeighbours, Actives), 169 | ( (Actives = 3) -> 170 | VertexOut = vertex(X, Y, Z, '#') 171 | ; VertexOut = vertex(X, Y, Z, '.') 172 | ). 173 | 174 | step2(Hypers, HyperIn, HyperOut) :- 175 | HyperIn = hyper(X, Y, Z, W, '#'), 176 | findall(Active, ( 177 | member(Active, Hypers), 178 | Active = hyper(_, _, _, _, '#'), 179 | dif(Active, HyperIn), 180 | neighbour_hyper(Active, HyperIn) 181 | ), ActiveNeighbours), 182 | length(ActiveNeighbours, Actives), 183 | ( (Actives = 2; Actives = 3) -> 184 | HyperOut = hyper(X, Y, Z, W, '#') 185 | ; HyperOut = hyper(X, Y, Z, W, '.') 186 | ). 187 | 188 | step2(Hypers, HyperIn, HyperOut) :- 189 | HyperIn = hyper(X, Y, Z, W, '.'), 190 | findall(Active, ( 191 | member(Active, Hypers), 192 | Active = hyper(_, _, _, _, '#'), 193 | dif(Active, HyperIn), 194 | neighbour_hyper(Active, HyperIn) 195 | ), ActiveNeighbours), 196 | length(ActiveNeighbours, Actives), 197 | ( (Actives = 3) -> 198 | HyperOut = hyper(X, Y, Z, W, '#') 199 | ; HyperOut = hyper(X, Y, Z, W, '.') 200 | ). 201 | 202 | neighbour_vertex(vertex(X0, Y0, Z0, _), vertex(X1, Y1, Z1, _)) :- 203 | X is abs(X0 - X1), 204 | (X = 1;X = 0), 205 | Y is abs(Y0 - Y1), 206 | (Y = 1;Y = 0), 207 | Z is abs(Z0 - Z1), 208 | (Z = 1;Z = 0). 209 | 210 | neighbour_hyper(hyper(X0, Y0, Z0, W0, _), hyper(X1, Y1, Z1, W1, _)) :- 211 | X is abs(X0 - X1), 212 | (X = 1;X = 0), 213 | Y is abs(Y0 - Y1), 214 | (Y = 1;Y = 0), 215 | Z is abs(Z0 - Z1), 216 | (Z = 1;Z = 0), 217 | W is abs(W0 - W1), 218 | (W = 1;W = 0). 219 | -------------------------------------------------------------------------------- /day8/input.dat: -------------------------------------------------------------------------------- 1 | acc +45 2 | nop +631 3 | acc +12 4 | acc -10 5 | jmp +127 6 | acc +28 7 | jmp +460 8 | jmp +619 9 | acc +15 10 | jmp +277 11 | nop +83 12 | acc +40 13 | acc +34 14 | acc +15 15 | jmp +108 16 | acc +10 17 | nop +61 18 | jmp +485 19 | jmp +44 20 | acc +3 21 | jmp +460 22 | acc +46 23 | acc +32 24 | jmp +12 25 | acc -1 26 | jmp +213 27 | acc +40 28 | acc +4 29 | nop +97 30 | acc +18 31 | jmp +613 32 | acc +15 33 | acc +14 34 | nop +374 35 | jmp +487 36 | jmp +1 37 | acc -1 38 | acc +32 39 | jmp +1 40 | jmp +418 41 | acc +10 42 | acc -9 43 | jmp +1 44 | jmp +117 45 | acc -5 46 | nop +539 47 | nop +456 48 | jmp +191 49 | acc +16 50 | jmp +431 51 | jmp +341 52 | acc -17 53 | acc +22 54 | acc +33 55 | acc +15 56 | jmp +152 57 | nop +277 58 | jmp +394 59 | acc -13 60 | acc +49 61 | acc -19 62 | jmp -26 63 | acc -5 64 | acc +13 65 | jmp +49 66 | acc +37 67 | acc +49 68 | nop +420 69 | acc +38 70 | jmp +515 71 | nop +168 72 | acc +22 73 | nop +151 74 | acc +25 75 | jmp +504 76 | acc -16 77 | jmp +73 78 | acc -6 79 | acc +40 80 | acc +9 81 | jmp +143 82 | acc +40 83 | acc -6 84 | acc +31 85 | nop +530 86 | jmp +265 87 | acc -13 88 | acc +40 89 | jmp +312 90 | acc +36 91 | jmp -55 92 | jmp +430 93 | jmp +551 94 | acc +10 95 | acc +18 96 | nop -25 97 | jmp +178 98 | acc +22 99 | jmp +176 100 | jmp +462 101 | acc +22 102 | acc +23 103 | acc +3 104 | acc +0 105 | jmp +162 106 | acc +0 107 | acc +27 108 | jmp +100 109 | nop +234 110 | acc +3 111 | nop +70 112 | nop +112 113 | jmp -62 114 | acc +8 115 | jmp +214 116 | jmp -38 117 | acc -15 118 | acc +48 119 | jmp +289 120 | nop +6 121 | nop +523 122 | jmp +286 123 | nop -9 124 | jmp +234 125 | jmp -74 126 | acc +33 127 | acc +14 128 | nop -11 129 | jmp -37 130 | acc +30 131 | jmp +277 132 | acc +35 133 | acc +4 134 | jmp +96 135 | acc +26 136 | nop +256 137 | acc -14 138 | jmp +389 139 | acc -19 140 | acc -12 141 | jmp +397 142 | jmp +477 143 | nop +141 144 | acc +21 145 | acc +16 146 | nop +29 147 | jmp +407 148 | acc +48 149 | jmp +243 150 | acc +43 151 | acc +41 152 | nop +384 153 | acc +24 154 | jmp +180 155 | jmp +372 156 | jmp +44 157 | acc +4 158 | nop +234 159 | acc +49 160 | jmp +343 161 | acc +0 162 | jmp -91 163 | acc -8 164 | acc +26 165 | jmp -9 166 | acc +37 167 | nop +321 168 | jmp +143 169 | jmp +278 170 | jmp -38 171 | acc +46 172 | nop +67 173 | acc +32 174 | jmp +445 175 | nop +143 176 | acc +35 177 | acc -19 178 | acc +33 179 | jmp +39 180 | jmp -24 181 | nop +393 182 | acc +0 183 | acc +36 184 | acc +44 185 | jmp -134 186 | acc +31 187 | acc +37 188 | acc +5 189 | acc -1 190 | jmp +291 191 | acc +37 192 | acc +36 193 | acc -3 194 | jmp -183 195 | acc -10 196 | acc +29 197 | acc +7 198 | acc +32 199 | jmp +205 200 | acc +38 201 | acc +20 202 | jmp +45 203 | acc +26 204 | acc +0 205 | acc +17 206 | acc +37 207 | jmp +289 208 | acc +20 209 | acc +6 210 | acc +18 211 | jmp -50 212 | acc +41 213 | acc +50 214 | jmp +419 215 | acc +20 216 | jmp +333 217 | jmp +250 218 | acc +35 219 | acc +13 220 | jmp -175 221 | acc -4 222 | nop +179 223 | jmp -57 224 | jmp +243 225 | acc -6 226 | acc +23 227 | nop -149 228 | jmp +1 229 | jmp -97 230 | acc -14 231 | acc +26 232 | acc +5 233 | nop +6 234 | jmp -223 235 | acc +12 236 | nop +115 237 | acc +38 238 | jmp -77 239 | acc +1 240 | acc +25 241 | acc +0 242 | jmp +276 243 | acc +37 244 | acc +31 245 | acc +7 246 | jmp +201 247 | acc +16 248 | acc +39 249 | acc +24 250 | jmp +54 251 | acc +45 252 | nop -96 253 | acc +17 254 | acc -7 255 | jmp +339 256 | acc +6 257 | jmp +317 258 | acc +12 259 | acc -1 260 | acc -4 261 | acc +14 262 | jmp +89 263 | acc +2 264 | acc +30 265 | jmp +60 266 | jmp +239 267 | acc +25 268 | acc -9 269 | jmp +82 270 | acc +45 271 | jmp +1 272 | nop +3 273 | jmp +1 274 | jmp +311 275 | jmp +142 276 | acc +36 277 | nop +253 278 | jmp +341 279 | acc +26 280 | acc +32 281 | acc +30 282 | jmp -182 283 | jmp +184 284 | jmp +331 285 | acc +6 286 | jmp -68 287 | nop -209 288 | acc +1 289 | acc +48 290 | jmp -23 291 | acc +11 292 | acc +30 293 | acc +45 294 | acc -3 295 | jmp -238 296 | jmp +1 297 | acc +9 298 | jmp +45 299 | acc +45 300 | jmp +1 301 | acc +44 302 | acc +29 303 | jmp -73 304 | acc -4 305 | acc +0 306 | acc +0 307 | jmp +294 308 | acc +35 309 | acc +21 310 | jmp +309 311 | nop +316 312 | acc -13 313 | jmp +1 314 | jmp +324 315 | acc -14 316 | acc +42 317 | jmp -99 318 | nop -103 319 | acc +16 320 | jmp -226 321 | nop +317 322 | nop +316 323 | acc -16 324 | jmp -192 325 | acc +33 326 | nop -47 327 | jmp -305 328 | jmp -81 329 | nop -197 330 | nop +249 331 | jmp +157 332 | nop -85 333 | jmp -246 334 | acc +8 335 | acc -14 336 | acc +20 337 | jmp -181 338 | acc +46 339 | nop +164 340 | acc +12 341 | acc -18 342 | jmp -199 343 | acc +10 344 | acc -9 345 | acc +17 346 | acc +15 347 | jmp +134 348 | acc -17 349 | acc -3 350 | jmp +18 351 | acc +35 352 | acc -14 353 | jmp +254 354 | acc -4 355 | acc +41 356 | acc +45 357 | jmp -346 358 | acc -18 359 | acc +41 360 | acc +48 361 | acc +27 362 | jmp -33 363 | acc -1 364 | acc -3 365 | acc +11 366 | acc -13 367 | jmp -224 368 | acc +22 369 | nop -73 370 | acc -12 371 | acc -18 372 | jmp +213 373 | jmp +1 374 | acc +39 375 | acc +19 376 | jmp +66 377 | jmp +126 378 | acc +37 379 | acc -17 380 | acc +17 381 | jmp -4 382 | acc -6 383 | acc +18 384 | acc +9 385 | acc -7 386 | jmp -195 387 | acc +33 388 | acc +24 389 | acc +25 390 | acc -19 391 | jmp -340 392 | acc +40 393 | acc +10 394 | acc +23 395 | jmp -308 396 | jmp +1 397 | acc +9 398 | jmp +1 399 | nop +104 400 | jmp +233 401 | jmp -24 402 | acc +29 403 | jmp -367 404 | acc -15 405 | jmp +107 406 | acc +12 407 | jmp +89 408 | nop -381 409 | jmp +1 410 | acc -2 411 | nop +233 412 | jmp +238 413 | acc +46 414 | acc -15 415 | acc +47 416 | jmp -290 417 | nop -323 418 | acc -9 419 | acc -6 420 | acc +0 421 | jmp -315 422 | acc +21 423 | nop +196 424 | acc +24 425 | acc +18 426 | jmp -49 427 | acc +21 428 | jmp +1 429 | jmp -47 430 | acc +49 431 | nop -120 432 | jmp -413 433 | acc +30 434 | jmp -284 435 | acc -17 436 | jmp -212 437 | nop +39 438 | nop -87 439 | acc -18 440 | jmp -122 441 | jmp -90 442 | nop +76 443 | jmp -277 444 | acc +34 445 | acc +49 446 | jmp +92 447 | nop +168 448 | acc -1 449 | acc +0 450 | jmp +26 451 | jmp -270 452 | jmp +1 453 | acc +14 454 | acc +11 455 | jmp +41 456 | acc -15 457 | jmp +144 458 | jmp +149 459 | acc +48 460 | jmp -260 461 | acc +27 462 | acc -3 463 | jmp +105 464 | acc +47 465 | acc -10 466 | jmp -316 467 | acc -4 468 | acc +41 469 | acc -3 470 | nop -289 471 | jmp -332 472 | nop -281 473 | nop -379 474 | nop +62 475 | jmp -456 476 | acc +34 477 | acc +23 478 | jmp +52 479 | acc +7 480 | jmp -374 481 | acc -18 482 | acc +45 483 | jmp +53 484 | acc +29 485 | nop -407 486 | acc +34 487 | jmp +9 488 | acc +49 489 | acc -1 490 | acc -1 491 | jmp +1 492 | jmp -55 493 | acc -3 494 | acc +5 495 | jmp -280 496 | jmp +1 497 | acc -13 498 | nop -173 499 | jmp -131 500 | acc +5 501 | acc +34 502 | jmp +105 503 | jmp -56 504 | jmp -485 505 | acc -14 506 | nop -389 507 | acc +13 508 | acc +27 509 | jmp -482 510 | nop -418 511 | jmp -394 512 | acc -9 513 | jmp -435 514 | acc -14 515 | nop -172 516 | acc +43 517 | jmp -159 518 | jmp +67 519 | acc +9 520 | acc +22 521 | jmp +15 522 | nop -405 523 | jmp -406 524 | jmp +1 525 | acc -19 526 | jmp -118 527 | acc +49 528 | jmp -385 529 | jmp +90 530 | acc -10 531 | jmp +10 532 | acc +8 533 | nop -315 534 | acc -14 535 | jmp -167 536 | jmp +49 537 | jmp -49 538 | jmp -275 539 | acc -1 540 | jmp -136 541 | acc +24 542 | acc +45 543 | jmp -259 544 | acc +2 545 | nop -370 546 | acc -18 547 | acc +4 548 | jmp -45 549 | acc +9 550 | jmp -542 551 | nop -39 552 | nop -16 553 | jmp +66 554 | acc -1 555 | nop -59 556 | acc +23 557 | acc -8 558 | jmp -91 559 | acc +7 560 | acc +37 561 | jmp -400 562 | acc +39 563 | jmp -162 564 | nop -346 565 | acc +5 566 | acc +50 567 | jmp -115 568 | jmp -141 569 | acc +2 570 | acc -18 571 | nop -179 572 | acc -19 573 | jmp -306 574 | acc -10 575 | acc +30 576 | jmp -115 577 | nop -47 578 | jmp -82 579 | acc +9 580 | acc -4 581 | jmp -139 582 | acc +18 583 | acc +16 584 | jmp -241 585 | jmp +1 586 | acc -3 587 | acc +11 588 | jmp -309 589 | acc +3 590 | acc +0 591 | acc +40 592 | jmp +1 593 | jmp -369 594 | acc +31 595 | jmp +1 596 | acc +35 597 | jmp -427 598 | acc +5 599 | acc -2 600 | jmp -26 601 | acc +29 602 | nop -121 603 | acc +6 604 | jmp -86 605 | nop -294 606 | jmp -391 607 | acc +50 608 | nop -96 609 | nop -325 610 | nop -134 611 | jmp -355 612 | acc +6 613 | jmp +1 614 | jmp -396 615 | nop -440 616 | jmp -89 617 | acc +22 618 | jmp -437 619 | acc +41 620 | acc +8 621 | acc +29 622 | jmp -603 623 | acc -18 624 | acc +16 625 | acc +42 626 | jmp -339 627 | acc +43 628 | acc -19 629 | nop -168 630 | nop -253 631 | jmp -198 632 | jmp -613 633 | jmp -346 634 | acc -4 635 | acc +7 636 | acc +40 637 | jmp -294 638 | jmp -423 639 | acc -4 640 | acc +48 641 | acc +41 642 | jmp +1 643 | jmp -49 644 | acc +4 645 | acc +28 646 | acc +9 647 | acc +38 648 | jmp -522 649 | jmp -5 650 | acc +3 651 | acc +6 652 | acc -8 653 | acc +44 654 | jmp +1 655 | -------------------------------------------------------------------------------- /day11/input.dat: -------------------------------------------------------------------------------- 1 | LLLLLLLLLLLLLLL.LL.L.LLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL 2 | LLLLLLLL..L.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLL.L.LLLLLL. 3 | LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LL.LLLLLLLLLLLLLLL 4 | LLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.L.LLLLLLLLLLLLLL. 5 | LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.L 6 | LLLL..LLLLL.LLLLLLLL..LLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL..LLLL.LLL.LLLLLLLLLLL 7 | LLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLL.L.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLL.L 8 | .LLLLL..LLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLLL 9 | LLLLLLLLLLL.LLL.LLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLLL.LLLLLLLLL 10 | LLLLL.L.LLL.LLLLLLLL.LLLLLLLLL..LL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLL.LLLLL.LLL.LLLLL 11 | L..L.L...LL.LL...L....LL......L.L.L...L....LL........LL.L..L...L.......L.L...L...LL......LL...L 12 | LLLLL.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLL.LLL.LLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL 13 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLL.LLLLLLLL. 14 | LL.LL.LL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLLLLL 15 | LLLL..LLLLLLLLLLLLLL.LLLLLLLLLLLL.LL.LLLLLLLLL.LLLLLL.LLLLLLL.LL.L.LLLLLL...LLLLLLLLL.LLLLLLLLL 16 | LLLLL..LLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL 17 | L.LLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL 18 | LL........LL....L.L.....LLL......LLL..L.L.LLLLL...LL....L.....LL..LL.L.......L.L.L.LL.L.L.L.... 19 | .LLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLL.LLLL..LLLLLLLLLLLL..LLLLLLLLLLLLLL 20 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL..LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.L.L.LLLLLLLLLLLLL.LLLLLLL 21 | LLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL..LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL 22 | LLLLL..LLLL.LLLLLLLL.L.LLLLLLL.LLL.L..LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLL.LLL 23 | LLLL..LLL.L...LLLLLL.LL.LLLLLL.LLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LL.LL.LLLLLLLLL 24 | LLLLL.LLLLL.LLLLLLLLLLLLLLLLLL..LLLLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLLL.LLL...LLLLLL.LLLLLLLL 25 | ....LLL.......L...LL.L..........L....LLL.L.LL..L..L........LLL..LL...L......L..LLL..L....L..... 26 | LLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LL.LL.LL.LLLLL.LLLLLLLLL 27 | LLLLL.LLLLL.LLLL.LLL.LLL.LLLLL.LLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLL.L 28 | LLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL...LLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL 29 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLL 30 | LLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLLLL..LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL 31 | LLLLLLLLLLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LL.LL.LLLLLLLLL 32 | LLLLL.LLLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.L.LLL.L.LLLLL.LLLLLLLLL 33 | LLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLL..LL.LL.LLLLL.LLLLL.LLLLLLLLL 34 | .LL.L...LLLL..L..L..LL...LL....LL..L...LL.L..L...L...L.................LLL....L..L...L.LLL..L.. 35 | LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL 36 | LLLLLLLLLLL.LLLLLLLL.L.LLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LL.LLL.LLLLLLLLLLLL..L.LLLLLLLLLLLLLLLLLL 37 | LLL.L.LLL.LLLLLL.LLL.LL.LL.LLLLL.LLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLL 38 | LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL..LLLLLLL.L.LLLLLLLLL.LLLLLL.LLLLL.LLLL..LLLLLLLLL 39 | LLLLL.L.LLLLLLLL.LL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLL.LLL.L.LLLL.LLLLL.LLLLLLLLLLLLLLL 40 | LLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL 41 | LLLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LL.L.LLL..LLLLLLLLLLLL.LLLLL.LLLLLLLLL 42 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLLL 43 | LL.L....L.L..........L...L.L.......LL......L.LL...LL.....L.L.L...L....LL.L..L......L..LL..L.... 44 | LLLLL.LLLLL.LLLLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.L.LLL.LLLLLLLLL 45 | L.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLL.LLLLLLLLL 46 | LLLL.LLLLLLLLLLLLLLL.LLLLL.LLL.LL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLL..LL 47 | LLLLL.LLLLL.LL.LLLLL..LLLLL.LL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLLL 48 | LLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.L.LL.LLLLLL.LLLLLLLLL 49 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.L.LLLLL.LLLLL.LLLLLLLLL 50 | ........L....LLL.L....L...L...L.LL.......L..L..L.LL.L.L.L..L...L..L..L.........LLL.....LL.L..L. 51 | LLLLL.LL.LL.LLLLLLLLLLLLLLLLLL.L.LLL..LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL..L.LLL.LL 52 | LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL..LLLLLLLL.LL.LLLLL.LLLLLLLLL 53 | LLLLL.LLLLLLLLLLLLLL.LLLLL..LL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LLLLL.L.LLLLLLL 54 | LLLLL.LLLLL.LLLLLL.L.LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.L.L.LL.LLLL.LLLLLLLLL 55 | LLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLL.LLLLLLLLL 56 | LLLLLLLLLLL.LLLLLLLL.LL.LLLLLL.LLLLLLLLLLLLLL..LLLLLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLL.LLLLLLLLL 57 | LLLLL.L.LLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLL 58 | LLLLL.LLLLL.LLLLLLLL.L.LLLLLLL.LLLLLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLL.LLLLLL..LLLL.LLLLL.LLLLLLLLL 59 | ...L.....LL.L...L......LL..L.....LL.L...L..L...L....L......L....L......L.LL..L........L.......L 60 | LLLLLLLL..L.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.L.LLLLLLL 61 | LLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LL..LLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLL.L 62 | LLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLL 63 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLL 64 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL 65 | ....L..L....L....L..L..LL.L......LL..LLL..L.L.L.LL......L.LLLL.L...LLL...L.....L.L.L.L.LLLL.... 66 | L.LLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL..LLLL.LLL..LLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLL.LL 67 | L.L.L.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL..LLLLLLLLL.LLLLLL.L..LL.LLLLL.LLLLLLLLL 68 | LLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLL.LLL 69 | LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL..LLLLLLLLLLLL.LLLLL.LLL 70 | LLLLL.LLLLLLLLLLLL...LLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL 71 | LLLLL.LLLLL.LL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLL 72 | .L.LLLL..L.........LLL...L..L.L..LLL....LL...L..L......LL...L...L...L...L.....LLL.L...L.L..LLLL 73 | LLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL 74 | LLLLL.LLLLLLLLLLLL.L.LLLLLLLLLL.L.LL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLLLLLL.L.LLLLLLLLL 75 | LLLLLLL.LLL.L.LLLLLL.LLLLLLLLL.L.LLL.LLLLLLLLL..LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL 76 | LLLLL.LLLLL.LLLLL.LL.LLLLLLLLL.L.LLL.L.LLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL 77 | LLLLL.L.L.LLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LL.L.LLL.LLLLLLLLLLLL.LL.LL.LL.LLLLLLLLLLLL 78 | LLLLL.LLLLL.LLLLLLL..LLLLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLLL 79 | LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLL..LLLLLLLLL.LLLLLLLL..LLLL.LLLL.LLLLLLLLL.LL.LLLLL.LLLLLLLLL 80 | LLLLL.LLLLL.LLLLLLLL.LL.LLL.LL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL 81 | LLLLLLLLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL 82 | .L.....L..LL.L.L.L.LL.L.L..L...L...L....LL.L..L.L..L...L..L.L.L..L........L.L.L.L..L.LL.L.L.... 83 | LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL..LLLLLLLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLL 84 | LLLLL.LLLLL.LLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLL.LLLLLLLLLL.L.LLLLL.LL.LL.LLLLLLLLL 85 | LLLL.LLLLLL.LLLLLLL..LL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLLL..LLLL.LLLLLLLLL 86 | .LLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL 87 | LLLLLLLLLLLLLL.LLLLL.L.LLLLLLL.LLLLL..LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLL.LL..LLLLL 88 | LLLLL.LLLLLLL.L.LLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLL..LLLLL.LLLL.LLL. 89 | LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLL.LLL 90 | ..L..LLLL....L...L.L.L....L.....LL..L.....L..L............L.L....L.L..L.LL...L.L........L...L.. 91 | LLLLL..LLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL..LLL.LLLL 92 | LLLLL.LLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLL.LL.LLL.LL.LLLLLL..LLLL.LLLLLLLLLLLLLLL 93 | LLLLL.LLLLLLLL.LLLLL.LL.LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL 94 | LLLLL.LLL.LLLLLLLLL..LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL 95 | LLLLL.LLLLL.L.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL.LL.LL.LLLL.LLLL 96 | -------------------------------------------------------------------------------- /day20/day20.pl: -------------------------------------------------------------------------------- 1 | :- module(day20, []). 2 | 3 | :- set_prolog_flag(double_quotes, chars). 4 | 5 | :- use_module(library(pure_input)). 6 | :- use_module(library(dcg/basics)). 7 | :- use_module(library(clpfd)). 8 | 9 | input([img(ID, Data)|Images]) --> 10 | "Tile ", 11 | integer(ID), 12 | ":\n", 13 | string_without("\n", Row1),"\n", 14 | string_without("\n", Row2),"\n", 15 | string_without("\n", Row3),"\n", 16 | string_without("\n", Row4),"\n", 17 | string_without("\n", Row5),"\n", 18 | string_without("\n", Row6),"\n", 19 | string_without("\n", Row7),"\n", 20 | string_without("\n", Row8),"\n", 21 | string_without("\n", Row9),"\n", 22 | string_without("\n", Row10),"\n", 23 | { 24 | Data = [Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9, Row10] 25 | }, 26 | "\n", 27 | input(Images). 28 | 29 | input([]) --> []. 30 | 31 | load_data(Images) :- 32 | read_file_to_string('day20/input.dat', String, []), 33 | string_chars(String, Chars), 34 | phrase(input(Images), Chars). 35 | 36 | star(1, N) :- 37 | load_data(Images), 38 | length(Table, 144), 39 | nlist(144, RNs), 40 | reverse(RNs, Ns), 41 | maplist(position(Images, Table), Ns, Table), 42 | nth1(1, Table, img(ID1, _)), 43 | nth1(12, Table, img(ID2, _)), 44 | nth1(133, Table, img(ID3, _)), 45 | nth1(144, Table, img(ID4, _)), 46 | N is ID1 * ID2 * ID3 * ID4. 47 | 48 | star(2, N) :- 49 | load_data(Images), 50 | length(Table, 144), 51 | nlist(144, RNs), 52 | reverse(RNs, Ns), 53 | maplist(position(Images, Table), Ns, Table),!, 54 | join_tiles(Table, Image), 55 | findall(Monsters, ( 56 | transform_image(img(0, Image), img(0, TImage)), 57 | monsters(TImage, Monsters) 58 | ), MonstersList), 59 | max_list(MonstersList, MonstersNumber), 60 | foldl(count_cells, Image, 0, Cells), 61 | N is Cells - MonstersNumber * 15. 62 | 63 | count_cells(Row, AccIn, AccOut) :- 64 | foldl(count_cells_, Row, AccIn, AccOut). 65 | count_cells_('#', In, Out) :- 66 | Out is In + 1. 67 | count_cells_('.', In, In). 68 | 69 | monsters(Image, N) :- 70 | findall(X, ( 71 | between(1, 96, X), 72 | between(1, 96, Y), 73 | YTop is Y - 1, 74 | YDown is Y + 1, 75 | nth1(YTop, Image, RowT), 76 | nth1(Y, Image, RowM), 77 | nth1(YDown, Image, RowD), 78 | nth1(X, RowM, '#'), 79 | X2 is X + 5, 80 | nth1(X2, RowM, '#'), 81 | X3 is X + 6, 82 | nth1(X3, RowM, '#'), 83 | X4 is X3 + 5, 84 | nth1(X4, RowM, '#'), 85 | X5 is X3 + 6, 86 | nth1(X5, RowM, '#'), 87 | X6 is X5 + 5, 88 | nth1(X6, RowM, '#'), 89 | X7 is X5 + 6, 90 | nth1(X7, RowM, '#'), 91 | X8 is X5 + 7, 92 | nth1(X8, RowM, '#'), 93 | X9 is X + 18, 94 | nth1(X9, RowT, '#'), 95 | X10 is X + 1, 96 | nth1(X10, RowD, '#'), 97 | X11 is X + 4, 98 | nth1(X11, RowD, '#'), 99 | X12 is X + 7, 100 | nth1(X12, RowD, '#'), 101 | X13 is X + 10, 102 | nth1(X13, RowD, '#'), 103 | X14 is X + 13, 104 | nth1(X14, RowD, '#'), 105 | X15 is X + 16, 106 | nth1(X15, RowD, '#') 107 | ), Xs), 108 | length(Xs, N). 109 | 110 | print_image(Image) :- 111 | forall(member(Row, Image), format("~w\n", [Row])). 112 | 113 | join_tiles(Table, Image) :- 114 | maplist(remove_border, Table, NoBorderImage), 115 | join_rows(0, NoBorderImage, Image). 116 | 117 | join_rows(96, _, []). % 96. 118 | join_rows(N, NoBorderImage, [Row|Image]) :- 119 | X is N // 8, 120 | Y is N mod 8, 121 | X1 is X * 12, 122 | nth0(X1, NoBorderImage, Table1), 123 | nth0(Y, Table1, Row1), 124 | X2 is X*12 + 1, 125 | nth0(X2, NoBorderImage, Table2), 126 | nth0(Y, Table2, Row2), 127 | X3 is X*12 + 2, 128 | nth0(X3, NoBorderImage, Table3), 129 | nth0(Y, Table3, Row3), 130 | X4 is X*12 + 3, 131 | nth0(X4, NoBorderImage, Table4), 132 | nth0(Y, Table4, Row4), 133 | X5 is X*12 + 4, 134 | nth0(X5, NoBorderImage, Table5), 135 | nth0(Y, Table5, Row5), 136 | X6 is X*12 + 5, 137 | nth0(X6, NoBorderImage, Table6), 138 | nth0(Y, Table6, Row6), 139 | X7 is X*12 + 6, 140 | nth0(X7, NoBorderImage, Table7), 141 | nth0(Y, Table7, Row7), 142 | X8 is X*12 + 7, 143 | nth0(X8, NoBorderImage, Table8), 144 | nth0(Y, Table8, Row8), 145 | X9 is X*12 + 8, 146 | nth0(X9, NoBorderImage, Table9), 147 | nth0(Y, Table9, Row9), 148 | X10 is X*12 + 9, 149 | nth0(X10, NoBorderImage, Table10), 150 | nth0(Y, Table10, Row10), 151 | X11 is X*12 + 10, 152 | nth0(X11, NoBorderImage, Table11), 153 | nth0(Y, Table11, Row11), 154 | X12 is X*12 + 11, 155 | nth0(X12, NoBorderImage, Table12), 156 | nth0(Y, Table12, Row12), 157 | append(Row1, Row2, Row012), 158 | append(Row012, Row3, Row123), 159 | append(Row123, Row4, Row1234), 160 | append(Row1234, Row5, Row12345), 161 | append(Row12345, Row6, Row123456), 162 | append(Row123456, Row7, Row1234567), 163 | append(Row1234567, Row8, Row12345678), 164 | append(Row12345678, Row9, Row123456789), 165 | append(Row123456789, Row10, Row12345678910), 166 | append(Row12345678910, Row11, Row1234567891011), 167 | append(Row1234567891011, Row12, Row), 168 | NewN is N + 1, 169 | join_rows(NewN, NoBorderImage, Image). 170 | 171 | remove_border(Tile, NoBorderTile) :- 172 | Tile = img(_, [_R1, R2, R3, R4, R5, R6, R7, R8, R9, _R10]), 173 | NoTopBottomTile = [R2, R3, R4, R5, R6, R7, R8, R9], 174 | maplist(remove_leftright, NoTopBottomTile, NoBorderTile). 175 | 176 | remove_leftright(Row, NoBorderRow) :- 177 | Row = [_C1, C2, C3, C4, C5, C6, C7, C8, C9, _C10], 178 | NoBorderRow = [C2, C3, C4, C5, C6, C7, C8, C9]. 179 | 180 | 181 | position(Images, Table, N, TImage) :- 182 | member(Image, Images), 183 | Image = img(ID, _0), 184 | transform_image(Image, TImage), 185 | LeftN is N - 1, 186 | ( 187 | (0 is LeftN mod 12) -> 188 | true 189 | ; ( 190 | nth1(LeftN, Table, Left), 191 | Left \= img(ID, _), 192 | left(TImage, LSide), 193 | right(Left, LSide) 194 | ) 195 | ), 196 | UpN is N - 12, 197 | ( 198 | (UpN < 1) -> 199 | true 200 | ; ( 201 | nth1(UpN, Table, Top), 202 | Top \= img(ID, _), 203 | top(TImage, TSide), 204 | bottom(Top, TSide) 205 | ) 206 | ). 207 | 208 | nlist(0, []). 209 | nlist(N, [N|List]) :- 210 | X is N - 1, 211 | nlist(X, List). 212 | 213 | write_table(Table) :- 214 | maplist(get_id, Table, Ids), 215 | write(Ids). 216 | 217 | get_id(img(ID, _), ID). 218 | 219 | transform_image(Image, Image). 220 | transform_image(Image, TImage) :- 221 | flip(Image, TImage). 222 | transform_image(Image, TImage) :- 223 | rotate(Image, TImage). 224 | transform_image(Image, TImage) :- 225 | rotate(Image, TImage0), 226 | rotate(TImage0, TImage). 227 | transform_image(Image, TImage) :- 228 | rotate(Image, TImage0), 229 | rotate(TImage0, TImage1), 230 | rotate(TImage1, TImage). 231 | transform_image(Image, TImage) :- 232 | rotate(Image, TImage0), 233 | flip(TImage0, TImage). 234 | transform_image(Image, TImage) :- 235 | rotate(Image, TImage0), 236 | rotate(TImage0, TImage1), 237 | flip(TImage1, TImage). 238 | transform_image(Image, TImage) :- 239 | rotate(Image, TImage0), 240 | rotate(TImage0, TImage1), 241 | rotate(TImage1, TImage2), 242 | flip(TImage2, TImage). 243 | 244 | flip(img(ID, Data), img(ID, FlippedData)) :- 245 | maplist(reverse, Data, FlippedData). 246 | 247 | rotate(img(ID, Data), img(ID, RotatedData)) :- 248 | transpose(Data, Data0), 249 | maplist(reverse, Data0, RotatedData). 250 | 251 | top(img(_, Data), Top) :- 252 | nth1(1, Data, Top). 253 | 254 | bottom(img(_, Data), Bottom) :- 255 | nth1(10, Data, Bottom). 256 | 257 | left(img(_, Data), Left) :- 258 | Left = [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10], 259 | Data = [ 260 | [X1, _, _, _, _, _, _, _, _, _], 261 | [X2, _, _, _, _, _, _, _, _, _], 262 | [X3, _, _, _, _, _, _, _, _, _], 263 | [X4, _, _, _, _, _, _, _, _, _], 264 | [X5, _, _, _, _, _, _, _, _, _], 265 | [X6, _, _, _, _, _, _, _, _, _], 266 | [X7, _, _, _, _, _, _, _, _, _], 267 | [X8, _, _, _, _, _, _, _, _, _], 268 | [X9, _, _, _, _, _, _, _, _, _], 269 | [X10, _, _, _, _, _, _, _, _, _] 270 | ]. 271 | 272 | right(img(_, Data), Right) :- 273 | Right = [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10], 274 | Data = [ 275 | [_, _, _, _, _, _, _, _, _, X1], 276 | [_, _, _, _, _, _, _, _, _, X2], 277 | [_, _, _, _, _, _, _, _, _, X3], 278 | [_, _, _, _, _, _, _, _, _, X4], 279 | [_, _, _, _, _, _, _, _, _, X5], 280 | [_, _, _, _, _, _, _, _, _, X6], 281 | [_, _, _, _, _, _, _, _, _, X7], 282 | [_, _, _, _, _, _, _, _, _, X8], 283 | [_, _, _, _, _, _, _, _, _, X9], 284 | [_, _, _, _, _, _, _, _, _, X10] 285 | ]. 286 | 287 | :- begin_tests(day20). 288 | 289 | test(star1) :- star(1, 108603771107737),!. 290 | test(star2) :- star(2, 2129),!. 291 | 292 | :- end_tests(day20). -------------------------------------------------------------------------------- /day3/input.dat: -------------------------------------------------------------------------------- 1 | ...#...#....#....##...###....#. 2 | #.#...#...#....#.........#..#.. 3 | .#....##..#.#..##..##.......... 4 | .....#.#.............#..#...... 5 | .......#...#.##.#......#..#.#.. 6 | #.#....#......##........##..... 7 | .....##.#....#..#...#...##...#. 8 | ...#...#..#.......#..#...##...# 9 | ..........#...........##....... 10 | ..#..#..#...................#.. 11 | #..#....#.....##.#.#..........# 12 | .#.##.......###.....#.#...#.... 13 | .#..##....##....#.......#...### 14 | #.#..##...#.#..#............... 15 | .........#....#.......##.#.#... 16 | ...###...##....##...#..##.#..#. 17 | ....#.........#..#...#.......#. 18 | ....................#..#.#.#... 19 | ..#....#..........#...........# 20 | .#.....#..#.....##........##..# 21 | #..##..#...##............#..##. 22 | .#..##....#..........#..#.##.#. 23 | ..#####..#.#............##..... 24 | ...###.#....##..#.#....#.....#. 25 | .#.......##....#...#.#.....##.. 26 | ...#....#...##.#...#..#........ 27 | .####.....#....#.#.#...#....... 28 | ...#....#.....#.......#........ 29 | #..#.#.......#...#............# 30 | ...#.....###.##....#.#.###.#... 31 | .#.........#.......#.#....##... 32 | #.#..#...#.#...##......#..#.... 33 | .....#...#..#.#...#..###..#.... 34 | ......#.........#...###........ 35 | .....#..##...#..........#.....# 36 | ..#..#.#.##.#...#....#....##..# 37 | ##....#.##...#.##.#..##....#... 38 | .....#.#.#.#..#....##.#...#.#.. 39 | .....##.......#........#....... 40 | ...#.#.....#...#...##.#......## 41 | ........#..#.#...#.#.....#.#..# 42 | #..##...#.#...##..##...#.#...## 43 | .##.#.#..#...#.....#.#.##.#...# 44 | .#.####.........##.........#..# 45 | .##..............#....#...#...# 46 | ......#...#..#...#..#..###.#... 47 | .......##...#.#.#..##..#......# 48 | .....#....#..##..#.........#... 49 | .....#..#.#.#........#.#.####.. 50 | #..#.......###....##........... 51 | #..##..........#.#......#.#.... 52 | .....##........#...#..##....... 53 | ###...#.##.#.#.#.#.##...##..... 54 | ....#...#........##.#.##..##... 55 | .#..#.#.#......#.......##..#..# 56 | .#...#.................#....#.. 57 | .##..#..........#..##.......#.. 58 | .#.#.#.....#..#.#.........##..# 59 | ...#......##...#.......#...##.. 60 | ##...###....#.###.............# 61 | #.....#.#..#.#..#........#.#.#. 62 | .....#.#......##..#.#.....#.##. 63 | .......#...........#..#.......# 64 | ..#....#.#.#......#.....#...#.. 65 | .....##........#..##..#..##.... 66 | #.#........#...##....#.#..##... 67 | #......#......#....#..#...#.##. 68 | ....#.#.......#.#.#............ 69 | ......####.#.##...#.#.##.....## 70 | ..###.#.#..#.........#.####.... 71 | .#.......#..#.#....#.#..#.#.##. 72 | #....#....#............##...##. 73 | ....#....#............#....#..# 74 | ..#........#..#....#..#..#...#. 75 | .#......##....#..........#....# 76 | #.##.....#..........#.###.#.... 77 | ....##...#.....#.#......#.##... 78 | #.#.....#.......###.###..#..#.# 79 | ..###..##.............#.####.## 80 | #....#.....#....#..##.......#.. 81 | .....#....#...#.#.#.#..#...#.## 82 | ...#.....#..#....###......#.#.# 83 | ##.........#.#..#..#.#..#.....# 84 | .#.....#.#....#.........##..#.# 85 | .#.#..#.###..#..#..........#... 86 | .##....#.#.#...#......##.....#. 87 | #.#....#....#...#...##...#..#.. 88 | #...#........#....#....#......# 89 | #......#...#..#.#.##.....##..#. 90 | ....#...#......##...#..#....#.. 91 | .#......##.##.......#.......#.. 92 | .#...#..####...........#.#.#... 93 | .........#...#.#.........#..... 94 | #.##.....#.#..#.#.###...###..#. 95 | #...##.###......#.###..##.#.##. 96 | ...##.#.....#....#..#......#... 97 | #....###.#..#...##.....#......# 98 | ........###...#...#............ 99 | ........#....#...#...#....#...# 100 | #....#..#..#....#.#........#.#. 101 | ##...#.....#.#..........#..#..# 102 | #.#...##.....#........#...#...# 103 | ##.#.#.......#...#..#.###....#. 104 | .#.......#....##..##...#.....#. 105 | #....#....#.....#.......#...... 106 | .##.##.##...##...#.#.#..#..#... 107 | #..#..#.##....#......##....###. 108 | .......#.#.........#..##.#...## 109 | .#..##...#....#.....#.......... 110 | ..#.#...#......#.#..#.......... 111 | .##....#.#.#.##.......###...#.. 112 | ..##.#...#.#.#.#.......#..#.... 113 | #..#.......#...#........#.....# 114 | .....#.......#......###..#..... 115 | ...##.#.......#.....##.....##.. 116 | ##..#.......#.#.....#....#..... 117 | ..#....#.##.##...#...#......#.. 118 | .#..#.###.#....###........#...# 119 | ....##.##...##..#..#.#....#.... 120 | ..###...##.....##.............. 121 | #....#...##...#....#..........# 122 | .##........#......##...##...#.# 123 | ..#.#.##..........#......#..... 124 | ...#...#.........#.##........## 125 | ..#.#..#.#..#...#....#...#..... 126 | ...##...#..#.###.#..#.#...#.... 127 | ....###........#..#..##...#.... 128 | #.#....##.......#.#........#... 129 | .###...#..#.#.#.#..#...#..##.## 130 | ..#.........#####.#......#..#.. 131 | #.....#.....##..#....#...#...#. 132 | ...#..#....##....##.....##.#... 133 | .........#............#.##..... 134 | ....##.#..#....#.##.......#..## 135 | .###....#.#..#......#.#.......# 136 | .###...###.#.........#.#..#...# 137 | .....#........#..#.#..#.#..##.# 138 | .###..#....##.........#..##.... 139 | ..#.......#..#..##...#.###.#... 140 | #.......#...........#.#...#.### 141 | #.##.##...##.#...##..#.....#... 142 | ..#..#........###.#.....##..... 143 | #.....##....#...##...####..#..# 144 | ....#........#...#...#......... 145 | ......#.#.#.#.......#..#.....## 146 | ..#..#....#.....#.#...##......# 147 | ..#....#...#.###.........#.###. 148 | ...#......##..#.#.....#...#.... 149 | ...#.......#...#...#........##. 150 | ............#...#..#....#.....# 151 | ....##......................#.. 152 | #.#.#....#....#..........##.... 153 | #.#.....#.#.##..#...#.##....##. 154 | ...#...#..#...#..#.#.#.......#. 155 | #.....#..........#.........##.# 156 | #...##..#..#.#.......###....#.. 157 | .#...#..##....#.....##.......#. 158 | ....#.##.....#.........#.#....# 159 | ........#.#...####..#.......#.# 160 | .####...#.#......####.....#.##. 161 | ###..#....#..#.......#.#..##..# 162 | #......#.#....##..#.##.#....#.# 163 | ...###...#...#..##.#..#..#.#... 164 | ...##..##....#..#.....#........ 165 | .....#..............#......#..# 166 | ......#....#......#..#......... 167 | #..#.....#.##...........##..... 168 | .#..#.#..................##.... 169 | #.#..#..##...#....#.#......#... 170 | .##.#.##......#.##...#...#...#. 171 | ..#...#.........#.#..#.#....#.. 172 | .#.####.#..#.#......##.#..#.... 173 | #..#.......#....#.............. 174 | ....#............#..#.......... 175 | .....#####.....#.....#..##...## 176 | #.#....#.#...............#..##. 177 | .#.#..#...#......#.....#.#.#... 178 | .#....#.#.#......#.....##....#. 179 | ....#....#.##..#.......###...## 180 | .....#..#.##...#...#...#..#.#.. 181 | ##..#........#.#..#..##......#. 182 | .#..#..##.......#..#.....#..... 183 | .#.#.....###..##.#.#........... 184 | ..##..##.####..........#..#.... 185 | ..##..#..#...#....#......#.#... 186 | #...#.#......##.....##.#..###.. 187 | #..#..............#........##.# 188 | .........#.##..#.#..#..##.##.#. 189 | #....##....#.#..#.#...##..#.... 190 | .#....#.......#............##.. 191 | .......#.#.......#...#.#......# 192 | ......##...#.......#.#........# 193 | ..###..#.#.##....##...#....##.. 194 | ..##.##..........##..###....... 195 | .#.#.#..#..#.#.......#.#...##.. 196 | ..#..##.........#.###..#......# 197 | ....#.#.#...##.#...#...##..###. 198 | ..###..##.........##...#...#..# 199 | .#..##...#.......#.......#..#.# 200 | ........##....##....#.#.###.#.# 201 | #.....#.#.................#.#.. 202 | ....#.#.#.....##.####.#......#. 203 | ....#.......#.#.##.##.......... 204 | ...#...........#...#.##...#.### 205 | #....#....#..........#.##...... 206 | ##..#...........##.....##.##... 207 | .#.##...##..##....#..#.....#### 208 | #...#...#.##..........##..##... 209 | ....##..#....#.....#.#...#....# 210 | ..#....#..##...###.#.#......... 211 | #......#.#.#...#...#.........#. 212 | #............###.#.#.#..##...#. 213 | .##.....####...##..##..#..##.#. 214 | #..#........#.....#.#.....#...# 215 | #............#....#.#.#........ 216 | ......##...##.#....#.....#...#. 217 | ..#........##......#.#.....##.. 218 | .#..#..#.....##.......#..#.#..# 219 | .#....#..#....##.#.#.#..#..#.## 220 | .####.#..........#...#..##..... 221 | ...###..###...##..#............ 222 | #..#.....##.#...#..##..#....... 223 | .....##....#...###.##...#...... 224 | ...##..#...#..#..##....##....#. 225 | ...###....#.###.#.#.##....#.... 226 | ##.#.#.....#....#.#....#..#.... 227 | .......##.....#.#..##...##...#. 228 | .#....#.#...##.#..#....#.....#. 229 | ..#...#..#...#.##........#...#. 230 | #....#......##.#....##...#.#..# 231 | .....#..#..#..#......#...#.#.#. 232 | ..###....#........#...#.......# 233 | ###...#.......#.#.......##.##.. 234 | ......##.....#.#........#....#. 235 | #.##..#.#.#.#..#....#.##.....#. 236 | ..........#.##.#...#...#..#..#. 237 | ..#...##.#..........#..##.###.. 238 | ..###..##.##..#.#...##.####..#. 239 | #.#.#...............##....###.# 240 | ....#.........#.#....#.#....#.# 241 | ..#...#.###...#....###.....#... 242 | ..#..#....#...#............#... 243 | .#..#....#..##.....##.......... 244 | ..#....#.#...#.#.#.#.......##.# 245 | .........#....##........#.#.... 246 | ...#..##.#..#.##...#...#.#....# 247 | ....####...#...####.#....###..# 248 | ......##...#.##.#.......#..#... 249 | #.#...#.#...#.#...#....#.#.#... 250 | .#.....##...#.....###.#....#... 251 | ......##.....###...#.#...#.#... 252 | #..#..##.#.#......#....#..#..#. 253 | ....#.###.....#..#...#.##.....# 254 | ##.##........#......#....#..##. 255 | ##.....##.#.....#.....##.....#. 256 | .....#.##...#.#..#.#.#.....#... 257 | .#.##..#...#.#..#.....#.#...... 258 | .....##.......#..#...##..#..#.. 259 | #.....#..#.####......#........# 260 | .#..#..##.#..##............#..# 261 | .##..#.#....##.##.....#......#. 262 | .......##.........#..#......... 263 | .#...#.......................#. 264 | #......#.#....##.#.......#..#.. 265 | ..##..##......#.......#....#.#. 266 | ##......#......##...##......... 267 | ..#....####....#.#.....##.#.#.. 268 | ..........#..#.#.#.....#..#.#.. 269 | ##..##...........##.......#.... 270 | ##....#.#....#..#......###....# 271 | ...#.#.#..#.......##.......#... 272 | #....#.......#.......#......... 273 | ...##......##....#...#......#.# 274 | #......#####.#.........#.....#. 275 | #..#.............#..#....#...#. 276 | .......#.##..#..#..#..#....#### 277 | ......#.##..##..........###...# 278 | .#.##....###..#........#....##. 279 | #......#..#...###.#...#.....#.. 280 | .#.#.......#....##.......#.#... 281 | ..#.##..#..##.....#.........#.# 282 | #.#...#..#.##....#.......##.... 283 | .#.....###....#.#..#...#.....#. 284 | #...#..#.......#.#.....##...#.# 285 | #.#####.........#....##.....#.. 286 | #....#..##...#....#.##.......#. 287 | .#.#.........##....##....#..... 288 | ...#..##.......#....#.#.#...... 289 | #.###.##...###....#.....#.####. 290 | .#...#.#.#..##.#..........#.... 291 | #.#.....#.##.#..####.....##.#.. 292 | ...###.##..####.......#......## 293 | .##..#.........#...#.#.....#.## 294 | ..#.....##....###.....#.#...##. 295 | #....#....#..#....#.##......... 296 | ......###....#.#..#..#....##... 297 | .#.#................#.......##. 298 | ...#.......#.........#.#....... 299 | ...#..........#...##.....###... 300 | ....#......#...#............... 301 | .##...#....#.....#.##......#... 302 | .#.....###...##..##...#.#...... 303 | ....##........#.....#...#....#. 304 | #.........#.#...##...#.#..#.... 305 | ...#.#.....#.#........#.#....#. 306 | .#........#.....#.#.#.#.#..#... 307 | ....#...#.....#.#....#........# 308 | ..###.#....#.#....##...##..#.## 309 | .#....#.#.####.#.#.....#....... 310 | .#...#...#.................##.# 311 | ..................##..#..#.#.#. 312 | .#..#............##....###..... 313 | .......#....#...........#...... 314 | ....#.#.#.....###.........#..## 315 | ...#.#....#.#.##.#.##.....##..# 316 | .#.##.#...##...#.......#.....## 317 | .#............#...#..##...#.#.# 318 | #.##..#.##..#..##.###.#........ 319 | ..............##....#...#..#.#. 320 | .#.#...#.#....#....###........# 321 | .#....#.#....#......###........ 322 | ..#.......##......#.##.....#... 323 | .....#......#..#...#.#.....#... 324 | -------------------------------------------------------------------------------- /day5/input.dat: -------------------------------------------------------------------------------- 1 | BBFBBBFLRR 2 | BBFBFBFLLL 3 | FFBBBFBLLL 4 | BFBFBFBRLR 5 | BFFFFFFLRR 6 | FBBFFBFRRL 7 | BFBBBBBLLL 8 | FBBBBFBRRL 9 | FFFBBBFLRR 10 | BBFFFFBRLL 11 | FFBFBFFLLR 12 | BFBBBBBRRL 13 | BBFFBFBLLL 14 | FBBFBBFRRR 15 | FFBFFBFRRR 16 | BBBFBFBLRL 17 | BFBBBBFLLR 18 | BFBFFFFLRL 19 | BBBBFFFLLL 20 | BFBFBFFLRR 21 | FFBBFBFRRR 22 | FBBBFBBLRR 23 | BBFBBFBRRR 24 | BBBFBBFLRR 25 | BFFBBBFRLL 26 | BFBBBFFLRR 27 | FFBBFFFRRL 28 | FBBBFBFLLL 29 | BFBFFFBRLR 30 | BBFFFBFRRL 31 | FBBBBFBLLL 32 | FBFBFFBRRL 33 | FBBFBFBLLR 34 | BBBFBFFLLL 35 | FFBBBFFLRR 36 | FFFBBFBLRL 37 | BFBFFFBRLL 38 | BBBFBBBLRL 39 | FBFFFBBLLR 40 | BFBBFBFLLL 41 | FBFFFFFLRL 42 | BFFBBFFRRR 43 | FBBFFBFRRR 44 | FFBFFBBLRR 45 | BFBFBBBRRL 46 | BFFBBBFLRL 47 | FBBFBBBLRL 48 | FBBBBBBRLR 49 | FBBBBBBLRR 50 | BFBBFBFRLL 51 | BFBBFFBRRL 52 | FBFBBFFRRR 53 | FBBBFFFLLR 54 | BFBBFFFRRL 55 | FFBBFBBRRL 56 | FBFFFFFLLR 57 | BFFBBBBLRL 58 | BFBFFFFLLR 59 | FBFBFFFRRR 60 | FBFBBBFLLL 61 | BBBFFFBLLL 62 | FFFBBFBRLR 63 | FBFBFFFLLL 64 | FBFFBBBRRL 65 | BFFBFBFRRR 66 | FFFBBBBRLR 67 | BFFBFBFLLR 68 | BFFFBFBLLR 69 | BFBBFBBLRL 70 | BFFBBFFLLR 71 | FFFBBBFRLL 72 | BFBFBBFRRR 73 | FBFFFFFLLL 74 | BFFBBFBRRL 75 | BBBFFFFRLL 76 | FBBFFFBRLR 77 | BFFBBBFRLR 78 | BBFBFBFLLR 79 | BFBBFBBLLR 80 | BFFFFFBRRL 81 | BFFFBBFLRR 82 | BBFBBBFLRL 83 | BFBFBBBLLR 84 | BBFFBFFRRR 85 | FFBFFBFRLL 86 | FBBBFFFRLR 87 | FBFFBFFRLR 88 | FBBBFFFRLL 89 | FBFBBFFRRL 90 | BFFBFFBLRL 91 | FBBFFBBLRR 92 | FFFBBBBLRL 93 | BBBFFBFLRR 94 | FBBBFFBRRL 95 | FFBFFFFLRR 96 | BBBFFBFRLL 97 | BBBFBBBRLL 98 | BFFBFFFRLR 99 | BFFBFBBRLL 100 | FFBFFFBRRL 101 | BBFBFFFLLL 102 | BBBFFBBLLR 103 | BFFBBBFRRR 104 | BFBFFFFRLL 105 | FBFFBBFRLL 106 | FFBBBFBRLR 107 | FBBFFBBLLR 108 | BFBBBBBLLR 109 | BFFBFBBLRL 110 | FBBBFFFLRR 111 | FBBBFBFLRL 112 | FBFFFFFRLL 113 | FBFBBBFLLR 114 | BFFFBBFLLR 115 | BBFBFBBLLR 116 | BBFFBFFRRL 117 | BBFFFBBRLL 118 | BFBFBFFRLL 119 | FBBFBBFLRR 120 | FBBBFFFLLL 121 | FBFBBFFLLR 122 | BBFBFBBRLL 123 | BFFFBFFLLR 124 | FBBFFBBRRR 125 | BBFBFBFLRL 126 | BFFFFBFLRR 127 | FBFFFBFRRR 128 | FBFFBBBRLL 129 | FBFBBBBLRL 130 | BFFBFFBLRR 131 | BFBBFBBRLR 132 | BFFFFFBLLL 133 | BFBBBBBRLR 134 | FFBBBFBLRL 135 | BFBFBBFLLR 136 | BBFBBFFLLL 137 | BBBFBBFRLL 138 | FFBFBFBLRL 139 | BBFBBFFRRL 140 | BFBBFFBLRL 141 | FFBFBBFLRL 142 | FBFFFFBLLR 143 | BBBFFBFRRR 144 | BFBFFFBRRR 145 | BBFFBFBLRL 146 | FBFBBBBRRR 147 | FBFBFFBRLL 148 | BFFBFFFLRR 149 | BBBFFFBRRR 150 | BFBBFBFRRL 151 | BFFFBBBLRL 152 | BBFBBFBRRL 153 | BFFBFBBRLR 154 | BFFBBFFLRR 155 | FFBFFFBLLR 156 | FBBBFBFLLR 157 | FBFBBFBRRR 158 | FBBBBFFRRL 159 | FBFFBBFLRL 160 | FBBFFFBLRR 161 | BFBBFFBRLR 162 | BBFBBBFRLR 163 | BFFBBFFRRL 164 | FBBFFFFLRR 165 | BFBFFFFLLL 166 | BBBBFFBRLR 167 | BFBFBFBRRL 168 | FBBBBBFRLR 169 | BFFBFBBRRL 170 | FFBBBFBLRR 171 | FFBBFBFRRL 172 | BFBFBBFRLL 173 | BBFFBFBLRR 174 | BBFBBBBLLR 175 | BFFBBBFLLL 176 | BBFFBBBLRL 177 | FBFBFBBRLL 178 | BBFBBBFRRR 179 | FFBBBFFLLR 180 | BFFBFFFLRL 181 | FBBBFFBRLR 182 | BFFBFFFRLL 183 | FBFBBBBLRR 184 | FBFFBFFLLL 185 | BFBBFBBRRR 186 | BFBFBBBLRL 187 | FBBBFBBLLR 188 | BBFFFFBRRL 189 | BBFBFFFLRL 190 | BBBFFBFLLL 191 | FBFFFFBRLR 192 | BFFFBBBRRR 193 | FFBBFBBRRR 194 | FBFFBFFRRL 195 | BBFBBBBLRR 196 | BBFFBBBRRL 197 | FFBFBFBRLR 198 | BBFBBBBRRL 199 | BBFFFBBLRL 200 | BBBFBBFLLR 201 | FBFFFBBLRR 202 | FBBBBBFLRL 203 | FBBBFBBRRL 204 | FBBBBFFRRR 205 | BFFBBFBLRL 206 | FFBFBBFRLL 207 | FBBFFFBLLR 208 | BBFBBFFRLR 209 | FBBFFBFLRL 210 | BFBFBFBLRR 211 | BBFBBFBLRL 212 | FFBFFBBRRL 213 | FBBFBFFLRR 214 | BFBBBBBRLL 215 | BFFBFBFRRL 216 | FFBFBFFLRL 217 | FBFBFFBLLL 218 | FFBFBBFRRL 219 | FFBBFFBRLR 220 | BBBFBFBLLR 221 | BFBFFFBLRR 222 | FBBFBBBRLL 223 | BBFFBBBRLL 224 | FFFBBFFLRR 225 | BBBFFFBRLR 226 | BBBFBBBLRR 227 | FBFBFFBLRR 228 | BFBBBBBLRL 229 | FBFFFFBRLL 230 | FBBBFFFRRR 231 | FBFFFBBRRR 232 | BBBFFFFLRL 233 | BBFFBFFLRR 234 | FFBFBBBLRR 235 | BFFBFFBRLR 236 | BFBFFBFLLR 237 | FFFBBFFRLR 238 | FFBFFFBLRR 239 | BFBBBFFRLL 240 | BFFFFBFRLR 241 | FFBFBFBLRR 242 | FBBBBFFLLL 243 | FFBBBFFLRL 244 | BBBFBFBRLL 245 | BBFFFBBRRL 246 | BFFFFFBLRL 247 | FBBBFBFRRL 248 | BBBFBBFRRL 249 | BFFFFFBLLR 250 | BFBBFFFLLL 251 | FBFBFBFRLL 252 | BFFFFBBLRR 253 | BBBFFFFRLR 254 | BFFFBBFRRR 255 | BBBFFFFLRR 256 | FBBFBFFRLR 257 | FBFBBFBRLL 258 | BFFBFFBRRR 259 | BFBBBBFRLL 260 | BFBBBFBRLR 261 | FBBBFBFRLR 262 | FBBBBBFRLL 263 | FBFFBBBRLR 264 | BBFFFBBLLR 265 | BBFFBBBLLL 266 | BBBFFFFRRL 267 | BFFBBBBLLL 268 | FFBFFBBRLR 269 | BFBBBFFLLL 270 | FFFBBBBRRR 271 | BBFFBFFLLR 272 | BBFBBFFRRR 273 | FBFBBBFLRL 274 | FBBFBFBRLL 275 | FFBBFBFRLR 276 | BFFFBBFLRL 277 | FBFFFBFRRL 278 | BFBBBFFRRR 279 | FBBFBFBLLL 280 | BFBBBBFRRR 281 | BBBFFBFRRL 282 | FBFBBFBLRL 283 | BFBBBFFLRL 284 | FFFBBBBLLL 285 | FBFBFBFLLR 286 | BBFFBFBRLL 287 | FFBFBFBLLL 288 | FBBFBFBRRR 289 | BFFFBFFRLL 290 | BFFBBFBLLR 291 | BFBBFFFRLR 292 | BFBFFBBRLL 293 | FFBBBFBLLR 294 | BFBFBFFRRL 295 | FBBFFFFLRL 296 | FFBBBFBRLL 297 | FBFBFBBLLL 298 | FBFBFFBLLR 299 | BBBFBBFLRL 300 | FBFFFBBRLR 301 | FBBBFFBRRR 302 | FFFBBBFLLR 303 | BFFFBBBLLR 304 | BBFBBFBLRR 305 | BFBBBBFRRL 306 | BBFBBBFRRL 307 | FFBBFBBRLL 308 | BBFBBFFRLL 309 | FBBBBFBRLL 310 | BFBBFFBRLL 311 | BBBFBFFRLR 312 | FBFFFFFRRR 313 | BBBFBFBLLL 314 | FFFBBFBRRL 315 | BBBFFBBLRL 316 | BBFFBBBRLR 317 | BFBBFFBRRR 318 | FBBFFBBLLL 319 | BFBBFFBLLL 320 | BFFFFBBLLR 321 | FBFFFBFRLL 322 | BFBBBFBLLL 323 | BFFFFBFLRL 324 | BFFFBBBLRR 325 | BFFBBFFRLR 326 | FBBBBFBLRL 327 | FBBFFFBLLL 328 | BFBBFBFLRL 329 | BFFBFBBLLR 330 | BBFFFBFLRL 331 | FFBFFBBRRR 332 | BBFFFBBRLR 333 | BFBFFFFRRR 334 | FFFBBBBRLL 335 | FFBFBBBLRL 336 | BFBFBFFLLL 337 | BBFBBBBRLR 338 | BBFFFBFRLL 339 | FBFFBFFLLR 340 | BBFFBBFRLR 341 | FFBBFBBLRL 342 | BBFBBBBRLL 343 | BBBFBFFLRL 344 | FBBFFBBRLR 345 | BFBFFBBRLR 346 | FBBBBFFLRL 347 | BBFBBFFLLR 348 | FBBFBBFLLR 349 | FFBFFBFLLR 350 | BFBBFBBRLL 351 | FFBFBFBRRR 352 | FBFBFFFLRL 353 | BBBBFFBLRL 354 | BFBFFFBLRL 355 | BBFFFFFRRL 356 | FBFFBBFRRR 357 | BBBFFBFLLR 358 | BFFBFBFLLL 359 | BBFBFBBRRL 360 | BFBBFBBLRR 361 | FBFFFBBRLL 362 | FFBBBBBLLL 363 | BFBBBFFRRL 364 | BBFFFBBRRR 365 | FFBFBBBRRR 366 | FFBBFFFLRR 367 | FBFBFBFLLL 368 | BBBFBFFLRR 369 | BFBFFBFRLR 370 | FBBFFBFRLR 371 | BBFBFBFRRR 372 | BBBFFBBLRR 373 | BFBBFBBRRL 374 | FBBFBFFLRL 375 | BBBBFFFLLR 376 | BBFBFFBLLR 377 | BFFFBFBLRL 378 | BFBFBBBLLL 379 | BFFFFFFRLR 380 | BBFFBFBRRR 381 | BFFBBBBLLR 382 | BBBFBFFRRR 383 | FBFFBBFLLL 384 | FFBFFFBRRR 385 | FBBFFFFRRL 386 | BBFFBBFLLL 387 | FBBBFBBLRL 388 | FFBBFBFLRR 389 | BBFFBBBLRR 390 | FBFFBBBLLL 391 | FBBFFBFLLR 392 | BBFBBBBLLL 393 | BFBFFFBLLR 394 | FBFFFFFRLR 395 | FFBFFBBRLL 396 | FFBBFFBRRL 397 | FBBFBFBLRL 398 | FBBFFFFLLL 399 | FFBFFBFLLL 400 | BFBFBFBLRL 401 | FFBBBBFRRL 402 | BFFBFBFRLR 403 | BBFFBBBRRR 404 | FFBBFFFLLL 405 | FFBBBBBLRL 406 | BFBBBFBLRL 407 | BBFFBBFLRR 408 | FBFBFFFLLR 409 | BFFFFBFRRL 410 | FBFBBFFLRL 411 | FBFFBFBRRR 412 | FFBFFFFLLL 413 | BFBFBFFLLR 414 | BFFFBBBRRL 415 | BFBFFBBLRR 416 | FBBFFFFLLR 417 | FBBBBBFLLL 418 | FBBFFBBRRL 419 | BFFBFBBLRR 420 | FBFFBFBRLL 421 | BFFFBFFLRR 422 | BBFBFFFRLL 423 | BFFFFFFRLL 424 | FFBBBFFRLL 425 | BBFBFBFRLR 426 | BBBFFFBRLL 427 | BFBFBFFLRL 428 | FFFBBFBLRR 429 | BFFBBBFLLR 430 | FFBBBBBRLR 431 | BFFFFBFRRR 432 | FFBFFFFRRR 433 | FFBFFBFLRL 434 | BBFFBBFLLR 435 | FFBFBFBRRL 436 | FFBBFFBRLL 437 | FFBFBFFRLR 438 | BBFBFBBLLL 439 | FBFBFFBRRR 440 | BFBFFBFLRR 441 | FBFFFFBLRR 442 | BFBBBFBRLL 443 | FFBFFFFRLR 444 | BFFFBBFRLL 445 | FFFBBBFRLR 446 | BBBBFFBLRR 447 | BBBFFFBLLR 448 | FFBBBBBLLR 449 | BBFFFFBLLR 450 | BFFFFFFLRL 451 | FFBBFFFRLL 452 | FBFFFBBLLL 453 | FFBFBFFRRL 454 | FBFBBBBRLL 455 | FBFBBFFLRR 456 | FBFBFFFRLR 457 | FBFFBBFLLR 458 | FFBFFFBRLL 459 | BFBFFBFLRL 460 | FFBFBBFLLL 461 | FFBBBFFRLR 462 | BBBFFFFLLR 463 | BFFFBBFRRL 464 | BBFFFBFRLR 465 | BFFBBFFRLL 466 | BBBFFBBRLL 467 | BFBBBBFLRR 468 | FFFBBFBLLR 469 | BBFFBFBRRL 470 | FFBFFFBRLR 471 | FBBBFFFLRL 472 | BBBBFFFLRL 473 | BFFBFFBRRL 474 | FBFFFBFLLL 475 | FFBBBFBRRR 476 | FFBBBFFRRL 477 | BFFBFBBRRR 478 | FBBFBFBLRR 479 | BBFFFFBRRR 480 | FFBFBBBRLR 481 | FFBBFFBLRR 482 | BFFFFFFRRR 483 | BFBBFFFLRL 484 | FBFBFBFLRL 485 | BFBFBBBRLL 486 | FBFFBFBLLL 487 | BBFBFFFRRL 488 | BFBBFFFRRR 489 | BFBBFBFLLR 490 | BFBFBFBRLL 491 | FBFBFBBLLR 492 | FBFBFBFRRR 493 | BBFBFBBLRR 494 | BFBBFBBLLL 495 | BFFFFBFLLL 496 | BFFFBFBLRR 497 | BBFBFBBLRL 498 | FBBBBFBLRR 499 | BBBFBBFRLR 500 | FBBFBFFLLR 501 | FBFFFBFLRL 502 | BBFFFBFLLL 503 | FBBFFFBRRL 504 | BBBFFFFLLL 505 | BFFBFFFLLR 506 | FFBBBFBRRL 507 | BFFBBBBRRL 508 | FFBFBBBRLL 509 | BBFBBFFLRR 510 | FBFBBBBLLL 511 | FFBFBBFRRR 512 | BFFBFFBLLR 513 | BBFFBFFLRL 514 | FFBFBBBLLR 515 | FBBBBBBLLR 516 | BFFFBBBRLR 517 | BBFFBBFLRL 518 | FBFFBBFLRR 519 | FBFFFFBLLL 520 | BFBFBBBRRR 521 | FFBFBBFRLR 522 | FFBFFBBLLL 523 | FFBBBBFRLL 524 | BFBFBFBLLL 525 | BBFBBFFLRL 526 | FFBFBBFLRR 527 | FFBBFBBRLR 528 | FBBBBFBLLR 529 | FBFFBFBLLR 530 | BFFFBBBLLL 531 | FBFFFBFRLR 532 | BBFBBBFLLL 533 | FBBFFBFRLL 534 | FBFBFBFLRR 535 | BFFFBBBRLL 536 | BFBFFBBLLR 537 | BFBBFFFLLR 538 | BFFBBFBLRR 539 | FBBFFBFLRR 540 | FFBBFFFRLR 541 | BBFBBBFLLR 542 | FBFBFFFRRL 543 | FBBBBBBRRL 544 | FBBFFBFLLL 545 | BFFBBBBRRR 546 | BBFBBBFRLL 547 | BFFFFBBLRL 548 | BFBBFBFRRR 549 | FBBFBBBLRR 550 | BFBFBBFLRR 551 | BFBFBBFRLR 552 | FFBFFBFRRL 553 | FBBFBBBRRR 554 | BFFFBFFRRR 555 | BFBFBBBLRR 556 | BFBFBFFRRR 557 | FFBBBBBRRL 558 | FFBFFFFRLL 559 | FFBFFBBLRL 560 | BBBFFFBRRL 561 | FBFBBBBRLR 562 | BBFFFFFLRL 563 | FBBBBBBLRL 564 | BFBBBBFRLR 565 | BFFFBFFRRL 566 | FBFBFFBLRL 567 | FFBBFFFLRL 568 | BFFFBFFRLR 569 | FBFFFFFRRL 570 | BBFBFFBLRR 571 | FBBFFBBLRL 572 | BBFBBFBRLL 573 | FFBBFBBLLR 574 | BBBFBBFLLL 575 | BFFBBFBLLL 576 | BBBFFBBRRL 577 | BFFFFFBRLR 578 | FFBBFBFRLL 579 | FBFFBFBLRL 580 | FBBBFFBRLL 581 | FBBBBBFRRL 582 | FFBBBFFLLL 583 | FBFFFBBLRL 584 | BFBFBBFLLL 585 | BFFFFFBLRR 586 | FBBBFFFRRL 587 | FFBFBBFLLR 588 | BFFBBBBRLR 589 | FBFFBFBRRL 590 | BBFBBFBRLR 591 | FBFFFFBRRL 592 | BFBFFFBLLL 593 | BFFBBBBLRR 594 | FBFFBFFRRR 595 | BFFFFBBRLR 596 | BFBBBFBLLR 597 | FBBBFBFRLL 598 | FBBBBBBLLL 599 | BFFBFBFLRR 600 | BBFFFFFLRR 601 | FBBFBBFRLL 602 | FBFFFBBRRL 603 | BFFFFBBRLL 604 | BFFFBBFRLR 605 | BFFBFBBLLL 606 | FFFBBBFRRL 607 | BBFFFBBLLL 608 | BFFFBFBRLL 609 | BFBBFFBLLR 610 | FBBFFBBRLL 611 | FBBFBFFRRR 612 | FBBFFFBRLL 613 | BBFBFFFRLR 614 | FFFBBBBLRR 615 | BFBBBFFRLR 616 | BFFBFFFRRL 617 | FBBFBFBRLR 618 | BFBBBBBLRR 619 | BBBFBFBRRR 620 | FBBFFFFRLR 621 | FBFFBBBLRL 622 | BFFBBFFLRL 623 | FBBFBFBRRL 624 | BBBFBFFRLL 625 | FBFBBFBLRR 626 | BBFFFFBRLR 627 | BFBBBFFLLR 628 | FBFBBBFRRR 629 | FFBFBFBLLR 630 | BBBFFBBRLR 631 | BFFBFFFLLL 632 | FBFBBFBRRL 633 | FFFBBFBRRR 634 | FBBFFFBLRL 635 | BBFBBFBLLR 636 | BBFFBFBRLR 637 | FBBBFBBLLL 638 | BBFBBBBRRR 639 | FFBFBFFLRR 640 | FBBBBFFLLR 641 | FBBBFBBRLR 642 | BBFFBFFRLR 643 | FBFFFBFLRR 644 | FBFBFBFRRL 645 | FBBBBBBRLL 646 | BFFFFFFLLL 647 | BBFBFBFRLL 648 | BBBFBFBRRL 649 | FBBFBBFLLL 650 | BFFFFBBRRL 651 | BBFBFBBRRR 652 | BBBFBBBRLR 653 | BBBFBBFRRR 654 | BFBFFBFRLL 655 | BFFBFBFRLL 656 | BFBBBFBRRL 657 | BFBFFBBLLL 658 | BFFFFFFLLR 659 | FBFFBBFRRL 660 | FBFFBFFLRR 661 | BBBBFFFRRL 662 | FFBFBFFRLL 663 | FFBFBBBRRL 664 | BFBFFFFLRR 665 | FFBBBBBRRR 666 | FBFBBBFRLR 667 | BBFBFFFLLR 668 | BBFBFFFLRR 669 | FBBFBBBRLR 670 | BFBFFBBRRL 671 | FFFBBBBRRL 672 | BBBFBFBRLR 673 | FBBFBBBLLL 674 | BBBFFFFRRR 675 | BBBFBFBLRR 676 | FBFFBFBRLR 677 | BFFBBFBRRR 678 | BBFFFFFLLL 679 | BFBFFFFRLR 680 | FFBBFFBLLL 681 | FFFBBFFRLL 682 | BBBFFBFLRL 683 | BFFBFFBRLL 684 | FBFBBBFLRR 685 | BFBFBFBRRR 686 | FBFFBFFRLL 687 | FFBBFFFLLR 688 | FFBFFFBLRL 689 | FFFBBBFRRR 690 | FFBBBBFLLR 691 | FFFBBBFLLL 692 | BBBFFFBLRR 693 | BFFFFFBRRR 694 | FFBBFBBLRR 695 | BFBFFBBRRR 696 | BBFFFFFRRR 697 | FFFBBFFRRR 698 | FFBBBFFRRR 699 | BBFFFBFLRR 700 | FFFBBFBLLL 701 | BFBBFFBLRR 702 | FBFBFBFRLR 703 | BBBFBBBRRL 704 | FBBFBBBRRL 705 | BBBFBBBRRR 706 | BFFFBFFLRL 707 | BFBBBBBRRR 708 | BBBBFFBRLL 709 | FBFBBFBLLL 710 | FBFBBFFRLR 711 | BBBFFBBRRR 712 | BBFBFFBLRL 713 | FFBBBBFLLL 714 | FFBBFFFRRR 715 | BBFBFFFRRR 716 | FBBBBBBRRR 717 | BBFFFFFRLR 718 | BFFFBFBRRR 719 | BBFFBBFRRR 720 | BFBBBBFLLL 721 | FFBBFFBLLR 722 | BFBFFBBLRL 723 | FBFBFFBRLR 724 | FBFFBBBRRR 725 | FFFBBBFLRL 726 | BFBFBFBLLR 727 | BFBFBFFRLR 728 | BBBFFFBLRL 729 | FBFBBFFRLL 730 | BBFBFFBRLR 731 | FBBFBBFLRL 732 | FBFFFFFLRR 733 | FFBFBFBRLL 734 | BFBFBBBRLR 735 | BFFBBBFRRL 736 | FBFFFBFLLR 737 | BFFBBFBRLR 738 | BBFFFFBLRL 739 | FFBBBBFLRL 740 | BFFBBBFLRR 741 | FBBBFFBLLR 742 | BBFBFFBRRR 743 | BFFBBFBRLL 744 | FFBBBBFRRR 745 | BBFBFFBRRL 746 | FBBBBFFRLL 747 | BBBBFFBLLL 748 | FBFFBBFRLR 749 | BBFFFFFLLR 750 | BFFFFFBRLL 751 | FBFBBFBLLR 752 | FBFBBFBRLR 753 | BBFBFFBLLL 754 | FFBBFBBLLL 755 | BFFFBFFLLL 756 | BBBFBBBLLR 757 | FBFBFBBRRL 758 | BBFFFBFRRR 759 | FBFFBFFLRL 760 | BBBBFFBRRL 761 | FBFFFFBLRL 762 | BBFBFBBRLR 763 | BFBBFFFRLL 764 | FBFBFFFRLL 765 | FBBFFFFRRR 766 | FFBFFFFLLR 767 | FFBBBBFLRR 768 | BBFFBFFLLL 769 | FFBBFBFLLR 770 | FFBBFFBRRR 771 | FFBBBBBLRR 772 | BFFBFFFRRR 773 | FBBBFBFRRR 774 | FBFFBBBLRR 775 | BBBFBFFLLR 776 | FBFFBBBLLR 777 | BFFBBBBRLL 778 | BFFFFBBLLL 779 | BFFFBFBLLL 780 | FBFBFBBLRR 781 | BBBBFFFLRR 782 | FFBFFFBLLL 783 | BBFBBFBLLL 784 | BFFBFFBLLL 785 | FBBFBBBLLR 786 | FBFFBFBLRR 787 | BFBFFBFRRR 788 | FBFBFBBRLR 789 | FBFFFFBRRR 790 | FFBFFFFRRL 791 | BFBBFFFLRR 792 | BBFBFFBRLL 793 | BBBBFFBLLR 794 | BFFFFFFRRL 795 | BBFFBBFRLL 796 | BBFBFBFLRR 797 | FBBFBFFRRL 798 | BFFFBFBRLR 799 | BBFFBBFRRL 800 | FBBBBBFRRR 801 | FFBBFBFLRL 802 | BFBFBBFRRL 803 | FFFBBFFRRL 804 | BFBFFBFLLL 805 | FBFBBFFLLL 806 | BBBFBFFRRL 807 | FBBFBFFRLL 808 | BBFFFBFLLR 809 | BFFFBFBRRL 810 | FFBFBFFLLL 811 | FBFBFBBRRR 812 | BFFFFBFRLL 813 | FBFBBBBRRL 814 | FBBBFBFLRR 815 | FBBBBFBRLR 816 | FFBFFBBLLR 817 | BBBBFFFRLL 818 | FBBFBFFLLL 819 | FBFBFBBLRL 820 | BFFFBBFLLL 821 | FFBBBBBRLL 822 | BFBBBBFLRL 823 | FFBFFBFLRR 824 | FBBBBBFLRR 825 | BBFFBFBLLR 826 | BFBFBBFLRL 827 | BBBFFBFRLR 828 | FBBBBFFLRR 829 | BFBFFBFRRL 830 | FBFBFFFLRR 831 | FBBFBBFRLR 832 | FBBFFFBRRR 833 | FBBFBBFRRL 834 | BFBFFFBRRL 835 | FFBFBBBLLL 836 | FFBBBBFRLR 837 | FBFBBBFRLL 838 | BBFFFBBLRR 839 | BFFBFBFLRL 840 | BBFFFFBLLL 841 | FBFBBBBLLR 842 | BBBBFFFRLR 843 | FFBBFFBLRL 844 | FBBBFFBLRR 845 | BBFFFFBLRR 846 | BBFFBFFRLL 847 | BBFFFFFRLL 848 | BBBFBBBLLL 849 | FBBBFFBLLL 850 | FBBBFFBLRL 851 | FBBBBBFLLR 852 | FBBBFBBRRR 853 | FBBBFBBRLL 854 | BBBBFFFRRR 855 | BBFFBBBLLR 856 | FBBBBFBRRR 857 | FFFBBBBLLR 858 | BFFFFBFLLR 859 | BBBFFBBLLL 860 | FFBFBFFRRR 861 | FFFBBFBRLL 862 | BFBBBFBLRR 863 | FFBFFFFLRL 864 | BFBBFBFRLR 865 | BFBBBFBRRR 866 | BFFBBFFLLL 867 | BBFBFBFRRL 868 | BBFBBBBLRL 869 | FFBFFBFRLR 870 | FBFBBBFRRL 871 | FFBBFBFLLL 872 | BFFFFBBRRR 873 | FBBBBFFRLR 874 | FBBFFFFRLL 875 | BFBBFBFLRR 876 | -------------------------------------------------------------------------------- /day9/input.dat: -------------------------------------------------------------------------------- 1 | 30 2 | 17 3 | 44 4 | 5 5 | 10 6 | 33 7 | 19 8 | 31 9 | 22 10 | 25 11 | 39 12 | 49 13 | 1 14 | 26 15 | 38 16 | 36 17 | 14 18 | 27 19 | 15 20 | 50 21 | 28 22 | 41 23 | 20 24 | 34 25 | 18 26 | 6 27 | 24 28 | 16 29 | 11 30 | 81 31 | 7 32 | 8 33 | 63 34 | 65 35 | 58 36 | 9 37 | 109 38 | 10 39 | 13 40 | 26 41 | 86 42 | 17 43 | 57 44 | 32 45 | 14 46 | 15 47 | 42 48 | 22 49 | 21 50 | 30 51 | 40 52 | 39 53 | 28 54 | 37 55 | 20 56 | 16 57 | 18 58 | 24 59 | 19 60 | 23 61 | 35 62 | 33 63 | 25 64 | 56 65 | 29 66 | 31 67 | 34 68 | 92 69 | 75 70 | 64 71 | 61 72 | 36 73 | 38 74 | 41 75 | 42 76 | 78 77 | 43 78 | 39 79 | 44 80 | 48 81 | 37 82 | 97 83 | 59 84 | 55 85 | 62 86 | 58 87 | 106 88 | 105 89 | 79 90 | 60 91 | 87 92 | 93 93 | 73 94 | 114 95 | 74 96 | 75 97 | 149 98 | 116 99 | 99 100 | 108 101 | 82 102 | 76 103 | 162 104 | 81 105 | 110 106 | 118 107 | 150 108 | 113 109 | 220 110 | 120 111 | 131 112 | 133 113 | 213 114 | 134 115 | 142 116 | 147 117 | 148 118 | 196 119 | 221 120 | 156 121 | 151 122 | 157 123 | 181 124 | 175 125 | 242 126 | 158 127 | 186 128 | 214 129 | 384 130 | 233 131 | 231 132 | 244 133 | 251 134 | 253 135 | 254 136 | 352 137 | 467 138 | 276 139 | 281 140 | 347 141 | 304 142 | 299 143 | 308 144 | 313 145 | 307 146 | 309 147 | 315 148 | 475 149 | 783 150 | 389 151 | 575 152 | 400 153 | 445 154 | 464 155 | 477 156 | 482 157 | 624 158 | 504 159 | 851 160 | 622 161 | 1079 162 | 923 163 | 1251 164 | 704 165 | 603 166 | 606 167 | 795 168 | 620 169 | 1158 170 | 616 171 | 773 172 | 715 173 | 789 174 | 1477 175 | 834 176 | 1794 177 | 845 178 | 909 179 | 941 180 | 986 181 | 1318 182 | 1695 183 | 1981 184 | 1209 185 | 1219 186 | 1222 187 | 1223 188 | 1226 189 | 1307 190 | 2304 191 | 2012 192 | 1236 193 | 1549 194 | 1331 195 | 1786 196 | 1488 197 | 1504 198 | 2649 199 | 2272 200 | 1679 201 | 3183 202 | 2727 203 | 2131 204 | 2177 205 | 2195 206 | 2428 207 | 2431 208 | 3667 209 | 2432 210 | 2445 211 | 2905 212 | 3874 213 | 2543 214 | 2567 215 | 2724 216 | 2785 217 | 4862 218 | 3932 219 | 3635 220 | 2992 221 | 3167 222 | 4584 223 | 4563 224 | 5423 225 | 5159 226 | 4308 227 | 4326 228 | 4859 229 | 6521 230 | 10285 231 | 6080 232 | 5110 233 | 4877 234 | 4975 235 | 4988 236 | 5267 237 | 5291 238 | 7895 239 | 10153 240 | 7773 241 | 5777 242 | 7730 243 | 6627 244 | 13196 245 | 7751 246 | 10887 247 | 8892 248 | 8634 249 | 9167 250 | 9185 251 | 9314 252 | 9203 253 | 10126 254 | 9963 255 | 9865 256 | 10255 257 | 9852 258 | 10144 259 | 10242 260 | 10279 261 | 16492 262 | 11068 263 | 14378 264 | 12404 265 | 14944 266 | 13507 267 | 16622 268 | 15261 269 | 16385 270 | 16954 271 | 17526 272 | 17801 273 | 17819 274 | 25695 275 | 18388 276 | 18517 277 | 28796 278 | 20534 279 | 19717 280 | 19996 281 | 20131 282 | 20094 283 | 26734 284 | 20521 285 | 24657 286 | 23472 287 | 26012 288 | 41995 289 | 35392 290 | 28451 291 | 33339 292 | 43119 293 | 34186 294 | 47184 295 | 34773 296 | 38611 297 | 35620 298 | 45729 299 | 40251 300 | 62126 301 | 39811 302 | 39713 303 | 58328 304 | 39848 305 | 44653 306 | 43993 307 | 40615 308 | 56141 309 | 55294 310 | 48129 311 | 51923 312 | 61404 313 | 89480 314 | 83706 315 | 61790 316 | 102321 317 | 95989 318 | 68959 319 | 70393 320 | 73384 321 | 74231 322 | 75333 323 | 79524 324 | 79561 325 | 114846 326 | 79659 327 | 80328 328 | 80463 329 | 83841 330 | 84608 331 | 88744 332 | 92538 333 | 100052 334 | 107217 335 | 109533 336 | 113327 337 | 131797 338 | 130749 339 | 179711 340 | 136021 341 | 144292 342 | 172099 343 | 139352 344 | 257619 345 | 272151 346 | 149564 347 | 154857 348 | 159085 349 | 352479 350 | 164304 351 | 159987 352 | 207269 353 | 176379 354 | 168449 355 | 231890 356 | 181282 357 | 244344 358 | 340548 359 | 291784 360 | 276089 361 | 268184 362 | 262546 363 | 275041 364 | 275373 365 | 280313 366 | 283644 367 | 429877 368 | 318013 369 | 304421 370 | 495405 371 | 308649 372 | 366354 373 | 323389 374 | 328436 375 | 324291 376 | 336366 377 | 344828 378 | 491838 379 | 460233 380 | 544273 381 | 425626 382 | 519385 383 | 607033 384 | 543225 385 | 537587 386 | 551828 387 | 642304 388 | 550414 389 | 555686 390 | 641402 391 | 847646 392 | 613070 393 | 805061 394 | 627810 395 | 632038 396 | 632940 397 | 659755 398 | 647680 399 | 972638 400 | 660657 401 | 681194 402 | 895242 403 | 1099959 404 | 1073303 405 | 1230687 406 | 1479684 407 | 1056972 408 | 1080812 409 | 1089415 410 | 1168756 411 | 1811060 412 | 1210169 413 | 1293597 414 | 1183496 415 | 2458740 416 | 1246010 417 | 1508312 418 | 1259848 419 | 2597727 420 | 1620318 421 | 1737095 422 | 1905765 423 | 1328874 424 | 1341851 425 | 1555899 426 | 1576436 427 | 1984657 428 | 2146387 429 | 2130275 430 | 2137784 431 | 2900475 432 | 2170227 433 | 2352252 434 | 2258171 435 | 3356556 436 | 2393665 437 | 2836284 438 | 2983105 439 | 4428398 440 | 2884773 441 | 2505858 442 | 3518019 443 | 3430075 444 | 2670725 445 | 2897750 446 | 3890422 447 | 3461664 448 | 4758949 449 | 5335357 450 | 3132335 451 | 4122441 452 | 5967522 453 | 4268059 454 | 4300502 455 | 6558673 456 | 4522479 457 | 9429186 458 | 8319774 459 | 4651836 460 | 5176583 461 | 4899523 462 | 7251164 463 | 5390631 464 | 5568475 465 | 5403608 466 | 5935933 467 | 8012863 468 | 5803060 469 | 7549586 470 | 6030085 471 | 6593999 472 | 7254776 473 | 8919895 474 | 7400394 475 | 9477085 476 | 8390500 477 | 14832794 478 | 9422002 479 | 8822981 480 | 9174315 481 | 9551359 482 | 9828419 483 | 13496357 484 | 11770582 485 | 14598585 486 | 10290154 487 | 10794239 488 | 11738993 489 | 10972083 490 | 17674926 491 | 11833145 492 | 12397059 493 | 12624084 494 | 13284861 495 | 13430479 496 | 14984499 497 | 15645276 498 | 15790894 499 | 16574709 500 | 28263273 501 | 40660332 502 | 22046086 503 | 54156689 504 | 17997296 505 | 22564821 506 | 19379778 507 | 21567412 508 | 21084393 509 | 33306405 510 | 21262237 511 | 21766322 512 | 22533232 513 | 54390798 514 | 22805228 515 | 43028559 516 | 24230204 517 | 26715340 518 | 25908945 519 | 28269360 520 | 28414978 521 | 41425864 522 | 31436170 523 | 50461064 524 | 39259533 525 | 42227500 526 | 37377074 527 | 39081689 528 | 39564708 529 | 45492441 530 | 40464171 531 | 40642015 532 | 44100644 533 | 42346630 534 | 59910306 535 | 61025855 536 | 44299554 537 | 50948210 538 | 63447243 539 | 86447274 540 | 54323923 541 | 50139149 542 | 52624285 543 | 59851148 544 | 56684338 545 | 72515622 546 | 70517859 547 | 83360177 548 | 83381243 549 | 78019089 550 | 76458763 551 | 77841245 552 | 78646397 553 | 130465530 554 | 84763725 555 | 95247764 556 | 84742659 557 | 86646184 558 | 93294840 559 | 109308623 560 | 111165004 561 | 136586423 562 | 101087359 563 | 102763434 564 | 123142144 565 | 104463072 566 | 106823487 567 | 112475433 568 | 116535486 569 | 133143101 570 | 148359104 571 | 155105160 572 | 155860334 573 | 154300008 574 | 154477852 575 | 197239158 576 | 156487642 577 | 187506093 578 | 197218092 579 | 191587212 580 | 219298920 581 | 171388843 582 | 199121617 583 | 223358973 584 | 220473627 585 | 203850793 586 | 205550431 587 | 207226506 588 | 323761992 589 | 235617577 590 | 211286559 591 | 344429660 592 | 229010919 593 | 374951479 594 | 404672048 595 | 302659112 596 | 353078426 597 | 312347976 598 | 401089951 599 | 310965494 600 | 353726800 601 | 360338435 602 | 370510460 603 | 382675402 604 | 362976055 605 | 423149713 606 | 375239636 607 | 434739194 608 | 409401224 609 | 673941549 610 | 518192000 611 | 412776937 612 | 783765353 613 | 440297478 614 | 446904136 615 | 646025753 616 | 400480901 617 | 687587612 618 | 783156303 619 | 613624606 620 | 615007088 621 | 623313470 622 | 975345523 623 | 664692294 624 | 720366718 625 | 714065235 626 | 1036774319 627 | 733486515 628 | 772377279 629 | 875036672 630 | 775720537 631 | 840778379 632 | 809882125 633 | 847385037 634 | 813257838 635 | 1616498916 636 | 853074415 637 | 887201614 638 | 1014105507 639 | 1310718047 640 | 1023794371 641 | 1015487989 642 | 1310901082 643 | 1228631694 644 | 1236938076 645 | 1238320558 646 | 1378757529 647 | 1942696929 648 | 1385059012 649 | 1453853233 650 | 1700459452 651 | 2510341577 652 | 1505863794 653 | 1548097816 654 | 1588978375 655 | 1623105574 656 | 1623139963 657 | 2198102696 658 | 1876868786 659 | 2429756754 660 | 2125522172 661 | 1740276029 662 | 2253808547 663 | 2029593496 664 | 3094842169 665 | 3408351025 666 | 2244119683 667 | 2465569770 668 | 2466952252 669 | 2475258634 670 | 2617078087 671 | 2763816541 672 | 2933156828 673 | 3171237779 674 | 2959717027 675 | 5426669279 676 | 5338961852 677 | 3053961610 678 | 4815180783 679 | 3329254404 680 | 3246245537 681 | 3363415992 682 | 3769869525 683 | 5046834841 684 | 3865798201 685 | 4357354116 686 | 6013678637 687 | 4273713179 688 | 5203836710 689 | 4709689453 690 | 4711071935 691 | 4719378317 692 | 4932522022 693 | 6288971431 694 | 5092336721 695 | 6296572820 696 | 5696973369 697 | 5892873855 698 | 6130954806 699 | 12189446675 700 | 7133285517 701 | 6300207147 702 | 6383216014 703 | 6575499941 704 | 6609661529 705 | 7016115062 706 | 7635667726 707 | 8043582704 708 | 12193081002 709 | 10849213120 710 | 8631067295 711 | 8983402632 712 | 8984785114 713 | 10024858743 714 | 9429067770 715 | 9430450252 716 | 12431161953 717 | 15558902573 718 | 10789310090 719 | 10985210576 720 | 11589847224 721 | 11827928175 722 | 12023828661 723 | 22379157314 724 | 12683423161 725 | 12875707088 726 | 12909868676 727 | 16040111781 728 | 14211167667 729 | 21614705967 730 | 23860917664 731 | 34650227754 732 | 16674649999 733 | 39901029445 734 | 20814168833 735 | 17614469927 736 | 17968187746 737 | 24273270385 738 | 29558034970 739 | 18859518022 740 | 33527090319 741 | 22617238265 742 | 23417775399 743 | 24703635263 744 | 22575057800 745 | 23613675885 746 | 23851756836 747 | 24899535749 748 | 54341259152 749 | 25559130249 750 | 41887740312 751 | 27121036343 752 | 81788769757 753 | 30885817666 754 | 34289119926 755 | 42318105190 756 | 35534168021 757 | 34642837745 758 | 42711274858 759 | 41466226763 760 | 35582657673 761 | 83784331953 762 | 41434575822 763 | 97052534010 764 | 52386608341 765 | 47031451284 766 | 82614108957 767 | 45992833199 768 | 52020572092 769 | 65501416197 770 | 81674289029 771 | 48751292585 772 | 50458665998 773 | 52680166592 774 | 84177501621 775 | 79507644684 776 | 76968743843 777 | 77017233495 778 | 68931957671 779 | 113796764610 780 | 70177005766 781 | 70225495418 782 | 76109064508 783 | 77048884436 784 | 81575490872 785 | 84333950258 786 | 149684650450 787 | 88466027106 788 | 93024284483 789 | 130170334820 790 | 116169838965 791 | 94744125784 792 | 104700738684 793 | 102479238090 794 | 149733140102 795 | 128789231100 796 | 99209958583 797 | 164921131550 798 | 122905662010 799 | 169993028326 800 | 169386964349 801 | 139157453089 802 | 139108963437 803 | 223442913695 804 | 164575091614 805 | 140402501184 806 | 195503522573 807 | 153157948944 808 | 197223363874 809 | 238199167208 810 | 183210152890 811 | 181490311589 812 | 187675985689 813 | 292315402033 814 | 193954084367 815 | 201689196673 816 | 199444864468 817 | 207179976774 818 | 279511464621 819 | 322743315467 820 | 222115620593 821 | 238318922020 822 | 262014625447 823 | 363947112693 824 | 278266416526 825 | 500213792655 826 | 304977592798 827 | 321892812773 828 | 293560450128 829 | 352251077303 830 | 323612654074 831 | 380935176057 832 | 347112033311 833 | 460434542613 834 | 369166297278 835 | 364700464479 836 | 387120850157 837 | 381630070056 838 | 393398948835 839 | 423804817266 840 | 566389661152 841 | 477711280994 842 | 445498898794 843 | 484130246040 844 | 500333547467 845 | 500382037119 846 | 531879372148 847 | 540281041973 848 | 921216218030 849 | 615453262901 850 | 598538042926 851 | 770916850577 852 | 617173104202 853 | 784047196687 854 | 913501694463 855 | 704547830131 856 | 711812497790 857 | 1000715584586 858 | 751821314636 859 | 901516098260 860 | 746330534535 861 | 1093442567846 862 | 775029018891 863 | 817203766101 864 | 924186854385 865 | 923210179788 866 | 929629144834 867 | 945880935913 868 | 1445381066611 869 | 1157454146175 870 | 1032261409267 871 | 1130417415074 872 | 1401220300889 873 | 1215711147128 874 | 1213991305827 875 | 1388089954779 876 | 1321720934333 877 | 1363503638737 878 | 1416360327921 879 | 1450878364666 880 | 1456369144767 881 | 1698239198679 882 | 1592232784992 883 | 2722941235222 884 | 1741390620486 885 | 2672080291895 886 | 1699215873276 887 | 2138532657628 888 | 1763084702014 889 | 1847397034173 890 | 1852839324622 891 | 4060170246674 892 | 1978142345180 893 | 2162678824341 894 | 2189715555442 895 | 2664869670493 896 | 2344408720901 897 | 3303717689288 898 | 2429702452955 899 | 3403706861269 900 | 2685224573070 901 | 2738081262254 902 | 3104894259223 903 | 2872729472688 904 | 2907247509433 905 | 3594901802395 906 | 3887954754121 907 | 5652403031666 908 | 4384440446346 909 | 4568235110583 910 | 3462300575290 911 | 3546612907449 912 | 7979342248741 913 | 3610481736187 914 | 4015518148963 915 | 6237279770968 916 | 4140821169521 917 | 5610810734942 918 | 6295706309257 919 | 4534124276343 920 | 5790118832293 921 | 5977623731911 922 | 5167783715209 923 | 6795202263554 924 | 6147525148360 925 | 7291687955779 926 | 6419342380137 927 | 8757297290889 928 | 8129026078738 929 | 6369548084723 930 | 9699580346258 931 | 7625999885150 932 | 7008913482739 933 | 14084020792604 934 | 11363437374137 935 | 7072782311477 936 | 7157094643636 937 | 7751302905708 938 | 9183301864172 939 | 11400929567235 940 | 8674945445864 941 | 10511748008254 942 | 9701907991552 943 | 11537331799932 944 | 10903672361066 945 | 10957902547502 946 | 17684856948292 947 | 11315308863569 948 | 13214544643691 949 | 13773525033510 950 | 13378461567462 951 | 12788890464860 952 | 13442330396200 953 | 13526642728359 954 | 14698782196627 955 | 14824085217185 956 | 14166008126375 957 | 14229876955113 958 | 14908397549344 959 | 19695049872426 960 | 16774690303029 961 | 15832040089500 962 | 16426248351572 963 | 18376853437416 964 | 19186693454118 965 | 30530822286127 966 | 20213655999806 967 | 20605580352618 968 | 22441004160998 969 | 21861574908568 970 | 22273211411071 971 | 24529853507260 972 | 35651672978533 973 | 28038629860876 974 | 26167352032322 975 | 28620930554360 976 | 26231220861060 977 | 56762043147187 978 | 28225424924986 979 | 28395885081488 980 | 30592256477947 981 | 36121298223998 982 | 29138274504457 983 | 30740437638844 984 | 35527089961926 985 | 33200938654601 986 | 40650064848487 987 | 34803101788988 988 | 39400349453924 989 | 39792273806736 990 | 58756247211113 991 | 40819236352424 992 | 46836801213678 993 | 44134786319639 994 | 46391428415828 995 | 46803064918331 996 | 75319363768662 997 | 54205981893198 998 | 52398572893382 999 | 54392776957308 1000 | 59213187032307 1001 | -------------------------------------------------------------------------------- /day21/input.dat: -------------------------------------------------------------------------------- 1 | rgt lmpxcr ssgkt klfp dfpqn scqc vzzxl hphcb pbmhl xrlmvz fvd cpj kxl gpplt jkrsn bhlbm dkxr vrzkz drpxzr bxhsq cvz nvhnsg jtzsqznl fjbjj slglnd qdbq gnrb zpbbvvm bqb mbdksj nlxh gtzp jrlvkz ctmzsr znjp zvmnv lhsgbq pdxhgx jrcczb vrpzss qdbj lsc jhrgz hqlm qlt kh grjf brhfcbt zjsh pkmbk rncjx nmszz fzpds qglps zjsz qfnq ftfx bbkth rkzqs vgp (contains nuts shellfish) 2 | slmjchql qfnq lqdpl bgdq tjxp rkzqs zjsh znklc qdbj pbtns cpsbgsh qbtpnr nmszz vzzxl vrzkz vtrltkq znfrgvc dksfbk cvz qfvvf cvtj dmpl qnt hbbz zmhnj dfpqn rncjx scqc bccz hdnq zpbbvvm lnpbh pdxhgx nqstv fhpxz ftfx rgt ztrpkb lqtnn dqdn vlqtzzl msvgj dkxr fptpk bbkth jgkp hmshx xrlmvz trlmqn znjp vgp ztlbvp klfp slglnd rmthpj nfzczn hdkc nvhnsg cntfbt rmpnm bqfqcjb tkrr jgxbzks sks pchhkp qsrh kh mbdksj ctmzsr drpxzr xlqj bhlbm (contains soy eggs shellfish) 3 | zjdzx cpj bqfqcjb bqb ztlbvp hdkc hphcb zjsh pkgsf qllxhr grjf rgt vfnv gtzp sbsrk hdnq vzzxl httx vgp cntfbt ghfk hmshx rzjcs dbfk xfvtzq nvhnsg znfrgvc bbkth svrx rcv bgdq hqjgzmt rkzqs nmq lqdpl zcxxdp dxpdkp nqstv vrtfrj zhvsdc rsrgmkr nlxh lmpxcr rmpnm kxl qzbzd fzpds sltl cvtj zvmnv jgxbzks vrzkz cpsbgsh zdrlf cqbkj nmszz jrcczb qvhdl dlc sks lvjrbms vfhvp lhb knhvxm qlt dqdn ssgkt slmjchql nvbr cgrcmp pkmbk vllxj spzmvfl rvnfn ctmzsr cvz zqgzlr zmhnj fzgbq bhlbm (contains shellfish) 4 | pznl nmszz vtrltkq qpgj zqgzlr lnpbh gpplt rkzqs gmx bqb jgv hphcb dfpqn zcxxdp tkrr qbtpnr mbdksj hxfrh vfnv hmshx fmkbnr gnrb sltl kh drpxzr vzzxl fptpk ftfx ctmzsr jrnfp dksfbk qsrh rnxl czlpq dpkdp qzbzd dxpdkp fvpj tnjxcf zdrlf bxhsq bhlbm nlxh hqjgzmt qglps cf qllxhr cqbkj jmxpbtk nvdst slmjchql qnt dnzljk ckzdf vrzkz pbmhl ssgkt knhvxm gjvqffm xzhct xvmftv zmf qbnkj ltxqz mxk njcjm knqlqt bccz dbfk dlc vllxj rph frz zmhnj pkmbk (contains soy sesame fish) 5 | gbzcv znjp xvmftv pjgxpg bhlbm spzmvfl xfvtzq vrzkz bqb brhfcbt rmthpj hphcb vfnv knqlqt slmjchql vrtfrj fzgbq hxfrh rxzxs cgrcmp dg msvgj xcdb dksfbk zmhnj gjvqffm jsdcr rzjcs jgkp klfp flhzd dnzljk nmszz qbnkj bbkth hdkc vlqtzzl fptpk hmshx jrcczb lhsgbq tcp fvvjp cvz lhb rls rcv pspjgzx gtzp cntfbt ftfx qpgj vzzxl hbbz qfnq ztlbvp dxpdkp lmpxcr frnh qzbzd ctmzsr rkzqs svrx znklc zjsh knhvxm rnxl qbtpnr jmxpbtk zjsz vgp zpbbvvm pkgsf jrnfp rvnfn gpplt sks vtrltkq (contains sesame fish) 6 | dmpl cpsbgsh msvgj qdbq tqtbd fptpk frnh zjdzx hbvqn rls bhlbm lhsgbq znklc rph bqfqcjb rmthpj dlc tkrr qfvvf xzhct dxpdkp qpgj rkzqs fvd ltxqz sltl zjsh ctmzsr kxl bbkth cvz znfrgvc jgkp zmhnj hphcb qvhdl vrzkz sbsrk jgxbzks qzbzd cgrcmp hqlm jmxpbtk mkpxx drpxzr kh rncjx qbnkj dbfk tjxp fvpj vpl nmszz jsdcr vzzxl dksfbk lqtnn pmhnmxr gnrb vkjggtx gmx cf (contains dairy peanuts sesame) 7 | qfvvf cntfbt cvz fvpj hxfrh vrzkz lsc zmf cgrcmp httx qvhdl xvmftv dksfbk zvmnv snxz lvjrbms zcxxdp gjvqffm pdxhgx czlpq spzmvfl knqlqt ctmzsr zhvsdc vzzxl rkzqs zjsh msvgj zmhnj nlxh dxpdkp hphcb dnzljk bqb lqdpl nvdst rcv tqtbd xfvtzq mkpxx (contains soy eggs peanuts) 8 | slmjchql zjsh qfnq lqdpl zmf vgp rkzqs cgrcmp snxz drpxzr zqgzlr cpsbgsh zvmnv vzzxl mxk knhvxm lsc dpkdp ltxqz xvmftv dnzljk ctmzsr spzmvfl pmhnmxr kh mbdksj gpplt znjp lvjrbms pkgsf hdkc vrzkz vfhvp znklc dg rcv jgxbzks fhpxz hbvqn qvhdl nqstv qglps dfpqn znfrgvc rncjx bqb gtzp xlqj zjsz pspjgzx zmhnj tjxp lmpxcr (contains nuts sesame) 9 | zqgzlr hhth scqc jtfnm qdbq cf zcxxdp rxzxs rlxhc zdrlf qfnq slglnd dbfk fzgbq cpj rncjx zjsz pmhnmxr kxl qllxhr bqfqcjb dlc flhzd klfp dpkdp vrzkz zjdzx fptpk vzzxl rkzqs zhvsdc mbdksj snxz jsdcr xlqj qbnkj pznl tqtbd dqdn slmjchql xvmftv fjbjj vkjggtx qlt rnxl gpplt qpgj nvbr nlxh nqhk vfhvp hphcb zjsh qglps rph lhsgbq zvmnv rzjcs pchhkp frz dfpqn kh qbtpnr zmhnj drpxzr bccz cgrcmp msvgj cqbkj hdnq vttzh lsc dmpl pkgsf rmpnm pbtns xfvtzq (contains shellfish dairy) 10 | hphcb hxfrh fptpk tsnhq ctmzsr qnt xvmftv nvbr zmf sks czlpq dlc cpsbgsh jtfnm znklc bhlbm bgdq qbtpnr nvhnsg slglnd jkrsn ghfk ztrpkb njcjm znjp jrnfp gpplt cpj tcp pdxhgx kxl mbdksj rnxl nvdst bxhsq zjdzx vzzxl rsrgmkr rvnfn rcv zmhnj xrlmvz dbfk tjxp ghtjbp rph zjsh rkzqs spzmvfl vlqtzzl (contains shellfish soy) 11 | hphcb sbsrk qvhdl hbvqn cpsbgsh nvhnsg mkpxx ssgkt znklc cf jgv vzzxl dnzljk ttr pbtns cgrcmp rnxl cvz znjp fptpk kh zdrlf zmhnj zjsh svrx snxz slglnd lsc pdxhgx rmpnm cqbkj pznl frnh bxhsq bqfqcjb ghfk dxpdkp qbnkj hkzzg hbbz rkzqs grjf dbfk jkrsn zcxxdp ctmzsr nvbr hhth mbdksj lhb vrtfrj brhfcbt flhzd zjdzx hdkc nlxh jrlvkz dfpqn (contains nuts peanuts shellfish) 12 | hqjgzmt njcjm rlxhc brhfcbt fvvjp zjsh ghtjbp dnzljk qsrh zmhnj brhns pznl vzzxl jrnfp lnpbh rzjcs svrx pkmbk nfzczn pbtns nvhnsg pmhnmxr hdnq gjvqffm pjgxpg bxhsq vllxj lhb dksfbk tcp ssgkt vrzkz nvbr qzbzd dmpl pbmhl lmpxcr hdkc dpkdp rkzqs zdrlf sbsrk knqlqt pspjgzx qbnkj rph cqbkj drpxzr mbdksj ctmzsr dfpqn bccz kh vlqtzzl hbbz vfhvp (contains sesame nuts) 13 | pchhkp jkrsn hbvqn vzzxl qsrh ctmzsr rzjcs cgrcmp xzhct zvmnv cntfbt dlc zqgzlr znfrgvc hqjgzmt dqdn pkmbk nmq zmhnj qdbj vrzkz qbnkj fzpds vlqtzzl qvhft bhlbm bccz rvnfn zjsh mbdksj lnpbh pbtns svrx rkzqs zhvsdc qbtpnr ltxqz dksfbk (contains dairy shellfish) 14 | hkzzg vtrltkq nmszz hhth pjgxpg jgxbzks rcv cgrcmp tsnhq zmhnj dqdn fhpxz ltxqz pdxhgx ssgkt jrnfp gtzp tnjxcf qdbq hphcb dnzljk ghfk znklc nvdst tcp brhfcbt xzhct vzzxl nvhnsg ttr bbkth hdnq nmq rph jtzsqznl czlpq gnrb ctmzsr ftfx pkgsf msvgj zjsh sltl lsc qnt pbmhl cqbkj gztf vrzkz jrcczb zdrlf qfnq jtfnm qbnkj frnh jrlvkz hbbz klfp njcjm rvnfn pmhnmxr qglps sbsrk mbdksj nllks (contains nuts) 15 | spzmvfl fvvjp cvtj qsrh pspjgzx vzzxl svrx rkzqs vfnv xcdb jgv hdkc zmhnj ghtjbp fptpk frz lsc dmpl bhlbm qpgj sbsrk dnzljk vttzh hkzzg tsnhq ctmzsr dpkdp jgkp bxhsq lnpbh ztrpkb zjsh mxk jtzsqznl zpbbvvm vrtfrj rcv rph bgdq lhb bccz rls jhrgz nvdst hhth qnt vpl kh mbdksj zmf rncjx knqlqt flhzd jmxpbtk jrnfp lqtnn tnjxcf cpj fmkbnr tcp dfpqn hdnq vrzkz (contains shellfish dairy) 16 | nqhk jrlvkz pjgxpg nvbr qvhdl rmthpj nqstv xcdb gpplt rgt vgp tjxp rlxhc rnxl tqtbd hqlm dkxr dbfk knqlqt msvgj scqc klfp httx hdnq hkzzg fmkbnr vllxj nmszz zjsh mkpxx ctmzsr dxpdkp fzpds xfvtzq nvhnsg kh qfvvf fzgbq dpkdp slmjchql knhvxm rcv mbdksj rzjcs vzzxl ghtjbp qzbzd jsdcr cpj pkmbk pdxhgx fptpk nlxh flhzd vrzkz qpgj spzmvfl jrnfp zmf ttr fvvjp qglps lhsgbq rkzqs snxz qfnq fvpj bbkth gztf lqtnn jgxbzks tkrr pbtns gjvqffm jgv nmq drpxzr czlpq kxl svrx hphcb (contains nuts) 17 | rph jkrsn dmpl tcp vrpzss jgkp cntfbt mkpxx spzmvfl dnzljk fvd cpj zmhnj cqbkj ltxqz tsnhq ctmzsr flhzd vtrltkq rkzqs pspjgzx hdnq vzzxl hbbz trlmqn cvtj fjbjj vrzkz gnrb hqjgzmt mbdksj lqdpl xrlmvz lnpbh jrlvkz qpgj kxl nvhnsg sbsrk svrx klfp vllxj slmjchql rncjx hkzzg bqfqcjb xvmftv qdbj dqdn nqhk tnjxcf vlqtzzl zcxxdp hxfrh vkjggtx pznl nmq qfvvf qdbq zjsh scqc (contains sesame dairy soy) 18 | rkzqs pchhkp jkrsn hqjgzmt qzbzd hbvqn zpbbvvm rph hphcb gmx njcjm nvbr qllxhr pbmhl ttr gpplt gbzcv vfhvp bccz hbbz nlxh mxk ltxqz vrzkz zjsz httx pmhnmxr fzgbq nvdst lqtnn vzzxl rvnfn pkmbk xzhct zqgzlr ctmzsr pznl bgdq znjp vllxj fvpj fvvjp mkpxx tkrr fhpxz tsnhq zjsh vttzh rmpnm gztf qbtpnr klfp cgrcmp fmkbnr jgv qglps mbdksj knhvxm sks kxl ckzdf cf (contains fish sesame nuts) 19 | fjbjj nqstv bqb dg vfnv gmx vzzxl qglps gpplt zjdzx zvmnv ctmzsr bqfqcjb xcdb tjxp gjvqffm hhth jrcczb bgdq cqbkj spzmvfl sltl qfnq vtrltkq dmpl qlt hphcb hdnq flhzd zmhnj vpl msvgj vrzkz dkxr jsdcr hbbz bbkth tsnhq svrx jrnfp lhsgbq slglnd gtzp cvtj ckzdf ztlbvp pspjgzx pbtns lmpxcr jmxpbtk mkpxx bxhsq ghfk rmpnm qllxhr dqdn fvpj ftfx vkjggtx qvhdl klfp qnt hdkc jtfnm zpbbvvm lqtnn nllks dfpqn vlqtzzl hbvqn jgkp hqlm grjf lsc pkgsf kxl qbtpnr qzbzd rkzqs nmszz zjsh (contains eggs soy dairy) 20 | knqlqt kh dlc vkjggtx jtfnm dnzljk svrx zmhnj dfpqn gpplt qvhft qsrh qzbzd hqlm kxl lqtnn qglps lvjrbms dmpl spzmvfl slmjchql knhvxm jmxpbtk ztlbvp vfhvp qnt rmthpj mbdksj xfvtzq lqdpl fjbjj vzzxl slglnd fhpxz snxz zhvsdc pbmhl nlxh ssgkt lhsgbq ckzdf tcp znfrgvc rkzqs lhb ctmzsr jrnfp frnh tjxp zjsh cgrcmp ftfx mxk rls vpl hphcb xcdb fptpk rvnfn fzgbq hkzzg vlqtzzl jkrsn ghfk vfnv (contains soy fish) 21 | vfhvp rmpnm tsnhq sks cntfbt qdbj rzjcs vllxj pjgxpg gpplt mxk brhfcbt qsrh zqgzlr qdbq lhb fjbjj dlc ztlbvp rcv dg dxpdkp tqtbd zjsz pdxhgx zjsh znklc xvmftv rkzqs zcxxdp gmx cqbkj dqdn zmf vrtfrj ckzdf hdkc qpgj jsdcr bccz slglnd brhns bhlbm vrzkz jkrsn zvmnv nmq hbvqn rvnfn qvhft pbtns jrnfp knhvxm dfpqn spzmvfl rgt httx hphcb mbdksj bbkth jrlvkz zmhnj hxfrh rls fhpxz rlxhc jgv vlqtzzl fmkbnr tnjxcf tjxp jhrgz qbnkj svrx jmxpbtk tkrr nfzczn ctmzsr knqlqt qlt kh cvtj (contains dairy fish) 22 | mbdksj dg hphcb jsdcr qvhdl bgdq pdxhgx vllxj jgxbzks ctmzsr hdkc hbvqn fhpxz znfrgvc cf svrx scqc rvnfn xlqj sks qvhft jrcczb zmf nqstv vzzxl jmxpbtk lvjrbms rcv tkrr vrtfrj nvbr bccz vlqtzzl qglps rkzqs zmhnj qzbzd pznl cpj cntfbt czlpq zjsz lqtnn zqgzlr slglnd jgkp vrzkz dpkdp sltl ztlbvp jrlvkz (contains shellfish soy peanuts) 23 | rncjx dg vfnv vzzxl pkgsf mbdksj jrcczb ltxqz zmhnj vtrltkq dfpqn gjvqffm dksfbk qbnkj slglnd nvdst hdnq ckzdf qlt hphcb mxk scqc sltl qfvvf jgxbzks cgrcmp bhlbm ttr njcjm cvz nvbr qglps vpl tcp trlmqn dnzljk pmhnmxr rlxhc zhvsdc lsc nvhnsg fhpxz gnrb brhns cf ctmzsr fzgbq fzpds fvd gztf drpxzr ssgkt pbtns rkzqs rmthpj fjbjj rmpnm bccz brhfcbt jmxpbtk zpbbvvm fvvjp zjsh rzjcs (contains eggs shellfish) 24 | zmhnj hxfrh scqc tqtbd dqdn zjsh rcv sbsrk ctmzsr slglnd sltl zdrlf pspjgzx qbnkj gztf vrtfrj trlmqn rncjx bhlbm pchhkp qglps tsnhq fvvjp ztlbvp fptpk nvbr lmpxcr pkgsf xvmftv rvnfn qnt spzmvfl jrlvkz dpkdp flhzd ssgkt snxz rph rkzqs fjbjj gpplt vzzxl hphcb gbzcv nfzczn vrzkz jtzsqznl kxl (contains soy) 25 | zjsh scqc vlqtzzl fzgbq xlqj dxpdkp jgv tjxp qdbj jhrgz kh znjp mbdksj jgkp xfvtzq rzjcs hdkc dksfbk jmxpbtk ftfx lvjrbms nmq svrx ztlbvp xvmftv cvtj zhvsdc cpj cvz hmshx zmhnj rkzqs zjsz jtfnm slmjchql zmf vzzxl cf jkrsn lqdpl ctmzsr fmkbnr hdnq mxk dg hphcb gtzp qdbq vrtfrj vfhvp nllks znfrgvc vrpzss ghtjbp bqb fhpxz jtzsqznl (contains sesame peanuts) 26 | pdxhgx rmthpj jrlvkz lqtnn pmhnmxr jmxpbtk vgp zjsh rncjx fvpj vrzkz rkzqs fptpk pbtns qzbzd bhlbm znfrgvc qbtpnr gtzp dbfk jsdcr pkmbk spzmvfl lhsgbq tqtbd gnrb vzzxl gpplt knqlqt frnh dksfbk qvhft lhb bqfqcjb hkzzg qfvvf scqc klfp cf mbdksj slmjchql dpkdp kh tsnhq ctmzsr rlxhc ssgkt hdnq rph rxzxs jgkp hbbz cqbkj xvmftv cpsbgsh pznl dnzljk zmhnj nvhnsg ztrpkb msvgj brhfcbt pchhkp rcv gmx rvnfn tcp zpbbvvm dlc cvz rzjcs (contains dairy shellfish) 27 | qbnkj zcxxdp qglps dnzljk dkxr jgkp frnh knhvxm ctmzsr bgdq zhvsdc vrzkz dqdn tqtbd vzzxl xzhct slglnd rkzqs znfrgvc qfvvf snxz fvd cpsbgsh trlmqn gbzcv tsnhq qbtpnr rzjcs pmhnmxr nmq nvhnsg mbdksj knqlqt vgp njcjm brhns zjsh pkgsf zmhnj (contains sesame nuts) 28 | spzmvfl zjsh fmkbnr qbtpnr pdxhgx fzpds qpgj vrzkz mkpxx jkrsn pchhkp tkrr zvmnv pspjgzx zmhnj hphcb rvnfn cf pmhnmxr nvdst frz qdbq fptpk fhpxz fzgbq nmszz qvhft gtzp vzzxl vlqtzzl dqdn pbmhl vkjggtx hqlm nmq trlmqn vtrltkq dpkdp lqdpl rkzqs ctmzsr qzbzd dksfbk fvvjp lvjrbms dkxr (contains soy sesame dairy) 29 | ctmzsr ssgkt msvgj xcdb tqtbd ghtjbp scqc nlxh nqhk vzzxl jrcczb tjxp vrtfrj ckzdf fvpj vfhvp jtzsqznl qpgj zqgzlr jmxpbtk ghfk sks gtzp zmhnj mkpxx vfnv jsdcr frnh zjsh rkzqs vrzkz httx rls qsrh xvmftv knqlqt jhrgz brhns frz qbtpnr njcjm fvd hbvqn rmthpj bxhsq lnpbh cpsbgsh bqb tsnhq rvnfn hqjgzmt slglnd lqdpl hphcb jgv cgrcmp slmjchql xrlmvz jgxbzks cvz qfvvf pbmhl cntfbt pznl rzjcs zvmnv cpj dksfbk gpplt znklc kh qfnq rmpnm tnjxcf dqdn ftfx qvhft ztlbvp jrnfp dfpqn hbbz pbtns bccz ttr (contains dairy) 30 | qbnkj bqb zmf lsc xfvtzq xrlmvz jgxbzks cvtj fvvjp gbzcv zqgzlr zmhnj vtrltkq jkrsn cvz kh lqdpl qzbzd rsrgmkr zjsz gpplt qlt cf fvd bbkth pkmbk pbmhl zhvsdc dmpl xcdb rmpnm rnxl lhb sks ssgkt vrzkz brhfcbt xzhct vzzxl pjgxpg ftfx fhpxz njcjm scqc hqjgzmt rkzqs lnpbh zjsh fzpds ctmzsr brhns trlmqn vlqtzzl lmpxcr jrcczb vllxj hphcb hxfrh rls qdbq znklc tsnhq dxpdkp cpj bhlbm zjdzx czlpq (contains eggs) 31 | hhth vkjggtx nmq zmhnj dmpl spzmvfl qfnq vzzxl pkgsf fjbjj rvnfn pkmbk frnh knhvxm vrzkz ctmzsr xcdb mbdksj nvdst cf fvd flhzd kxl cvz qbnkj hkzzg jtzsqznl rnxl sbsrk klfp cqbkj jsdcr rkzqs jhrgz nmszz slglnd nqstv qdbj zjsh tkrr zmf (contains nuts) 32 | nvbr ghtjbp nvdst fvd mkpxx xlqj dkxr znfrgvc mbdksj vfnv rph zpbbvvm gpplt ctmzsr rsrgmkr cvz ztlbvp rkzqs bbkth nfzczn hphcb httx zjsh zmhnj zhvsdc qsrh jsdcr gztf jrnfp trlmqn bccz pchhkp lhb qbnkj fjbjj dpkdp dxpdkp cgrcmp vlqtzzl zjsz rlxhc jgkp pkgsf jrlvkz nqhk tsnhq czlpq ckzdf vrzkz (contains nuts) 33 | tjxp xvmftv znklc ghfk svrx pbtns rgt fzgbq cgrcmp qvhdl lvjrbms rmpnm zmf cvz vzzxl bhlbm qllxhr pznl dfpqn ltxqz mbdksj bbkth jsdcr dkxr hdnq kxl nfzczn vpl jhrgz snxz trlmqn vrpzss njcjm gpplt zjsh dqdn ftfx zmhnj brhfcbt dmpl ztlbvp ctmzsr xcdb frnh nmszz jrcczb cpsbgsh vkjggtx knhvxm xfvtzq bxhsq xrlmvz rph jrnfp fhpxz cqbkj pdxhgx bqfqcjb lnpbh nmq frz gjvqffm klfp lqdpl rkzqs httx qdbj vrzkz pchhkp fzpds sks ttr gmx tqtbd (contains sesame soy) 34 | lnpbh czlpq cpsbgsh zjsh rsrgmkr jmxpbtk vtrltkq cqbkj bxhsq vrzkz rnxl znfrgvc hqjgzmt pkgsf rlxhc dmpl lqdpl qbtpnr ghtjbp drpxzr scqc ztlbvp dxpdkp znklc kxl hphcb ctmzsr cgrcmp xlqj tkrr mkpxx rkzqs qvhdl qdbq gjvqffm cf gztf qglps gbzcv zpbbvvm frnh vfnv qbnkj vfhvp sks zvmnv mbdksj jrlvkz qlt rvnfn vkjggtx zmhnj (contains nuts sesame) 35 | pkgsf rkzqs ckzdf fvvjp lhsgbq tsnhq tkrr qvhft qnt jtfnm vrzkz mkpxx lqtnn nllks qdbj pmhnmxr qdbq httx nmq pjgxpg bqfqcjb lmpxcr vlqtzzl rzjcs rncjx rvnfn cgrcmp ctmzsr rmpnm dmpl gnrb dfpqn jhrgz zjdzx nlxh zvmnv fvpj zjsh drpxzr mxk hbvqn vrtfrj jrnfp ghtjbp trlmqn dlc bccz hbbz nqstv vttzh pkmbk fzgbq bgdq ssgkt vrpzss vzzxl mbdksj hhth zmhnj dxpdkp rmthpj lqdpl (contains soy) 36 | ltxqz vttzh frnh hdkc rmthpj hxfrh bgdq jtfnm qbtpnr rlxhc tnjxcf lvjrbms ttr scqc dxpdkp rncjx hphcb vkjggtx qfvvf qzbzd jrnfp xlqj jrlvkz lsc rvnfn knqlqt zjdzx hqlm gbzcv qbnkj mbdksj qnt qpgj dkxr gjvqffm vllxj hmshx znfrgvc nvhnsg tqtbd hkzzg zpbbvvm cpsbgsh zdrlf sltl pkmbk rzjcs fzgbq trlmqn vzzxl czlpq rkzqs fptpk jgxbzks nqhk slmjchql vrtfrj ftfx ghfk fhpxz ctmzsr fmkbnr rls rcv snxz qlt zqgzlr zmhnj bqb nlxh vrpzss pchhkp vrzkz (contains soy) 37 | jrcczb xfvtzq nmszz sbsrk dpkdp pdxhgx cgrcmp qbnkj mbdksj rkzqs scqc rxzxs xzhct mkpxx ttr qglps vzzxl xlqj jsdcr pbtns qzbzd fvvjp vllxj zjsz frnh gnrb vpl zdrlf gztf vrpzss vrzkz dmpl hphcb gbzcv rgt kxl ctmzsr nlxh zjsh lvjrbms sltl brhfcbt lsc pmhnmxr fhpxz qsrh vkjggtx zcxxdp drpxzr jgxbzks (contains peanuts) 38 | tcp vlqtzzl zjsh rkzqs drpxzr cqbkj ftfx gbzcv xvmftv fptpk rncjx rnxl jtfnm nqstv znfrgvc jsdcr zmhnj jrnfp qfnq hphcb vzzxl bbkth flhzd jgxbzks ssgkt xcdb fvpj rlxhc ztrpkb qsrh qbtpnr bqfqcjb xzhct pznl hdnq qlt tjxp lvjrbms fhpxz cpj dpkdp mbdksj qpgj vrzkz xrlmvz rvnfn snxz hdkc ltxqz zjsz hxfrh pmhnmxr (contains nuts fish peanuts) 39 | vrtfrj ctmzsr zpbbvvm nvdst qvhdl rlxhc pbtns tcp lsc vrzkz dqdn hmshx fptpk rph rgt vllxj dbfk dkxr ttr nmszz qvhft znjp fhpxz jgv ftfx zjdzx zjsh znfrgvc qdbj vkjggtx znklc lhsgbq jsdcr frz pspjgzx pkmbk vpl pkgsf vfnv dnzljk hqlm klfp zmhnj njcjm pdxhgx dlc cntfbt ghtjbp qpgj rkzqs vtrltkq jrcczb fzgbq fjbjj vzzxl cgrcmp lvjrbms vlqtzzl hphcb svrx dmpl dxpdkp pjgxpg bbkth ztlbvp rncjx cqbkj (contains shellfish eggs soy) 40 | spzmvfl bccz xzhct qdbj qllxhr jgv rkzqs slglnd qlt tjxp rncjx rnxl fvpj fjbjj zhvsdc qnt nvbr mbdksj tkrr hphcb rcv znklc qdbq fzgbq nlxh rph rlxhc msvgj lhsgbq dfpqn cqbkj vrzkz znfrgvc tqtbd cntfbt zmhnj vrpzss xrlmvz flhzd zjsh httx znjp nmszz pbmhl pspjgzx ctmzsr kxl ftfx qzbzd zpbbvvm scqc jtfnm njcjm fvvjp (contains soy shellfish fish) 41 | brhns bbkth jtfnm znklc xzhct jrnfp tcp fptpk cqbkj mkpxx vpl ssgkt jgkp rmthpj hxfrh fvvjp zjsh pkgsf fzpds zmhnj tqtbd ltxqz rkzqs pmhnmxr rnxl gztf qvhft rxzxs qsrh ctmzsr fvd sks qbnkj xrlmvz rzjcs zmf hbvqn qbtpnr mbdksj nlxh nvdst ghtjbp slmjchql hphcb lhb zvmnv xcdb vllxj hmshx znjp vrpzss dbfk pchhkp klfp lqtnn bxhsq slglnd vlqtzzl cvz zdrlf vrzkz cpsbgsh nvhnsg pkmbk fzgbq dfpqn dlc fmkbnr cvtj (contains dairy) 42 | jtzsqznl bhlbm lsc lhb zpbbvvm ftfx znjp hphcb nqstv zjsh dksfbk pchhkp fzgbq pmhnmxr vrpzss knhvxm mbdksj pbmhl rkzqs httx bqfqcjb qvhft lqdpl jrlvkz zmhnj sks qbnkj nvdst czlpq pznl tnjxcf tkrr vrzkz hkzzg cf zdrlf nfzczn jrnfp gmx spzmvfl vzzxl rnxl znfrgvc dqdn jgxbzks jtfnm xcdb (contains nuts) 43 | --------------------------------------------------------------------------------