├── .formatter.exs ├── .gitattributes ├── .github └── workflows │ └── elixir.yml ├── .gitignore ├── .iex.exs ├── .tool-versions ├── README.md ├── config └── config.exs ├── lib ├── advent.ex ├── advent │ ├── day.ex │ ├── grid.ex │ ├── path_grid.ex │ └── stats.ex ├── mix │ └── tasks │ │ ├── bench.ex │ │ ├── day.ex │ │ └── update_readme_stars.ex ├── y2015 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day23.txt │ │ └── day24.txt ├── y2016 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day10 │ │ ├── bot.ex │ │ └── output.ex │ ├── day11.ex │ ├── day11 │ │ ├── elevator.ex │ │ ├── floor.ex │ │ └── state.ex │ ├── day12.ex │ ├── day13.ex │ ├── day13 │ │ └── position.ex │ ├── day14.ex │ ├── day14 │ │ └── cache.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day20.txt │ │ ├── day21.txt │ │ ├── day22.txt │ │ ├── day23.txt │ │ ├── day24.txt │ │ └── day25.txt ├── y2017 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day03 │ │ ├── board.ex │ │ ├── coordinate.ex │ │ └── progress.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day07 │ │ └── program.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day13 │ │ └── layer.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day182.ex │ ├── day182 │ │ └── program.ex │ ├── day19.ex │ ├── day20.ex │ ├── day20 │ │ └── particle.ex │ ├── day21.ex │ ├── day21 │ │ └── rule.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day20.txt │ │ ├── day21.txt │ │ ├── day22.txt │ │ ├── day23.txt │ │ ├── day24.txt │ │ └── day25.txt ├── y2018 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day13 │ │ └── cart.ex │ ├── day14.ex │ ├── day15.ex │ ├── day15 │ │ └── unit.ex │ ├── day16.ex │ ├── day17.ex │ ├── day17 │ │ └── ground.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day10.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day15.txt │ │ ├── day16_part1.txt │ │ ├── day16_part2.txt │ │ ├── day17.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day20.txt │ │ ├── day21.txt │ │ ├── day23.txt │ │ └── day25.txt ├── y2019 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day07 │ │ └── amplifier.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day12 │ │ └── moon.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day17.txt │ │ ├── day18-part2.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day20.txt │ │ └── day21.txt │ └── intcode.ex ├── y2020 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day18 │ │ └── screwy_operators.ex │ ├── day19.ex │ ├── day20.ex │ ├── day20 │ │ └── tile.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day16.txt │ │ ├── day17.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ └── day20.txt ├── y2021 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day11 │ │ └── extras.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day18.txt │ │ ├── day20.txt │ │ ├── day22.txt │ │ ├── day24.txt │ │ └── day25.txt ├── y2022 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ ├── day24.ex │ ├── day25.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day17.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day20.txt │ │ ├── day21.txt │ │ ├── day22.txt │ │ ├── day23.txt │ │ ├── day24.txt │ │ └── day25.txt ├── y2023 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ ├── day21.ex │ ├── day22.ex │ ├── day23.ex │ └── input │ │ ├── day01.txt │ │ ├── day02.txt │ │ ├── day03.txt │ │ ├── day04.txt │ │ ├── day05.txt │ │ ├── day06.txt │ │ ├── day07.txt │ │ ├── day08.txt │ │ ├── day09.txt │ │ ├── day10.txt │ │ ├── day11.txt │ │ ├── day12.txt │ │ ├── day13.txt │ │ ├── day14.txt │ │ ├── day15.txt │ │ ├── day16.txt │ │ ├── day17.txt │ │ ├── day18.txt │ │ ├── day19.txt │ │ ├── day20.txt │ │ ├── day21.txt │ │ ├── day22.txt │ │ └── day23.txt └── y2024 │ ├── README.md │ ├── day01.ex │ ├── day02.ex │ ├── day03.ex │ ├── day04.ex │ ├── day05.ex │ ├── day06.ex │ ├── day07.ex │ ├── day08.ex │ ├── day09.ex │ ├── day10.ex │ ├── day11.ex │ ├── day12.ex │ ├── day13.ex │ ├── day14.ex │ ├── day15.ex │ ├── day16.ex │ ├── day17.ex │ ├── day18.ex │ ├── day19.ex │ ├── day20.ex │ └── input │ ├── day01.txt │ ├── day02.txt │ ├── day03.txt │ ├── day04.txt │ ├── day05.txt │ ├── day06.txt │ ├── day07.txt │ ├── day08.txt │ ├── day09.txt │ ├── day10.txt │ ├── day11.txt │ ├── day12.txt │ ├── day13.txt │ ├── day14.txt │ ├── day15.txt │ ├── day16.txt │ ├── day17.txt │ ├── day18.txt │ ├── day19.txt │ └── day20.txt ├── mix.exs ├── mix.lock ├── pre-commit ├── priv └── templates │ ├── day.ex │ ├── day.txt │ └── day_test.ex └── test ├── test_helper.exs ├── y2015 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ ├── day08.txt │ └── day13.txt ├── y2016 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ └── day22 │ └── part2_sample.txt ├── y2017 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ ├── day07.txt │ ├── day08.txt │ ├── day12.txt │ └── day19.txt ├── y2018 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ ├── day13 │ ├── crash.txt │ ├── intersecting_carts.txt │ ├── removing_crashes.txt │ ├── removing_crashes_overlapping.txt │ └── simple_loop.txt │ ├── day15 │ ├── all_units_movement.txt │ ├── full_match_1.txt │ ├── full_match_2.txt │ ├── full_match_3.txt │ ├── full_match_4.txt │ ├── full_match_5.txt │ ├── full_match_6.txt │ ├── full_match_7.txt │ ├── more_movement.txt │ ├── more_movement_2.txt │ ├── movement.txt │ ├── parse_input.txt │ ├── part_2_first.txt │ └── turn_by_turn.txt │ ├── day17 │ ├── edge_case.txt │ ├── sample.txt │ └── sample_picture.txt │ ├── day18 │ ├── sample.txt │ └── sample_small.txt │ └── day19 │ └── sample.txt ├── y2019 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── input │ ├── day10 │ │ ├── sample_2.txt │ │ ├── sample_3.txt │ │ ├── sample_4.txt │ │ ├── sample_5.txt │ │ └── sample_6.txt │ ├── day14 │ │ ├── sample_1.txt │ │ ├── sample_2.txt │ │ ├── sample_3.txt │ │ ├── sample_4.txt │ │ └── sample_5.txt │ └── day20 │ │ ├── sample_1.txt │ │ ├── sample_2.txt │ │ └── sample_3.txt └── intcode_test.exs ├── y2020 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs └── input │ ├── day11 │ ├── initial.txt │ ├── p1_round2.txt │ ├── p1_round3.txt │ ├── p1_round4.txt │ ├── p1_round5.txt │ ├── p2_round2.txt │ ├── p2_round3.txt │ ├── p2_round4.txt │ ├── p2_round5.txt │ ├── p2_round6.txt │ └── round1.txt │ ├── day19 │ └── part2.txt │ └── day20 │ ├── sample.txt │ └── small.txt ├── y2021 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ ├── day08.txt │ ├── day09.txt │ ├── day10.txt │ └── day15.txt ├── y2022 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs ├── day24_test.exs ├── day25_test.exs └── input │ └── day10.txt ├── y2023 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs ├── day21_test.exs ├── day22_test.exs ├── day23_test.exs └── input │ └── day16 │ └── sample.txt └── y2024 ├── day01_test.exs ├── day02_test.exs ├── day03_test.exs ├── day04_test.exs ├── day05_test.exs ├── day06_test.exs ├── day07_test.exs ├── day08_test.exs ├── day09_test.exs ├── day10_test.exs ├── day11_test.exs ├── day12_test.exs ├── day13_test.exs ├── day14_test.exs ├── day15_test.exs ├── day16_test.exs ├── day17_test.exs ├── day18_test.exs ├── day19_test.exs ├── day20_test.exs └── input ├── day16 ├── sample1.txt └── sample2.txt └── day18 └── sample.txt /.formatter.exs: -------------------------------------------------------------------------------- 1 | # Used by "mix format" 2 | [ 3 | inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] 4 | ] 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | lib/y*/input/day*.txt filter=git-crypt diff=git-crypt 2 | test/y*/input/**/*.txt filter=git-crypt diff=git-crypt 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # The directory Mix will write compiled artifacts to. 2 | /_build/ 3 | 4 | # If you run "mix test --cover", coverage assets end up here. 5 | /cover/ 6 | 7 | # The directory Mix downloads your dependencies sources to. 8 | /deps/ 9 | 10 | # Where third-party dependencies like ExDoc output generated docs. 11 | /doc/ 12 | 13 | # Ignore .fetch files in case you like to edit your project deps locally. 14 | /.fetch 15 | 16 | # If the VM crashes, it generates a dump, let's ignore it too. 17 | erl_crash.dump 18 | 19 | # Also ignore archive artifacts (built via "mix archive.build"). 20 | *.ez 21 | 22 | # Ignore package tarball (built via "mix hex.build"). 23 | advent-*.tar 24 | 25 | # Temporary files, for example, from tests. 26 | /tmp/ 27 | 28 | .DS_Store 29 | -------------------------------------------------------------------------------- /.iex.exs: -------------------------------------------------------------------------------- 1 | alias Y2024.{Day01, Day02, Day03, Day04, Day05, Day06, Day07, Day08, Day09, Day10} 2 | alias Y2024.{Day11, Day12, Day13, Day14, Day15, Day16, Day17, Day18, Day19, Day20} 3 | alias Y2024.{Day21, Day22, Day23, Day24, Day25} 4 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | elixir 1.18.0-otp-27 2 | erlang 27.1.2 3 | -------------------------------------------------------------------------------- /config/config.exs: -------------------------------------------------------------------------------- 1 | import Config 2 | 3 | # Allow non-UTC timezone checks - AOC is in UTC-5 4 | config :elixir, :time_zone_database, Tz.TimeZoneDatabase 5 | -------------------------------------------------------------------------------- /lib/advent/stats.ex: -------------------------------------------------------------------------------- 1 | defmodule Advent.Stats do 2 | def years, do: 2015..DateTime.utc_now().year 3 | 4 | def count_complete_puzzles(year) do 5 | for(day <- 25..1//-1, part <- [2, 1], do: {day, part}) 6 | |> Enum.filter(fn {day, part} -> complete?(year, day, part) end) 7 | |> Enum.count() 8 | end 9 | 10 | # You get the last star only if you have all 49 other stars. 11 | def complete?(year, 25, 2) do 12 | for(day <- 25..1//-1, part <- [2, 1], do: {day, part}) 13 | |> tl() 14 | |> Enum.all?(fn {day, part} -> complete?(year, day, part) end) 15 | end 16 | 17 | def complete?(year, day, part) do 18 | # Any completed puzzle will have a function defined like `Y2021.Day01.part1_verify/0` 19 | module_name = :"Elixir.Y#{year}.Day#{zero_pad(day)}" 20 | function_name = :"part#{part}_verify" 21 | 22 | Code.ensure_loaded(module_name) 23 | Kernel.function_exported?(module_name, function_name, 0) 24 | end 25 | 26 | defp zero_pad(day) when day < 10, do: "0#{day}" 27 | defp zero_pad(day), do: "#{day}" 28 | end 29 | -------------------------------------------------------------------------------- /lib/mix/tasks/bench.ex: -------------------------------------------------------------------------------- 1 | defmodule Mix.Tasks.Bench do 2 | @moduledoc """ 3 | Run all daily benchmarks for a given year. 4 | """ 5 | 6 | use Mix.Task 7 | 8 | def run([]) do 9 | Mix.Shell.IO.error("Please provide a year, eg. `mix bench 2015`") 10 | end 11 | 12 | def run([year]) do 13 | year 14 | |> all_benchmarks_for_year() 15 | |> Benchee.run(Advent.Day.benchee_config()) 16 | end 17 | 18 | defp all_benchmarks_for_year(year) do 19 | {:ok, modules} = :application.get_key(:advent, :modules) 20 | 21 | modules 22 | |> Enum.filter(fn module -> only_day_modules(module, year) end) 23 | |> Enum.flat_map(&benchmarks/1) 24 | |> Enum.into(%{}) 25 | end 26 | 27 | defp only_day_modules(module_name, year) do 28 | module_name 29 | |> Atom.to_string() 30 | |> String.match?(~r/^Elixir.Y#{year}.Day\d{2}$/) 31 | end 32 | 33 | defp benchmarks(module_name) do 34 | apply(module_name, :benchmarks, []) 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /lib/mix/tasks/day.ex: -------------------------------------------------------------------------------- 1 | defmodule Mix.Tasks.Day do 2 | use Mix.Task 3 | import Mix.Generator, only: [copy_template: 3] 4 | 5 | def run([year, day]) do 6 | formatted_day = String.pad_leading(day, 2, "0") 7 | 8 | file_path = Path.join([File.cwd!(), "lib", "y#{year}", "day#{formatted_day}.ex"]) 9 | copy_template("priv/templates/day.ex", file_path, year: year, day: formatted_day) 10 | 11 | test_path = Path.join([File.cwd!(), "test", "y#{year}", "day#{formatted_day}_test.exs"]) 12 | copy_template("priv/templates/day_test.ex", test_path, year: year, day: formatted_day) 13 | 14 | input_path = Path.join([File.cwd!(), "lib", "y#{year}", "input", "day#{formatted_day}.txt"]) 15 | copy_template("priv/templates/day.txt", input_path, year: year, day: formatted_day) 16 | end 17 | 18 | def run([]) do 19 | "Please provide the day number to generate a template for, eg. `mix day 2021 7` for 2021 day 7" 20 | |> Mix.Shell.IO.error() 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /lib/y2015/day01.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day01 do 2 | use Advent.Day, no: 1 3 | 4 | @doc """ 5 | iex> Day01.part1("(())") 6 | 0 7 | 8 | iex> Day01.part1("(()(()(") 9 | 3 10 | 11 | iex> Day01.part1("))(") 12 | -1 13 | 14 | iex> Day01.part1(")))") 15 | -3 16 | """ 17 | def part1(string, floor \\ 0) 18 | def part1("", floor), do: floor 19 | def part1(<<"(", rest::binary>>, floor), do: part1(rest, floor + 1) 20 | def part1(<<")", rest::binary>>, floor), do: part1(rest, floor - 1) 21 | 22 | @doc """ 23 | iex> Day01.part2(")") 24 | 1 25 | 26 | iex> Day01.part2("()())") 27 | 5 28 | """ 29 | def part2(string, floor \\ 0, index \\ 0) 30 | def part2(_, floor, index) when floor < 0, do: index 31 | def part2(<<"(", rest::binary>>, floor, index), do: part2(rest, floor + 1, index + 1) 32 | def part2(<<")", rest::binary>>, floor, index), do: part2(rest, floor - 1, index + 1) 33 | 34 | def part1_verify do 35 | input() |> part1() 36 | end 37 | 38 | def part2_verify do 39 | input() |> part2() 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /lib/y2015/day04.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day04 do 2 | use Advent.Day, no: 4 3 | 4 | @doc """ 5 | iex> Day04.part1("abcdef") 6 | 609043 7 | 8 | iex> Day04.part1("pqrstuv") 9 | 1048970 10 | """ 11 | def part1(input), do: do_parts(input, 0, 16) 12 | def part2(input), do: do_parts(input, 0, 0) 13 | 14 | defp do_parts(input, counter, max) do 15 | # Five zeros translates to the first 20 bits being zero, six zeros is 24 bits. 16 | # I don't think Elixir can pluck just 20 bits, so take 24, and for the five zero case, we 17 | # don't care about last four bits? 18 | # This way we don't need to do the hexadecimal encoding at all 19 | <> = :erlang.md5("#{input}#{counter}") 20 | 21 | if val <= max do 22 | counter 23 | else 24 | do_parts(input, counter + 1, max) 25 | end 26 | end 27 | 28 | def part1_verify, do: part1("yzbqklnj") 29 | def part2_verify, do: part2("yzbqklnj") 30 | end 31 | -------------------------------------------------------------------------------- /lib/y2015/day17.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day17 do 2 | use Advent.Day, no: 17 3 | 4 | @input [50, 44, 11, 49, 42, 46, 18, 32, 26, 40, 21, 7, 18, 43, 10, 47, 36, 24, 22, 40] 5 | @litres 150 6 | 7 | @doc """ 8 | iex> Day17.part1([20, 15, 10, 5, 5], 25) 9 | 4 10 | """ 11 | def part1(input \\ @input, litres \\ @litres) do 12 | 1..length(input) 13 | |> Enum.reduce([], fn length, acc -> acc ++ Advent.combinations(input, length) end) 14 | |> Enum.filter(fn list -> Enum.sum(list) == litres end) 15 | |> Enum.count() 16 | end 17 | 18 | @doc """ 19 | iex> Day17.part2([20, 15, 10, 5, 5], 25) 20 | 3 21 | """ 22 | def part2(input \\ @input, litres \\ @litres) do 23 | valid_lists = 24 | 1..length(input) 25 | |> Enum.reduce([], fn length, acc -> acc ++ Advent.combinations(input, length) end) 26 | |> Enum.filter(fn list -> Enum.sum(list) == litres end) 27 | 28 | shortest = Enum.min_by(valid_lists, fn list -> length(list) end) |> length 29 | 30 | Enum.count(valid_lists, fn list -> length(list) == shortest end) 31 | end 32 | 33 | def part1_verify, do: part1() 34 | def part2_verify, do: part2() 35 | end 36 | -------------------------------------------------------------------------------- /lib/y2015/day24.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day24 do 2 | use Advent.Day, no: 24 3 | 4 | def part1(input), do: do_parts(input, 3) 5 | def part2(input), do: do_parts(input, 4) 6 | 7 | defp do_parts(input, num_buckets) do 8 | bucket_size = div(Enum.sum(input), num_buckets) 9 | check_bucket_size(input, bucket_size, 1) 10 | end 11 | 12 | def check_bucket_size(packages, bucket_size, count) do 13 | matches = 14 | Advent.combinations(packages, count) 15 | |> Enum.filter(fn list -> Enum.sum(list) == bucket_size end) 16 | 17 | if matches == [] do 18 | check_bucket_size(packages, bucket_size, count + 1) 19 | else 20 | matches 21 | |> Enum.min_by(&quantum_entanglement/1) 22 | |> quantum_entanglement() 23 | end 24 | end 25 | 26 | def quantum_entanglement(set) do 27 | Enum.reduce(set, 1, fn x, acc -> acc * x end) 28 | end 29 | 30 | def parse_input(input) do 31 | input 32 | |> String.split("\n") 33 | |> Enum.map(&String.to_integer/1) 34 | end 35 | 36 | def part1_verify, do: input() |> parse_input() |> part1() 37 | def part2_verify, do: input() |> parse_input() |> part2() 38 | end 39 | -------------------------------------------------------------------------------- /lib/y2015/day25.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day25 do 2 | use Advent.Day, no: 25 3 | 4 | @row 2981 5 | @col 3075 6 | 7 | @doc """ 8 | iex> Day25.part1(3, 4) 9 | 7981243 10 | 11 | iex> Day25.part1(6, 2) 12 | 6796745 13 | """ 14 | def part1(row \\ @row, col \\ @col) do 15 | number = position(row, col) 16 | next_number(20_151_125, 1, number) 17 | end 18 | 19 | defp next_number(current, index, max) when index == max, do: current 20 | 21 | defp next_number(current, index, max) do 22 | next_number(rem(current * 252_533, 33_554_393), index + 1, max) 23 | end 24 | 25 | @doc """ 26 | iex> Day25.position(1, 1) 27 | 1 28 | 29 | iex> Day25.position(3, 4) 30 | 19 31 | 32 | iex> Day25.position(5, 2) 33 | 17 34 | """ 35 | def position(row, col) do 36 | # Seems to work! Kinda adapted from https://brilliant.org/wiki/sum-of-n-n2-or-n3/ 37 | base_row = row + col - 2 38 | div(base_row * (base_row + 1), 2) + col 39 | end 40 | 41 | def part1_verify, do: part1() 42 | end 43 | -------------------------------------------------------------------------------- /lib/y2015/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day01.txt -------------------------------------------------------------------------------- /lib/y2015/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day02.txt -------------------------------------------------------------------------------- /lib/y2015/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day03.txt -------------------------------------------------------------------------------- /lib/y2015/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day05.txt -------------------------------------------------------------------------------- /lib/y2015/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day06.txt -------------------------------------------------------------------------------- /lib/y2015/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day07.txt -------------------------------------------------------------------------------- /lib/y2015/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day08.txt -------------------------------------------------------------------------------- /lib/y2015/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day09.txt -------------------------------------------------------------------------------- /lib/y2015/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day12.txt -------------------------------------------------------------------------------- /lib/y2015/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day13.txt -------------------------------------------------------------------------------- /lib/y2015/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day14.txt -------------------------------------------------------------------------------- /lib/y2015/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day15.txt -------------------------------------------------------------------------------- /lib/y2015/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day16.txt -------------------------------------------------------------------------------- /lib/y2015/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day18.txt -------------------------------------------------------------------------------- /lib/y2015/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day19.txt -------------------------------------------------------------------------------- /lib/y2015/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day23.txt -------------------------------------------------------------------------------- /lib/y2015/input/day24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2015/input/day24.txt -------------------------------------------------------------------------------- /lib/y2016/day10/bot.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day10.Bot do 2 | defstruct status: :pending, 3 | holding: [], 4 | low_to: nil, 5 | high_to: nil, 6 | comparisons: nil 7 | 8 | def new(), do: %__MODULE__{comparisons: MapSet.new()} 9 | 10 | def drop_pieces(%__MODULE__{} = bot, comparison) do 11 | bot 12 | |> Map.put(:status, :done) 13 | |> Map.put(:holding, []) 14 | |> Map.update!(:comparisons, &MapSet.put(&1, comparison)) 15 | end 16 | 17 | def hold(%__MODULE__{} = bot, value) do 18 | bot 19 | |> Map.put(:status, :pending) 20 | |> Map.update!(:holding, &[maybe_int(value) | &1]) 21 | end 22 | 23 | def set_rule(%__MODULE__{} = bot, low_to, high_to) do 24 | %{bot | high_to: high_to, low_to: low_to} 25 | end 26 | 27 | def made_comparison?(%__MODULE__{} = bot, comparison) do 28 | Enum.member?(bot.comparisons, comparison) 29 | end 30 | 31 | def made_comparison?(_, _), do: false 32 | 33 | defp maybe_int(value) when is_integer(value), do: value 34 | defp maybe_int(value) when is_binary(value), do: String.to_integer(value) 35 | end 36 | -------------------------------------------------------------------------------- /lib/y2016/day10/output.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day10.Output do 2 | defstruct holding: nil, status: :done 3 | 4 | def new(), do: %__MODULE__{} 5 | 6 | def hold(%__MODULE__{} = output, value) do 7 | %{output | holding: value} 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/y2016/day11/elevator.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day11.Elevator do 2 | alias Y2016.Day11.State 3 | 4 | @doc """ 5 | iex> Elevator.valid_moves(%State{elevator: 1, floors: [ 6 | ...> %Floor{number: 1}, %Floor{number: 2}]}) 7 | [2] 8 | 9 | iex> Elevator.valid_moves(%State{elevator: 2, floors: [ 10 | ...> %Floor{number: 1}, %Floor{number: 2}]}) 11 | [1] 12 | 13 | iex> Elevator.valid_moves(%State{elevator: 2, floors: [ 14 | ...> %Floor{number: 1}, %Floor{number: 2}, 15 | ...> %Floor{number: 3}]}) 16 | [1, 3] 17 | """ 18 | def valid_moves(%State{floors: floors, elevator: elevator}) do 19 | [elevator + 1, elevator - 1] 20 | |> Enum.filter(fn floor -> Enum.any?(floors, &(&1.number == floor)) end) 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /lib/y2016/day13/position.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day13.Position do 2 | def initial, do: [1, 1] 3 | 4 | @doc """ 5 | iex> Position.wall?([0, 0], 10) 6 | false 7 | 8 | iex> Position.wall?([0, 2], 10) 9 | true 10 | 11 | iex> Position.wall?([6, 1], 10) 12 | false 13 | 14 | iex> Position.wall?([3, 5], 10) 15 | true 16 | """ 17 | def wall?([x, y], magic_number) do 18 | val = 19 | (x * x + 3 * x + 2 * x * y + y + y * y + magic_number) 20 | |> Integer.digits(2) 21 | |> Enum.count(&(&1 == 1)) 22 | |> rem(2) 23 | 24 | val == 1 25 | end 26 | 27 | def winning?(current, destination), do: current == destination 28 | 29 | @doc """ 30 | iex> Position.legal_moves([0, 0], 10) 31 | [[0, 1]] 32 | 33 | iex> Position.legal_moves([2, 2], 10) 34 | [[1, 2], [3, 2]] 35 | """ 36 | def legal_moves([x, y], magic_number) do 37 | [[x - 1, y], [x + 1, y], [x, y - 1], [x, y + 1]] 38 | |> Enum.reject(fn [x, y] -> x < 0 || y < 0 end) 39 | |> Enum.reject(fn position -> wall?(position, magic_number) end) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /lib/y2016/day14/cache.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day14.Cache do 2 | use Agent 3 | 4 | # Public API 5 | def start(hash_fn, salt) do 6 | {:ok, pid} = Agent.start_link(fn -> {hash_fn, salt, Map.new()} end) 7 | pid 8 | end 9 | 10 | def hash(pid, index) do 11 | Agent.get_and_update(pid, fn {hash_fn, salt, cache} -> 12 | key = key(index) 13 | cache = Map.put_new_lazy(cache, key, fn -> hash_fn.(index, salt) end) 14 | {Map.get(cache, key), {hash_fn, salt, cache}} 15 | end) 16 | end 17 | 18 | # Private functions 19 | def key(index), do: Integer.to_string(index) 20 | end 21 | -------------------------------------------------------------------------------- /lib/y2016/day18.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day18 do 2 | use Advent.Day, no: 18 3 | 4 | @input ".^^^^^.^^.^^^.^...^..^^.^.^..^^^^^^^^^^..^...^^.^..^^^^..^^^^...^.^.^^^^^^^^....^..^^^^^^.^^^.^^^.^^" 5 | 6 | def part1(input \\ @input, rows \\ 40) do 7 | Enum.reduce(1..(rows - 1), [parse_input(input)], fn _x, acc -> 8 | [next_row(hd(acc)) | acc] 9 | end) 10 | |> Enum.map(&count_safe/1) 11 | |> Enum.sum() 12 | end 13 | 14 | def next_row(row) do 15 | ([:s] ++ row ++ [:s]) 16 | |> Enum.chunk_every(3, 1, :discard) 17 | |> Enum.map(&check_rules/1) 18 | end 19 | 20 | defp count_safe(row), do: Enum.count(row, fn char -> char == :s end) 21 | 22 | defp check_rules([:t, :t, :s]), do: :t 23 | defp check_rules([:s, :t, :t]), do: :t 24 | defp check_rules([:t, :s, :s]), do: :t 25 | defp check_rules([:s, :s, :t]), do: :t 26 | defp check_rules(_), do: :s 27 | 28 | defp parse_input(input) do 29 | input 30 | |> String.codepoints() 31 | |> Enum.map(&to_symbol/1) 32 | end 33 | 34 | defp to_symbol("."), do: :s 35 | defp to_symbol("^"), do: :t 36 | 37 | def part1_verify, do: part1() 38 | def part2_verify, do: part1(@input, 400_000) 39 | end 40 | -------------------------------------------------------------------------------- /lib/y2016/day23.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day23 do 2 | use Advent.Day, no: 23 3 | 4 | alias Y2016.Day12 5 | 6 | def part1_verify do 7 | input() |> Day12.parse_input() |> Day12.run_assembunny_code({7, 0, 0, 0}) |> elem(0) 8 | end 9 | 10 | def part2_verify do 11 | input() |> Day12.parse_input() |> Day12.run_assembunny_code({12, 0, 0, 0}) |> elem(0) 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /lib/y2016/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day01.txt -------------------------------------------------------------------------------- /lib/y2016/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day02.txt -------------------------------------------------------------------------------- /lib/y2016/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day03.txt -------------------------------------------------------------------------------- /lib/y2016/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day04.txt -------------------------------------------------------------------------------- /lib/y2016/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day06.txt -------------------------------------------------------------------------------- /lib/y2016/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day07.txt -------------------------------------------------------------------------------- /lib/y2016/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day08.txt -------------------------------------------------------------------------------- /lib/y2016/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day09.txt -------------------------------------------------------------------------------- /lib/y2016/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day10.txt -------------------------------------------------------------------------------- /lib/y2016/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day11.txt -------------------------------------------------------------------------------- /lib/y2016/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day12.txt -------------------------------------------------------------------------------- /lib/y2016/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day20.txt -------------------------------------------------------------------------------- /lib/y2016/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day21.txt -------------------------------------------------------------------------------- /lib/y2016/input/day22.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day22.txt -------------------------------------------------------------------------------- /lib/y2016/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day23.txt -------------------------------------------------------------------------------- /lib/y2016/input/day24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day24.txt -------------------------------------------------------------------------------- /lib/y2016/input/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2016/input/day25.txt -------------------------------------------------------------------------------- /lib/y2017/day02.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day02 do 2 | use Advent.Day, no: 02 3 | 4 | def part1(input) do 5 | input 6 | |> String.trim() 7 | |> String.split("\n") 8 | |> Enum.map(&to_ints/1) 9 | |> Enum.map(&part_1_line_value/1) 10 | |> Enum.sum() 11 | end 12 | 13 | def part2(input) do 14 | input 15 | |> String.trim() 16 | |> String.split("\n") 17 | |> Enum.map(&to_ints/1) 18 | |> Enum.map(&part_2_line_value/1) 19 | |> Enum.sum() 20 | end 21 | 22 | defp to_ints(line) do 23 | line 24 | |> String.split() 25 | |> Enum.map(&String.to_integer/1) 26 | end 27 | 28 | defp part_1_line_value(line) do 29 | Enum.max(line) - Enum.min(line) 30 | end 31 | 32 | defp part_2_line_value(line) do 33 | line 34 | |> Enum.sort() 35 | |> find_divisible([]) 36 | end 37 | 38 | defp find_divisible([x | xs], ys) do 39 | case Enum.find(ys, fn y -> rem(x, y) == 0.0 end) do 40 | nil -> find_divisible(xs, [x | ys]) 41 | y -> div(x, y) 42 | end 43 | end 44 | 45 | def part1_verify, do: input() |> part1() 46 | def part2_verify, do: input() |> part2() 47 | end 48 | -------------------------------------------------------------------------------- /lib/y2017/day03/board.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day03.Board do 2 | alias Y2017.Day03.{Coordinate, Progress} 3 | 4 | def build(input, fun) do 5 | do_build(Enum.into(1..input, []), [%Coordinate{}], Progress.new(), fun) 6 | end 7 | 8 | defp do_build([_num], coordinates, _, _), do: coordinates 9 | 10 | defp do_build([num | nums], coordinates, progress, fun) do 11 | {new_progress, new_coordinate} = Progress.increment(progress, coordinates, fun.(num)) 12 | do_build(nums, [new_coordinate | coordinates], new_progress, fun) 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /lib/y2017/day03/coordinate.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day03.Coordinate do 2 | defstruct x: 0, y: 0, value: 1 3 | end 4 | -------------------------------------------------------------------------------- /lib/y2017/day13/layer.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day13.Layer do 2 | alias __MODULE__ 3 | 4 | defstruct depth: 0, range: nil, position: 0, caught: false 5 | 6 | def new([depth, range]) do 7 | %Layer{depth: String.to_integer(depth), range: String.to_integer(range)} 8 | end 9 | 10 | def set_position(%Layer{range: range} = layer, offset) do 11 | # Remove loops in the process, ie. if offset is 8 and range is 3, then the offset can be reduced 12 | # by 4 because after 4 moves, the sentry will be back at its starting position 13 | offset = rem(offset, range * 2 - 2) 14 | new_pos = if offset >= range, do: offset - 2 - 2 * (offset - range), else: offset 15 | 16 | %{layer | position: new_pos} 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/y2017/day20/particle.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day20.Particle do 2 | alias __MODULE__ 3 | 4 | defstruct id: nil, position: nil, velocity: nil, acceleration: nil 5 | 6 | def manhattan_acceleration(%Particle{acceleration: {x, y, z}}) do 7 | abs(x) + abs(y) + abs(z) 8 | end 9 | 10 | @doc """ 11 | iex> Particle.move(%Particle{id: 0, position: {3, 0, 0}, velocity: {2, 0, 0}, acceleration: {-1, 0, 0}}) 12 | %Particle{id: 0, position: {4, 0, 0}, velocity: {1, 0, 0}, acceleration: {-1, 0, 0}} 13 | """ 14 | def move( 15 | %Particle{position: {x1, y1, z1}, velocity: {x2, y2, z2}, acceleration: {x3, y3, z3}} = 16 | particle 17 | ) do 18 | {x1, x2, x3} = move_axis(x1, x2, x3) 19 | {y1, y2, y3} = move_axis(y1, y2, y3) 20 | {z1, z2, z3} = move_axis(z1, z2, z3) 21 | %{particle | position: {x1, y1, z1}, velocity: {x2, y2, z2}, acceleration: {x3, y3, z3}} 22 | end 23 | 24 | defp move_axis(position, velocity, acceleration) do 25 | {position + (velocity + acceleration), velocity + acceleration, acceleration} 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /lib/y2017/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day01.txt -------------------------------------------------------------------------------- /lib/y2017/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day02.txt -------------------------------------------------------------------------------- /lib/y2017/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day04.txt -------------------------------------------------------------------------------- /lib/y2017/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day05.txt -------------------------------------------------------------------------------- /lib/y2017/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day06.txt -------------------------------------------------------------------------------- /lib/y2017/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day07.txt -------------------------------------------------------------------------------- /lib/y2017/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day08.txt -------------------------------------------------------------------------------- /lib/y2017/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day09.txt -------------------------------------------------------------------------------- /lib/y2017/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day10.txt -------------------------------------------------------------------------------- /lib/y2017/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day11.txt -------------------------------------------------------------------------------- /lib/y2017/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day12.txt -------------------------------------------------------------------------------- /lib/y2017/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day13.txt -------------------------------------------------------------------------------- /lib/y2017/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day15.txt -------------------------------------------------------------------------------- /lib/y2017/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day16.txt -------------------------------------------------------------------------------- /lib/y2017/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day18.txt -------------------------------------------------------------------------------- /lib/y2017/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day19.txt -------------------------------------------------------------------------------- /lib/y2017/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day20.txt -------------------------------------------------------------------------------- /lib/y2017/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day21.txt -------------------------------------------------------------------------------- /lib/y2017/input/day22.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day22.txt -------------------------------------------------------------------------------- /lib/y2017/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day23.txt -------------------------------------------------------------------------------- /lib/y2017/input/day24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day24.txt -------------------------------------------------------------------------------- /lib/y2017/input/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2017/input/day25.txt -------------------------------------------------------------------------------- /lib/y2018/day15/unit.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day15.Unit do 2 | defstruct [:type, :hp, :position, :alive, :power] 3 | end 4 | -------------------------------------------------------------------------------- /lib/y2018/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day01.txt -------------------------------------------------------------------------------- /lib/y2018/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day02.txt -------------------------------------------------------------------------------- /lib/y2018/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day03.txt -------------------------------------------------------------------------------- /lib/y2018/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day04.txt -------------------------------------------------------------------------------- /lib/y2018/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day05.txt -------------------------------------------------------------------------------- /lib/y2018/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day06.txt -------------------------------------------------------------------------------- /lib/y2018/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day07.txt -------------------------------------------------------------------------------- /lib/y2018/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day08.txt -------------------------------------------------------------------------------- /lib/y2018/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day10.txt -------------------------------------------------------------------------------- /lib/y2018/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day12.txt -------------------------------------------------------------------------------- /lib/y2018/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day13.txt -------------------------------------------------------------------------------- /lib/y2018/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day15.txt -------------------------------------------------------------------------------- /lib/y2018/input/day16_part1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day16_part1.txt -------------------------------------------------------------------------------- /lib/y2018/input/day16_part2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day16_part2.txt -------------------------------------------------------------------------------- /lib/y2018/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day17.txt -------------------------------------------------------------------------------- /lib/y2018/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day18.txt -------------------------------------------------------------------------------- /lib/y2018/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day19.txt -------------------------------------------------------------------------------- /lib/y2018/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day20.txt -------------------------------------------------------------------------------- /lib/y2018/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day21.txt -------------------------------------------------------------------------------- /lib/y2018/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day23.txt -------------------------------------------------------------------------------- /lib/y2018/input/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2018/input/day25.txt -------------------------------------------------------------------------------- /lib/y2019/day01.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day01 do 2 | use Advent.Day, no: 1 3 | 4 | def part1(input) do 5 | input 6 | |> Enum.map(&fuel_mass/1) 7 | |> Enum.sum() 8 | end 9 | 10 | def part2(input) do 11 | input 12 | |> Enum.map(&fuel_mass_with_extra/1) 13 | |> Enum.sum() 14 | end 15 | 16 | def parse_input(data) do 17 | data 18 | |> String.trim() 19 | |> String.split("\n") 20 | |> Enum.map(&String.to_integer/1) 21 | end 22 | 23 | @doc """ 24 | iex> Day01.fuel_mass(12) 25 | 2 26 | 27 | iex> Day01.fuel_mass(14) 28 | 2 29 | 30 | iex> Day01.fuel_mass(1969) 31 | 654 32 | 33 | iex> Day01.fuel_mass(100756) 34 | 33583 35 | """ 36 | def fuel_mass(num), do: div(num, 3) - 2 37 | 38 | @doc """ 39 | iex> Day01.fuel_mass_with_extra(100756) 40 | 50346 41 | """ 42 | def fuel_mass_with_extra(num, sum \\ 0) do 43 | needed = fuel_mass(num) 44 | 45 | if needed >= 0, do: fuel_mass_with_extra(needed, sum + needed), else: sum 46 | end 47 | 48 | def part1_verify, do: input() |> parse_input() |> part1() 49 | def part2_verify, do: input() |> parse_input() |> part2() 50 | end 51 | -------------------------------------------------------------------------------- /lib/y2019/day05.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day05 do 2 | use Advent.Day, no: 5 3 | 4 | alias Y2019.Intcode 5 | 6 | def parts(program, input) do 7 | program 8 | |> Intcode.new(List.wrap(input)) 9 | |> Intcode.run() 10 | |> Intcode.outputs() 11 | end 12 | 13 | def part1_verify, do: input() |> Intcode.from_string() |> parts(1) |> List.last() 14 | def part2_verify, do: input() |> Intcode.from_string() |> parts(5) |> List.last() 15 | end 16 | -------------------------------------------------------------------------------- /lib/y2019/day09.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day09 do 2 | # This day just uses Day 5 (the intcode VM) with different input. 3 | 4 | use Advent.Day, no: 9 5 | 6 | alias Y2019.{Day05, Intcode} 7 | 8 | def part1_verify, do: input() |> Intcode.from_string() |> Day05.parts(1) |> hd() 9 | def part2_verify, do: input() |> Intcode.from_string() |> Day05.parts(2) |> hd() 10 | end 11 | -------------------------------------------------------------------------------- /lib/y2019/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day01.txt -------------------------------------------------------------------------------- /lib/y2019/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day02.txt -------------------------------------------------------------------------------- /lib/y2019/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day03.txt -------------------------------------------------------------------------------- /lib/y2019/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day05.txt -------------------------------------------------------------------------------- /lib/y2019/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day06.txt -------------------------------------------------------------------------------- /lib/y2019/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day07.txt -------------------------------------------------------------------------------- /lib/y2019/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day08.txt -------------------------------------------------------------------------------- /lib/y2019/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day09.txt -------------------------------------------------------------------------------- /lib/y2019/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day10.txt -------------------------------------------------------------------------------- /lib/y2019/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day11.txt -------------------------------------------------------------------------------- /lib/y2019/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day12.txt -------------------------------------------------------------------------------- /lib/y2019/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day13.txt -------------------------------------------------------------------------------- /lib/y2019/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day14.txt -------------------------------------------------------------------------------- /lib/y2019/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day15.txt -------------------------------------------------------------------------------- /lib/y2019/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day16.txt -------------------------------------------------------------------------------- /lib/y2019/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day17.txt -------------------------------------------------------------------------------- /lib/y2019/input/day18-part2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day18-part2.txt -------------------------------------------------------------------------------- /lib/y2019/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day18.txt -------------------------------------------------------------------------------- /lib/y2019/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day19.txt -------------------------------------------------------------------------------- /lib/y2019/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day20.txt -------------------------------------------------------------------------------- /lib/y2019/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2019/input/day21.txt -------------------------------------------------------------------------------- /lib/y2020/day18/screwy_operators.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day18.ScrewyOperators do 2 | import Kernel, except: [-: 2, *: 2, /: 2] 3 | 4 | def a - b, do: Kernel.*(a, b) 5 | def a / b, do: Kernel.*(a, b) 6 | def a * b, do: Kernel.+(a + b) 7 | end 8 | -------------------------------------------------------------------------------- /lib/y2020/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day01.txt -------------------------------------------------------------------------------- /lib/y2020/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day02.txt -------------------------------------------------------------------------------- /lib/y2020/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day03.txt -------------------------------------------------------------------------------- /lib/y2020/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day04.txt -------------------------------------------------------------------------------- /lib/y2020/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day05.txt -------------------------------------------------------------------------------- /lib/y2020/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day06.txt -------------------------------------------------------------------------------- /lib/y2020/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day07.txt -------------------------------------------------------------------------------- /lib/y2020/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day08.txt -------------------------------------------------------------------------------- /lib/y2020/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day09.txt -------------------------------------------------------------------------------- /lib/y2020/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day10.txt -------------------------------------------------------------------------------- /lib/y2020/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day11.txt -------------------------------------------------------------------------------- /lib/y2020/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day12.txt -------------------------------------------------------------------------------- /lib/y2020/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day13.txt -------------------------------------------------------------------------------- /lib/y2020/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day14.txt -------------------------------------------------------------------------------- /lib/y2020/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day16.txt -------------------------------------------------------------------------------- /lib/y2020/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day17.txt -------------------------------------------------------------------------------- /lib/y2020/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day18.txt -------------------------------------------------------------------------------- /lib/y2020/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day19.txt -------------------------------------------------------------------------------- /lib/y2020/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2020/input/day20.txt -------------------------------------------------------------------------------- /lib/y2021/day01.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day01 do 2 | use Advent.Day, no: 1 3 | 4 | @doc """ 5 | iex> Day01.part1([199, 200, 208, 210, 200, 207, 240, 269, 260, 263]) 6 | 7 7 | """ 8 | def part1(list, count \\ 0) 9 | 10 | def part1([a, b | rest], count) do 11 | new_count = if a < b, do: count + 1, else: count 12 | part1([b | rest], new_count) 13 | end 14 | 15 | def part1(_, count), do: count 16 | 17 | @doc """ 18 | iex> Day01.part2([199, 200, 208, 210, 200, 207, 240, 269, 260, 263]) 19 | 5 20 | """ 21 | def part2(list, count \\ 0) 22 | 23 | def part2([a, b, c, d | rest], count) do 24 | new_count = if a + b + c < b + c + d, do: count + 1, else: count 25 | part2([b, c, d | rest], new_count) 26 | end 27 | 28 | def part2(_, count), do: count 29 | 30 | def parse_input(input) do 31 | input 32 | |> String.split("\n") 33 | |> Enum.map(&String.to_integer/1) 34 | end 35 | 36 | def part1_verify, do: input() |> parse_input() |> part1() 37 | def part2_verify, do: input() |> parse_input() |> part2() 38 | end 39 | -------------------------------------------------------------------------------- /lib/y2021/day05.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day05 do 2 | use Advent.Day, no: 5 3 | 4 | def parts(input) do 5 | input 6 | |> List.flatten() 7 | |> Enum.frequencies() 8 | |> Enum.count(fn {_val, count} -> count > 1 end) 9 | end 10 | 11 | def parse_input(input, include_diagonals \\ false) do 12 | input 13 | |> String.split("\n") 14 | |> Enum.map(fn row -> parse_row(row, include_diagonals) end) 15 | |> Enum.reject(&is_nil/1) 16 | end 17 | 18 | defp parse_row(row, include_diagonals) do 19 | row 20 | |> String.trim() 21 | |> String.split([",", " -> "]) 22 | |> Enum.map(&String.to_integer/1) 23 | |> to_grid(include_diagonals) 24 | end 25 | 26 | defp to_grid([x, y1, x, y2], _include_diagonals), do: for(y <- y1..y2, do: {x, y}) 27 | defp to_grid([x1, y, x2, y], _include_diagonals), do: for(x <- x1..x2, do: {x, y}) 28 | defp to_grid(_, false), do: nil 29 | defp to_grid([x1, y1, x2, y2], true), do: Enum.zip(x1..x2, y1..y2) 30 | 31 | def part1_verify, do: input() |> parse_input(false) |> parts() 32 | def part2_verify, do: input() |> parse_input(true) |> parts() 33 | end 34 | -------------------------------------------------------------------------------- /lib/y2021/day11/extras.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day11.Grid do 2 | defstruct map: %{} 3 | 4 | def new(map), do: %__MODULE__{map: map} 5 | 6 | def size(%__MODULE__{map: map}), do: map_size(map) 7 | end 8 | 9 | defimpl Inspect, for: Y2021.Day11.Grid do 10 | import Inspect.Algebra 11 | alias Y2021.Day11.Grid 12 | 13 | def inspect(%Grid{map: map}, _opts) do 14 | size = :math.sqrt(map_size(map)) |> trunc 15 | 16 | for row <- 0..(size - 1) do 17 | for col <- 0..(size - 1) do 18 | Map.get(map, {row, col}) |> Integer.to_string() |> String.pad_leading(3, " ") 19 | end 20 | |> IO.iodata_to_binary() 21 | end 22 | |> Enum.intersperse(line()) 23 | |> concat() 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /lib/y2021/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day01.txt -------------------------------------------------------------------------------- /lib/y2021/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day02.txt -------------------------------------------------------------------------------- /lib/y2021/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day03.txt -------------------------------------------------------------------------------- /lib/y2021/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day04.txt -------------------------------------------------------------------------------- /lib/y2021/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day05.txt -------------------------------------------------------------------------------- /lib/y2021/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day06.txt -------------------------------------------------------------------------------- /lib/y2021/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day07.txt -------------------------------------------------------------------------------- /lib/y2021/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day08.txt -------------------------------------------------------------------------------- /lib/y2021/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day09.txt -------------------------------------------------------------------------------- /lib/y2021/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day10.txt -------------------------------------------------------------------------------- /lib/y2021/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day11.txt -------------------------------------------------------------------------------- /lib/y2021/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day12.txt -------------------------------------------------------------------------------- /lib/y2021/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day13.txt -------------------------------------------------------------------------------- /lib/y2021/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day14.txt -------------------------------------------------------------------------------- /lib/y2021/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day15.txt -------------------------------------------------------------------------------- /lib/y2021/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day16.txt -------------------------------------------------------------------------------- /lib/y2021/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day18.txt -------------------------------------------------------------------------------- /lib/y2021/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day20.txt -------------------------------------------------------------------------------- /lib/y2021/input/day22.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day22.txt -------------------------------------------------------------------------------- /lib/y2021/input/day24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day24.txt -------------------------------------------------------------------------------- /lib/y2021/input/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2021/input/day25.txt -------------------------------------------------------------------------------- /lib/y2022/day01.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day01 do 2 | use Advent.Day, no: 01 3 | 4 | def part1(input) do 5 | input 6 | |> Enum.map(&Enum.sum/1) 7 | |> Enum.max() 8 | end 9 | 10 | def part2(input) do 11 | input 12 | |> Enum.map(&Enum.sum/1) 13 | |> Enum.sort(:desc) 14 | |> Enum.take(3) 15 | |> Enum.sum() 16 | end 17 | 18 | def parse_input(input) do 19 | input 20 | |> String.split("\n\n", trim: true) 21 | |> Enum.map(&parse_block/1) 22 | end 23 | 24 | defp parse_block(input) do 25 | input 26 | |> String.split("\n", trim: true) 27 | |> Enum.map(&String.to_integer/1) 28 | end 29 | 30 | def part1_verify, do: input() |> parse_input() |> part1() 31 | def part2_verify, do: input() |> parse_input() |> part2() 32 | end 33 | -------------------------------------------------------------------------------- /lib/y2022/day06.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day06 do 2 | use Advent.Day, no: 06 3 | 4 | def part1(input), do: do_parts(input, 4, 0) 5 | 6 | def part2(input), do: do_parts(input, 14, 0) 7 | 8 | defp do_parts(string, desired_length, count) do 9 | uniq_chars = 10 | string 11 | |> Enum.take(desired_length) 12 | |> Enum.uniq() 13 | 14 | if length(uniq_chars) == desired_length do 15 | count + desired_length 16 | else 17 | do_parts(tl(string), desired_length, count + 1) 18 | end 19 | end 20 | 21 | def parse_input(input) do 22 | input 23 | |> String.trim() 24 | |> String.graphemes() 25 | end 26 | 27 | def part1_verify, do: input() |> parse_input() |> part1() 28 | def part2_verify, do: input() |> parse_input() |> part2() 29 | end 30 | -------------------------------------------------------------------------------- /lib/y2022/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day01.txt -------------------------------------------------------------------------------- /lib/y2022/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day02.txt -------------------------------------------------------------------------------- /lib/y2022/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day03.txt -------------------------------------------------------------------------------- /lib/y2022/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day04.txt -------------------------------------------------------------------------------- /lib/y2022/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day05.txt -------------------------------------------------------------------------------- /lib/y2022/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day06.txt -------------------------------------------------------------------------------- /lib/y2022/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day07.txt -------------------------------------------------------------------------------- /lib/y2022/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day08.txt -------------------------------------------------------------------------------- /lib/y2022/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day09.txt -------------------------------------------------------------------------------- /lib/y2022/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day10.txt -------------------------------------------------------------------------------- /lib/y2022/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day11.txt -------------------------------------------------------------------------------- /lib/y2022/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day12.txt -------------------------------------------------------------------------------- /lib/y2022/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day13.txt -------------------------------------------------------------------------------- /lib/y2022/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day14.txt -------------------------------------------------------------------------------- /lib/y2022/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day15.txt -------------------------------------------------------------------------------- /lib/y2022/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day16.txt -------------------------------------------------------------------------------- /lib/y2022/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day17.txt -------------------------------------------------------------------------------- /lib/y2022/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day18.txt -------------------------------------------------------------------------------- /lib/y2022/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day19.txt -------------------------------------------------------------------------------- /lib/y2022/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day20.txt -------------------------------------------------------------------------------- /lib/y2022/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day21.txt -------------------------------------------------------------------------------- /lib/y2022/input/day22.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day22.txt -------------------------------------------------------------------------------- /lib/y2022/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day23.txt -------------------------------------------------------------------------------- /lib/y2022/input/day24.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day24.txt -------------------------------------------------------------------------------- /lib/y2022/input/day25.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2022/input/day25.txt -------------------------------------------------------------------------------- /lib/y2023/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day01.txt -------------------------------------------------------------------------------- /lib/y2023/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day02.txt -------------------------------------------------------------------------------- /lib/y2023/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day03.txt -------------------------------------------------------------------------------- /lib/y2023/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day04.txt -------------------------------------------------------------------------------- /lib/y2023/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day05.txt -------------------------------------------------------------------------------- /lib/y2023/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day06.txt -------------------------------------------------------------------------------- /lib/y2023/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day07.txt -------------------------------------------------------------------------------- /lib/y2023/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day08.txt -------------------------------------------------------------------------------- /lib/y2023/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day09.txt -------------------------------------------------------------------------------- /lib/y2023/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day10.txt -------------------------------------------------------------------------------- /lib/y2023/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day11.txt -------------------------------------------------------------------------------- /lib/y2023/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day12.txt -------------------------------------------------------------------------------- /lib/y2023/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day13.txt -------------------------------------------------------------------------------- /lib/y2023/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day14.txt -------------------------------------------------------------------------------- /lib/y2023/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day15.txt -------------------------------------------------------------------------------- /lib/y2023/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day16.txt -------------------------------------------------------------------------------- /lib/y2023/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day17.txt -------------------------------------------------------------------------------- /lib/y2023/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day18.txt -------------------------------------------------------------------------------- /lib/y2023/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day19.txt -------------------------------------------------------------------------------- /lib/y2023/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day20.txt -------------------------------------------------------------------------------- /lib/y2023/input/day21.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day21.txt -------------------------------------------------------------------------------- /lib/y2023/input/day22.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day22.txt -------------------------------------------------------------------------------- /lib/y2023/input/day23.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2023/input/day23.txt -------------------------------------------------------------------------------- /lib/y2024/day01.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day01 do 2 | use Advent.Day, no: 01 3 | 4 | def part1(input) do 5 | input 6 | |> Enum.map(&Enum.sort/1) 7 | |> Enum.zip() 8 | |> Enum.map(fn {a, b} -> abs(a - b) end) 9 | |> Enum.sum() 10 | end 11 | 12 | def part2(input) do 13 | [left, right] = input 14 | right_frequencies = Enum.frequencies(right) 15 | 16 | Enum.reduce(left, 0, fn val, acc -> acc + val * Map.get(right_frequencies, val, 0) end) 17 | end 18 | 19 | def parse_input(input) do 20 | input 21 | |> String.split("\n", trim: true) 22 | |> Enum.map(fn row -> 23 | row 24 | |> String.split(" ") 25 | |> Enum.map(&String.to_integer/1) 26 | end) 27 | |> Advent.transpose() 28 | end 29 | 30 | def part1_verify, do: input() |> parse_input() |> part1() 31 | def part2_verify, do: input() |> parse_input() |> part2() 32 | end 33 | -------------------------------------------------------------------------------- /lib/y2024/day02.ex: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day02 do 2 | use Advent.Day, no: 02 3 | 4 | def part1(input) do 5 | Enum.count(input, &safe?/1) 6 | end 7 | 8 | def part2(input) do 9 | Enum.count(input, &safe_with_problem_dampener?/1) 10 | end 11 | 12 | def parse_input(input) do 13 | input 14 | |> String.split("\n", trim: true) 15 | |> Enum.map(fn row -> 16 | String.split(row, " ") |> Enum.map(&String.to_integer/1) 17 | end) 18 | end 19 | 20 | def safe?([a, a | _]), do: false 21 | 22 | def safe?([a, b | rest]) do 23 | multiplier = if b - a > 0, do: 1, else: -1 24 | check_safe?([a, b | rest], multiplier) 25 | end 26 | 27 | def safe_with_problem_dampener?(list) do 28 | dampened = 29 | 0..length(list) 30 | |> Enum.map(&List.delete_at(list, &1)) 31 | 32 | safe?(list) || Enum.any?(dampened, &safe?/1) 33 | end 34 | 35 | defp check_safe?([_], _), do: true 36 | 37 | defp check_safe?([a, b | rest], multiplier) do 38 | ((b - a) * multiplier) in 1..3 && check_safe?([b | rest], multiplier) 39 | end 40 | 41 | def part1_verify, do: input() |> parse_input() |> part1() 42 | def part2_verify, do: input() |> parse_input() |> part2() 43 | end 44 | -------------------------------------------------------------------------------- /lib/y2024/input/day01.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day01.txt -------------------------------------------------------------------------------- /lib/y2024/input/day02.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day02.txt -------------------------------------------------------------------------------- /lib/y2024/input/day03.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day03.txt -------------------------------------------------------------------------------- /lib/y2024/input/day04.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day04.txt -------------------------------------------------------------------------------- /lib/y2024/input/day05.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day05.txt -------------------------------------------------------------------------------- /lib/y2024/input/day06.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day06.txt -------------------------------------------------------------------------------- /lib/y2024/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day07.txt -------------------------------------------------------------------------------- /lib/y2024/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day08.txt -------------------------------------------------------------------------------- /lib/y2024/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day09.txt -------------------------------------------------------------------------------- /lib/y2024/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day10.txt -------------------------------------------------------------------------------- /lib/y2024/input/day11.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day11.txt -------------------------------------------------------------------------------- /lib/y2024/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day12.txt -------------------------------------------------------------------------------- /lib/y2024/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day13.txt -------------------------------------------------------------------------------- /lib/y2024/input/day14.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day14.txt -------------------------------------------------------------------------------- /lib/y2024/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day15.txt -------------------------------------------------------------------------------- /lib/y2024/input/day16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day16.txt -------------------------------------------------------------------------------- /lib/y2024/input/day17.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day17.txt -------------------------------------------------------------------------------- /lib/y2024/input/day18.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day18.txt -------------------------------------------------------------------------------- /lib/y2024/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day19.txt -------------------------------------------------------------------------------- /lib/y2024/input/day20.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/lib/y2024/input/day20.txt -------------------------------------------------------------------------------- /mix.exs: -------------------------------------------------------------------------------- 1 | defmodule Advent.MixProject do 2 | use Mix.Project 3 | 4 | def project do 5 | [ 6 | app: :advent, 7 | version: "0.1.0", 8 | elixir: "~> 1.12", 9 | start_permanent: Mix.env() == :prod, 10 | deps: deps() 11 | ] 12 | end 13 | 14 | # Run "mix help compile.app" to learn about applications. 15 | def application do 16 | [ 17 | extra_applications: [:logger] 18 | ] 19 | end 20 | 21 | # Run "mix help deps" to learn about dependencies. 22 | defp deps do 23 | [ 24 | {:jason, "~> 1.2"}, 25 | {:libgraph, "~> 0.13"}, 26 | {:benchee, "~> 1.0"}, 27 | {:tz, ">= 0.24.0"} 28 | ] 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /pre-commit: -------------------------------------------------------------------------------- 1 | mix update_readme_stars 2 | git add **/README.md 3 | -------------------------------------------------------------------------------- /priv/templates/day.ex: -------------------------------------------------------------------------------- 1 | defmodule Y<%= @year %>.Day<%= @day %> do 2 | use Advent.Day, no: <%= @day %> 3 | 4 | @doc """ 5 | iex> Day<%= @day %>.part1("update or delete me") 6 | "update or delete me" 7 | """ 8 | def part1(input) do 9 | input 10 | end 11 | 12 | # @doc """ 13 | # iex> Day<%= @day %>.part2("update or delete me") 14 | # "update or delete me" 15 | # """ 16 | # def part2(input) do 17 | # input 18 | # end 19 | 20 | @doc """ 21 | iex> Day<%= @day %>.parse_input("update or delete me") 22 | "update or delete me" 23 | """ 24 | def parse_input(input) do 25 | input 26 | end 27 | 28 | def part1_verify, do: input() |> parse_input() |> part1() 29 | #def part2_verify, do: input() |> parse_input() |> part2() 30 | end 31 | -------------------------------------------------------------------------------- /priv/templates/day.txt: -------------------------------------------------------------------------------- 1 | update or delete me 2 | -------------------------------------------------------------------------------- /priv/templates/day_test.ex: -------------------------------------------------------------------------------- 1 | defmodule Y<%= @year %>.Day<%= @day %>Test do 2 | use ExUnit.Case, async: true 3 | alias Y<%= @year %>.Day<%= @day %> 4 | doctest Day<%= @day %> 5 | 6 | test "verification, part 1", do: assert(Day<%= @day %>.part1_verify() == "update or delete me") 7 | # test "verification, part 2", do: assert(Day<%= @day %>.part2_verify() == "update or delete me") 8 | end 9 | -------------------------------------------------------------------------------- /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start(exclude: [:skip]) 2 | -------------------------------------------------------------------------------- /test/y2015/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 232) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 1783) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 1_586_300) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 3_737_498) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 2081) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 2341) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 282_749) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 9_962_624) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 258) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 53) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 400_410) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 15_343_601) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 46065) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 14134) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day08 4 | doctest Day08 5 | 6 | test "verification, part 1", do: assert(Day08.part1_verify() == 1333) 7 | test "verification, part 2", do: assert(Day08.part2_verify() == 2046) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 117) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 909) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day10_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day10Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day10 4 | doctest Day10 5 | 6 | test "verification, part 1", do: assert(Day10.part1_verify() == 252_594) 7 | 8 | test "verification, part 2", do: assert(Day10.part2_verify() == 3_579_328) 9 | end 10 | -------------------------------------------------------------------------------- /test/y2015/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day11 4 | doctest Day11 5 | 6 | test "verification, part 1", do: assert(Day11.part1_verify() == "hxbxxyzz") 7 | 8 | test "verification, part 2", do: assert(Day11.part2_verify() == "hxcaabcc") 9 | end 10 | -------------------------------------------------------------------------------- /test/y2015/day12_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day12Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day12 4 | doctest Day12 5 | 6 | test "verification, part 1", do: assert(Day12.part1_verify() == 156_366) 7 | test "verification, part 2", do: assert(Day12.part2_verify() == 96852) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day13 4 | doctest Day13 5 | 6 | test "verification, part 1", do: assert(Day13.part1_verify() == 709) 7 | test "verification, part 2", do: assert(Day13.part2_verify() == 668) 8 | 9 | test "can parse input" do 10 | input = "Alice would gain 54 happiness units by sitting next to Bob. 11 | Alice would lose 79 happiness units by sitting next to Carol." 12 | output = [{"Alice", "Bob", 54}, {"Alice", "Carol", -79}] 13 | 14 | assert Day13.parse_input(input) == output 15 | end 16 | 17 | test "part1" do 18 | input = File.read!("test/y2015/input/day13.txt") 19 | output = {[{"Alice", 52}, {"Bob", 76}, {"Carol", 115}, {"David", 87}], 330} 20 | 21 | assert Day13.part1(input) == output 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/y2015/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day14 4 | doctest Day14 5 | 6 | test "verification, part 1", do: assert(Day14.part1_verify() == 2655) 7 | test "verification, part 2", do: assert(Day14.part2_verify() == 1059) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 21_367_368) 7 | test "verification, part 2", do: assert(Day15.part2_verify() == 1_766_400) 8 | 9 | test "score for cookie" do 10 | expected = 62_842_880 11 | 12 | result = 13 | Day15.score_for_cookie( 14 | [{"Butterscotch", 44}, {"Cinnamon", 56}], 15 | [ 16 | %{ 17 | name: "Butterscotch", 18 | capacity: -1, 19 | durability: -2, 20 | flavor: 6, 21 | texture: 3, 22 | calories: 8 23 | }, 24 | %{name: "Cinnamon", capacity: 2, durability: 3, flavor: -2, texture: -1, calories: 3} 25 | ] 26 | ) 27 | 28 | assert expected == result 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/y2015/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == "Sue 213") 7 | test "verification, part 2", do: assert(Day16.part2_verify() == "Sue 323") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 654) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 57) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day19 4 | doctest Day19 5 | 6 | test "verification, part 1", do: assert(Day19.part1_verify() == 509) 7 | test "verification, part 2", do: assert(Day19.part2_verify() == 195) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day20 4 | doctest Day20 5 | 6 | test "verification, part 1", do: assert(Day20.part1_verify() == 831_600) 7 | test "verification, part 2", do: assert(Day20.part2_verify() == 884_520) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day21_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day21Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day21 4 | doctest Day21 5 | 6 | test "verification, part 1", do: assert(Day21.part1_verify() == 91) 7 | test "verification, part 2", do: assert(Day21.part2_verify() == 158) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 953) 7 | test "verification, part 2", do: assert(Day22.part2_verify() == 1289) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day23_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day23Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day23 4 | doctest Day23 5 | 6 | test "verification, part 1", do: assert(Day23.part1_verify() == 184) 7 | test "verification, part 2", do: assert(Day23.part2_verify() == 231) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day24_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day24Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day24 4 | doctest Day24 5 | 6 | test "verification, part 1", do: assert(Day24.part1_verify() == 11_846_773_891) 7 | test "verification, part 2", do: assert(Day24.part2_verify() == 80_393_059) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2015/day25_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2015.Day25Test do 2 | use ExUnit.Case, async: true 3 | alias Y2015.Day25 4 | doctest Day25 5 | 6 | test "verification, part 1", do: assert(Day25.part1_verify() == 9_132_360) 7 | end 8 | -------------------------------------------------------------------------------- /test/y2015/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2015/input/day08.txt -------------------------------------------------------------------------------- /test/y2015/input/day13.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2015/input/day13.txt -------------------------------------------------------------------------------- /test/y2016/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 250) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 151) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == "56855") 7 | test "verification, part 2", do: assert(Day02.part2_verify() == "B3C27") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 917) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 1649) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 158_835) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 993) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == "1A3099AA") 7 | test "verification, part 2", do: assert(Day05.part2_verify() == "694190CD") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == "xhnqpqql") 7 | test "verification, part 2", do: assert(Day06.part2_verify() == "brhailro") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 118) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 260) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day08 4 | doctest Day08 5 | 6 | import ExUnit.CaptureIO 7 | 8 | test "verification, part 1", do: assert(Day08.part1_verify() == 119) 9 | 10 | test "verification, part 2" do 11 | assert capture_io(&Day08.part2_verify/0) == """ 12 | ####.####.#..#.####..###.####..##...##..###...##.. 13 | ...#.#....#..#.#....#....#....#..#.#..#.#..#.#..#. 14 | ..#..###..####.###..#....###..#..#.#....#..#.#..#. 15 | .#...#....#..#.#.....##..#....#..#.#.##.###..#..#. 16 | #....#....#..#.#.......#.#....#..#.#..#.#....#..#. 17 | ####.#....#..#.#....###..#.....##...###.#.....##.. 18 | """ 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /test/y2016/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 183_269) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 11_317_278_863) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day10_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day10Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.{Day10, Day10.Bot, Day10.Output} 4 | doctest Day10 5 | 6 | test "verification, part 1", do: assert(Day10.part1_verify() == 47) 7 | test "verification, part 2", do: assert(Day10.part2_verify() == 2666) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day12_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day12Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day12 4 | doctest Day12 5 | 6 | test "verification, part 1", do: assert(Day12.part1_verify() == 318_009) 7 | test "verification, part 2", do: assert(Day12.part2_verify() == 9_227_663) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day13 4 | alias Y2016.Day13.Position 5 | doctest Day13 6 | doctest Day13.Position 7 | 8 | test "verification, part 1", do: assert(Day13.part1_verify() == 82) 9 | test "verification, part 2", do: assert(Day13.part2_verify() == 138) 10 | 11 | test "running an actual scenario for a given initial position and returning a path length" do 12 | path = Position.initial() |> Day13.get_optimal_path([7, 4], 10) 13 | 14 | assert path == [ 15 | [1, 2], 16 | [2, 2], 17 | [3, 2], 18 | [3, 3], 19 | [3, 4], 20 | [4, 4], 21 | [4, 5], 22 | [5, 5], 23 | [6, 5], 24 | [6, 4], 25 | [7, 4] 26 | ] 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /test/y2016/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day14 4 | alias Y2016.Day14.Cache 5 | doctest Day14 6 | 7 | test "verification, part 1", do: assert(Day14.part1_verify() == 16106) 8 | 9 | @tag timeout: :infinity 10 | test "verification, part 2", do: assert(Day14.part2_verify() == 22423) 11 | end 12 | -------------------------------------------------------------------------------- /test/y2016/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 16824) 7 | test "verification, part 2", do: assert(Day15.part2_verify() == 3_543_984) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == "10010110010011110") 7 | test "verification, part 2", do: assert(Day16.part2_verify() == "01101011101100011") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == "DRRDRLDURD") 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 618) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day18 4 | doctest Day18 5 | 6 | test "verification, part 1", do: assert(Day18.part1_verify() == 1989) 7 | test "verification, part 2", do: assert(Day18.part2_verify() == 19_999_894) 8 | 9 | describe "part1/2" do 10 | test "small input" do 11 | assert Day18.part1("..^^.", 3) == 6 12 | assert Day18.part1(".^^.^.^^^^", 10) == 38 13 | end 14 | end 15 | 16 | describe "next_row/2" do 17 | test "sample input" do 18 | assert Day18.next_row([:s, :s, :t, :t, :s]) == [:s, :t, :t, :t, :t] 19 | assert Day18.next_row([:s, :t, :t, :t, :t]) == [:t, :t, :s, :s, :t] 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /test/y2016/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day19 4 | doctest Day19 5 | 6 | test "verification, part 1", do: assert(Day19.part1_verify() == 1_842_613) 7 | test "verification, part 2", do: assert(Day19.part2_verify() == 1_424_135) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day20 4 | doctest Day20 5 | 6 | test "verification, part 1", do: assert(Day20.part1_verify() == 4_793_564) 7 | test "verification, part 2", do: assert(Day20.part2_verify() == 146) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2016/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 987) 7 | test "verification, part 2", do: assert(Day22.part2_verify() == 220) 8 | 9 | describe "part2/1" do 10 | test "sample input" do 11 | input = test_data("part2_sample") |> Day22.parse_input() 12 | assert 7 == Day22.part2(input) 13 | end 14 | end 15 | 16 | describe "parse_input/1" do 17 | test "sample input" do 18 | input = """ 19 | root@ebhq-gridcenter# df -h 20 | Filesystem Size Used Avail Use% 21 | /dev/grid/node-x0-y0 89T 65T 24T 73% 22 | /dev/grid/node-x0-y1 212T 101T 111T 70% 23 | """ 24 | 25 | assert Day22.parse_input(input) == %{ 26 | {0, 0} => %{x: 0, y: 0, size: 89, used: 65, available: 24}, 27 | {0, 1} => %{x: 0, y: 1, size: 212, used: 101, available: 111} 28 | } 29 | end 30 | end 31 | 32 | def test_data(name), do: File.read!("test/y2016/input/day22/#{name}.txt") 33 | end 34 | -------------------------------------------------------------------------------- /test/y2016/day23_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day23Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.{Day12, Day23} 4 | doctest Day23 5 | 6 | test "verification, part 1", do: assert(Day23.part1_verify() == 13468) 7 | 8 | @tag :skip 9 | test "verification, part 2", do: assert(Day23.part2_verify() == 479_010_028) 10 | 11 | describe "part1/1" do 12 | test "sample" do 13 | input = """ 14 | cpy 2 a 15 | tgl a 16 | tgl a 17 | tgl a 18 | cpy 1 a 19 | dec a 20 | dec a 21 | """ 22 | 23 | result = Day12.parse_input(input) |> Day12.run_assembunny_code() |> elem(0) 24 | assert result == 3 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /test/y2016/day24_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day24Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day24 4 | alias Advent.PathGrid 5 | doctest Day24 6 | 7 | @sample_input """ 8 | ########### 9 | #0.1.....2# 10 | #.#######.# 11 | #4.......3# 12 | ########### 13 | """ 14 | 15 | test "verification, part 1", do: assert(Day24.part1_verify() == 456) 16 | test "verification, part 2", do: assert(Day24.part2_verify() == 704) 17 | 18 | test "part1/1" do 19 | result = Day24.parse_input(@sample_input) |> Day24.part1() 20 | assert result == {["0", "4", "1", "2", "3"], 14} 21 | end 22 | 23 | test "parse_input/1" do 24 | units = [ 25 | %PathGrid.Unit{identifier: "0", position: {2, 2}}, 26 | %PathGrid.Unit{identifier: "1", position: {2, 4}}, 27 | %PathGrid.Unit{identifier: "2", position: {2, 10}}, 28 | %PathGrid.Unit{identifier: "3", position: {4, 10}}, 29 | %PathGrid.Unit{identifier: "4", position: {4, 2}} 30 | ] 31 | 32 | assert %PathGrid{graph: %Graph{}, units: parsed_units} = Day24.parse_input(@sample_input) 33 | assert Enum.sort(units) == Enum.sort(parsed_units) 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /test/y2016/day25_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2016.Day25Test do 2 | use ExUnit.Case, async: true 3 | alias Y2016.Day25 4 | doctest Day25 5 | 6 | test "verification, part 1", do: assert(Day25.part1_verify() == 198) 7 | end 8 | -------------------------------------------------------------------------------- /test/y2016/input/day22/part2_sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2016/input/day22/part2_sample.txt -------------------------------------------------------------------------------- /test/y2017/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 1223) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 1284) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 47623) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 312) 8 | 9 | test "example 1" do 10 | assert Day02.part1("5 1 9 5\n7 5 3\n2 4 6 8") == 18 11 | end 12 | 13 | test "example 2" do 14 | assert Day02.part2("5 9 2 8\n9 4 7 3\n3 8 6 5") == 9 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /test/y2017/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day03 4 | alias Y2017.Day03.Coordinate 5 | doctest Day03 6 | 7 | test "verification, part 1", do: assert(Day03.part1_verify() == 475) 8 | test "verification, part 2", do: assert(Day03.part2_verify() == 279_138) 9 | end 10 | -------------------------------------------------------------------------------- /test/y2017/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 337) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 231) 8 | 9 | test "example part 1" do 10 | assert Day04.part1("aa bb cc dd ee\naa bb cc dd aa\naa bb cc dd aaa") == 2 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /test/y2017/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 325_922) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 24_490_906) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 5042) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 1086) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day08 4 | doctest Day08 5 | 6 | @test_file "../../../test/y2017/input/day08" 7 | 8 | test "verification, part 1", do: assert(Day08.part1_verify() == 3880) 9 | test "verification, part 2", do: assert(Day08.part2_verify() == 5035) 10 | 11 | test "part 1" do 12 | assert Day08.input(@test_file) |> Day08.part1() == {"a", 1} 13 | end 14 | 15 | test "part 2" do 16 | assert Day08.input(@test_file) |> Day08.part2() == {"c", 10} 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /test/y2017/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 16869) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 7284) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day10_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day10Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day10 4 | doctest Day10 5 | 6 | test "verification, part 1", do: assert(Day10.part1_verify() == 9656) 7 | 8 | test "verification, part 2" do 9 | assert Day10.part2_verify() == "20b7b54c92bf73cf3e5631458a715149" 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /test/y2017/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day11 4 | doctest Day11 5 | 6 | test "verification, part 1", do: assert(Day11.part1_verify() == 747) 7 | test "verification, part 2", do: assert(Day11.part2_verify() == 1544) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day13 4 | alias Y2017.Day13.Layer 5 | doctest Day13 6 | 7 | test "verification, part 1", do: assert(Day13.part1_verify() == 1580) 8 | test "verification, part 2", do: assert(Day13.part2_verify() == 3_943_252) 9 | end 10 | -------------------------------------------------------------------------------- /test/y2017/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day14 4 | doctest Day14 5 | 6 | test "verification, part 1", do: assert(Day14.part1_verify() == 8216) 7 | test "verification, part 2", do: assert(Day14.part2_verify() == 1139) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 573) 7 | test "verification, part 2", do: assert(Day15.part2_verify() == 294) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == "ionlbkfeajgdmphc") 7 | test "verification, part 2", do: assert(Day16.part2_verify() == "fdnphiegakolcmjb") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 419) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 46_038_988) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.{Day18, Day182} 4 | doctest Day18 5 | doctest Day182 6 | 7 | test "verification, part 1", do: assert(Day18.part1_verify() == 8600) 8 | test "verification, part 2", do: assert(Day18.part2_verify() == 7239) 9 | end 10 | -------------------------------------------------------------------------------- /test/y2017/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day19 4 | doctest Day19 5 | 6 | test "verification, part 1", do: assert(Day19.part1_verify() == "RYLONKEWB") 7 | test "verification, part 2", do: assert(Day19.part2_verify() == 16016) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day23_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day23Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day23 4 | doctest Day23 5 | 6 | test "verification, part 1", do: assert(Day23.part1_verify() == 3969) 7 | test "verification, part 2", do: assert(Day23.part2_verify() == 917) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2017/day24_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day24Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day24 4 | doctest Day24 5 | 6 | test "verification, part 1", do: assert(Day24.part1_verify() == 1868) 7 | test "verification, part 2", do: assert(Day24.part2_verify() == 1841) 8 | 9 | test "generates all possible bridges given example input" do 10 | pipes = [{0, 2}, {2, 2}, {2, 3}, {3, 4}, {3, 5}, {0, 1}, {10, 1}, {9, 10}] 11 | 12 | bridges = [ 13 | [], 14 | [{0, 1}], 15 | [{0, 1}, {10, 1}], 16 | [{0, 1}, {10, 1}, {9, 10}], 17 | [{0, 2}], 18 | [{0, 2}, {2, 3}], 19 | [{0, 2}, {2, 3}, {3, 4}], 20 | [{0, 2}, {2, 3}, {3, 5}], 21 | [{0, 2}, {2, 2}], 22 | [{0, 2}, {2, 2}, {2, 3}], 23 | [{0, 2}, {2, 2}, {2, 3}, {3, 4}], 24 | [{0, 2}, {2, 2}, {2, 3}, {3, 5}] 25 | ] 26 | 27 | assert Enum.sort(Day24.build_bridges([], 0, pipes)) == Enum.sort(bridges) 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /test/y2017/day25_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2017.Day25Test do 2 | use ExUnit.Case, async: true 3 | alias Y2017.Day25 4 | doctest Day25 5 | 6 | import Day25, only: [l: 1, r: 1] 7 | 8 | test "verification, part 1", do: assert(Day25.part1_verify() == 5593) 9 | 10 | test "part 1 with the example data" do 11 | rules = %{A: {{1, &r/1, :B}, {0, &l/1, :B}}, B: {{1, &l/1, :A}, {1, &r/1, :A}}} 12 | 13 | assert Day25.part1(rules, 6) == 3 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /test/y2017/input/day07.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2017/input/day07.txt -------------------------------------------------------------------------------- /test/y2017/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2017/input/day08.txt -------------------------------------------------------------------------------- /test/y2017/input/day12.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2017/input/day12.txt -------------------------------------------------------------------------------- /test/y2017/input/day19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2017/input/day19.txt -------------------------------------------------------------------------------- /test/y2018/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 516) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 71892) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 5904) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == "jiwamotgsfrudclzbyzkhlrvp") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 116_489) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 1260) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 84636) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 91679) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 11310) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 6020) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 4290) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 37318) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day08 4 | doctest Day08 5 | 6 | test "verification, part 1", do: assert(Day08.part1_verify() == 44893) 7 | test "verification, part 2", do: assert(Day08.part2_verify() == 27433) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 399_645) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 3_352_507_536) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day11 4 | doctest Day11 5 | 6 | test "verification, part 1", do: assert(Day11.part1_verify() == {34, 72, 3}) 7 | test "verification, part 2", do: assert(Day11.part2_verify() == {233, 187, 13}) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day14 4 | doctest Day14 5 | 6 | test "verification, part 1", do: assert(Day14.part1_verify() == "1132413111") 7 | 8 | @tag timeout: :infinity 9 | test "verification, part 2", do: assert(Day14.part2_verify() == 20_340_232) 10 | end 11 | -------------------------------------------------------------------------------- /test/y2018/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == 588) 7 | test "verification, part 2", do: assert(Day16.part2_verify() == 627) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 31013) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 25448) 8 | 9 | describe "part 1" do 10 | test "edge case" do 11 | {from, state} = test_data("edge_case") |> Day17.parse_picture_input() 12 | assert Day17.part1(state, from) == 337 13 | end 14 | end 15 | 16 | def test_data(name), do: File.read!("test/y2018/input/day17/#{name}.txt") 17 | end 18 | -------------------------------------------------------------------------------- /test/y2018/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day18 4 | doctest Day18 5 | 6 | test "verification, part 1", do: assert(Day18.part1_verify() == 638_400) 7 | test "verification, part 2", do: assert(Day18.part2_verify() == 195_952) 8 | 9 | def test_data(name), do: File.read!("test/y2018/input/day18/#{name}.txt") 10 | end 11 | -------------------------------------------------------------------------------- /test/y2018/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day19 4 | doctest Day19 5 | 6 | test "verification, part 1", do: assert(Day19.part1_verify() == 1860) 7 | test "verification, part 2", do: assert(Day19.part2_verify() == 20_108_088) 8 | 9 | describe "part 1" do 10 | test "it works with sample input" do 11 | input = test_data("sample") 12 | output = {6, 5, 6, 0, 0, 9} 13 | 14 | assert Day19.part1(input) == output 15 | end 16 | end 17 | 18 | describe "parse_input" do 19 | test "it reads the input properly" do 20 | input = test_data("sample") 21 | 22 | output = %{ 23 | ip: 0, 24 | commands: %{ 25 | 0 => {:seti, 5, 0, 1}, 26 | 1 => {:seti, 6, 0, 2}, 27 | 2 => {:addi, 0, 1, 0}, 28 | 3 => {:addr, 1, 2, 3}, 29 | 4 => {:setr, 1, 0, 0}, 30 | 5 => {:seti, 8, 0, 4}, 31 | 6 => {:seti, 9, 0, 5} 32 | } 33 | } 34 | 35 | assert Day19.parse_input(input) == output 36 | end 37 | end 38 | 39 | def test_data(name), do: File.read!("test/y2018/input/day19/#{name}.txt") 40 | end 41 | -------------------------------------------------------------------------------- /test/y2018/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day20 4 | doctest Day20 5 | 6 | test "verification, part 1", do: assert(Day20.part1_verify() == 3725) 7 | test "verification, part 2", do: assert(Day20.part2_verify() == 8541) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day21_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day21Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day21 4 | doctest Day21 5 | 6 | test "verification, part 1", do: assert(Day21.part1_verify() == 986_758) 7 | 8 | @tag timeout: :infinity 9 | test "verification, part 2", do: assert(Day21.part2_verify() == 16_016_565) 10 | end 11 | -------------------------------------------------------------------------------- /test/y2018/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 11810) 7 | test "verification, part 2", do: assert(Day22.part2_verify() == 1015) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/day23_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2018.Day23Test do 2 | use ExUnit.Case, async: true 3 | alias Y2018.Day23 4 | doctest Day23 5 | 6 | test "verification, part 1", do: assert(Day23.part1_verify() == 619) 7 | test "verification, part 2", do: assert(Day23.part2_verify() == 71_631_000) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2018/input/day13/crash.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day13/crash.txt -------------------------------------------------------------------------------- /test/y2018/input/day13/intersecting_carts.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day13/intersecting_carts.txt -------------------------------------------------------------------------------- /test/y2018/input/day13/removing_crashes.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day13/removing_crashes.txt -------------------------------------------------------------------------------- /test/y2018/input/day13/removing_crashes_overlapping.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day13/removing_crashes_overlapping.txt -------------------------------------------------------------------------------- /test/y2018/input/day13/simple_loop.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day13/simple_loop.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/all_units_movement.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/all_units_movement.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_1.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_2.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_3.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_4.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_5.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_5.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_6.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_6.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/full_match_7.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/full_match_7.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/more_movement.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/more_movement.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/more_movement_2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/more_movement_2.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/movement.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/movement.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/parse_input.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/parse_input.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/part_2_first.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/part_2_first.txt -------------------------------------------------------------------------------- /test/y2018/input/day15/turn_by_turn.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day15/turn_by_turn.txt -------------------------------------------------------------------------------- /test/y2018/input/day17/edge_case.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day17/edge_case.txt -------------------------------------------------------------------------------- /test/y2018/input/day17/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day17/sample.txt -------------------------------------------------------------------------------- /test/y2018/input/day17/sample_picture.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day17/sample_picture.txt -------------------------------------------------------------------------------- /test/y2018/input/day18/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day18/sample.txt -------------------------------------------------------------------------------- /test/y2018/input/day18/sample_small.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day18/sample_small.txt -------------------------------------------------------------------------------- /test/y2018/input/day19/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2018/input/day19/sample.txt -------------------------------------------------------------------------------- /test/y2019/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 3_299_598) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 4_946_546) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 3_224_742) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 7960) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 399) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 15678) 8 | 9 | @sample_input_small [ 10 | [{"R", 8}, {"U", 5}, {"L", 5}, {"D", 3}], 11 | [{"U", 7}, {"R", 6}, {"D", 4}, {"L", 4}] 12 | ] 13 | 14 | describe "parse_input/1" do 15 | test "it translates raw strings into lists of tuples" do 16 | assert Day03.parse_input("R8,U5,L5,D3\nU7,R6,D4,L4") == @sample_input_small 17 | end 18 | end 19 | 20 | describe "part1/1" do 21 | test "it works for small sample input" do 22 | assert Day03.part1(@sample_input_small) == 6 23 | end 24 | end 25 | 26 | describe "part2/1" do 27 | test "it works for small sample input" do 28 | assert Day03.part2(@sample_input_small) == 30 29 | end 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /test/y2019/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 1640) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 1126) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 6_745_903) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 9_168_267) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 122_782) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 271) 8 | 9 | describe "part1/1" do 10 | test "sample input" do 11 | assert 42 == Day06.part1("COM)B\nB)C\nC)D\nD)E\nE)F\nB)G\nG)H\nD)I\nE)J\nJ)K\nK)L") 12 | end 13 | end 14 | 15 | describe "part2/1" do 16 | test "sample input" do 17 | actual = 18 | Day06.part2("COM)B\nB)C\nC)D\nD)E\nE)F\nB)G\nG)H\nD)I\nE)J\nJ)K\nK)L\nK)YOU\nI)SAN") 19 | 20 | assert 4 == actual 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/y2019/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 929_800) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 15_432_220) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day08 4 | doctest Day08 5 | 6 | import ExUnit.CaptureIO 7 | 8 | test "verification, part 1", do: assert(Day08.part1_verify() == 2193) 9 | 10 | test "verification, part 2" do 11 | expected = """ 12 | .XXX.....X.XX.X....X....X 13 | .XXX..XXXX.XX.X.XXXX.XXXX 14 | X.X.X...XX....X...XX...XX 15 | XX.XX.XXXX.XX.X.XXXX.XXXX 16 | XX.XX.XXXX.XX.X.XXXX.XXXX 17 | XX.XX....X.XX.X....X.XXXX 18 | """ 19 | 20 | actual = capture_io(fn -> Day08.part2_verify() end) 21 | assert actual == expected 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/y2019/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 2_775_723_069) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 49115) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day11 4 | doctest Day11 5 | 6 | import ExUnit.CaptureIO 7 | 8 | test "verification, part 1", do: assert(Day11.part1_verify() == 2293) 9 | 10 | test "verification, part 2" do 11 | expected = """ 12 | XX..XX.XX.X.XXXXX..XX...XX...XXX..XX.XXXXXX 13 | X.XX.X.XX.X.XXXX.XX.X.XX.X.XX.X.XX.X.XXXXXX 14 | X.XX.X....X.XXXX.XXXX.XX.X.XX.X.XX.X.XXXXXX 15 | X....X.XX.X.XXXX.XXXX...XX...XX....X.XXXXXX 16 | X.XX.X.XX.X.XXXX.XX.X.XXXX.X.XX.XX.X.XXXXXX 17 | X.XX.X.XX.X....XX..XX.XXXX.XX.X.XX.X....XXX 18 | """ 19 | 20 | assert(capture_io(&Day11.part2_verify/0) == expected) 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /test/y2019/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day13 4 | doctest Day13 5 | 6 | test "verification, part 1", do: assert(Day13.part1_verify() == 315) 7 | test "verification, part 2", do: assert(Day13.part2_verify() == 16171) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 224) 7 | test "verification, part 2", do: assert(Day15.part2_verify() == 284) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == "10189359") 7 | end 8 | -------------------------------------------------------------------------------- /test/y2019/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day19 4 | doctest Day19 5 | 6 | test "verification, part 1", do: assert(Day19.part1_verify() == 179) 7 | test "verification, part 2", do: assert(Day19.part2_verify() == 9_760_485) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day20 4 | doctest Day20 5 | 6 | describe "part 1" do 7 | test "sample 1" do 8 | result = test_data("sample_1") |> Day20.parse_input() |> Day20.part1() 9 | assert result == 23 10 | end 11 | 12 | test "sample 2" do 13 | result = test_data("sample_2") |> Day20.parse_input() |> Day20.part1() 14 | assert result == 58 15 | end 16 | end 17 | 18 | describe "part 2" do 19 | test "sample 3" do 20 | result = test_data("sample_3") |> Day20.parse_input() |> Day20.part2() 21 | assert result == 396 22 | end 23 | end 24 | 25 | test "verification, part 1", do: assert(Day20.part1_verify() == 422) 26 | 27 | @tag timeout: :infinity 28 | test "verification, part 2", do: assert(Day20.part2_verify() == 5040) 29 | 30 | def test_data(name), do: File.read!("test/y2019/input/day20/#{name}.txt") 31 | end 32 | -------------------------------------------------------------------------------- /test/y2019/day21_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2019.Day21Test do 2 | use ExUnit.Case, async: true 3 | alias Y2019.Day21 4 | doctest Day21 5 | 6 | test "verification, part 1", do: assert(Day21.part1_verify() == 19_349_939) 7 | # test "verification, part 2", do: assert(Day21.part2_verify() == "update or delete me") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2019/input/day10/sample_2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day10/sample_2.txt -------------------------------------------------------------------------------- /test/y2019/input/day10/sample_3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day10/sample_3.txt -------------------------------------------------------------------------------- /test/y2019/input/day10/sample_4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day10/sample_4.txt -------------------------------------------------------------------------------- /test/y2019/input/day10/sample_5.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day10/sample_5.txt -------------------------------------------------------------------------------- /test/y2019/input/day10/sample_6.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day10/sample_6.txt -------------------------------------------------------------------------------- /test/y2019/input/day14/sample_1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day14/sample_1.txt -------------------------------------------------------------------------------- /test/y2019/input/day14/sample_2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day14/sample_2.txt -------------------------------------------------------------------------------- /test/y2019/input/day14/sample_3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day14/sample_3.txt -------------------------------------------------------------------------------- /test/y2019/input/day14/sample_4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day14/sample_4.txt -------------------------------------------------------------------------------- /test/y2019/input/day14/sample_5.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day14/sample_5.txt -------------------------------------------------------------------------------- /test/y2019/input/day20/sample_1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day20/sample_1.txt -------------------------------------------------------------------------------- /test/y2019/input/day20/sample_2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day20/sample_2.txt -------------------------------------------------------------------------------- /test/y2019/input/day20/sample_3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2019/input/day20/sample_3.txt -------------------------------------------------------------------------------- /test/y2020/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 776_064) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 6_964_490) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 636) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 588) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 145) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 3_424_528_800) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 226) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 160) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 976) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 685) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 6680) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 3117) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 172) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 39645) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day08 4 | doctest Day08 5 | 6 | test "verification, part 1", do: assert(Day08.part1_verify() == 1684) 7 | test "verification, part 2", do: assert(Day08.part2_verify() == 2188) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 776_203_571) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 104_800_569) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day10_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day10Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day10 4 | doctest Day10 5 | 6 | test "verification, part 1", do: assert(Day10.part1_verify() == 1980) 7 | test "verification, part 2", do: assert(Day10.part2_verify() == 4_628_074_479_616) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day12_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day12Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day12 4 | doctest Day12 5 | 6 | test "verification, part 1", do: assert(Day12.part1_verify() == 1533) 7 | test "verification, part 2", do: assert(Day12.part2_verify() == 25235) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day13 4 | doctest Day13 5 | 6 | test "verification, part 1", do: assert(Day13.part1_verify() == 3865) 7 | test "verification, part 2", do: assert(Day13.part2_verify() == 415_579_909_629_976) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2020/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 1111) 7 | 8 | @tag timeout: :infinity 9 | test "verification, part 2", do: assert(Day15.part2_verify() == 48568) 10 | end 11 | -------------------------------------------------------------------------------- /test/y2020/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 230) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 1600) 8 | 9 | @sample_input ".#.\n..#\n###" 10 | 11 | test "parts/2" do 12 | assert 112 == Day17.parse_input(@sample_input) |> Day17.parts(3) 13 | assert 848 == Day17.parse_input(@sample_input) |> Day17.parts(4) 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /test/y2020/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2020.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2020.Day18 4 | doctest Day18 5 | 6 | test "verification, part 1", do: assert(Day18.part1_verify() == 510_009_915_468) 7 | test "verification, part 2", do: assert(Day18.part2_verify() == 321_176_691_637_769) 8 | 9 | test "part1/1" do 10 | assert 71 == Day18.part1("1 + 2 * 3 + 4 * 5 + 6") 11 | assert 51 == Day18.part1("1 + (2 * 3) + (4 * (5 + 6))") 12 | assert 26 == Day18.part1("2 * 3 + (4 * 5)") 13 | assert 437 == Day18.part1("5 + (8 * 3 + 9 + 3 * 4 * 3)") 14 | assert 12240 == Day18.part1("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))") 15 | assert 13632 == Day18.part1("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2") 16 | end 17 | 18 | test "part2/1" do 19 | assert 231 == Day18.part2("1 + 2 * 3 + 4 * 5 + 6") 20 | assert 51 == Day18.part2("1 + (2 * 3) + (4 * (5 + 6))") 21 | assert 46 == Day18.part2("2 * 3 + (4 * 5)") 22 | assert 1445 == Day18.part2("5 + (8 * 3 + 9 + 3 * 4 * 3)") 23 | assert 669_060 == Day18.part2("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))") 24 | assert 23340 == Day18.part2("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2") 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /test/y2020/input/day11/initial.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/initial.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p1_round2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p1_round2.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p1_round3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p1_round3.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p1_round4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p1_round4.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p1_round5.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p1_round5.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p2_round2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p2_round2.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p2_round3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p2_round3.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p2_round4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p2_round4.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p2_round5.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p2_round5.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/p2_round6.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/p2_round6.txt -------------------------------------------------------------------------------- /test/y2020/input/day11/round1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day11/round1.txt -------------------------------------------------------------------------------- /test/y2020/input/day19/part2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day19/part2.txt -------------------------------------------------------------------------------- /test/y2020/input/day20/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day20/sample.txt -------------------------------------------------------------------------------- /test/y2020/input/day20/small.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2020/input/day20/small.txt -------------------------------------------------------------------------------- /test/y2021/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 1448) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 1471) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 1_728_414) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 1_765_720_035) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 3_687_446) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 4_406_844) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == 6311) 7 | test "verification, part 2", do: assert(Day05.part2_verify() == 19929) 8 | 9 | @sample_input "0,9 -> 5,9 10 | 8,0 -> 0,8 11 | 9,4 -> 3,4 12 | 2,2 -> 2,1 13 | 7,0 -> 7,4 14 | 6,4 -> 2,0 15 | 0,9 -> 2,9 16 | 3,4 -> 1,4 17 | 0,0 -> 8,8 18 | 5,5 -> 8,2" 19 | 20 | test "parses without diagonals" do 21 | output = Day05.parse_input(@sample_input) |> Day05.parts() 22 | assert output == 5 23 | end 24 | 25 | test "parses with diagonals" do 26 | output = Day05.parse_input(@sample_input, true) |> Day05.parts() 27 | assert output == 12 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /test/y2021/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 386_755) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 1_732_731_810_807) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 352_331) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 99_266_250) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day10_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day10Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day10 4 | doctest Day10 5 | 6 | @test_file "../../../test/y2021/input/day10" 7 | 8 | test "verification, part 1", do: assert(Day10.part1_verify() == 389_589) 9 | test "verification, part 2", do: assert(Day10.part2_verify() == 1_190_420_163) 10 | 11 | test "part1/1" do 12 | actual = Day10.input(@test_file) |> Day10.parse_input() |> Day10.part1() 13 | assert actual == 26397 14 | end 15 | 16 | test "part2/1" do 17 | actual = Day10.input(@test_file) |> Day10.parse_input() |> Day10.part2() 18 | assert actual == 288_957 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /test/y2021/day12_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day12Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day12 4 | doctest Day12 5 | 6 | test "verification, part 1", do: assert(Day12.part1_verify() == 5958) 7 | test "verification, part 2", do: assert(Day12.part2_verify() == 150_426) 8 | 9 | describe "build_paths/1" do 10 | test "small input 1" do 11 | actual = 12 | Day12.build_paths([ 13 | {"start", "A"}, 14 | {"start", "b"}, 15 | {"A", "c"}, 16 | {"A", "b"}, 17 | {"b", "d"}, 18 | {"A", "end"}, 19 | {"b", "end"} 20 | ]) 21 | 22 | expected = [ 23 | ["start", "A", "b", "A", "c", "A", "end"], 24 | ["start", "A", "b", "A", "end"], 25 | ["start", "A", "b", "end"], 26 | ["start", "A", "c", "A", "b", "A", "end"], 27 | ["start", "A", "c", "A", "b", "end"], 28 | ["start", "A", "c", "A", "end"], 29 | ["start", "A", "end"], 30 | ["start", "b", "A", "c", "A", "end"], 31 | ["start", "b", "A", "end"], 32 | ["start", "b", "end"] 33 | ] 34 | 35 | assert Enum.sort(actual) == expected 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /test/y2021/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day13 4 | doctest Day13 5 | 6 | import ExUnit.CaptureIO 7 | 8 | test "verification, part 1", do: assert(Day13.part1_verify() == 751) 9 | 10 | test "verification, part 2" do 11 | expected = """ 12 | 🁢🁢🁢...🁢🁢..🁢..🁢.🁢🁢🁢..🁢..🁢.🁢....🁢..🁢.🁢... 13 | 🁢..🁢.🁢..🁢.🁢..🁢.🁢..🁢.🁢.🁢..🁢....🁢.🁢..🁢... 14 | 🁢..🁢.🁢....🁢🁢🁢🁢.🁢..🁢.🁢🁢...🁢....🁢🁢...🁢... 15 | 🁢🁢🁢..🁢.🁢🁢.🁢..🁢.🁢🁢🁢..🁢.🁢..🁢....🁢.🁢..🁢... 16 | 🁢....🁢..🁢.🁢..🁢.🁢.🁢..🁢.🁢..🁢....🁢.🁢..🁢... 17 | 🁢.....🁢🁢🁢.🁢..🁢.🁢..🁢.🁢..🁢.🁢🁢🁢🁢.🁢..🁢.🁢🁢🁢🁢 18 | """ 19 | 20 | actual = capture_io(fn -> Day13.part2_verify() end) 21 | assert actual == expected 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /test/y2021/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day14 4 | doctest Day14 5 | 6 | test "verification, part 1", do: assert(Day14.part1_verify() == 2988) 7 | test "verification, part 2", do: assert(Day14.part2_verify() == 3_572_761_917_024) 8 | 9 | @rules %{ 10 | "CH" => "B", 11 | "HH" => "N", 12 | "CB" => "H", 13 | "NH" => "C", 14 | "HB" => "C", 15 | "HC" => "B", 16 | "HN" => "C", 17 | "NN" => "C", 18 | "BH" => "H", 19 | "NC" => "B", 20 | "NB" => "B", 21 | "BN" => "B", 22 | "BB" => "N", 23 | "BC" => "B", 24 | "CC" => "N", 25 | "CN" => "C" 26 | } 27 | 28 | test "parts/2" do 29 | assert Day14.parts({"NNCB", @rules}, 10) == 1588 30 | assert Day14.parts({"NNCB", @rules}, 40) == 2_188_189_693_529 31 | end 32 | 33 | test "parse_input/1" do 34 | actual = 35 | Day14.parse_input( 36 | "NNCB\n\nCH -> B\nHH -> N\nCB -> H\nNH -> C\nHB -> C\nHC -> B\nHN -> C\nNN -> C\nBH -> H\nNC -> B\nNB -> B\nBN -> B\nBB -> N\nBC -> B\nCC -> N\nCN -> C\n" 37 | ) 38 | 39 | assert actual == {"NNCB", @rules} 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /test/y2021/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == 891) 7 | test "verification, part 2", do: assert(Day16.part2_verify() == 673_042_777_597) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 6786) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 2313) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2021/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day20 4 | doctest Day20 5 | 6 | test "verification, part 1", do: assert(Day20.part1_verify() == 4873) 7 | test "verification, part 2", do: assert(Day20.part2_verify() == 16394) 8 | 9 | test "parts/1" do 10 | input = 11 | Day20.parse_input(""" 12 | ..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..# 13 | 14 | #..#. 15 | #.... 16 | ##..# 17 | ..#.. 18 | ..### 19 | """) 20 | 21 | assert Day20.parts(input, 0) == 10 22 | assert Day20.parts(input, 1) == 24 23 | assert Day20.parts(input, 2) == 35 24 | assert Day20.parts(input, 50) == 3351 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /test/y2021/day21_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day21Test do 2 | use ExUnit.Case, async: true 3 | 4 | # Needs to apply to the doctest for part 2 as well 5 | @moduletag timeout: :infinity 6 | 7 | alias Y2021.Day21 8 | doctest Day21 9 | 10 | test "verification, part 1", do: assert(Day21.part1_verify() == 893_700) 11 | 12 | test "verification, part 2", do: assert(Day21.part2_verify() == 568_867_175_661_958) 13 | end 14 | -------------------------------------------------------------------------------- /test/y2021/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 609_563) 7 | end 8 | -------------------------------------------------------------------------------- /test/y2021/day23_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day23Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day23 4 | doctest Day23 5 | 6 | test "verification, part 1", do: assert(Day23.part1_verify() == 15338) 7 | test "verification, part 2", do: assert(Day23.part2_verify() == 47064) 8 | 9 | describe "parts/1" do 10 | test "part 1 sample input" do 11 | result = Day23.part1_input(:sample) |> Day23.parts() 12 | assert result == 12521 13 | end 14 | 15 | test "part 2 sample input" do 16 | result = Day23.part2_input(:sample) |> Day23.parts() 17 | assert result == 44169 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /test/y2021/day24_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day24Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day24 4 | doctest Day24 5 | 6 | @tag timeout: :infinity 7 | test "verification, part 1", do: assert(Day24.part1_verify() == "99995969919326") 8 | 9 | @tag timeout: :infinity 10 | test "verification, part 2", do: assert(Day24.part2_verify() == "48111514719111") 11 | end 12 | -------------------------------------------------------------------------------- /test/y2021/day25_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2021.Day25Test do 2 | use ExUnit.Case, async: true 3 | alias Y2021.Day25 4 | doctest Day25 5 | 6 | @tag timeout: :infinity 7 | test "verification, part 1", do: assert(Day25.part1_verify() == 498) 8 | 9 | test "part1/1" do 10 | input = """ 11 | v...>>.vv> 12 | .vv>>.vv.. 13 | >>.>v>...v 14 | >>v>>.>.v. 15 | v>v.vv.v.. 16 | >.>>..v... 17 | .vv..>.>v. 18 | v.v..>>v.v 19 | ....v..v.> 20 | """ 21 | 22 | assert Day25.parse_input(input) |> Day25.part1() == 58 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /test/y2021/input/day08.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2021/input/day08.txt -------------------------------------------------------------------------------- /test/y2021/input/day09.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2021/input/day09.txt -------------------------------------------------------------------------------- /test/y2021/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2021/input/day10.txt -------------------------------------------------------------------------------- /test/y2021/input/day15.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2021/input/day15.txt -------------------------------------------------------------------------------- /test/y2022/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 67027) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 197_291) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2022/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day02 4 | doctest Day02 5 | 6 | test "verification, part 1", do: assert(Day02.part1_verify() == 12679) 7 | test "verification, part 2", do: assert(Day02.part2_verify() == 14470) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2022/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 8153) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 2342) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2022/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 556) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 876) 8 | 9 | test "part1/1" do 10 | input = 11 | Day04.parse_input(""" 12 | 2-4,6-8 13 | 2-3,4-5 14 | 5-7,7-9 15 | 2-8,3-7 16 | 6-6,4-6 17 | 2-6,4-8 18 | """) 19 | 20 | assert Day04.part1(input) == 2 21 | end 22 | 23 | test "part2/1" do 24 | input = 25 | Day04.parse_input(""" 26 | 2-4,6-8 27 | 2-3,4-5 28 | 5-7,7-9 29 | 2-8,3-7 30 | 6-6,4-6 31 | 2-6,4-8 32 | """) 33 | 34 | assert Day04.part2(input) == 4 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /test/y2022/day05_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day05Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day05 4 | doctest Day05 5 | 6 | test "verification, part 1", do: assert(Day05.part1_verify() == ~c"TLNGFGMFN") 7 | test "verification, part 2", do: assert(Day05.part2_verify() == ~c"FGLQJCMBD") 8 | 9 | # [D] 10 | # [N] [C] 11 | # [Z] [M] [P] 12 | # 1 2 3 13 | @stacks %{1 => ~c"ZN", 2 => ~c"MCD", 3 => ~c"P"} 14 | @input Day05.parse_input(""" 15 | move 1 from 2 to 1 16 | move 3 from 1 to 3 17 | move 2 from 2 to 1 18 | move 1 from 1 to 2 19 | """) 20 | 21 | test "part1/2" do 22 | result = Day05.part1(@input, @stacks) 23 | assert result == {%{1 => ~c"C", 2 => ~c"M", 3 => ~c"PDNZ"}, ~c"CMZ"} 24 | end 25 | 26 | test "part2/2" do 27 | result = Day05.part2(@input, @stacks) 28 | assert result == {%{1 => ~c"M", 2 => ~c"C", 3 => ~c"PZND"}, ~c"MCD"} 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/y2022/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 1920) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 2334) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2022/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day08 4 | doctest Day08 5 | 6 | test "verification, part 1", do: assert(Day08.part1_verify() == 1849) 7 | test "verification, part 2", do: assert(Day08.part2_verify() == 201_600) 8 | 9 | @input """ 10 | 30373 11 | 25512 12 | 65332 13 | 33549 14 | 35390 15 | """ 16 | 17 | test "part1/1" do 18 | assert 21 == Day08.parse_input(@input) |> Day08.part1() 19 | end 20 | 21 | test "scenic_score/2" do 22 | grid = Day08.parse_input(@input) 23 | assert 4 == Day08.scenic_score({{2, 3}, 5}, grid, {5, 5}) 24 | assert 8 == Day08.scenic_score({{4, 3}, 5}, grid, {5, 5}) 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /test/y2022/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 6266) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 2369) 8 | 9 | test "part1/1" do 10 | input = """ 11 | R 4 12 | U 4 13 | L 3 14 | D 1 15 | R 4 16 | D 1 17 | L 5 18 | R 2 19 | """ 20 | 21 | assert 13 == Day09.parse_input(input) |> Day09.part1() 22 | end 23 | 24 | test "part2/1" do 25 | input = """ 26 | R 5 27 | U 8 28 | L 8 29 | D 3 30 | R 17 31 | D 10 32 | L 25 33 | U 20 34 | """ 35 | 36 | assert 36 == Day09.parse_input(input) |> Day09.part2() 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /test/y2022/day12_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day12Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day12 4 | doctest Day12 5 | 6 | test "verification, part 1", do: assert(Day12.part1_verify() == 517) 7 | test "verification, part 2", do: assert(Day12.part2_verify() == 512) 8 | 9 | @sample_input """ 10 | Sabqponm 11 | abcryxxl 12 | accszExk 13 | acctuvwj 14 | abdefghi 15 | """ 16 | 17 | test "part1/1" do 18 | assert 31 == Day12.parse_input(@sample_input) |> Day12.part1() 19 | end 20 | 21 | test "part2/1" do 22 | assert 29 == Day12.parse_input(@sample_input) |> Day12.part2() 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /test/y2022/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == 2330) 7 | test "verification, part 2", do: assert(Day16.part2_verify() == 2675) 8 | 9 | @sample_input """ 10 | Valve AA has flow rate=0; tunnels lead to valves DD, II, BB 11 | Valve BB has flow rate=13; tunnels lead to valves CC, AA 12 | Valve CC has flow rate=2; tunnels lead to valves DD, BB 13 | Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE 14 | Valve EE has flow rate=3; tunnels lead to valves FF, DD 15 | Valve FF has flow rate=0; tunnels lead to valves EE, GG 16 | Valve GG has flow rate=0; tunnels lead to valves FF, HH 17 | Valve HH has flow rate=22; tunnel leads to valve GG 18 | Valve II has flow rate=0; tunnels lead to valves AA, JJ 19 | Valve JJ has flow rate=21; tunnel leads to valve II 20 | """ 21 | 22 | test "part1/1" do 23 | assert 1651 == Day16.parse_input(@sample_input) |> Day16.part1() 24 | end 25 | 26 | test "part2/1" do 27 | assert 1707 == Day16.parse_input(@sample_input) |> Day16.part2() 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /test/y2022/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day18 4 | doctest Day18 5 | 6 | test "verification, part 1", do: assert(Day18.part1_verify() == 3432) 7 | test "verification, part 2", do: assert(Day18.part2_verify() == 2042) 8 | 9 | @sample_input """ 10 | 2,2,2 11 | 1,2,2 12 | 3,2,2 13 | 2,1,2 14 | 2,3,2 15 | 2,2,1 16 | 2,2,3 17 | 2,2,4 18 | 2,2,6 19 | 1,2,5 20 | 3,2,5 21 | 2,1,5 22 | 2,3,5 23 | """ 24 | 25 | test "part1/1" do 26 | assert 10 == Day18.parse_input("1,1,1\n2,1,1") |> Day18.part1() 27 | assert 64 == Day18.parse_input(@sample_input) |> Day18.part1() 28 | end 29 | 30 | test "part2/1" do 31 | assert 58 == Day18.parse_input(@sample_input) |> Day18.part2() 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /test/y2022/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 50412) 7 | test "verification, part 2", do: assert(Day22.part2_verify() == 130_068) 8 | 9 | @sample_input """ 10 | ...# 11 | .#.. 12 | #... 13 | .... 14 | ...#.......# 15 | ........#... 16 | ..#....#.... 17 | ..........#. 18 | ...#.... 19 | .....#.. 20 | .#...... 21 | ......#. 22 | 23 | 10R5L5R10L4R5L5 24 | """ 25 | 26 | test "part1/1" do 27 | assert 6032 == Day22.parse_input(@sample_input) |> Day22.part1() 28 | end 29 | 30 | test "part2/1" do 31 | assert 5031 == Day22.parse_input(@sample_input) |> Day22.part2(:sample) 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /test/y2022/day24_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day24Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day24 4 | doctest Day24 5 | 6 | test "verification, part 1", do: assert(Day24.part1_verify() == 249) 7 | test "verification, part 2", do: assert(Day24.part2_verify() == 735) 8 | 9 | @sample_input """ 10 | #.###### 11 | #>>.<^<# 12 | #.<..<<# 13 | #>v.><># 14 | #<^v^^># 15 | ######.# 16 | """ 17 | 18 | test "part1/1" do 19 | assert 18 == Day24.parse_input(@sample_input) |> Day24.part1() 20 | end 21 | 22 | test "part2/1" do 23 | assert 54 == Day24.parse_input(@sample_input) |> Day24.part2() 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /test/y2022/day25_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2022.Day25Test do 2 | use ExUnit.Case, async: true 3 | alias Y2022.Day25 4 | doctest Day25 5 | 6 | test "verification, part 1", do: assert(Day25.part1_verify() == "2-02===-21---2002==0") 7 | 8 | test "part1/1" do 9 | input = """ 10 | 1=-0-2 11 | 12111 12 | 2=0= 13 | 21 14 | 2=01 15 | 111 16 | 20012 17 | 112 18 | 1=-1= 19 | 1-12 20 | 12 21 | 1= 22 | 122 23 | """ 24 | 25 | assert "2=-1=0" == Day25.parse_input(input) |> Day25.part1() 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /test/y2022/input/day10.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2022/input/day10.txt -------------------------------------------------------------------------------- /test/y2023/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day01 4 | doctest Day01 5 | 6 | test "verification, part 1", do: assert(Day01.part1_verify() == 53651) 7 | test "verification, part 2", do: assert(Day01.part2_verify() == 53894) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2023/day02_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day02Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day02 4 | doctest Day02 5 | 6 | @sample_input """ 7 | Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green 8 | Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue 9 | Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red 10 | Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red 11 | Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green 12 | """ 13 | 14 | test "verification, part 1", do: assert(Day02.part1_verify() == 2476) 15 | test "verification, part 2", do: assert(Day02.part2_verify() == 54911) 16 | 17 | test "part 1" do 18 | expected = 8 19 | actual = @sample_input |> Day02.parse_input() |> Day02.part1() 20 | 21 | assert actual == expected 22 | end 23 | 24 | test "part 2" do 25 | expected = 2286 26 | actual = @sample_input |> Day02.parse_input() |> Day02.part2() 27 | 28 | assert actual == expected 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/y2023/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 536_202) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 78_272_573) 8 | 9 | @sample_input """ 10 | 467..114.. 11 | ...*...... 12 | ..35..633. 13 | ......#... 14 | 617*...... 15 | .....+.58. 16 | ..592..... 17 | ......755. 18 | ...$.*.... 19 | .664.598.. 20 | """ 21 | 22 | test "part 1" do 23 | actual = @sample_input |> Day03.parse_input() |> Day03.part1() 24 | expected = 4361 25 | 26 | assert actual == expected 27 | end 28 | 29 | test "part 2" do 30 | actual = @sample_input |> Day03.parse_input() |> Day03.part2() 31 | expected = 467_835 32 | 33 | assert actual == expected 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /test/y2023/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day04 4 | doctest Day04 5 | 6 | test "verification, part 1", do: assert(Day04.part1_verify() == 15268) 7 | test "verification, part 2", do: assert(Day04.part2_verify() == 6_283_755) 8 | 9 | @sample_input """ 10 | Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 11 | Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 12 | Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 13 | Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 14 | Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 15 | Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11 16 | """ 17 | 18 | test "part 1" do 19 | assert 13 == Day04.parse_input(@sample_input) |> Day04.part1() 20 | end 21 | 22 | test "part 2" do 23 | assert 30 == Day04.parse_input(@sample_input) |> Day04.part2() 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /test/y2023/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day06 4 | doctest Day06 5 | 6 | test "verification, part 1", do: assert(Day06.part1_verify() == 1_084_752) 7 | test "verification, part 2", do: assert(Day06.part2_verify() == 28_228_952) 8 | 9 | @mapping [ 10 | %{time: 7, distance: 9}, 11 | %{time: 15, distance: 40}, 12 | %{time: 30, distance: 200} 13 | ] 14 | 15 | test "part 1" do 16 | assert Day06.part1(@mapping) == 288 17 | end 18 | 19 | test "part 2" do 20 | assert Day06.part2(@mapping) == 71503 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /test/y2023/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day07 4 | doctest Day07 5 | 6 | test "verification, part 1", do: assert(Day07.part1_verify() == 250_898_830) 7 | test "verification, part 2", do: assert(Day07.part2_verify() == 252_127_335) 8 | 9 | @sample_input """ 10 | 32T3K 765 11 | T55J5 684 12 | KK677 28 13 | KTJJT 220 14 | QQQJA 483 15 | """ 16 | 17 | test "part 1" do 18 | actual = @sample_input |> Day07.parse_input() |> Day07.part1() 19 | expected = 6440 20 | 21 | assert actual == expected 22 | end 23 | 24 | test "part 2" do 25 | actual = @sample_input |> Day07.parse_input() |> Day07.part2() 26 | expected = 5905 27 | 28 | assert actual == expected 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/y2023/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 1_877_825_184) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 1108) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2023/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day11 4 | doctest Day11 5 | 6 | test "verification, part 1", do: assert(Day11.part1_verify() == 9_723_824) 7 | test "verification, part 2", do: assert(Day11.part2_verify() == 731_244_261_352) 8 | 9 | @sample_input """ 10 | ...#...... 11 | .......#.. 12 | #......... 13 | .......... 14 | ......#... 15 | .#........ 16 | .........# 17 | .......... 18 | .......#.. 19 | #...#..... 20 | """ 21 | 22 | test "both parts" do 23 | assert 374 == Day11.parse_input(@sample_input) |> Day11.parts() 24 | assert 1030 == Day11.parse_input(@sample_input) |> Day11.parts(10) 25 | assert 8410 == Day11.parse_input(@sample_input) |> Day11.parts(100) 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /test/y2023/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day14 4 | doctest Day14 5 | 6 | test "verification, part 1", do: assert(Day14.part1_verify() == 105_208) 7 | test "verification, part 2", do: assert(Day14.part2_verify() == 102_943) 8 | 9 | @sample_input """ 10 | O....#.... 11 | O.OO#....# 12 | .....##... 13 | OO.#O....O 14 | .O.....O#. 15 | O.#..O.#.# 16 | ..O..#O..O 17 | .......O.. 18 | #....###.. 19 | #OO..#.... 20 | """ 21 | 22 | test "part 1" do 23 | assert 136 == Day14.parse_input(@sample_input) |> Day14.part1() 24 | end 25 | 26 | test "part 2" do 27 | assert 64 == Day14.parse_input(@sample_input) |> Day14.part2() 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /test/y2023/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day15 4 | doctest Day15 5 | 6 | test "verification, part 1", do: assert(Day15.part1_verify() == 513_172) 7 | test "verification, part 2", do: assert(Day15.part2_verify() == 237_806) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2023/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day16 4 | doctest Day16 5 | 6 | test "verification, part 1", do: assert(Day16.part1_verify() == 7482) 7 | test "verification, part 2", do: assert(Day16.part2_verify() == 7896) 8 | 9 | test "part 1" do 10 | actual = test_data("sample") |> Day16.parse_input() |> Day16.part1() 11 | assert 46 == actual 12 | end 13 | 14 | test "part 2" do 15 | actual = test_data("sample") |> Day16.parse_input() |> Day16.part2() 16 | assert 51 == actual 17 | end 18 | 19 | def test_data(name), do: File.read!("test/y2023/input/day16/#{name}.txt") 20 | end 21 | -------------------------------------------------------------------------------- /test/y2023/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == 886) 7 | test "verification, part 2", do: assert(Day17.part2_verify() == 1055) 8 | 9 | @sample_input """ 10 | 2413432311323 11 | 3215453535623 12 | 3255245654254 13 | 3446585845452 14 | 4546657867536 15 | 1438598798454 16 | 4457876987766 17 | 3637877979653 18 | 4654967986887 19 | 4564679986453 20 | 1224686865563 21 | 2546548887735 22 | 4322674655533 23 | """ 24 | 25 | test "part 1" do 26 | actual = Day17.parse_input(@sample_input) |> Day17.part1() 27 | assert 102 == actual 28 | end 29 | 30 | test "part 2, sample 1" do 31 | actual = Day17.parse_input(@sample_input) |> Day17.part2() 32 | assert 94 == actual 33 | end 34 | 35 | test "part 2, sample 2" do 36 | actual = 37 | """ 38 | 111111111111 39 | 999999999991 40 | 999999999991 41 | 999999999991 42 | 999999999991 43 | """ 44 | |> Day17.parse_input() 45 | |> Day17.part2() 46 | 47 | assert 71 == actual 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /test/y2023/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day18 4 | doctest Day18 5 | 6 | test "verification, part 1", do: assert(Day18.part1_verify() == 68115) 7 | test "verification, part 2", do: assert(Day18.part2_verify() == 71_262_565_063_800) 8 | 9 | @sample_input """ 10 | R 6 (#70c710) 11 | D 5 (#0dc571) 12 | L 2 (#5713f0) 13 | D 2 (#d2c081) 14 | R 2 (#59c680) 15 | D 2 (#411b91) 16 | L 5 (#8ceee2) 17 | U 2 (#caa173) 18 | L 1 (#1b58a2) 19 | U 2 (#caa171) 20 | R 2 (#7807d2) 21 | U 3 (#a77fa3) 22 | L 2 (#015232) 23 | U 2 (#7a21e3) 24 | """ 25 | 26 | test "part 1" do 27 | input = Day18.parse_input(@sample_input) 28 | assert Day18.part1(input) == 62 29 | end 30 | 31 | test "part 2" do 32 | input = Day18.parse_input(@sample_input) 33 | assert Day18.part2(input) == 952_408_144_115 34 | end 35 | 36 | describe "shoelace algorithm" do 37 | test "example 1" do 38 | coords = [{2, 7}, {10, 1}, {8, 6}, {11, 7}, {7, 10}] 39 | assert 32 == Day18.run_shoelace_algorithm(coords) 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /test/y2023/day21_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day21Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day21 4 | doctest Day21 5 | 6 | test "verification, part 1", do: assert(Day21.part1_verify() == 3733) 7 | # test "verification, part 2", do: assert(Day21.part2_verify() == "update or delete me") 8 | 9 | @sample_input """ 10 | ........... 11 | .....###.#. 12 | .###.##..#. 13 | ..#.#...#.. 14 | ....#.#.... 15 | .##..S####. 16 | .##..#...#. 17 | .......##.. 18 | .##.#.####. 19 | .##..##.##. 20 | ........... 21 | """ 22 | 23 | test "part 1" do 24 | input = Day21.parse_input(@sample_input) 25 | 26 | assert Day21.part1(input, 1) == 2 27 | assert Day21.part1(input, 2) == 4 28 | assert Day21.part1(input, 3) == 6 29 | assert Day21.part1(input, 6) == 16 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /test/y2023/day22_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2023.Day22Test do 2 | use ExUnit.Case, async: true 3 | alias Y2023.Day22 4 | doctest Day22 5 | 6 | test "verification, part 1", do: assert(Day22.part1_verify() == 507) 7 | test "verification, part 2", do: assert(Day22.part2_verify() == 51733) 8 | 9 | @sample_input """ 10 | 1,0,1~1,2,1 11 | 0,0,2~2,0,2 12 | 0,2,3~2,2,3 13 | 0,0,4~0,2,4 14 | 2,0,5~2,2,5 15 | 0,1,6~2,1,6 16 | 1,1,8~1,1,9 17 | """ 18 | 19 | test "part 1" do 20 | assert Day22.parse_input(@sample_input) |> Day22.part1() == 5 21 | end 22 | 23 | test "part 2" do 24 | assert Day22.parse_input(@sample_input) |> Day22.part2() == 7 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /test/y2023/input/day16/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2023/input/day16/sample.txt -------------------------------------------------------------------------------- /test/y2024/day01_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day01Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day01 4 | doctest Day01 5 | 6 | @input """ 7 | 3 4 8 | 4 3 9 | 2 5 10 | 1 3 11 | 3 9 12 | 3 3 13 | """ 14 | 15 | test "part 1" do 16 | assert Day01.parse_input(@input) |> Day01.part1() == 11 17 | end 18 | 19 | test "part 2" do 20 | assert Day01.parse_input(@input) |> Day01.part2() == 31 21 | end 22 | 23 | test "verification, part 1", do: assert(Day01.part1_verify() == 3_508_942) 24 | test "verification, part 2", do: assert(Day01.part2_verify() == 26_593_248) 25 | end 26 | -------------------------------------------------------------------------------- /test/y2024/day03_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day03Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day03 4 | doctest Day03 5 | 6 | test "verification, part 1", do: assert(Day03.part1_verify() == 188_116_424) 7 | test "verification, part 2", do: assert(Day03.part2_verify() == 104_245_808) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2024/day04_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day04Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day04 4 | doctest Day04 5 | 6 | @input """ 7 | MMMSXXMASM 8 | MSAMXMSMSA 9 | AMXSXMAAMM 10 | MSAMASMSMX 11 | XMASAMXAMM 12 | XXAMMXXAMA 13 | SMSMSASXSS 14 | SAXAMASAAA 15 | MAMMMXMMMM 16 | MXMXAXMASX 17 | """ 18 | 19 | test "part 1" do 20 | assert Day04.parse_input(@input) |> Day04.part1() == 18 21 | end 22 | 23 | test "part 2" do 24 | assert Day04.parse_input(@input) |> Day04.part2() == 9 25 | end 26 | 27 | test "verification, part 1", do: assert(Day04.part1_verify() == 2462) 28 | test "verification, part 2", do: assert(Day04.part2_verify() == 1877) 29 | end 30 | -------------------------------------------------------------------------------- /test/y2024/day06_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day06Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day06 4 | doctest Day06 5 | 6 | @input """ 7 | ....#..... 8 | .........# 9 | .......... 10 | ..#....... 11 | .......#.. 12 | .......... 13 | .#..^..... 14 | ........#. 15 | #......... 16 | ......#... 17 | """ 18 | 19 | test "part 1" do 20 | assert Day06.parse_input(@input) |> Day06.part1() == 41 21 | end 22 | 23 | test "part 2" do 24 | assert Day06.parse_input(@input) |> Day06.part2() == 6 25 | end 26 | 27 | test "verification, part 1", do: assert(Day06.part1_verify() == 5095) 28 | test "verification, part 2", do: assert(Day06.part2_verify() == 1933) 29 | end 30 | -------------------------------------------------------------------------------- /test/y2024/day07_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day07Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day07 4 | doctest Day07 5 | 6 | @input """ 7 | 190: 10 19 8 | 3267: 81 40 27 9 | 83: 17 5 10 | 156: 15 6 11 | 7290: 6 8 6 15 12 | 161011: 16 10 13 13 | 192: 17 8 14 14 | 21037: 9 7 18 13 15 | 292: 11 6 16 20 16 | """ 17 | 18 | test "part 1" do 19 | assert Day07.parse_input(@input) |> Day07.part1() == 3749 20 | end 21 | 22 | test "part 2" do 23 | assert Day07.parse_input(@input) |> Day07.part2() == 11387 24 | end 25 | 26 | test "valid?" do 27 | operands1 = [&Kernel.+/2, &Kernel.*/2] 28 | operands2 = [&Kernel.+/2, &Kernel.*/2, &Day07.concat/2] 29 | assert Day07.valid?({190, [10, 19]}, operands1) 30 | assert Day07.valid?({3267, [81, 40, 27]}, operands1) 31 | refute Day07.valid?({2_939_907_585_850, [8, 8, 957, 6, 1, 1, 2, 4, 2, 3, 1, 8]}, operands2) 32 | end 33 | 34 | test "verification, part 1", do: assert(Day07.part1_verify() == 2_437_272_016_585) 35 | test "verification, part 2", do: assert(Day07.part2_verify() == 162_987_117_690_649) 36 | end 37 | -------------------------------------------------------------------------------- /test/y2024/day08_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day08Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day08 4 | doctest Day08 5 | 6 | @input """ 7 | ............ 8 | ........0... 9 | .....0...... 10 | .......0.... 11 | ....0....... 12 | ......A..... 13 | ............ 14 | ............ 15 | ........A... 16 | .........A.. 17 | ............ 18 | ............ 19 | """ 20 | 21 | test "part 1" do 22 | actual = Day08.parse_input(@input) |> Day08.part1() |> Enum.sort() 23 | 24 | assert [ 25 | {1, 7}, 26 | {1, 12}, 27 | {2, 4}, 28 | {3, 5}, 29 | {3, 11}, 30 | {4, 3}, 31 | {5, 10}, 32 | {6, 2}, 33 | {6, 7}, 34 | {7, 4}, 35 | {8, 1}, 36 | {8, 8}, 37 | {11, 11}, 38 | {12, 11} 39 | ] = actual 40 | end 41 | 42 | test "part 2" do 43 | assert Day08.parse_input(@input) |> Day08.part2() |> length() == 34 44 | end 45 | 46 | test "verification, part 1", do: assert(Day08.part1_verify() == 220) 47 | test "verification, part 2", do: assert(Day08.part2_verify() == 813) 48 | end 49 | -------------------------------------------------------------------------------- /test/y2024/day09_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day09Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day09 4 | doctest Day09 5 | 6 | test "verification, part 1", do: assert(Day09.part1_verify() == 6_241_633_730_082) 7 | test "verification, part 2", do: assert(Day09.part2_verify() == 6_265_268_809_555) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2024/day11_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day11Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day11 4 | doctest Day11 5 | 6 | test "verification, part 1", do: assert(Day11.part1_verify() == 183_435) 7 | # test "verification, part 2", do: assert(Day11.part2_verify() == "update or delete me") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2024/day13_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day13Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day13 4 | doctest Day13 5 | 6 | test "verification, part 1", do: assert(Day13.part1_verify() == 27157) 7 | test "verification, part 2", do: assert(Day13.part2_verify() == 104_015_411_578_548) 8 | end 9 | -------------------------------------------------------------------------------- /test/y2024/day14_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day14Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day14 4 | doctest Day14 5 | 6 | @sample """ 7 | p=0,4 v=3,-3 8 | p=6,3 v=-1,-3 9 | p=10,3 v=-1,2 10 | p=2,0 v=2,-1 11 | p=0,0 v=1,3 12 | p=3,0 v=-2,-2 13 | p=7,6 v=-1,-3 14 | p=3,0 v=-1,-2 15 | p=9,3 v=2,3 16 | p=7,3 v=-1,2 17 | p=2,4 v=2,-3 18 | p=9,5 v=-3,-3 19 | """ 20 | 21 | test "part1/1" do 22 | size = {11, 7} 23 | assert Day14.parse_input(@sample) |> Day14.part1(size, 100) == 12 24 | end 25 | 26 | test "verification, part 1", do: assert(Day14.part1_verify() == 226_236_192) 27 | test "verification, part 2", do: assert(Day14.part2_verify() == 8168) 28 | end 29 | -------------------------------------------------------------------------------- /test/y2024/day15_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day15Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day15 4 | doctest Day15 5 | 6 | @sample """ 7 | ######## 8 | #..O.O.# 9 | ##@.O..# 10 | #...O..# 11 | #.#.O..# 12 | #...O..# 13 | #......# 14 | ######## 15 | 16 | <^^>>>vv>v<< 17 | """ 18 | 19 | test "part1" do 20 | assert Day15.parse_input(@sample) |> Day15.part1() == 2028 21 | end 22 | 23 | test "run_movements" do 24 | {guard, rocks} = Day15.parse_input(@sample) |> Day15.run_movements() 25 | 26 | assert guard == {5, 5} 27 | assert Enum.sort(rocks) == [{2, 6}, {2, 7}, {4, 7}, {5, 4}, {6, 5}, {7, 5}] 28 | end 29 | 30 | test "verification, part 1", do: assert(Day15.part1_verify() == 1_568_399) 31 | # test "verification, part 2", do: assert(Day15.part2_verify() == "update or delete me") 32 | end 33 | -------------------------------------------------------------------------------- /test/y2024/day16_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day16Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day16 4 | doctest Day16 5 | 6 | test "part1" do 7 | assert test_data("sample1") |> Day16.parse_input() |> Day16.part1() == 7036 8 | assert test_data("sample2") |> Day16.parse_input() |> Day16.part1() == 11048 9 | end 10 | 11 | test "part2" do 12 | assert test_data("sample1") |> Day16.parse_input() |> Day16.part2() == 45 13 | assert test_data("sample2") |> Day16.parse_input() |> Day16.part2() == 64 14 | end 15 | 16 | test "verification, part 1", do: assert(Day16.part1_verify() == 91464) 17 | test "verification, part 2", do: assert(Day16.part2_verify() == 494) 18 | 19 | def test_data(name), do: File.read!("test/y2024/input/day16/#{name}.txt") 20 | end 21 | -------------------------------------------------------------------------------- /test/y2024/day17_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day17Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day17 4 | doctest Day17 5 | 6 | test "verification, part 1", do: assert(Day17.part1_verify() == "4,6,1,4,2,1,3,1,6") 7 | # test "verification, part 2", do: assert(Day17.part2_verify() == "update or delete me") 8 | end 9 | -------------------------------------------------------------------------------- /test/y2024/day18_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day18Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day18 4 | doctest Day18 5 | 6 | test "part1" do 7 | assert test_data() |> Day18.parse_input() |> Day18.part1(6, 12) == 22 8 | end 9 | 10 | test "part2" do 11 | assert test_data() |> Day18.parse_input() |> Day18.part2(6) == "6,1" 12 | end 13 | 14 | test "verification, part 1", do: assert(Day18.part1_verify() == 436) 15 | test "verification, part 2", do: assert(Day18.part2_verify() == "61,50") 16 | 17 | def test_data(), do: File.read!("test/y2024/input/day18/sample.txt") 18 | end 19 | -------------------------------------------------------------------------------- /test/y2024/day19_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day19Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day19 4 | doctest Day19 5 | 6 | @sample """ 7 | r, wr, b, g, bwu, rb, gb, br 8 | 9 | brwrr 10 | bggr 11 | gbbr 12 | rrbgbr 13 | ubwu 14 | bwurrg 15 | brgr 16 | bbrgwb 17 | """ 18 | 19 | test "part1" do 20 | assert Day19.parse_input(@sample) |> Day19.part1() == 6 21 | end 22 | 23 | test "part2" do 24 | assert Day19.parse_input(@sample) |> Day19.part2() == 16 25 | end 26 | 27 | test "parse_input" do 28 | assert %{from: from, to: to} = Day19.parse_input(@sample) 29 | assert ["r", "wr" | _rest] = from 30 | assert ["brwrr", "bggr" | _rest] = to 31 | end 32 | 33 | test "verification, part 1", do: assert(Day19.part1_verify() == 285) 34 | test "verification, part 2", do: assert(Day19.part2_verify() == 636_483_903_099_279) 35 | end 36 | -------------------------------------------------------------------------------- /test/y2024/day20_test.exs: -------------------------------------------------------------------------------- 1 | defmodule Y2024.Day20Test do 2 | use ExUnit.Case, async: true 3 | alias Y2024.Day20 4 | doctest Day20 5 | 6 | @sample """ 7 | ############### 8 | #...#...#.....# 9 | #.#.#.#.#.###.# 10 | #S#...#.#.#...# 11 | #######.#.#.### 12 | #######.#.#...# 13 | #######.#.###.# 14 | ###..E#...#...# 15 | ###.#######.### 16 | #...###...#...# 17 | #.#####.#.###.# 18 | #.#...#.#.#...# 19 | #.#.#.#.#.#.### 20 | #...#...#...### 21 | ############### 22 | """ 23 | 24 | test "cheats" do 25 | expected = %{ 26 | 2 => 14, 27 | 4 => 14, 28 | 6 => 2, 29 | 8 => 4, 30 | 10 => 2, 31 | 12 => 3, 32 | 20 => 1, 33 | 36 => 1, 34 | 38 => 1, 35 | 40 => 1, 36 | 64 => 1 37 | } 38 | 39 | assert Day20.parse_input(@sample) |> Day20.cheats(2) == expected 40 | end 41 | 42 | test "verification, part 1", do: assert(Day20.part1_verify() == 1289) 43 | test "verification, part 2", do: assert(Day20.part2_verify() == 982_425) 44 | end 45 | -------------------------------------------------------------------------------- /test/y2024/input/day16/sample1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2024/input/day16/sample1.txt -------------------------------------------------------------------------------- /test/y2024/input/day16/sample2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2024/input/day16/sample2.txt -------------------------------------------------------------------------------- /test/y2024/input/day18/sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sevenseacat/advent_of_code/9767ae37c01fc92c9e1950012933b9eb5f4171eb/test/y2024/input/day18/sample.txt --------------------------------------------------------------------------------