diff options
| author | DJ O'Leary <dijitol@proton.me> | 2025-03-03 00:56:33 +0100 |
|---|---|---|
| committer | DJ O'Leary <dijitol@proton.me> | 2025-03-03 00:56:33 +0100 |
| commit | e24effa8fd3574e9d396be0e1a47f101c27c0a60 (patch) | |
| tree | 793896d20384facd10d925e09f8f0dd89c930cce /2024 | |
perf: Merge Advent of Code year specific repos
Diffstat (limited to '2024')
38 files changed, 3311 insertions, 0 deletions
diff --git a/2024/OCaml/.editorconfig b/2024/OCaml/.editorconfig new file mode 100644 index 0000000..24b0621 --- /dev/null +++ b/2024/OCaml/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ml] +indent_style = space +indent_size = 2 + +[*.php] +indent_style = space +indent_size = 4 + +[*.go] +indent_style = tab + +[Makefile] +indent_style = tab diff --git a/2024/OCaml/.env.template b/2024/OCaml/.env.template new file mode 100644 index 0000000..637094f --- /dev/null +++ b/2024/OCaml/.env.template @@ -0,0 +1 @@ +SESSION=REPLACE_ME diff --git a/2024/OCaml/.envrc b/2024/OCaml/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/2024/OCaml/.envrc @@ -0,0 +1 @@ +use nix diff --git a/2024/OCaml/.gitignore b/2024/OCaml/.gitignore new file mode 100644 index 0000000..a251688 --- /dev/null +++ b/2024/OCaml/.gitignore @@ -0,0 +1,32 @@ +*.annot +*.cmo +*.cma +*.cmi +*.a +*.o +*.cmx +*.cmxs +*.cmxa + +# ocamlbuild working directory +_build/ + +# ocamlbuild targets +*.byte +*.native + +# oasis generated files +setup.data +setup.log + +# Merlin configuring file for Vim and Emacs +.merlin + +# Dune generated files +*.install + +# Local OPAM switch +_opam/ + +.env +.direnv diff --git a/2024/OCaml/.ocamlformat b/2024/OCaml/.ocamlformat new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/2024/OCaml/.ocamlformat diff --git a/2024/OCaml/AoC_2024.opam b/2024/OCaml/AoC_2024.opam new file mode 100644 index 0000000..41c0f97 --- /dev/null +++ b/2024/OCaml/AoC_2024.opam @@ -0,0 +1,31 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "Advent of Code 2024" +description: "Solutions to the Advent of Code puzzles for 2024" +maintainer: ["D.J. O'Leary"] +authors: ["D.J. O'Leary"] +license: "MIT" +tags: ["aoc2024" "Advent of Code 2024"] +homepage: "https://github.com/DJOLEARY/AoC_2024" +doc: "https://github.com/DJOLEARY/AoC_2024/blob/main/README.md" +bug-reports: "https://github.com/DJOLEARY/AoC_2024/issues" +depends: [ + "ocaml" + "dune" {>= "3.16"} + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/DJOLEARY/AoC_2024.git" diff --git a/2024/OCaml/LICENSE b/2024/OCaml/LICENSE new file mode 100644 index 0000000..714c645 --- /dev/null +++ b/2024/OCaml/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 D.J. O'Leary + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/2024/OCaml/README.md b/2024/OCaml/README.md new file mode 100644 index 0000000..96db988 --- /dev/null +++ b/2024/OCaml/README.md @@ -0,0 +1,22 @@ +# Advent of Code 2024 + +## Getting Started + +### How to Build + +```sh +dune build +``` + +### How to Run + +```sh +dune exec AoC_2024 +``` + +### How to Test + +```sh +dune runtest +``` + diff --git a/2024/OCaml/Taskfile.yml b/2024/OCaml/Taskfile.yml new file mode 100644 index 0000000..067ecec --- /dev/null +++ b/2024/OCaml/Taskfile.yml @@ -0,0 +1,100 @@ +# https://taskfile.dev + +version: '3' + +vars: + PROJECT_NAME: AoC_2024 + YEAR: 2024 + ASSET_DIR: input + SRC_DIR: lib + SRC_TEMPLATE: part.ml + TEST_DIR: test + TEST_TEMPLATE: test.ml + +dotenv: ['.env'] + +tasks: + default: + desc: "Prints this message" + cmds: + - cmd: task --list-all + + day:setup: + desc: "Creates the files needed to solve a day of Advent of Code" + requires: + vars: + - DAY + vars: + FORMATTED_DAY: "{{if (lt (atoi .DAY) 10)}}0{{.DAY}}{{else}}{{.DAY}}{{end}}" + cmds: + - cmd: mkdir --parents {{ .SRC_DIR }}/day_{{ .FORMATTED_DAY }} + - cmd: cp templates/{{.SRC_TEMPLATE}} {{.SRC_DIR}}/day_{{.FORMATTED_DAY}}/part_01.ml + - cmd: mkdir --parents {{ .TEST_DIR }} + - cmd: cp templates/{{.TEST_TEMPLATE}} {{.TEST_DIR}}/day_{{.FORMATTED_DAY}}_part_01.ml + - task: fetch-input + - task: build + silent: true + + fetch-input: + desc: "Fetches your input from adventofcode.com for the specified day" + internal: true + requires: + vars: + - DAY + vars: + URI: https://adventofcode.com/{{ .YEAR }}/day/{{.DAY}}/input + FORMATTED_DAY: "{{if (lt (atoi .DAY) 10)}}0{{.DAY}}{{else}}{{.DAY}}{{end}}" + cmds: + - cmd: curl --cookie 'session={{.SESSION}}' {{.URI}} > {{.ASSET_DIR}}/day_{{.FORMATTED_DAY}}.txt + silent: true + + build:doc: + desc: "Builds documentation using ocamldoc" + preconditions: + - which ocamldoc + cmds: + - cmd: ocamldoc -html -d docs bin/main.ml + silent: true + + build: + desc: "Builds the project" + preconditions: + - which dune + cmds: + - cmd: dune build + + test: + desc: "Runs the tests in the 'tests' directory" + ignore_error: true + env: + OUNIT_CI: true + preconditions: + - which dune + deps: + - task: build + cmds: + - cmd: dune test {{.CLI_ARGS}} + + test:watch: + desc: "Continuously runs the tests in the 'tests' directory" + ignore_error: true + sources: + - "lib/**/*.ml" + - "test/**/*.ml" + env: + OUNIT_CI: true + preconditions: + - which dune + deps: + - task: build + cmds: + - cmd: dune test --watch {{.CLI_ARGS}} + + run: + desc: "Runs the project" + preconditions: + - which dune + deps: + - task: build + cmds: + - cmd: dune exec {{.PROJECT_NAME}} diff --git a/2024/OCaml/bin/dune b/2024/OCaml/bin/dune new file mode 100644 index 0000000..ee36b46 --- /dev/null +++ b/2024/OCaml/bin/dune @@ -0,0 +1,5 @@ +(executable + (public_name AoC_2024) + (name main) + (modes byte exe) + (libraries AoC_2024)) diff --git a/2024/OCaml/bin/main.ml b/2024/OCaml/bin/main.ml new file mode 100644 index 0000000..a76e046 --- /dev/null +++ b/2024/OCaml/bin/main.ml @@ -0,0 +1,46 @@ +open AoC_2024 + +let day_to_path day = + let string_day = string_of_int day in + let formatted_day = if day < 10 then "0" ^ string_day else string_day in + "../_input/day_" ^ formatted_day ^ ".txt" + +let print_solution day_num part_num answer = + print_string "D"; + print_int day_num; + print_string ":P"; + print_int part_num; + print_string " -> "; + print_int answer; + print_newline () + +let day_1 = + let lines = File.Read_input.lines_from_file (day_to_path 1) in + let left, right = Day_01.Part_01.lines_to_lists lines in + let part_01 = Day_01.Part_01.solve left right in + print_solution 1 1 part_01; + let part_02 = Day_01.Part_02.solve left right in + print_solution 1 2 part_02 + +let day_2 = + let lines = File.Read_input.lines_from_file (day_to_path 2) in + let reports = Day_02.Part_01.lines_to_reports lines in + let part_01 = Day_02.Part_01.solve reports in + print_solution 2 1 part_01 + +let day_3 = + let lines = File.Read_input.lines_from_file (day_to_path 3) in + let line = List.fold_left (fun acc line -> acc ^ line) "" lines in + let part_01 = Day_03.Part_01.solve line in + print_solution 3 1 part_01 + +let day_4 = + let lines = File.Read_input.lines_from_file (day_to_path 4) in + let part_01 = Day_04.Part_01.solve lines in + print_solution 4 1 part_01 + +let _ = + day_1; + day_2; + day_3; + day_4 diff --git a/2024/OCaml/dune-project b/2024/OCaml/dune-project new file mode 100644 index 0000000..ee86a69 --- /dev/null +++ b/2024/OCaml/dune-project @@ -0,0 +1,28 @@ +(lang dune 3.16) + +(name AoC_2024) + +(generate_opam_files true) + +(source + (github DJOLEARY/AoC_2024)) + +(authors "D.J. O'Leary") + +(maintainers "D.J. O'Leary") + +(license MIT) + +(documentation https://github.com/DJOLEARY/AoC_2024/blob/main/README.md) + +(map_workspace_root false) + +(package + (name AoC_2024) + (synopsis "Advent of Code 2024") + (description "Solutions to the Advent of Code puzzles for 2024") + (depends ocaml dune) + (tags + (aoc2024 "Advent of Code 2024"))) + +; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html diff --git a/2024/OCaml/lib/day_01/part_01.ml b/2024/OCaml/lib/day_01/part_01.ml new file mode 100644 index 0000000..100b12a --- /dev/null +++ b/2024/OCaml/lib/day_01/part_01.ml @@ -0,0 +1,40 @@ +(* Day 1: Part 1 *) + +let calculate_distance x y = Stdlib.abs (x - y) + +(** Require: left and right to be the same length *) +let solve left right = + let sorted_left = List.sort Stdlib.compare left in + let sorted_right = List.sort Stdlib.compare right in + let distances = List.map2 calculate_distance sorted_left sorted_right in + List.fold_left ( + ) 0 distances + +let left line = + let pos = 0 in + let len = String.index line ' ' in + String.sub line pos len + +let right line = + let pos = String.rindex line ' ' + 1 in + let len = String.length line - pos in + String.sub line pos len + +let line_to_tuple line = (left line, right line) + +let lines_to_lists lines = + let tuples = List.map line_to_tuple lines in + let left = + List.map + (fun t -> + let l, _ = t in + int_of_string l) + tuples + in + let right = + List.map + (fun t -> + let _, r = t in + int_of_string r) + tuples + in + (left, right) diff --git a/2024/OCaml/lib/day_01/part_02.ml b/2024/OCaml/lib/day_01/part_02.ml new file mode 100644 index 0000000..532b344 --- /dev/null +++ b/2024/OCaml/lib/day_01/part_02.ml @@ -0,0 +1,43 @@ +(* Day 1: Part 2 *) + +let rec count_occurrances_help element acc lst = + match lst with + | [] -> acc + | h :: t -> + if h = element then count_occurrances_help element (acc + 1) t + else count_occurrances_help element acc t + +let count_occurrances element lst = count_occurrances_help element 0 lst + +let solve left right = + List.map (fun x -> x * count_occurrances x right) left |> List.fold_left ( + ) 0 + +let left line = + let pos = 0 in + let len = String.index line ' ' in + String.sub line pos len + +let right line = + let pos = String.rindex line ' ' + 1 in + let len = String.length line - pos in + String.sub line pos len + +let line_to_tuple line = (left line, right line) + +let lines_to_lists lines = + let tuples = List.map line_to_tuple lines in + let left = + List.map + (fun t -> + let l, _ = t in + int_of_string l) + tuples + in + let right = + List.map + (fun t -> + let _, r = t in + int_of_string r) + tuples + in + (left, right) diff --git a/2024/OCaml/lib/day_02/part_01.ml b/2024/OCaml/lib/day_02/part_01.ml new file mode 100644 index 0000000..32d7ab8 --- /dev/null +++ b/2024/OCaml/lib/day_02/part_01.ml @@ -0,0 +1,42 @@ +(* Day 2: Part 1 *) + +type level = int +type reports = level list list + +let rec compare_report_levels_helper comparison prev report = + match report with + | [] -> true + | h :: t -> comparison prev h && compare_report_levels_helper comparison h t + +let compare_report_levels comparison report = + match report with + | [] -> true + | h :: t -> compare_report_levels_helper comparison h t + +let all_increasing report = compare_report_levels ( < ) report +let all_decreasing report = compare_report_levels ( > ) report + +let at_least_one report = + compare_report_levels (fun prev curr -> prev <> curr) report + +let at_most_three report = + compare_report_levels (fun prev curr -> abs (prev - curr) <= 3) report + +let check_report_safety report = + if not (all_increasing report || all_decreasing report) then false + else if not (at_least_one report && at_most_three report) then false + else true + +let rec count_safe_reports acc lst = + match lst with + | [] -> acc + | h :: t -> + if h then count_safe_reports (acc + 1) t else count_safe_reports acc t + +let solve reports = + reports |> List.map check_report_safety |> count_safe_reports 0 + +let line_to_report line = + line |> String.split_on_char ' ' |> List.map int_of_string + +let lines_to_reports lines = List.map line_to_report lines diff --git a/2024/OCaml/lib/day_03/part_01.ml b/2024/OCaml/lib/day_03/part_01.ml new file mode 100644 index 0000000..c12b68a --- /dev/null +++ b/2024/OCaml/lib/day_03/part_01.ml @@ -0,0 +1,33 @@ +(* Day 3: Part 1 *) + +let find_mul text = + let regex_or_err = Re2.create "mul\\(([0-9]{1,3}),([0-9]{1,3})\\)" in + match regex_or_err with + | Ok regex -> ( + let matches = Re2.get_matches regex text in + match matches with Ok matches -> matches | Error _ -> []) + | Error _ -> [] + +let extract_pairs (matches : Re2.Match.t list) : (int * int) list = + List.map + (fun x -> + let left = Re2.Match.get x ~sub:(`Index 1) in + match left with + | None -> (0, 0) + | Some left -> ( + let left_num = int_of_string left in + let right = Re2.Match.get x ~sub:(`Index 2) in + match right with + | None -> (0, 0) + | Some right -> + let right_num = int_of_string right in + (left_num, right_num))) + matches + +let solve input = + input |> find_mul |> extract_pairs + |> List.fold_left + (fun acc pair -> + let left, right = pair in + acc + (left * right)) + 0 diff --git a/2024/OCaml/lib/day_04/part_01.ml b/2024/OCaml/lib/day_04/part_01.ml new file mode 100644 index 0000000..63c1cfd --- /dev/null +++ b/2024/OCaml/lib/day_04/part_01.ml @@ -0,0 +1,84 @@ +(* Day 4: Part 1 *) + +type character = { index : int; character : char } +type direction = N | NE | E | SE | S | SW | W | NW + +let all_directions = [ N; NE; E; SE; S; SW; W; NW ] +let needle = "XMAS" + +(** [calculate_row_offset lines] is the offset used to move between the rows of the concatenated variant of [lines] as though it were a grid. + Requires: values of [lines] all have the same length *) +let calculate_row_offset lines = + match lines with [] -> 0 | h :: _ -> String.length h + +let join_lines lines = + let concat_trim acc line = acc ^ String.trim line in + List.fold_left concat_trim "" lines + +let explode s = List.init (String.length s) (String.get s) +let is_in_bounds length index = index >= 0 && index < length + +let get_at_index line index = + let length = String.length line in + if not (is_in_bounds length index) then "." + else + let character = String.get line index in + Char.escaped character + +let get_direction_index row_offset direction index = + match direction with + | N -> index - row_offset + | NE -> index - row_offset + 1 + | E -> index + 1 + | SE -> index + row_offset + 1 + | S -> index + row_offset + | SW -> index + row_offset - 1 + | W -> index - 1 + | NW -> index - row_offset - 1 + +let get_direction_string get_char get_offset_index index = + let first = get_char index in + let second_index = get_offset_index index in + let second = get_char second_index in + let third_index = get_offset_index second_index in + let third = get_char third_index in + let fourth_index = get_offset_index third_index in + let fourth = get_char fourth_index in + first ^ second ^ third ^ fourth + +let check_direction get_from_line get_offset_index index direction = + get_direction_string get_from_line (get_offset_index direction) index = needle + +let calculate_num_of_matches line row_offset character = + let get_from_line_at_index = get_at_index line in + let get_offset_direction_index = get_direction_index row_offset in + let check_direction_from_index = + check_direction get_from_line_at_index get_offset_direction_index + character.index + in + all_directions + |> List.map check_direction_from_index + |> List.map (fun x -> match x with true -> 1 | false -> 0) + |> List.fold_left ( + ) 0 + +(* Tried: + 2544 -> too high + 1272 (previous halved) -> too low *) +let solve lines = + let row_offset = calculate_row_offset lines in + let line = join_lines lines in + let chars = explode line in + let characters = List.mapi (fun i c -> { index = i; character = c }) chars in + let xs = + List.filter + (fun c -> match c.character with 'X' -> true | _ -> false) + characters + in + let calculate_num_of_surrounding_matches_in_line = + calculate_num_of_matches line row_offset + in + let num_of_matches = + List.map calculate_num_of_surrounding_matches_in_line xs + |> List.fold_left ( + ) 0 + in + num_of_matches diff --git a/2024/OCaml/lib/day_04/php/Grid.php b/2024/OCaml/lib/day_04/php/Grid.php new file mode 100644 index 0000000..c0382df --- /dev/null +++ b/2024/OCaml/lib/day_04/php/Grid.php @@ -0,0 +1,67 @@ +<?php + +declare(strict_types=1); + +class Grid implements Stringable +{ + /** + * @param string[][] $data + */ + public function __construct(public array $data) {} + + public function __toString(): string + { + $rowToLine = fn(array $row): string => array_reduce( + array: $row, + callback: fn(string $acc, string $character): string => $acc . $character, + initial: "", + ); + + return array_reduce( + array: $this->data, + callback: fn(string $acc, array $row): string => $acc . $rowToLine($row) . PHP_EOL, + initial: "", + ); + } + + public function getCharacterAtPosition(Position $position): string + { + if ($this->isInBounds($position)) { + return $this->data[$position->y][$position->x]; + } + + return "."; + } + + /** + * @param Position[] $positions + */ + public function getStringFromPositions(array $positions): string + { + $characters = array_map( + callback: fn(Position $position): string => $this->getCharacterAtPosition($position), + array: $positions, + ); + + $string = array_reduce( + array: $characters, + callback: fn(string $acc, string $character): string => $acc . $character, + initial: "", + ); + + return $string; + } + + public function isInBounds(Position $position): bool + { + if (!array_key_exists($position->y, $this->data)) { + return false; + } + + if (!array_key_exists($position->x, $this->data[$position->y])) { + return false; + } + + return true; + } +} diff --git a/2024/OCaml/lib/day_04/php/Input.php b/2024/OCaml/lib/day_04/php/Input.php new file mode 100644 index 0000000..f7e03c1 --- /dev/null +++ b/2024/OCaml/lib/day_04/php/Input.php @@ -0,0 +1,25 @@ +<?php + +declare(strict_types=1); + +class Input +{ + public string $contents; + + public function __construct(private string $fileName) + { + $contents = file_get_contents($this->fileName, use_include_path: true); + $this->contents = $contents === false ? "" : $contents; + } + + public function toGrid(): Grid + { + $lines = explode("\n", $this->contents); + $gridArray = array_map( + callback: fn(string $line): array => str_split(trim($line)), + array: $lines + ); + + return new Grid($gridArray); + } +} diff --git a/2024/OCaml/lib/day_04/php/Position.php b/2024/OCaml/lib/day_04/php/Position.php new file mode 100644 index 0000000..182da7e --- /dev/null +++ b/2024/OCaml/lib/day_04/php/Position.php @@ -0,0 +1,77 @@ +<?php + +declare(strict_types=1); + +class Position implements Stringable +{ + public function __construct(public $x, public $y) {} + + public function __toString(): string + { + return "({$this->x}, {$this->y})"; + } + + /** + * Not validated + */ + public function getNorth(): self + { + return new self($this->x, $this->y - 1); + } + + /** + * Not validated + */ + public function getNorthEast(): self + { + return new self($this->x + 1, $this->y - 1); + } + + /** + * Not validated + */ + public function getEast(): self + { + return new self($this->x + 1, $this->y); + } + + /** + * Not validated + */ + public function getSouthEast(): self + { + return new self($this->x + 1, $this->y + 1); + } + + /** + * Not validated + */ + public function getSouth(): self + { + return new self($this->x, $this->y + 1); + } + + /** + * Not validated + */ + public function getSouthWest(): self + { + return new self($this->x - 1, $this->y + 1); + } + + /** + * Not validated + */ + public function getWest(): self + { + return new self($this->x - 1, $this->y); + } + + /** + * Not validated + */ + public function getNorthWest(): self + { + return new self($this->x - 1, $this->y - 1); + } +} diff --git a/2024/OCaml/lib/day_04/php/part_01.php b/2024/OCaml/lib/day_04/php/part_01.php new file mode 100644 index 0000000..250da0c --- /dev/null +++ b/2024/OCaml/lib/day_04/php/part_01.php @@ -0,0 +1,94 @@ +<?php + +declare(strict_types=1); + +spl_autoload_register(fn(string $className) => require "{$className}.php"); + +// Assumes executed from workspace root +$input = new Input('input/day_04.txt'); +if ($input->contents === "") { + throw new RuntimeException("File not found"); +} + +$grid = $input->toGrid(); + +$matchCount = 0; +foreach ($grid->data as $y => $row) { + foreach ($row as $x => $char) { + if ($char !== 'X') { + continue; + } + + $start = new Position($x, $y); + + $possibleMatches = []; + + $possibleMatches["north"] = $grid->getStringFromPositions([ + $start, + $start->getNorth(), + $start->getNorth()->getNorth(), + $start->getNorth()->getNorth()->getNorth(), + ]); + + $possibleMatches["east"] = $grid->getStringFromPositions([ + $start, + $start->getEast(), + $start->getEast()->getEast(), + $start->getEast()->getEast()->getEast(), + ]); + + $possibleMatches["south"] = $grid->getStringFromPositions([ + $start, + $start->getSouth(), + $start->getSouth()->getSouth(), + $start->getSouth()->getSouth()->getSouth(), + ]); + + $possibleMatches["west"] = $grid->getStringFromPositions([ + $start, + $start->getWest(), + $start->getWest()->getWest(), + $start->getWest()->getWest()->getWest(), + ]); + + $possibleMatches["north-east"] = $grid->getStringFromPositions([ + $start, + $start->getNorthEast(), + $start->getNorthEast()->getNorthEast(), + $start->getNorthEast()->getNorthEast()->getNorthEast(), + ]); + + $possibleMatches["north-west"] = $grid->getStringFromPositions([ + $start, + $start->getNorthWest(), + $start->getNorthWest()->getNorthWest(), + $start->getNorthWest()->getNorthWest()->getNorthWest(), + ]); + + $possibleMatches["south-east"] = $grid->getStringFromPositions([ + $start, + $start->getSouthEast(), + $start->getSouthEast()->getSouthEast(), + $start->getSouthEast()->getSouthEast()->getSouthEast(), + ]); + + $possibleMatches["south-west"] = $grid->getStringFromPositions([ + $start, + $start->getSouthWest(), + $start->getSouthWest()->getSouthWest(), + $start->getSouthWest()->getSouthWest()->getSouthWest(), + ]); + + $matchCount += array_reduce( + array: $possibleMatches, + callback: fn(int $acc, string $possibleMatch): int => match ($possibleMatch) { + "XMAS" => $acc + 1, + default => $acc, + }, + initial: 0, + ); + } +} + +// ANSWER: 2517 +echo $matchCount; diff --git a/2024/OCaml/lib/day_05/part_01.ml b/2024/OCaml/lib/day_05/part_01.ml new file mode 100644 index 0000000..92bb105 --- /dev/null +++ b/2024/OCaml/lib/day_05/part_01.ml @@ -0,0 +1,23 @@ +(* Day 5: Part 1 *) + +(* + 01. Parse pages that need updating into list, e.g. "75,47,61,53,29" -> [ 75; 47; 61; 53; 29; ] + 02. Parse page ordering rules into DTOs, e.g. "47|53" -> {"before": 47, "after": 53} + 03. Find all rules that have pages from the parsed page list on both sides, e.g. "47|53" is valid but "97|47" and "47|13" are not + - filter down to "before" values that are in page list + - filter down to "after" values that are in page list + 04. Map across the page list and ensure that all rules for each page are upheld + 05. Map across the rules for the current page and ensure that all rules are upheld + - filter rules down to rules with "before" equal to current page + - walk the page list and ensure that all "after" values do no appear before the "before" value + - return true if all rules are valid for the current page + 06. Reduce result down to single boolean + 07. IF FALSE, move on to next page in page list + 08. IF TRUE, continue until all rules are validated + 09. IF ALL RULES ARE NOT VALID FOR PAGE LIST, move on to next page list + 10. IF ALL RULES ARE VALID FOR PAGE LIST, save middle number in page list + 11. ONCE ALL PAGE LISTS HAVE BEEN PROCESSED, add all saved middle numbers + 12. Return sum of middle numbers +*) + +let solve _ = () diff --git a/2024/OCaml/lib/dune b/2024/OCaml/lib/dune new file mode 100644 index 0000000..84e62ca --- /dev/null +++ b/2024/OCaml/lib/dune @@ -0,0 +1,5 @@ +(library + (name AoC_2024) + (libraries re2)) + +(include_subdirs qualified) diff --git a/2024/OCaml/lib/file/read_input.ml b/2024/OCaml/lib/file/read_input.ml new file mode 100644 index 0000000..0f7470b --- /dev/null +++ b/2024/OCaml/lib/file/read_input.ml @@ -0,0 +1,11 @@ +let rec lines_from_channel ic = + try + let line = input_line ic in + line :: lines_from_channel ic + with End_of_file -> [] + +let lines_from_file filename = + let channel = open_in filename in + let lines = lines_from_channel channel in + close_in channel; + lines diff --git a/2024/OCaml/shell.nix b/2024/OCaml/shell.nix new file mode 100644 index 0000000..aa955b6 --- /dev/null +++ b/2024/OCaml/shell.nix @@ -0,0 +1,42 @@ +{ }: +let + config = { + allowUnfree = true; + }; + pkgs = import <nixpkgs> { inherit config; }; + + # choose the ocaml version you want to use + ocamlPackages = pkgs.ocaml-ng.ocamlPackages_5_2; +in +pkgs.mkShell { + # build tools + nativeBuildInputs = with ocamlPackages; [ + pkgs.opam + ocaml + findlib + dune_3 + ]; + # dependencies + buildInputs = with ocamlPackages; [ + bisect_ppx + findlib + menhir + ocaml-lsp + earlybird + ocamlformat + ocamlgraph + odoc + ounit2 + re2 + utop + + pkgs.gh # GitHub CLI + + # Fallback language + pkgs.php84 + pkgs.intelephense + pkgs.php84Packages.php-cs-fixer + pkgs.php84Packages.phpstan + pkgs.nodejs_18 + ]; +} diff --git a/2024/OCaml/templates/part.ml b/2024/OCaml/templates/part.ml new file mode 100644 index 0000000..062c917 --- /dev/null +++ b/2024/OCaml/templates/part.ml @@ -0,0 +1,3 @@ +(* Day N: Part 1 *) + +let solve _ = () diff --git a/2024/OCaml/templates/test.ml b/2024/OCaml/templates/test.ml new file mode 100644 index 0000000..0f50476 --- /dev/null +++ b/2024/OCaml/templates/test.ml @@ -0,0 +1,4 @@ +open OUnit2 + +let tests = "test suite for day n part 1" >::: [] +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/day_01_part_01.ml b/2024/OCaml/test/day_01_part_01.ml new file mode 100644 index 0000000..824c95b --- /dev/null +++ b/2024/OCaml/test/day_01_part_01.ml @@ -0,0 +1,27 @@ +open OUnit2 +open AoC_2024.Day_01.Part_01 + +let tests = + "test suite for day 01 part 01" + >::: [ + ("empty list is 0" >:: fun _ -> assert_equal 0 (solve [] [])); + ( "distance between 0 and 1 is 1" >:: fun _ -> + assert_equal 1 (solve [ 0 ] [ 1 ]) ); + ( "distance between 1 and 0 is 1" >:: fun _ -> + assert_equal 1 (solve [ 1 ] [ 0 ]) ); + ( "smallest are paired, then next smallest, ..." >:: fun _ -> + assert_equal 0 (solve [ 1; 2; 3 ] [ 3; 2; 1 ]) ); + (* See https://adventofcode.com/2024/day/1 *) + ( "solves example correctly" >:: fun _ -> + assert_equal 11 (solve [ 3; 4; 2; 1; 3; 3 ] [ 4; 3; 5; 3; 9; 3 ]) ); + ( "same number is 0 distance apart" >:: fun _ -> + assert_equal 0 (calculate_distance 0 0) ); + ( "same number is 0 distance apart" >:: fun _ -> + assert_equal 0 (calculate_distance 1 1) ); + ( "distance is equal to abs(x - y)" >:: fun _ -> + assert_equal 1 (calculate_distance 0 1) ); + ( "order of inputs doesn't matter" >:: fun _ -> + assert_equal 1 (calculate_distance 1 0) ); + ] + +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/day_01_part_02.ml b/2024/OCaml/test/day_01_part_02.ml new file mode 100644 index 0000000..f7340df --- /dev/null +++ b/2024/OCaml/test/day_01_part_02.ml @@ -0,0 +1,17 @@ +open OUnit2 +open AoC_2024.Day_01.Part_02 + +let test_solve = + "test suite for day 01 part 02" + >::: [ + ("empty list is 0" >:: fun _ -> assert_equal 0 (solve [] [])); + ( "ten x zero occurrances of ten" >:: fun _ -> + assert_equal 0 (solve [ 10 ] [ 1; 2; 3 ]) ); + ( "two x three occurrances of two" >:: fun _ -> + assert_equal 6 (solve [ 2 ] [ 2; 2; 2 ]) ); + (* See https://adventofcode.com/2024/day/1#part2 *) + ( "solves example correctly" >:: fun _ -> + assert_equal 31 (solve [ 3; 4; 2; 1; 3; 3 ] [ 4; 3; 5; 3; 9; 3 ]) ); + ] + +let _ = run_test_tt_main test_solve diff --git a/2024/OCaml/test/day_02_part_01.ml b/2024/OCaml/test/day_02_part_01.ml new file mode 100644 index 0000000..36af248 --- /dev/null +++ b/2024/OCaml/test/day_02_part_01.ml @@ -0,0 +1,38 @@ +open OUnit2 +open AoC_2024.Day_02.Part_01 + +let tests = + "test suite for day 2 part 1" + >::: [ + ( "empty list should have no valid reports" >:: fun _ -> + assert_equal 0 (solve []) ); + ( "valid report should count as one" >:: fun _ -> + assert_equal 1 (solve [ [ 7; 6; 4; 2; 1 ] ]) ); + ( "example correct" >:: fun _ -> + assert_equal 2 + (solve + [ + [ 7; 6; 4; 2; 1 ]; + [ 1; 2; 7; 8; 9 ]; + [ 9; 7; 6; 2; 1 ]; + [ 1; 3; 2; 4; 5 ]; + [ 8; 6; 4; 4; 1 ]; + [ 1; 3; 6; 7; 9 ]; + ]) ); + ( "all increasing" >:: fun _ -> + assert_equal true (check_report_safety [ 1; 2; 3 ]) ); + ( "all decreasing" >:: fun _ -> + assert_equal true (check_report_safety [ 3; 2; 1 ]) ); + ( "increasing and decreasing" >:: fun _ -> + assert_equal false (check_report_safety [ 1; 3; 2 ]) ); + ( "change of at least one" >:: fun _ -> + assert_equal true (check_report_safety [ 1; 2; 3 ]) ); + ( "no change" >:: fun _ -> + assert_equal false (check_report_safety [ 1; 1; 2 ]) ); + ( "change of at most three" >:: fun _ -> + assert_equal true (check_report_safety [ 1; 2; 4; 7 ]) ); + ( "change of at more than three" >:: fun _ -> + assert_equal false (check_report_safety [ 1; 5 ]) ); + ] + +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/day_03_part_01.ml b/2024/OCaml/test/day_03_part_01.ml new file mode 100644 index 0000000..0db039a --- /dev/null +++ b/2024/OCaml/test/day_03_part_01.ml @@ -0,0 +1,29 @@ +open OUnit2 +open AoC_2024.Day_03.Part_01 + +let example_input = + "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))" + +let test_find_mul _ = + assert_equal + [ "mul(2,4)"; "mul(5,5)"; "mul(11,8)"; "mul(8,5)" ] + (let result = find_mul example_input in + List.map (fun x -> Re2.Match.get_exn x ~sub:(`Index 0)) result) + +let test_extract_pairs _ = + assert_equal + [ (2, 4); (5, 5); (11, 8); (8, 5) ] + (let matches = find_mul example_input in + extract_pairs matches) + +let test_solve _ = assert_equal ~printer:string_of_int 161 (solve example_input) + +let tests = + "test suite for day 3 part 1" + >::: [ + "muls extracted from example correctly" >:: test_find_mul; + "pairs extracted from matches" >:: test_extract_pairs; + "example correctly solved" >:: test_solve; + ] + +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/day_04_part_01.ml b/2024/OCaml/test/day_04_part_01.ml new file mode 100644 index 0000000..9f43df0 --- /dev/null +++ b/2024/OCaml/test/day_04_part_01.ml @@ -0,0 +1,141 @@ +open OUnit2 +open AoC_2024.Day_04.Part_01 + +let example_input = + [ + "MMMSXXMASM"; + "MSAMXMSMSA"; + "AMXSXMAAMM"; + "MSAMASMSMX"; + "XMASAMXAMM"; + "XXAMMXXAMA"; + "SMSMSASXSS"; + "SAXAMASAAA"; + "MAMMMXMMMM"; + "MXMXAXMASX"; + ] + +let is_in_bounds_tests = + let test_is_in_bounds expected length index _ = + let actual = is_in_bounds length index in + assert_equal ~printer:string_of_bool expected actual + in + [ + "not in bounds if below 0" >:: test_is_in_bounds false 1 (-1); + "in bounds if gte 0 and lt length" >:: test_is_in_bounds true 1 0; + "not in bounds if eq length" >:: test_is_in_bounds false 1 1; + "not in bounds if gt length" >:: test_is_in_bounds false 1 2; + ] + +let calculate_num_of_matches_tests = + let test_calculate_num_of_matches expected line row_offset character _ = + let actual = calculate_num_of_matches line row_offset character in + assert_equal ~printer:string_of_int expected actual + in + [ + "is 0 when no matches present" + >:: test_calculate_num_of_matches 0 "SMMX" 1 { index = 3; character = 'X' }; + "is 1 when only one match present - top to bottom" + >:: (* + |.|X|.| + |.|M|.| + |.|A|.| + |.|S|.| + *) + test_calculate_num_of_matches 1 ".X..M..A..S." 3 + { index = 1; character = 'X' }; + "is 1 when only one match present - top to bottom edge" + >:: (* + |X|.|.| + |M|.|.| + |A|.|.| + |S|.|.| + *) + test_calculate_num_of_matches 1 "X..M..A..S.." 3 + { index = 0; character = 'X' }; + "is 1 when only one match present - bottom to top" + >:: (* + |.|S|.| + |.|A|.| + |.|M|.| + |.|X|.| + *) + test_calculate_num_of_matches 1 ".S..A..M..X." 3 + { index = 10; character = 'X' }; + "is 1 when only one match present - left to right" + >:: (* + |X|M|A|S| + *) + test_calculate_num_of_matches 1 "XMAS" 4 { index = 0; character = 'X' }; + "is 1 when only one match present - right to left" + >:: (* + |S|A|M|X| + *) + test_calculate_num_of_matches 1 "SAMX" 4 { index = 3; character = 'X' }; + "is 1 when only one match present - bottom right to top left" + >:: (* + |S|.|.|.| + |.|A|.|.| + |.|.|M|.| + |.|.|.|X| + *) + test_calculate_num_of_matches 1 "S....A....M....X" 4 + { index = 15; character = 'X' }; + "is 1 when only one match present - top left to bottom right" + >:: (* + |X|.|.|.| + |.|M|.|.| + |.|.|A|.| + |.|.|.|S| + *) + test_calculate_num_of_matches 1 "X....M....A....S" 4 + { index = 0; character = 'X' }; + "is 1 when only one match present - bottom left to top right" + >:: (* + |.|.|.|S| + |.|.|A|.| + |.|M|.|.| + |X|.|.|.| + *) + test_calculate_num_of_matches 1 "...S..A..M..X..." 4 + { index = 12; character = 'X' }; + "is 1 when only one match present - top right to bottom left" + >:: (* + |.|.|.|X| + |.|.|M|.| + |.|A|.|.| + |S|.|.|.| + *) + test_calculate_num_of_matches 1 "...X..M..A..S..." 4 + { index = 3; character = 'X' }; + "is 8 when matches present in all possible directions" + >:: (* + |S|.|.|S|.|.|S| + |.|A|.|A|.|A|.| + |.|.|M|M|M|.|.| + |S|A|M|X|M|A|S| + |.|.|M|M|M|.|.| + |.|A|.|A|.|A|.| + |S|.|.|S|.|.|S| + *) + test_calculate_num_of_matches 8 + "S..S..S.A.A.A...MMM..SAMXMAS..MMM...A.A.A.S..S..S" 7 + { index = 24; character = 'X' }; + ] + +let solve_tests = + let test_solve expected lines _ = + let actual = solve lines in + assert_equal ~printer:string_of_int expected actual + in + [ + "example is solved correctly" >:: test_solve 18 example_input; + "minimal example is solved correctly" + >:: test_solve 4 [ "..X..."; ".SAMX."; ".A..A."; "XMAS.S"; ".X...." ]; + ] + +let tests = + "test suite for day 4 part 1" + >::: is_in_bounds_tests @ calculate_num_of_matches_tests @ solve_tests + +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/day_05_part_01.ml b/2024/OCaml/test/day_05_part_01.ml new file mode 100644 index 0000000..0f50476 --- /dev/null +++ b/2024/OCaml/test/day_05_part_01.ml @@ -0,0 +1,4 @@ +open OUnit2 + +let tests = "test suite for day n part 1" >::: [] +let _ = run_test_tt_main tests diff --git a/2024/OCaml/test/dune b/2024/OCaml/test/dune new file mode 100644 index 0000000..8d01938 --- /dev/null +++ b/2024/OCaml/test/dune @@ -0,0 +1,8 @@ +(tests + (names day_01_part_01 + day_01_part_02 + day_02_part_01 + day_03_part_01 + day_04_part_01) + (modes byte exe) + (libraries AoC_2024 ounit2)) diff --git a/2024/_input/day_01.txt b/2024/_input/day_01.txt new file mode 100644 index 0000000..fd6ff80 --- /dev/null +++ b/2024/_input/day_01.txt @@ -0,0 +1,1000 @@ +17633 15737 +79440 47531 +44767 73309 +86871 26386 +66575 90774 +31637 38259 +89855 50198 +81829 20253 +95071 98569 +34163 43719 +28696 84802 +10975 89855 +48232 15737 +14078 99983 +40882 73431 +75659 94769 +85341 13345 +92610 16338 +18043 59463 +60606 24540 +22376 46760 +14535 24785 +26022 94769 +90745 76304 +94386 84190 +22699 50602 +48716 38259 +93599 63674 +24797 57698 +89866 94029 +13841 87991 +12612 31743 +22889 53500 +84705 43272 +50982 26386 +19312 68554 +43985 36005 +23864 99058 +71953 45509 +58611 64279 +15949 98297 +89181 99781 +57095 54781 +19462 82924 +13989 32724 +74037 81607 +98414 34699 +17793 73309 +77332 64279 +17360 75855 +88430 38259 +59633 52523 +93603 31051 +93215 57119 +89750 48853 +73983 31051 +95163 35142 +50441 65929 +66767 72254 +96947 78965 +62870 50159 +46395 76148 +25246 21955 +39127 18070 +69589 72254 +87118 77505 +89577 11697 +64365 17982 +89417 90211 +38259 91050 +14458 32457 +42775 20442 +58228 72254 +87729 30434 +63480 17982 +90234 31051 +19242 94087 +77553 64344 +42962 27509 +20746 70689 +42003 14840 +24751 72254 +98825 66551 +35667 48627 +86088 43388 +87433 12947 +42556 73309 +77443 26386 +85947 66440 +26239 23875 +51904 10613 +45935 55396 +93900 79692 +94769 26138 +89944 29196 +16924 31743 +29441 72254 +31685 52714 +28455 38856 +82408 89991 +50492 79692 +48587 27909 +52190 51936 +14432 26239 +40296 90211 +87571 15975 +68554 82924 +60909 77747 +90581 50216 +17874 89227 +77699 84802 +52227 95383 +81281 38845 +74510 77249 +34913 52738 +17927 11147 +38246 67042 +95559 90562 +97142 94769 +17388 43583 +45933 73309 +61625 92202 +92202 60021 +32609 42173 +10121 15737 +42108 52145 +99781 88040 +71839 52086 +31215 12281 +23028 11321 +45513 36187 +44989 92435 +21042 26664 +41686 53092 +49396 13345 +87383 24542 +57374 94769 +92305 94769 +90956 73220 +59298 60825 +71833 61968 +39322 15153 +90211 98328 +78524 76232 +56222 48717 +88896 42647 +24989 84802 +15618 57610 +40750 15330 +57787 59202 +66076 64279 +27005 46356 +12299 27983 +99606 96968 +78648 88145 +90191 82924 +40731 26599 +28572 32457 +29036 39980 +12210 26664 +72284 11697 +76661 90364 +90125 24914 +42239 14455 +11589 61336 +33000 72254 +10758 31712 +10172 21525 +39561 91482 +47405 95316 +44894 83948 +46926 43967 +59896 87826 +85512 65546 +58641 79692 +83574 57878 +98203 84802 +43633 10581 +47564 69216 +87287 82731 +43747 13345 +91297 79692 +76432 18598 +75790 26386 +93818 96480 +31051 38259 +47511 64279 +97907 22026 +87367 90211 +59976 50541 +52149 99781 +17942 67693 +99139 69460 +66216 49858 +29264 38259 +82924 51350 +66027 25520 +82954 73309 +12290 67322 +20683 93568 +85750 13345 +54662 52685 +79346 31641 +76068 84568 +39015 79773 +30045 19435 +82962 25655 +20148 42108 +67813 29679 +65066 26239 +84222 63931 +13345 59242 +90893 48967 +51707 83112 +42399 15737 +40546 66000 +19343 92202 +95420 14200 +81543 55348 +28417 13345 +57947 91893 +76560 24540 +25531 23044 +60453 50868 +48959 38856 +66180 16455 +16907 83845 +79677 32420 +69680 92202 +65677 32375 +58869 79692 +49481 19672 +81530 26664 +30968 18603 +40003 36218 +70770 89227 +51169 17982 +39585 99781 +41887 90211 +98401 68715 +66079 60199 +79686 17982 +95976 34064 +62505 24540 +66440 31743 +66353 26239 +37729 66440 +78716 84802 +87428 62768 +52512 89855 +86117 84802 +54387 68022 +13759 78689 +40476 66769 +44961 19623 +99372 68799 +89090 79636 +61709 42060 +66586 11972 +68112 33028 +56457 31743 +58500 37748 +49835 52835 +69526 95383 +81736 84802 +72397 80320 +28792 44785 +67973 74969 +28140 79692 +99229 95383 +37502 67333 +21071 32457 +98028 82116 +13892 64667 +64351 19859 +39347 86071 +73309 94769 +25904 31051 +50933 28770 +81957 97102 +53641 15737 +88814 42916 +92575 26239 +62255 54132 +81785 72088 +75349 50602 +83203 89855 +98080 81605 +93942 31743 +97798 57279 +45256 73898 +51544 93706 +25195 88904 +68947 68366 +91830 68022 +91524 54353 +76708 31564 +90123 40095 +86890 21718 +98282 26239 +41961 42868 +11039 12856 +55505 73643 +56720 73309 +50589 35243 +18316 57600 +89706 26386 +77270 26934 +16280 31743 +38856 31317 +38306 72254 +22621 31743 +52085 35952 +25990 17841 +47713 46814 +50171 26239 +68656 30746 +16833 96013 +31650 59611 +38239 93728 +90966 22779 +20522 65624 +74289 88356 +30878 15020 +99343 90211 +46494 46080 +40055 98186 +62089 79296 +27261 11480 +14641 89227 +62672 51003 +43731 67153 +13641 93818 +81157 15737 +38752 93975 +22481 16596 +56161 26876 +11821 15737 +21702 42699 +95781 99704 +96637 61893 +52222 25556 +56805 32457 +43568 31051 +62828 15737 +19567 40953 +49559 25373 +55482 42108 +44986 95412 +53062 52392 +57314 26664 +37016 14626 +63361 92202 +68680 79692 +18476 89101 +20199 21632 +77823 89855 +69738 96520 +67170 40198 +79546 82924 +85110 88431 +54119 46332 +86781 92202 +90311 90211 +57902 82924 +54606 12067 +75696 90211 +31498 77415 +63061 47498 +20426 30513 +77880 79692 +80653 46725 +12847 77929 +67482 73832 +41457 22015 +96070 37125 +26083 87259 +15571 17982 +64763 81999 +69049 22033 +37215 73309 +68721 84808 +41483 43032 +19623 21237 +80415 94769 +40289 47860 +29800 15737 +51573 87470 +95147 93818 +49768 43274 +57896 47996 +11698 31743 +18534 93345 +33315 66184 +93295 26435 +13998 14286 +37866 42108 +27311 91778 +88630 50602 +61311 65732 +58088 54659 +39038 92202 +21263 32457 +68733 26239 +56327 26386 +10831 84802 +41475 14140 +65191 84802 +65689 10408 +99405 76417 +60130 26296 +62835 15737 +43765 25627 +37857 74612 +75626 26698 +82299 39722 +59124 44751 +11662 59626 +13403 38259 +84021 71058 +46515 31743 +19274 99781 +42981 66150 +81200 96138 +28115 52538 +66036 73617 +46632 44785 +44785 45999 +93611 94769 +58202 27856 +83448 31743 +47387 99781 +56227 19962 +10056 90211 +47436 42592 +25614 38259 +91347 94837 +93293 87462 +54018 13345 +93975 24540 +88534 28661 +55107 36119 +90676 30422 +74207 72254 +53544 11697 +82027 50515 +28952 93818 +24039 73309 +51681 59383 +84784 33827 +57727 38856 +17375 79692 +84334 75729 +85913 61227 +34190 70516 +88405 93909 +57014 89855 +49572 51212 +96919 57120 +57074 84802 +97433 94600 +39316 19546 +23267 73309 +49617 62475 +45398 49944 +93789 84802 +80870 79692 +66592 89412 +84914 21538 +15737 58959 +85633 17470 +24299 89227 +50996 28076 +59760 37410 +19853 36303 +87172 63500 +73167 26239 +69533 58203 +10294 47085 +10068 84802 +71528 59133 +90074 48734 +85177 13345 +39240 19623 +46901 31230 +31573 14744 +40287 76713 +52063 31743 +15665 92202 +55652 57799 +94618 43492 +35516 17699 +99836 97684 +12266 93653 +49382 94769 +58480 27713 +30160 95383 +15895 82924 +99570 35771 +86138 29452 +50602 15240 +65863 72856 +14014 17313 +23202 73309 +52442 99781 +98402 62424 +99960 93818 +30587 37482 +27344 71566 +14901 18107 +50646 87619 +39894 82924 +76102 79692 +93553 41109 +95383 19459 +43523 34173 +93147 15737 +52736 86381 +73737 38856 +74670 89855 +70375 44671 +35660 27596 +68216 72680 +87067 46274 +74103 75792 +95109 17982 +17982 92202 +81693 14959 +72925 13345 +79007 26239 +56890 75332 +43163 94330 +89721 89227 +98999 88213 +24385 71775 +31463 68554 +86271 72254 +76927 43416 +82914 88520 +10672 42227 +37107 72254 +53415 65905 +57507 32457 +61956 80596 +53426 42108 +24147 73170 +42957 89855 +82795 66358 +36784 93211 +33334 18704 +81024 79692 +50757 87305 +11023 19777 +56827 91998 +63122 72254 +22187 93663 +45790 24392 +45455 25374 +18321 90211 +50449 42108 +88021 45580 +49799 13345 +87225 94769 +97435 26386 +83558 87182 +38550 95383 +33452 13345 +56025 17982 +67783 93390 +84187 48977 +39395 89716 +68418 38259 +52548 89161 +28163 72254 +84823 89227 +31206 15482 +64705 44785 +58401 31743 +95618 38856 +91709 93818 +48005 92202 +76020 82924 +23833 93782 +52831 50653 +85010 31743 +10664 99781 +22411 13783 +43979 31051 +61257 57691 +61520 15737 +48746 88134 +14279 44785 +47898 89855 +93422 88779 +68022 92202 +14459 96167 +89227 40096 +20824 33236 +75208 79692 +49845 41520 +51562 87703 +93302 64917 +92836 95935 +49142 35882 +50653 24538 +70201 17982 +13156 26664 +72511 68022 +25934 38856 +91338 47911 +75287 41621 +15292 17284 +61020 24851 +24871 93818 +69502 32804 +22107 32457 +11069 17982 +90501 32457 +79735 33307 +22407 40613 +56638 73309 +43995 97846 +24346 10698 +19332 64254 +98053 96741 +64279 95856 +35846 80488 +87249 15737 +26693 91433 +23953 37660 +36613 18796 +68547 42108 +29801 84802 +95876 20755 +96850 26239 +69173 21661 +15143 95829 +88911 12796 +85370 24540 +37936 55116 +27252 62202 +52765 68022 +85421 74199 +29524 26239 +50768 66440 +43558 86684 +51533 89797 +52414 88190 +69357 10930 +37499 82866 +51109 73091 +56299 68022 +35287 90211 +24335 31051 +66593 96407 +34510 24540 +59870 24540 +95114 93204 +25535 45844 +77617 36433 +90219 94315 +79862 38856 +23936 94769 +97001 31743 +80515 77665 +79565 73309 +26333 64279 +75467 90211 +76518 59553 +43602 20354 +36813 99477 +43716 27733 +65228 92202 +23719 94557 +27276 37673 +79341 13382 +92730 64279 +13327 26664 +74695 71838 +26891 51076 +27088 98880 +69958 38856 +91806 17982 +85215 82201 +87804 97407 +87074 38259 +91912 67024 +88017 73309 +37176 26386 +86262 52774 +79370 72254 +59531 72254 +87454 61531 +56438 90211 +69511 28232 +56851 38259 +65430 80706 +36077 17982 +25960 94769 +71485 38856 +54398 90211 +28265 28278 +78120 87123 +59446 34818 +26386 89227 +83452 48947 +37184 37978 +61882 68022 +85743 83130 +58108 93975 +88676 91673 +56709 31769 +60790 80223 +13675 30664 +26508 38856 +86384 45096 +11697 51693 +18506 84802 +64140 26386 +72254 73309 +32457 31743 +47880 57178 +28362 66440 +41762 94769 +52860 13501 +76072 37914 +28664 30385 +38694 83674 +77076 73416 +52304 15737 +48805 97201 +79691 84802 +60446 31743 +50527 13345 +57332 73119 +91969 69182 +24540 42108 +52000 10568 +60350 85617 +65954 75315 +77087 26664 +11673 21083 +86822 31308 +46369 94769 +72162 80387 +78984 15737 +86619 94893 +97668 19111 +98988 92336 +82635 29846 +13455 94769 +58975 80353 +25865 16923 +53039 10038 +30768 15737 +12014 14617 +46545 19623 +25611 38259 +68704 97611 +19940 47269 +86483 63673 +57437 51287 +61703 26386 +48018 51102 +67563 66460 +40899 62325 +39500 34475 +54669 11697 +58288 88743 +74372 50602 +78876 81743 +44932 34577 +63464 81249 +83883 68022 +52588 82924 +32785 67603 +50300 78946 +43503 50602 +64904 84802 +76135 68022 +35611 93677 +64841 34132 +10588 30349 +63814 48233 +19013 17210 +80561 64619 +88208 26239 +10576 10445 +99430 92202 +38695 90117 +32677 30805 +28960 72254 +76150 37024 +27997 66440 +25216 38259 +75079 95383 +19640 32457 +87142 24540 +29691 73136 +43608 60367 +37613 29457 +11187 86291 +14208 97616 +85169 89855 +12976 24540 +64222 52066 +10454 14324 +26231 19580 +94650 15737 +58941 89855 +79692 27316 +54692 10285 +63161 69466 +89688 14267 +88077 93568 +81434 41368 +30007 84802 +93568 72254 +38883 73016 +69231 94769 +14633 72555 +22196 79692 +48676 84802 +87546 84802 +87523 24540 +95107 73309 +79211 15737 +55870 89227 +10953 36166 +11083 73309 +21863 36153 +38429 62600 +61106 92358 +97986 93975 +88704 38856 +93825 66535 +29839 40913 +24546 21464 +74178 15737 +42883 94769 +40996 38622 +42992 26664 +71684 42730 +57251 23426 +26664 31743 +68948 73753 +97206 68022 +57843 33400 +49113 13345 +60920 50511 +22678 89227 +72961 78397 +19802 38490 +86087 90211 +89652 66440 +49821 24540 +50537 79692 +73536 24540 +53929 98400 +60918 79692 +99061 49678 +37062 38238 +20934 72875 +67200 34807 +71415 94769 +99026 96883 +31743 14721 +59957 93818 +68759 76158 +41938 17982 +97993 69305 +80420 85851 +46816 93742 +28271 71400 +87923 32457 +67736 36498 +47677 92202 +56483 84724 +90236 79692 +64649 86922 +55425 46497 +12465 17982 +20096 82924 +60707 96546 +60329 73309 +17905 31743 +11135 17982 +29543 94769 +86447 79692 +77740 97091 +94482 84802 +93699 69588 +26097 13450 +98119 79692 +85496 14796 +86244 73309 +96663 59923 +15846 82924 +85935 72254 +27121 75478 +85411 84131 +30273 32457 +20039 82924 +78703 20706 +41844 64465 +68394 44785 +23329 90139 +58675 96125 +71413 93818 +73282 14167 +50904 89227 +85583 65246 +20025 17289 +47996 18160 +29785 31743 +95739 47118 +79616 92202 +88013 76315 +58837 91798 +78955 92642 +70336 26239 +24170 33987 +78256 24257 +10398 26386 +46571 93031 +93997 79692 +10668 45223 +86866 90211 +49014 53649 +69991 92202 +36977 90623 +92324 79031 +95872 13345 +84633 26386 +30462 24540 +32209 85790 +45036 80196 +17978 68976 +87590 50253 +84802 72481 +39492 68554 +35134 63205 +26840 17894 +75937 10487 +20865 70581 +22548 26386 +73301 56010 +55824 85167 +33501 38259 +97678 30745 +89755 41648 +59158 81505 +51201 66440 +31408 92202 +91451 90800 +70921 29799 +19367 13325 +77381 31051 +91572 89049 +77233 26502 +86139 70861 +60708 35871 +78193 26239 +24930 31852 +14024 82528 +64480 82924 +15775 26239 +75694 94769 +85608 73391 +81409 19623 +57211 26386 +94296 59256 +79582 21822 +59998 38856 +68629 13345 +17800 26239 +37775 44785 +70250 28657 +30006 39357 +80597 35930 +22013 93975 +78422 26239 +38548 24540 +86266 72254 +97848 26386 +84347 56506 +81988 28292 +17114 26660 +11319 73380 +41857 13345 +59624 18015 +75476 33080 +19083 13949 +58992 58123 +60891 32063 +30704 28458 +81706 98995 +65022 87326 +80970 46974 +78758 79469 diff --git a/2024/_input/day_02.txt b/2024/_input/day_02.txt new file mode 100644 index 0000000..8a93f73 --- /dev/null +++ b/2024/_input/day_02.txt @@ -0,0 +1,1000 @@ +85 86 87 88 85 +30 32 35 36 36 +75 77 79 81 84 87 91 +9 11 13 15 16 18 21 27 +72 73 76 75 77 80 81 +7 9 8 11 12 10 +95 97 98 95 95 +64 67 68 69 70 67 68 72 +5 7 5 8 14 +33 35 35 38 39 41 43 +88 89 92 93 96 96 98 96 +62 65 67 70 72 72 72 +83 86 89 92 93 93 95 99 +27 28 30 31 31 38 +31 33 34 38 40 42 +32 34 36 40 38 +12 13 14 16 20 22 22 +31 32 34 38 39 43 +44 47 48 50 53 57 60 65 +22 25 26 33 35 +6 8 15 18 15 +49 52 55 62 62 +39 41 42 48 50 51 53 57 +41 42 44 47 53 54 59 +48 47 50 51 52 54 57 58 +24 22 23 24 26 23 +33 30 32 33 33 +49 47 50 53 55 59 +15 12 14 16 23 +87 85 82 83 85 87 +48 47 49 46 47 45 +13 11 8 10 10 +50 47 44 47 51 +78 77 79 81 83 86 84 91 +41 39 41 41 44 +15 12 15 15 16 17 15 +60 57 60 60 63 63 +22 20 21 21 24 28 +87 86 88 88 90 93 98 +13 12 14 18 20 +72 70 74 75 78 79 77 +51 50 53 54 58 58 +69 67 68 71 72 75 79 83 +7 5 7 9 13 15 18 24 +34 32 34 40 41 +6 4 7 9 11 18 16 +31 29 32 35 40 42 42 +64 63 65 71 73 76 79 83 +63 60 63 65 70 76 +22 22 23 26 29 31 34 +34 34 35 37 34 +66 66 68 70 71 71 +16 16 18 21 24 26 30 +55 55 56 58 59 60 67 +76 76 77 78 77 80 +19 19 16 18 17 +37 37 40 43 44 47 46 46 +17 17 16 18 20 22 26 +10 10 12 9 12 18 +3 3 3 6 9 +34 34 36 39 40 40 39 +19 19 20 23 23 26 26 +28 28 31 31 35 +36 36 37 37 39 44 +75 75 78 79 80 82 86 89 +23 23 24 28 29 31 30 +30 30 34 36 37 38 41 41 +10 10 12 13 17 18 22 +25 25 27 31 33 34 40 +1 1 8 10 11 12 +11 11 14 15 20 19 +76 76 79 86 86 +79 79 86 88 92 +64 64 67 68 70 73 80 87 +4 8 10 11 12 +46 50 52 54 55 57 59 58 +46 50 51 52 55 58 60 60 +22 26 29 32 36 +62 66 67 68 71 73 79 +56 60 63 64 63 66 67 +49 53 55 58 57 56 +27 31 34 31 31 +73 77 75 78 81 85 +10 14 16 17 16 23 +64 68 71 71 72 75 77 78 +38 42 43 43 42 +12 16 16 19 20 20 +65 69 71 73 76 77 77 81 +47 51 52 53 53 56 58 64 +25 29 31 34 36 39 43 44 +13 17 18 22 23 25 22 +30 34 38 39 41 41 +28 32 36 39 42 43 47 +32 36 39 41 45 46 53 +77 81 88 91 94 +63 67 68 69 76 74 +25 29 34 37 39 39 +74 78 79 84 85 86 90 +14 18 23 24 26 31 +35 41 44 47 48 50 51 +47 53 56 57 59 61 64 62 +13 19 22 25 28 31 34 34 +56 63 64 66 70 +65 70 71 74 79 +41 46 44 45 46 48 +13 19 16 18 16 +74 80 77 78 78 +41 46 47 46 48 52 +31 37 36 39 44 +42 48 48 51 53 +7 14 15 15 17 15 +60 67 67 69 69 +21 28 28 29 33 +59 65 68 70 73 73 79 +40 45 49 50 53 56 58 59 +83 88 92 95 93 +35 40 42 43 46 48 52 52 +72 79 80 84 85 89 +37 44 47 51 53 54 57 63 +37 42 43 44 51 54 +75 82 83 89 90 92 90 +48 53 60 62 65 68 71 71 +4 11 14 19 23 +72 79 80 85 86 88 89 96 +65 62 61 60 63 +55 54 53 50 49 48 48 +14 11 10 8 4 +24 22 20 19 18 16 15 9 +78 75 77 75 73 70 69 68 +74 73 70 73 72 74 +23 21 18 19 19 +80 77 79 77 76 72 +78 75 76 74 71 68 63 +88 85 83 83 81 +44 42 42 39 38 41 +34 31 31 29 29 +76 73 72 72 69 65 +78 77 74 72 72 67 +76 74 70 69 66 +84 82 79 76 72 70 69 71 +21 18 14 13 11 11 +67 66 62 61 58 55 53 49 +66 64 61 57 54 51 46 +77 74 73 71 69 67 61 60 +28 25 19 17 15 13 12 14 +16 14 8 6 6 +90 88 85 84 78 74 +79 77 72 69 66 65 62 57 +83 86 85 82 80 +31 34 31 30 31 +9 11 8 7 5 5 +65 68 65 63 59 +74 77 75 74 71 70 63 +32 33 30 28 27 29 26 +9 11 9 7 4 7 5 6 +92 95 94 93 90 91 91 +26 28 31 28 25 24 20 +18 19 18 15 17 11 +18 21 21 19 16 15 +10 11 8 7 6 6 4 6 +51 53 53 50 49 49 +72 73 72 71 71 70 67 63 +91 93 90 88 87 87 86 81 +58 60 56 53 51 +12 13 9 8 10 +5 6 2 1 1 +47 49 47 45 44 43 39 35 +52 53 52 51 50 46 41 +88 89 87 80 79 +17 19 18 11 13 +57 58 55 50 47 46 46 +30 31 29 27 25 23 16 12 +56 59 58 56 50 43 +29 29 26 24 23 22 20 +64 64 62 61 60 58 60 +62 62 60 57 57 +63 63 62 60 57 55 52 48 +19 19 18 17 15 14 9 +25 25 28 26 24 21 18 16 +41 41 39 38 37 39 41 +68 68 71 70 69 68 67 67 +68 68 65 68 65 61 +51 51 52 50 44 +92 92 89 89 86 +48 48 46 46 47 +92 92 91 88 88 88 +10 10 10 8 7 3 +50 50 48 47 45 45 43 37 +85 85 84 82 81 80 76 75 +60 60 58 54 51 48 50 +83 83 79 76 76 +62 62 61 57 53 +75 75 72 69 65 59 +96 96 93 92 90 89 83 82 +94 94 91 90 85 84 83 85 +44 44 37 34 31 31 +28 28 26 25 22 21 14 10 +71 71 69 66 61 55 +82 78 75 73 70 +60 56 54 52 51 50 51 +69 65 62 60 58 55 52 52 +23 19 16 14 11 10 6 +81 77 75 73 71 66 +10 6 8 7 5 +65 61 59 60 63 +76 72 70 68 69 68 65 65 +57 53 50 52 48 +87 83 82 79 81 78 73 +39 35 33 32 32 29 27 24 +98 94 93 92 92 89 87 90 +63 59 58 58 58 +30 26 26 23 19 +42 38 37 36 34 34 33 27 +44 40 39 35 34 +16 12 8 7 4 1 2 +93 89 85 82 81 80 77 77 +43 39 37 33 31 27 +52 48 44 42 35 +21 17 16 10 7 4 2 1 +71 67 62 61 58 57 54 57 +21 17 15 10 8 8 +54 50 47 44 39 35 +62 58 53 51 44 +66 59 56 53 52 +41 35 32 31 30 29 31 +44 37 35 34 32 31 30 30 +30 24 21 20 17 13 +35 30 27 26 20 +33 27 25 27 25 +55 48 45 42 45 47 +8 3 1 4 1 1 +82 77 74 75 71 +93 86 85 87 86 85 83 78 +80 74 72 71 71 69 68 65 +51 44 43 43 44 +73 68 65 64 62 62 59 59 +77 70 69 68 65 65 64 60 +91 85 82 82 79 72 +37 30 27 23 22 19 17 +91 85 83 80 76 75 74 76 +58 51 47 44 44 +45 39 37 35 31 28 24 +42 35 32 29 25 18 +67 61 59 54 53 52 +23 17 16 9 6 8 +39 34 29 26 24 23 21 21 +24 17 15 14 9 5 +97 92 90 87 81 79 78 71 +52 52 52 54 55 57 59 64 +83 87 88 89 93 93 +79 85 88 87 84 +41 41 43 43 41 +77 75 74 73 74 74 +12 19 19 22 24 24 +33 33 40 42 46 +92 86 82 80 74 +17 18 16 13 12 10 7 2 +63 68 71 72 70 71 72 72 +78 83 90 93 93 +27 28 28 29 31 33 35 38 +48 47 50 51 55 +53 53 51 48 45 +25 21 18 15 14 11 11 7 +28 33 36 38 41 39 43 +40 46 53 56 61 +70 69 70 75 73 +38 42 43 45 47 48 53 +35 38 37 34 33 30 28 +73 72 77 80 81 +92 88 85 82 82 81 78 76 +44 48 50 51 52 52 55 52 +59 64 64 67 71 +29 34 36 42 44 47 46 +53 52 53 60 63 70 +51 53 56 58 58 58 +83 80 76 74 71 65 +58 62 63 65 67 70 +87 87 84 77 77 +25 29 32 32 39 +68 70 73 75 75 78 79 78 +53 48 44 41 39 35 +73 72 75 72 79 +62 63 65 68 71 74 79 +35 39 46 48 50 52 53 57 +48 46 49 51 52 52 50 +50 50 51 53 56 56 56 +96 93 91 90 84 +27 23 20 13 11 6 +77 82 83 81 84 +91 91 87 84 86 +77 77 79 79 83 +18 18 19 23 24 28 +65 65 63 62 60 53 +85 87 88 87 86 85 84 80 +35 31 29 25 22 15 +6 7 4 1 2 +77 82 85 88 89 92 93 97 +35 36 35 34 31 24 18 +48 50 53 56 62 64 +75 71 70 73 72 71 68 66 +56 55 58 59 62 63 67 71 +22 22 26 27 29 31 32 32 +70 74 75 73 75 76 77 77 +29 30 32 35 33 36 37 43 +71 67 64 64 59 +95 97 96 95 95 93 91 87 +88 91 93 94 91 90 +92 88 87 83 81 80 76 +4 7 9 10 11 13 10 +19 18 21 25 27 30 30 +32 31 28 23 22 20 13 +31 35 38 41 45 48 49 +72 71 72 71 65 +72 72 70 65 67 +33 30 28 24 27 +73 70 67 64 63 61 61 +58 58 59 58 56 58 +71 77 78 81 83 86 86 +64 66 63 63 61 +47 51 51 53 54 55 55 +46 42 39 36 35 33 35 31 +84 86 85 79 79 +66 63 61 59 55 51 +67 69 72 74 75 81 88 +44 47 48 51 52 56 57 61 +94 94 96 94 89 +46 46 46 43 37 +73 72 74 77 79 82 84 89 +61 56 50 49 48 47 47 +31 27 25 24 22 23 22 22 +48 43 41 39 32 +40 33 30 28 25 25 21 +44 50 54 57 58 61 67 +49 51 45 44 41 44 +26 26 22 19 16 14 13 +46 52 52 54 56 53 +59 61 58 56 56 53 51 45 +27 28 33 36 39 43 +73 71 72 74 76 81 84 88 +48 43 42 40 40 38 +17 23 25 25 27 32 +96 91 88 90 88 84 +20 25 26 31 34 +19 16 16 18 21 23 26 32 +65 69 72 74 75 79 +57 53 53 51 48 49 +29 29 28 28 27 26 24 25 +91 92 89 86 82 76 +22 21 22 24 25 26 27 +91 92 94 96 97 97 +43 47 50 55 61 +22 15 13 10 6 4 5 +37 36 33 30 28 24 21 +19 19 16 14 11 11 7 +45 45 48 49 50 48 48 +28 28 27 25 25 +60 62 60 59 56 52 49 49 +14 14 17 15 16 17 22 +14 17 14 11 10 6 +9 9 11 10 14 +27 23 21 18 15 15 +54 56 63 65 67 70 70 +15 15 17 18 20 23 27 +37 36 37 41 44 45 +55 62 64 66 69 70 72 73 +72 67 65 58 56 50 +5 11 13 16 20 19 +66 73 75 75 76 79 80 82 +18 21 25 27 28 +55 55 59 62 63 62 +48 48 42 41 39 32 +67 69 66 64 63 56 54 +42 42 43 46 45 44 +43 47 49 53 54 55 57 63 +14 13 7 5 1 +59 56 57 55 56 56 +97 97 98 99 97 +33 33 31 28 26 23 19 +25 25 27 29 30 +85 81 84 82 84 +81 80 81 84 87 89 91 90 +77 78 79 82 82 84 87 91 +34 30 29 27 25 22 24 +24 24 25 26 27 30 37 +77 81 85 87 84 +28 25 26 28 26 24 +96 90 86 85 83 82 80 +9 8 5 5 5 +55 52 53 53 54 54 +73 72 73 74 81 81 +96 93 95 93 89 +48 47 46 43 37 37 +53 57 59 60 62 60 62 61 +68 70 68 66 62 61 59 61 +82 81 81 83 87 +17 17 14 10 9 2 +73 78 80 84 86 +20 13 14 11 11 +75 79 80 77 80 84 +94 91 92 95 97 97 +89 89 88 85 84 85 82 82 +79 78 80 77 79 83 +7 8 9 13 14 17 16 +70 73 74 71 69 68 +69 63 60 59 56 58 55 57 +35 31 30 23 20 17 13 +45 40 36 35 35 +32 28 26 21 19 17 17 +56 53 50 44 43 46 +60 59 58 56 52 +74 74 80 82 83 86 +84 84 87 90 93 95 95 +25 30 33 35 36 39 41 48 +12 10 13 13 14 16 19 +72 66 64 62 59 55 +90 91 89 91 92 93 97 +71 70 70 68 64 +36 32 25 24 27 +36 36 34 30 29 26 22 +26 19 18 17 14 11 +28 21 19 17 17 +20 20 18 16 14 13 16 +81 78 79 81 85 91 +38 34 31 28 27 26 25 20 +71 71 64 61 59 57 +20 20 22 20 19 +57 55 52 55 53 52 +71 72 70 71 73 76 78 78 +1 3 6 8 9 13 13 +19 18 16 12 12 +48 50 53 53 58 +90 91 88 84 83 82 80 78 +45 49 51 52 53 55 54 +15 13 10 10 9 7 +29 33 34 36 37 38 39 39 +15 21 24 25 26 30 30 +49 48 46 44 41 40 38 36 +82 85 88 91 93 95 96 97 +70 73 75 78 81 84 87 88 +71 72 73 75 78 80 +65 62 61 60 58 57 54 53 +89 91 94 95 98 +83 85 86 87 89 90 +13 11 10 9 6 +69 70 71 73 76 +86 87 90 91 93 94 +81 78 75 72 70 +75 78 79 82 84 +88 85 84 81 79 76 +65 62 60 59 56 55 52 51 +90 88 87 85 82 +36 35 33 30 28 25 23 +70 69 66 63 62 +4 5 7 8 11 +44 43 42 41 39 +6 7 8 11 14 16 +27 28 30 31 32 33 +84 82 81 80 78 77 74 +74 71 70 67 65 62 59 58 +53 56 59 61 63 65 +85 86 87 89 92 93 95 96 +49 50 53 56 58 59 61 63 +72 69 66 65 63 +57 55 54 51 50 48 +55 57 58 61 63 64 66 68 +19 21 24 26 27 +60 59 58 55 53 50 48 47 +77 76 74 71 70 68 66 63 +3 4 7 10 11 14 15 17 +58 57 54 52 49 +77 75 74 72 70 +80 77 74 72 70 68 67 +33 30 27 24 21 20 17 +44 45 46 48 50 52 54 57 +72 73 76 78 81 82 85 +88 91 92 93 94 97 98 99 +23 20 19 18 15 12 11 +39 40 43 44 45 48 +84 87 88 91 94 95 +38 35 32 30 27 26 23 22 +34 35 36 38 41 42 43 +61 63 66 68 69 +51 54 56 57 59 60 +63 66 67 70 71 74 77 +17 16 13 12 9 8 +63 61 59 57 55 52 50 +61 64 65 67 70 72 74 76 +74 72 69 68 65 64 +12 15 16 18 20 +97 95 94 91 88 +67 68 69 70 73 76 78 +51 54 57 58 61 63 65 +45 44 41 38 36 35 32 +70 73 76 78 79 81 82 +18 15 14 13 11 9 6 +44 41 40 39 36 35 +33 34 37 38 40 +30 29 26 24 21 19 +29 30 31 32 33 36 38 +48 46 45 43 41 40 +83 84 87 88 90 +48 49 51 52 53 54 57 +68 71 73 74 76 78 81 83 +79 81 84 86 87 90 +63 64 67 68 71 73 +47 49 50 51 52 53 54 56 +95 93 90 89 88 85 83 81 +46 44 42 41 40 38 35 34 +87 86 84 81 78 75 73 +84 87 90 91 92 94 +87 86 83 81 80 +11 9 6 5 3 2 +10 8 5 4 3 +49 46 44 43 40 38 +34 37 38 39 41 43 44 46 +47 50 52 54 57 +87 86 84 81 78 75 +81 84 85 87 88 91 92 94 +32 35 38 39 42 45 48 50 +74 73 71 70 69 68 +41 40 37 36 34 32 29 27 +13 15 16 19 21 23 +17 16 14 12 10 7 4 +66 69 72 73 74 75 77 +13 11 8 7 6 3 1 +13 16 17 20 21 23 +32 30 28 25 23 21 +75 73 70 67 64 +22 23 26 27 30 +67 70 72 74 75 76 79 +52 51 50 49 46 44 41 38 +64 62 59 57 55 54 52 +34 37 38 39 40 42 45 +14 11 10 7 5 +1 4 6 9 11 +75 72 70 69 67 65 64 +22 19 16 15 14 +86 85 84 83 82 79 77 +88 85 84 81 78 77 76 73 +15 14 12 10 8 7 4 +53 54 57 60 63 64 66 +72 70 67 66 63 61 +21 24 27 29 30 32 34 +21 19 18 17 15 14 +16 13 11 9 6 +49 52 53 56 58 61 64 67 +57 56 54 51 48 46 43 41 +90 91 94 95 96 97 98 +59 62 64 65 67 +33 30 27 24 21 18 +25 23 22 20 19 17 +3 4 5 7 9 11 +57 54 52 50 47 44 43 41 +86 88 91 93 94 +54 55 58 59 62 63 +91 94 95 96 99 +86 89 92 94 96 +69 70 73 74 76 77 +3 6 7 8 10 13 +65 63 60 57 56 55 53 +13 15 18 20 22 +14 13 11 10 7 6 3 +5 6 9 11 14 15 +59 62 63 65 66 +62 65 67 69 70 71 74 75 +70 69 67 64 61 59 +70 68 66 64 61 58 55 52 +3 6 7 8 9 +11 13 15 16 18 20 23 +95 93 91 89 86 83 81 79 +25 23 22 21 18 17 +63 64 67 70 71 73 +94 93 90 88 86 83 +86 84 83 80 78 +17 16 13 11 8 5 2 1 +78 79 82 84 86 88 91 +69 68 67 65 63 +77 78 79 81 83 85 87 90 +77 75 72 71 69 66 +76 77 80 81 83 85 +82 81 79 76 74 72 +63 61 58 56 53 52 +65 66 69 71 74 77 78 +37 40 41 44 47 +90 89 87 84 82 +69 72 73 76 78 81 +10 11 13 14 16 19 22 +52 51 48 47 44 +75 76 79 81 84 +82 80 77 76 75 74 +78 77 75 74 72 70 68 +12 13 15 16 17 20 22 25 +12 9 7 5 3 2 +44 42 40 37 36 +65 67 69 70 73 75 78 +92 91 89 86 83 82 +98 96 93 92 90 88 +77 74 72 71 70 69 68 +74 73 71 69 68 +85 88 91 93 95 +12 10 9 6 5 3 1 +88 87 84 82 81 80 +5 6 9 10 11 14 +20 19 17 16 14 12 +50 47 45 43 40 39 +57 54 52 49 48 46 +79 80 81 82 85 +93 90 89 88 86 +6 9 10 11 12 14 17 19 +4 7 9 10 12 +45 44 42 40 39 +1 3 6 7 9 10 13 +37 36 33 31 28 26 25 22 +25 24 23 21 19 +78 81 84 86 89 +23 21 19 16 13 10 9 7 +82 81 78 75 74 72 71 69 +94 93 90 87 84 81 +90 89 87 84 82 81 78 76 +86 83 82 80 79 76 75 72 +65 62 59 57 55 53 +41 44 47 50 53 +99 96 93 91 88 85 83 81 +94 91 90 87 85 82 81 79 +50 47 45 44 42 40 39 +79 82 84 85 86 89 91 +28 26 24 21 20 19 +22 23 25 26 27 29 30 +42 45 48 49 50 51 +90 88 87 86 84 83 +14 15 16 18 21 24 +91 89 88 87 84 83 +7 10 11 14 15 16 17 +60 58 56 55 52 51 48 47 +88 91 93 94 96 +91 88 85 83 81 78 76 74 +54 51 50 48 45 42 41 40 +84 86 89 90 92 94 96 +16 13 12 10 7 +47 49 51 53 54 55 +43 45 47 49 50 53 +97 94 92 89 86 83 81 +85 88 89 90 92 93 94 +51 53 55 58 60 61 63 65 +61 63 64 66 69 71 73 +60 58 57 56 54 +56 54 53 52 50 +89 87 84 81 78 76 73 70 +15 16 17 20 21 +34 36 37 38 41 44 +41 40 39 36 33 32 30 27 +91 92 94 96 97 98 99 +12 14 17 20 21 +40 43 44 47 50 52 54 55 +49 52 53 54 56 59 61 +91 89 86 84 82 79 78 75 +43 45 47 50 51 54 57 +51 48 45 42 41 +34 33 32 30 29 +55 57 58 60 61 64 +62 59 58 55 54 +61 63 66 69 72 74 +55 53 52 49 48 47 +20 22 25 27 30 32 34 35 +71 73 76 78 79 81 +35 36 38 39 41 44 47 48 +60 63 66 69 71 73 76 79 +90 89 86 84 82 80 +71 73 76 77 80 82 84 87 +81 82 83 86 87 89 +42 40 38 37 34 +97 96 93 91 89 86 +11 12 15 16 18 +1 2 5 8 10 12 +8 7 6 3 2 1 +71 70 67 65 64 +91 89 88 85 82 79 +69 67 65 63 61 60 58 +53 52 50 49 46 44 42 41 +21 19 18 17 14 13 11 +93 92 91 90 87 84 +34 31 29 27 26 24 23 20 +86 84 82 81 78 77 +71 73 74 75 76 79 81 82 +28 31 32 33 34 36 39 +53 56 58 60 62 65 68 69 +50 51 54 55 58 +59 61 64 65 66 +81 83 86 87 89 +65 64 62 61 60 +75 74 72 71 68 67 64 63 +29 31 34 37 39 41 43 46 +51 48 46 43 42 39 36 +34 35 38 39 42 45 48 +34 32 31 29 27 24 22 20 +28 27 26 24 21 20 17 15 +27 30 31 33 35 37 39 +47 44 41 39 36 35 +60 62 63 65 67 68 70 71 +28 31 32 34 37 +38 41 42 43 45 +65 64 61 60 59 +78 81 84 86 87 90 91 93 +45 42 41 38 37 36 +72 75 76 79 81 82 84 86 +81 78 77 74 73 72 69 66 +70 71 74 76 77 80 82 83 +17 15 12 9 8 7 6 +42 44 45 48 51 53 55 +60 58 57 55 54 +36 33 32 31 29 +49 50 53 54 56 58 60 +71 72 75 76 78 80 82 85 +38 35 32 29 26 +30 33 36 37 40 +65 62 61 58 56 54 52 +28 31 33 36 38 41 43 45 +85 83 81 80 79 77 74 71 +72 69 68 66 64 61 +48 50 52 53 54 56 58 +78 80 81 83 86 88 +57 55 52 50 49 46 45 42 +85 88 90 91 93 94 +91 89 87 86 83 82 80 77 +77 78 81 84 87 88 90 93 +67 68 69 71 74 77 78 +65 64 61 59 58 57 +24 26 29 32 35 38 +64 67 68 69 72 74 76 +82 80 77 75 73 70 +12 15 16 19 21 23 26 28 +90 88 85 84 81 80 78 75 +18 20 22 23 25 28 +79 78 77 75 73 +69 68 67 64 61 +58 60 62 64 66 +35 36 38 41 44 45 +81 84 86 87 90 91 93 96 +78 75 72 70 67 64 61 60 +5 6 9 11 13 15 17 +51 53 54 55 57 60 61 +41 38 36 34 31 29 28 +47 50 52 53 56 59 60 +27 25 22 20 18 16 13 10 +46 48 50 51 52 +93 92 90 89 88 +63 62 60 57 54 53 50 48 +82 84 86 87 90 91 +26 29 30 31 34 35 38 40 +79 77 76 74 72 70 +25 27 28 30 31 +84 85 86 88 90 92 +26 29 30 31 33 36 38 +59 62 65 66 69 70 71 +4 5 7 9 12 +10 12 14 15 16 19 22 +44 47 50 53 56 59 62 63 +85 87 89 90 91 93 +31 34 37 39 42 45 46 +32 33 34 35 36 37 39 40 +78 77 76 74 72 +37 40 42 44 47 49 52 +11 9 8 6 4 3 2 +24 22 19 18 16 13 +36 34 32 29 28 25 23 21 +87 84 81 79 76 75 73 +83 85 87 88 91 94 97 99 +36 33 32 30 29 27 24 +86 85 83 82 79 77 74 +59 56 54 52 49 48 47 +78 79 82 83 85 87 88 +36 39 42 45 47 50 +87 89 90 93 94 96 99 +93 94 95 97 98 +20 17 15 14 11 9 6 3 +73 70 67 66 64 +84 85 87 90 92 94 97 +49 46 45 43 40 +4 7 8 9 12 +28 26 24 21 18 16 +15 16 19 20 23 +14 15 16 17 20 22 +45 46 49 50 53 54 56 58 +58 57 55 54 51 49 +52 55 58 61 62 65 67 70 +28 30 31 34 35 38 +40 38 35 32 30 29 26 24 +91 88 85 84 82 79 77 +35 34 32 29 27 26 25 +60 57 55 52 51 +85 88 90 91 94 97 +13 16 18 19 22 24 25 +41 42 43 44 45 48 49 +32 34 36 38 41 42 +13 14 17 20 22 25 +51 48 46 44 43 +60 63 65 66 68 71 72 74 +17 20 22 25 27 30 +75 77 80 82 85 87 +73 74 77 80 82 85 +78 77 74 72 69 67 +21 19 17 15 13 11 +43 46 47 50 52 +79 80 82 85 86 +74 76 78 80 82 84 87 90 +92 90 88 86 84 82 79 +12 10 9 7 6 3 +11 9 8 7 6 +29 28 27 24 22 20 +75 76 78 80 82 +66 64 62 60 57 56 55 +58 56 54 53 52 50 47 45 +13 14 17 19 21 24 25 26 +14 17 19 22 25 27 30 32 +90 89 86 84 83 81 80 +52 49 46 45 42 41 +39 40 41 43 46 +53 56 58 61 62 +83 81 79 77 75 72 70 +59 60 62 65 66 +34 35 36 39 40 41 43 45 +80 81 82 83 86 89 90 92 +17 16 14 11 10 8 5 +20 18 16 14 12 11 8 5 +54 51 50 47 45 42 40 39 +96 93 92 90 89 87 85 +85 87 90 91 93 95 96 99 +49 50 53 55 57 +16 19 21 24 25 +64 65 68 69 71 73 +23 26 29 32 34 37 38 41 +79 82 85 87 90 +88 89 92 94 95 98 +22 20 19 17 14 11 +74 72 71 69 66 64 61 +29 26 25 24 22 19 +56 54 53 52 49 48 45 +28 31 34 36 37 38 40 +23 22 21 18 16 15 12 +43 44 47 50 52 53 55 58 +92 91 88 85 82 80 +41 43 44 47 48 51 53 +18 16 13 11 9 7 6 4 +84 85 88 90 91 92 93 96 +57 58 61 62 64 67 70 73 +57 58 59 62 63 +26 24 23 21 18 17 +95 93 92 91 88 85 82 +63 65 67 68 71 72 75 +85 86 89 92 95 97 99 +29 27 26 25 22 21 18 +40 42 45 46 47 49 +43 45 47 49 50 53 55 +94 92 89 88 86 83 82 80 +28 27 26 23 21 +85 88 90 92 94 96 97 +58 56 54 52 49 46 45 42 +64 67 69 72 74 75 76 78 +8 10 11 13 16 19 20 +97 96 94 92 90 +59 61 62 64 66 69 71 +74 73 70 68 66 +20 23 25 27 28 30 32 +34 31 30 29 27 25 22 19 +44 42 40 39 38 36 34 +93 90 88 85 82 79 76 73 +69 68 66 64 63 60 58 56 +13 12 10 8 7 6 5 3 +68 71 74 75 76 +40 39 36 34 31 28 27 25 +48 45 44 42 39 38 37 +68 70 72 75 78 80 83 +84 87 88 91 93 96 99 +45 44 41 39 37 35 +16 14 11 9 8 6 3 2 +77 80 81 83 86 87 +18 21 23 26 27 28 30 31 +12 15 16 19 21 24 +27 29 31 32 33 35 +77 76 74 73 70 67 64 63 +28 30 33 35 36 37 38 +49 48 46 43 40 37 34 32 +75 77 80 82 83 85 88 91 +20 17 14 13 12 10 9 6 +63 60 57 55 54 +18 21 24 25 26 +63 65 68 70 73 +88 87 85 84 83 80 +61 64 67 68 70 +21 22 24 27 29 32 34 +52 51 49 48 46 43 +82 81 78 76 74 73 71 +24 21 20 19 17 +66 63 62 61 58 57 54 51 +69 66 64 62 61 59 57 56 +14 17 19 20 21 24 +3 4 5 8 9 11 13 15 +81 79 78 75 74 73 +30 31 33 34 36 37 40 +66 63 62 60 58 56 55 52 +15 16 18 20 21 +77 79 81 82 83 84 87 +7 8 9 11 12 15 17 +19 16 14 12 10 8 7 6 +42 45 47 49 52 +42 39 36 33 30 28 26 +32 30 28 25 22 21 20 +73 70 69 67 65 64 +10 12 13 14 15 18 +72 69 66 64 63 +75 76 79 81 82 85 87 +63 66 69 71 74 +17 14 13 10 8 7 5 2 +52 55 57 58 60 62 +41 42 45 48 50 51 +61 60 58 56 55 54 51 +56 57 59 60 63 64 66 +79 78 77 76 75 73 70 68 +93 91 89 87 85 84 +39 38 37 36 33 31 29 28 +32 35 38 39 42 44 45 +12 15 18 19 22 25 +88 90 91 92 95 96 98 +45 43 41 38 35 33 +22 20 17 16 14 +52 50 49 47 45 42 +98 95 94 93 91 +6 7 9 10 11 12 15 18 +55 58 61 62 64 66 68 +67 69 72 75 76 78 +96 93 90 87 84 +58 60 63 66 69 +51 52 53 56 57 58 59 +24 26 29 32 35 36 +35 32 29 27 25 22 19 16 +34 33 31 28 27 26 +45 44 41 38 37 34 +32 31 30 29 27 24 23 +59 60 63 65 66 69 +61 59 58 55 53 51 48 +80 81 84 87 90 92 +67 64 63 61 58 56 +58 61 64 65 67 68 69 +52 55 56 58 59 60 +76 75 72 69 67 64 62 +78 81 82 83 85 88 +48 46 44 42 41 39 36 33 +65 64 63 60 59 57 54 51 +56 58 59 60 61 63 +64 66 69 72 74 77 79 81 +36 34 32 30 28 26 23 +82 80 79 77 76 74 72 +22 24 27 28 31 +67 66 63 61 59 58 55 +55 57 59 62 63 64 +4 5 7 9 10 12 14 +57 58 59 62 64 65 67 68 +21 19 16 14 11 10 8 5 +33 31 29 26 24 22 19 +66 63 60 59 57 +54 51 50 47 46 44 43 +97 94 93 92 89 86 +16 19 22 23 25 27 +46 44 43 41 40 39 +74 72 70 68 66 65 63 60 +55 54 51 50 48 45 +17 18 21 22 23 26 28 30 +61 62 65 66 67 +77 75 73 70 67 64 61 60 +48 50 53 56 59 61 64 65 +75 78 79 81 83 86 +52 54 56 59 61 63 66 68 +45 42 40 39 36 35 32 31 +77 75 73 71 70 +60 57 55 52 51 50 48 47 +70 73 75 77 79 82 84 85 +75 77 79 81 84 86 88 +49 52 53 55 57 60 +80 81 83 84 85 87 90 93 +16 17 19 21 22 24 +61 58 55 53 51 48 47 46 +70 68 65 63 61 58 55 54 +3 6 8 10 11 +89 87 86 84 82 81 79 +27 29 32 33 36 38 41 43 +47 49 50 51 52 55 56 +28 29 31 32 35 38 +90 89 88 87 85 84 +38 37 34 33 32 29 26 23 +67 66 65 62 59 +66 63 61 60 59 58 57 +21 20 19 17 15 12 9 8 +18 21 23 24 27 +8 10 13 15 16 +29 28 25 23 20 +63 61 58 57 55 54 +53 54 55 58 60 63 64 +13 12 10 7 6 4 +35 33 32 30 27 24 21 18 +69 67 64 63 61 60 58 55 diff --git a/2024/_input/day_03.txt b/2024/_input/day_03.txt new file mode 100644 index 0000000..567dd05 --- /dev/null +++ b/2024/_input/day_03.txt @@ -0,0 +1,6 @@ +(who()where()''~[how()'&do()why()$;mul(323,598)&/-'}{&-/<do(), '~>[?-mul(933,97)how()?from();}{+mul(864,562):#<*$>mul(63,747)what()mul(514,101){]$where())~>do(){:mul(53,731)mul(899,858)~~[select()(~mul(402,353)?^&!,who()what()-when()mul(4,41)-&mul(505,942)how()*/%select(667,826);mul(233,284)(&mul(484,956) #/mul(243,698)[;')how()'<%+[mul(153,970)!when()^{^;mul(176,383)@$$~[select(901,794)mul(322,492)from(183,121),-mul(212,356)who();)where()select()#do()>!who()!mul(138,847)&select()mul(128,454)select()what()(&<-mul(650,981) #when(636,522)(who()'-{?mul(149,431);/ !$}<#<!mul(806,218)when():mul(669,489)!@,) select()+mul(596,973)!@}mul(990,349)-]{,'mul(684,303)-[*mul(358,267)(mul(819,988)+;$}who()-[mul(67,603)< -!$%$who()?mul(753,49)[^who()>@mul(15,553)[[>;%mul(389,307)'mul(864,97)#[$why(),<>mul(322,599) ^mul(109,985)who()<from()from()?<?'mul(894,431)select(397,204)why()}mul(540,913)*?what()?~select()mul(411,407)/^how()-'select()mul(590,166) <how()mul(664,994)from()#^ *mul(384,184)][$^mul(113,201){$)*;{mul(634,407)who()@ how()why()(from()from(65,876)^mul(649,20)>when()<why()!~/who(),mul(586,611)mul(797,330)^&mul(409,692)@@from()]<select(){do()['who()who()&]mul(414,374)~from(){}what()>mul(763,870){from(905,178);$/mul(980,975)$why()@don't()#why()#from()from()when(){mul(436,3)[^]/*what()!!mul(300,322)where()!select()*(~why()mul(845,313),[:mul(937,973)how()^when()mul(552,183);from()/ &from()>'!mul(773,549)/where()~<?mul(869,838)%where()[%#&mul(835,525);?$<[], mul(69,159)what()>from(277,235)'mul(43,275)#>#[?-mul(110,899)~where()when())mul(976,743)%& mul(373,511)what(){{$)?}!mul(565,194)from()%#mul(47,349)(select()%when()&mul(263,392)-#,{+ *(mul(382,243)@:?+&-#%when()from()don't()where()what()(+from()- }where()mul(904,460)@how(768,761)}-why():<what()mul(312,552)@why()/-where()? >^mul(450,724)~mul(570,970)+-+/when():mul(203,363)why()[%%@mul(803,322)how()#who(),mul(368,46)select()what()#^*>from()from()+do()^(:)]+mul(585,478)^*:[mul(4,668);&select()'(mul(931,511);:mul(356,478)[mul(933,523)}';when()mul(616,605)why()$]{{select()how()~mul(869,274)mul(15,936)how()/:}mul(297,842)#}%~,select()$@(!mul(961,553)when()why(40,621)>mul(35,851),?+*mul(574,127)when()select()}who()from()/from()mul(107,604)<~@)mul(911,877who()?(when()!mul(496,778)select()when()select()&<mul(980,829)*<,>!$:,}+mul(278,194)%))who()when()*why()#+mul;when()??what()select() -%how()what()mul(873,684)where();where(741,393)+}?!'}mul(684,81)what()what()how()who()from()/<{>mul(286,481),<^mul(788,53)mul(561;)mul(376,887)+]-(when()[who();mul(205,369)!how(425,691)do(){}when() {mul(260,802)],*where()^why()how(){don't()where()}#?*), mul(670,405)^how()where()]mul(645,220)who();< > +select()how()+mul(763,932)+mul(141,632)+'}how(),@#from()'from()mul(211,161)mul(272,971)[@,>mul(340,784)-#why()&:@mul(343,209)when()#/]&mul(408,205)#!,,@;{>}@don't()mul(682,891)^:(>mul(234@when()} don't()) mul(322,500)~>when()*mul(826,896)$!^+->>what()don't()~&select()mul(127,828):,!^!%where(168,484)<~mul(709,801))@*{mul(148,549);from(649,310)+~what():why():?mul(62,198)mul(133,316)select()mul(580,623)who()who();<;[who(388,191)!{mul(819,559)/[mul(572,562)))@,mul(148,103)who(),select()(mul(669,636)-{mul(493,60)))&#^mul(766,322]*mul(290,960)mul(962,649)mul(209,105) +mul(759,17why()&'!](%-mul(389,889),select(){/mul(907,972)why()&(<mul(778,477)-:from()*+@^mul(876,124)#}!what():what(){<mul(633,946)from()when()*]mul(61,166):*!select()select()mul(385,972))[*-<select()][do()/{select()what()mul(572,800)+%>#what()select()+!when()mul(379,398)'-{?mul(275,735)>why()(]%)select()+mul(811,330),%who()#mul(27,53)mul(810,378))how()[don't()^$'*mul(714,951)[>where()}:}%)mul(741,834~][<mul(515,311)[;)where()&-$when()!mul(943,268)>*% where()}&when()mul(84?mul(204,282)*,]+@^+%what()what()mul(442,73from()@select()}?when()~select()do()from()-}:where(){$* {mul(436,174)where(209,751)mul(576,189)[^when()what()why()don't()@when()%<$?mul(49,842)>who()from()-:$mul(309,375)-who() <+#+/when(225,777)mul(298,362)^~how()what()]&^;<mul(333,974)mul(760,603))<mul(547,974)#}}#}%mul(939,522)>&;^mul(573,219)[:/mul(714,428)}%mul(534who()@}}]:~'how()('mul(985,19)>( do()%what()&mul(17,24)when()),>from()do()@%!mul(967,50)why()}from()~who()<where()mul(619,399)-+mul(926,910)!mul(790,450)%what()mul(652,66))*~,)@%*'<do():#{/>/;!:mul(330,386)>why();]*<%[{from(285,989)mul(746,507),)where(131,831)'>select()!'who()mul(936,547)mul(698,306),mul(810,111)'[[when()mul(859,814when()(,^:$when()*^@*mul(639,6)()%mul(530,398)from()?'+]what()%mul(565~mul(664,297)][{where()$<'mul(521,918)<~'']?do();how()?[;,! who()^mul(993,640)-$;how():from()mul(555,779)where():?mul(802,307)/}&;@where(),],$mul(428,846)mul(914,333))%$?from()mul(132,678)*when(843,580)mul(360,826)*/when()% what();'mul(726,716)+select()'#~},when(587,50)select(871,597){mul(204,647)(from():{*-]$where()>mul(347,78)'@why()why(990,935)mul(708,962)(:^#what(),)+mul(946,615))>>$how()do()<<&mul(27,707){)&what()mul(734,74)+>'mul(889,356)+{why()why()&why()mul(875,327)[ $who();]#&!@mul(887,395)how()/<select(),~}'>mul(445,826)mul(325,137)why()$#&[+:mul(61,520)~when()]/from(682,457)^;&~,mul(909,277)mul(155,72)what()@<([?#do()&}why():who()mul(636,58)where())[<who()mul(963,11)?!what()what()} ~]mul(675,549)~%{)>@who(487,170)?mul(195,909)how()#;where()why()-)&[/mul(682,842)!(+}+^<<;mul(303,732)mul(709,34)@' (when()~mul(32,411)@don't()what()select()mul(765,345)mul(124,69)mul(68,95)/mul(967,749)do()who()where()who(){:why(430,451)(*when()where()mul(719,917)**)#mul(77,946),when()mul(273,971)#[what():+>why()]mul(583,407)<%from()mul(360,886)who())where(465,475)mul(398,130)#when()where()?where(),#~;mul(647,114*]who()-'*%!from()do()~';?(?$?mul(750,896)'^!how()+'!:/mul(95,159)who()>from(){;how()<mul(749,897)-'^mul(415,582)from()[(where()mul(568,507);~)why()) -mul(850,931)!where()why()~@<!{why()do() ^~%why()mul(909,10)!select(),!-}why()who()mul(654,569)'+mul(416,33)!+how() why()mul(384,73)(#why()where(){&mul(601,75)mul(186,890)-),mul(441,730)from()$+-mul(781,347)[{*from(),mul(412,933)how()]%$:><&,!mul(623,492)+?::from()who(){mul(915,36)#what()mul(855,275)mul(546,43)%%!&from()mul(256,937)^%how()where()+#mul(720,847)who()>mul(530,714))]~<mulwhen(127,51)#/#what()mul(442,992)mul(199,836)~(mul(133,954)#;@~ /:mul(807,810)-<!select()mul(967,241)'^mul(931,561)~;+$how(208,930)how()[(mul(536,241)$mul(161,306~!)$mul(823,497)[*:>what()#when()who()where(353,953)mul(948,731)} ?]~&don't())where()when()where()who():%,?-mul(348,179)why()where()^'/mul(858,210)^$what()!+mul(169,479)};from(106,826)/who()mul(44,593how(382,624)>)-'+#mul(822,120)when(509,411)]why()@from()@~/$do()mul(135,70)?select(){don't()]~mul(339,843)mul(89,314)*[-from()do()){>%^#mul(961,883) +#-}*mul(204,272)^@':%>]'/mul(399,973)from()!,>>mul(183,122):?#<({+ )mul(489,296^/where()$how(949,670)where()^}/mul(509,262)&!why()when()mul(42,399)]@how();(mulselect()why()~[*!mul(530,643),#$mul(798,926)select()%/:]'from() ?select()mul(777,171)@how()'when(849,184)do()'-'''mul(609,27)how()^&<mul(294,233)/;who(292,498)-:;mul(46,352)who()*'!what()?where()~?mul(678,93)' who()where()mul(918&:/{mul(778,76)mul(992,739)who()< select();mul(233,391)when(){%-[(when()mul(622,255)select(){@#($;$>mul(663,547)}where(891,558)mul;*select(){~$!mul(679,190);<~mul(95,93)where()>mul(347,816)}'[from()+mul(69,7)@,-;^what()mul(679,759)mul(985,484)mul(374,224)+^<}mul(356,351)*(?why()'how()why()when()]>mulwhen() select()!-who() mul(386,988)#%]{ {~mul(403,987)select()<from()^$;how()!mul(934,779)from()from()[ who()why(41,259)why()mul(986'}]>from()where()[+/mul(534,4)'from()who()mul(845,463)^~^who())]!:&from()mul(396,175)mul(797,149),mul(373,499)~/mul(908,215)when()who()$-what()where() ![from(874,415)mul(735,220)%from()?;*<mul(420,264)-;*:?mul(648,648)from()[} +when()mul(484,535)-)from()how()select()[^mul(827,744)*[,:%$mul(318,590)!mul(72,338)}from(332,828)+<@>select()who():'mul(958,295)?from(){[how()}mul(577,440*]mul(248,108)/{mul(845,24) what(708,623)&,mul(962,333):-{mul(228,773) @;'mul(65,412){],]}where()mul(695from()}:mul(802,950)?}&mul(903,520)]select()}@mul(819,46)')who(290,48)}]!+}mul(175,633)from()[-+/select()]#from()mul(502,869)who()who(){who()[$*$mul(625,448)where()&!where() &mul(640,501),&when(322,255){who()mul(393,184)%*(#from()where()mul(855,937)@;(+mul(658,584)+what():'$$mul(510,392)what();%mul(972,965)][*mul(199,39)mul(258,651)#where()when()$mul(629,994)]+&[where(747,799))<?(mul(243,235)~>mul(927,670)$# !{*who()mul(925,133);don't()*mul(430,770))}when()!;mul(691,631)+mul(78,556)]~+{where())mul(119,527)*{>where()mul(108,678)'select()!:$*>mul(178,527)do()&^mul(958,626)-&$[}?mul(51,760)mul(24,628)!mul(193@^{who():^';?'mul(494,429)&who()@;[(from()~mul(556,60)/^[{mul(448,594)+from()/why()mul(133,200)^when()~select()*,how()mul(874,680)'from()>~when()when()>mul(993,110,%!{*</mul(296,249))how()$<*{%^mul(499,678)why()+?]where()+mul(960,503)-$mul(837,497)}#when()when()-[from()]mul(137!*from()?;{,#-[mul(865,181)who(688,662)~?>mul(964,213)[mul(740,725)*}! <mul(842,760)!~{mul(595,90),%^]don't()+from()+(!>-'mul(681,471)$don't()who())< ?*<when() $mul(116,694)who()mul(334,892)select(){mul(692,393)%!?~%select()when(628,495))why()mul(109,158)*how()mul(601,487)how()<mul(18,993)mul(176,256)what()why()select()+?%mul(613,499)what()don't()@~mul(383,802)<!mul(265,451)^,( mul(556,577)'select(486,637)+<select()mul(194,935)how(),]%mul(183,304)%?mul(896,216)who();*why()^]who()$'-mul(482,857)>-^^+*#'%mul(354,482)//;select()why()^select()?how()%mul(717,506)from()from()where()mul(729,432)],> ]@mul(817,878)(mul(25,684),select()?mul(9,290)select()~//from()mul(597,993)>:%]}who()<]&[mul(463,497)'(}don't()what()@&+!select(323,684)%how()mul(530when()'why()mul(595,825)&?why()mul(419,41)how()don't()-(mul(682,595)%,;{&:^%-what()don't()^ *@{how()+what()mul(69,125)*?!?'!why(),<mul(824,838-mul(799,561);@*from()mul(723,945),%[@#,~from(){mul(246,930)$mul>]what()where()<]mul(38,337) (mul(920,421)who() what()&*]{mul(228,619)where()#?'%^>who()mul(500,245) +{!;';'~)$^#!/usr/bin/perl<@what()&where()-[!]mul(215,331):!^~!&mul(740,257)how(283,279)#mul(86,887)>how(){[([mul(229,645)/+:don't()'(select()how()-{>$mul(319,757)what()^mul(438,563)$where(){select()mul(176,746)] ]%mul(291,179)mul(720,898)}{~;what()]do()[when()/@,)<mul(909,994)/<^{# why()!/don't()?why()mul(502,478)><why()]where()%,/ @mul(576,319)**)'%;*mul(434,53)#%%<:~*@'}mul(122,740)*?from()/#)who()select(11,207)'mul(198,192)(when()})+;[from()mul(228,554)/{]$^mul(707,718)what()@ @//'<mul(697,798)<mul(751,203)$*>:select()!mul(356,326)>?'mul(655,327);,#why()':[ mul(782,645)[:)what()??%mul(328,999)@^ (@>^%from()mul(765,647(,'/mul(523,130)where()why()%where()~why();where()who()mul(536,374)from()mul(240,454)!]how(122,192)from()#)how()/why(572,858)!don't()[mul(626,865)*!$,from()},-mul;:what()mul(926,728) '>}who()^%mul(971,826)<when()what()who()where()select()((;}mul(782,632)-mul(555,891)why(493,334)why(){how()mul(497,236);who()when()mul(224,527)select()@'how()select()mul(983,17))<from()>{(>mul(414,666)}&?&<--<-/mul(869,9)who(706,345)when(211,297)[what()><why(52,346)select()~mul(407,710)how()%{why()*):mul(428,443)#@]mul>'-(){how()?]{select()mul(514,69)mul(926,807)when()who()+[don't(),}$where()%##(mul(628,758))from()?mul(269,430)mul(489,967)when()mul(171,814)+ &when()mulfrom()#]((^{mul(104,614)how()&why()^+who()why())(&mul(843,643)>)(;[when(888,120)how(463,116)mul(519,821)<,(why()$when()who(623,832)mul(26,559)]:why()?/]-;{?do() why()-mul(759,848)*who()why()}*where()mul(358,256)who(250,854)don't();<mul(234,96);@select()mul(232,858)select()who()mul(260,692)[what(307,353)+^what()mul(770,421)who(); *#&{*who(307,583)mul(781,961)]'%where()<*}?-(mul(812,383)'%>#?-~what()how()mul(188,539)what()why()(:how()how()when()(~,mul(10,118):!where()select(){-mul(851,170)+why()[why()-$(from(287,301)mul(53,873)+(&];)![mul(654,539)~how()why()why()who()&>mul(802,188)#}mul(286,24)#-~+~]who()'mul(281,726)why()#{![+when()mul(105,845)+@select()mul(932,93)-:;/';, mul(820,402)select();where()mul(282,739)%what()who()!{%why();:who()mul(37,507)[) &$who()mul(398,244)where()]]<^,*why()from()mul(703,450)?$ mul(568,998)[/mul(241,361)[*>,}%do()what()how()mul(539,814))+^what()@what()!mul(484,815)</&#why()-mul(886,584)>'select(875,43)don't();{]*]^;who()mul(798,636):~>mul(398,278&mul(468,474)(}@;~mul&%[who()@mul(118,538)!$@who()how()*what()what(),<mul(67,428)mul(510,176)mul(803,856)mul(161,602))mul(158,587)mul(360,238)~':,mul(478,5)&*+-}where()*mul(804,17)!@how()$</*%@mul(286,874) #:>why()^*+why()mul(156,58)[^from():)#<<how()mul(268,300)-how()%?#{mul(674,761)]!don't())>?<{mul(47,431) ,>'mul(131,665)who()how()what(){@mul(888,835)who(593,10)'%how()select(357,595)mul(793,894)+select()(mul(289,300)mul(668,408)}+[,mul(404,186):+~}^mul(580,609)who()(:((+mul(664,287){from()<{mul(627,661) select()mul(961,352))why()from()how()mul(652,317)$<select()how():mul(351,933)why()what()<do()mul(70how()where()!-mul(760,394)/(%mul(346,151)]when()(;what()mul(912,435):when()^when()what()select()'how()mul(701,360)}^$mul(312,786)&! ^select()mul(468,133)]!<what(726,322)]#!)why()>mul(423[%where()(!</mul(38,161)~&+'&why()!~*mul(495,220)>[[]]/@mul(613,935)%:[ &<where()}(mulwhen()where()how()mul(340,241)mul(630,76)&why()+%{@!])mul(146,728)! ;${^{from()mul(58,368)@?select() %,!)mul(682,975)# )how()^?%mul(703,165)'from()when()from()^mul(140,504)~from()'select()what()when()[%{mul(44,577)(>?where()<select(27,140),mul(741,451) ~how()why()how()$select()@!mul(812,268) +*where()select()!+! '@mul(279,497)?when()mul(261,969)select()&!&mul(361,865):~<}!&mul(215,665)&:%from()'mul(412!%-@$:)mul(93,869)&how()when()/+! don't()/why()[';/how(698,147)mul(187,610)+]]!}when()mul(727,817)who()?mul(876,423)what():@{mul(772,859)>why()[:{mul(473,246):[what()^mul(673,250)mul(674,621), ,} ;>when(){-mul(934,227)where())#where()~mul(535!~!how()]how()^mul(16,678)-%?why()what()*-do()}#mul(407,518)?<>'@)&,mul(935,102)+select()@>{>>>~)mul(810,478)mul(13,154)>-]from()@when()mul(359,474)who()<?&+do()what()}mul(463,300);%who(20,992)/where()*where()%(mul(307,632){what()@:}!;-%mul(262,328)/?)don't()select()&%<mul(945,418)/](~why()]}mul(844,771),%mul(66,907)mul(634,936)'+don't()mul(667,574)where() ]@+where()mul(797,682)from()!*&:mul(828,603))mul(428,801)^what()@>-who(311,794)mul(595,571)mul(10,255)what()<who()mul+#mul(786,784)-^?how()how()&don't()/}mul(353,33)]?mul(188>+${select()who()%'!mul(767,38)[mulhow()~{mul(101,378)')where()}!from()!%mul(81,12) what()+what()::select()mul(851,679):#}~&>who()when()/'mul(341,606)when(){)^who()from()select()mul(462when()]^{what()%{!why()don't()why()^@$mul(480,740)mul(327,864)$why()@&,*how()!{mul(359,622)%#+~*where())##%mul(957,284)[]who()}/,)mul(646,738)mul(588'&~&what()#!~mul(901,808)mul(751,892){>*;,why()how()mul(588,670)when() $from()${!#<mul(904,960)mul(268,822)select(865,281)^what()when(870,4)+!mul(283,416)[~how()]@when()%#from(116,591)mul(903,643)how(544,123)select()what()mul(131,766)where();<(}^%'>don't()(select()^&where()mul(430,59)@~why()mul(880,187)how()&!'what()where()how()mul(496,275)+who(){/$!mul(571,229<*!*>mul(843,816)who();what()<#@->'&mul(578,292)/ why()mul(585,157)select()}@>/(when()mul!^who()mul(660,711)><}why()when()mul(392,7)what()$who()how(156,813)'mul(512,78)select()from()*,;mul(139,554)why()!;}&}$from()mul(534,318)(##:]*)what()how()mul(981,987)#select()when(914,450)!:/'mul(664from()^from()?'-mul(287,512)>;?~how()> #mul(763,19)}:mul(875,396)/(-from() !:why()mul(830,397#mul(143,615)mul(565,22)~what()+mul(443,374)how()mul(396,99))who()do()mul(613,198)*,who()]?{(#mul(681,692)(@:[<#;]mul(353,806)mul(416,977)&from();/don't()why(),,&mul(844,896)$how()%:#:(+>who()mul(929,260) %+'when(),~*+mul(549,134)why()[why())!;)when()(from()mul(306,154)'where()what()mul(781,501)['when()why())where()&[select()-mul(256,37)mul(764,192);mul(204,633)mul(980,29)]$mul(85,142why(88,3)~mul(297,384)>mul(445,165):}who(){(: mul(790,74)$?)where(361,397)^what()$$mul(932,137)mul(283,441)$$where()&^~mul(419,42)/$$mul(95,704)what()from()^mul(686,803):from()?what()$mul(657,560)~mul(394,381)why();-+&}where()<}!mul(320,912))+# &,#mul(22,374)^[';!^mul(295,509)who():from()-*mul(844,745)*}$when()where();&^mul(157,945)~how()^/?(mul(98,104)mul(883,360)}from()where(456,72)$???who()[]mul(869,340)from()@/$({@who()'mul(30,429)what();':,:,'select()mul(444,351),mul(568,344))]where()[@)'*!-mul(268,329)who()don't()]select()(select() what()&{'mul(190,17)*mul(795,718)who()^@+;+mul(748,907)>]who());<mul(812,750)(what(307,854)?,mul(559,132)$?/}what()!who()]]mul(64,576)&*{((?mul(514,113)!;do():(select()/ ]mul(884,458):who()[*^[how(458,26)'mul(874,485)^%where()^&*>}&mul(645,937){,/how(47,395) mul(826,39)how()}where(791,937)<^{@)mul(286,200)}who()how()&from()'what()$select()!mul(615,866)<where()@mul(41,606)/from()}@$where()? 'mul(135,4)from()>) why()(/why(901,882)[:mul(815,919)why()mul(713,155) + mul(267,443)&select()#/$ )mulwhy(834,619)mul(468,369):mul(360<what()>when(248,679)*when()]don't()(what()<+^{mul(84,136)!mul(865,460)mul(63,689)}who()/!**%/mul#?(,,!when()mul(321,194),?/$who()why(264,50)*-mul(424,308)(/[%~$who()!*?mul(870,366)-;+*^*mul(629,804from(485,259)what(691,680)why() {what())mul(182,814)who()who()mul(45,447)*,from()(+&?$select()*mul(592,101)why()};mul(716] how()when()&%select(393,368)when()*+^mul(360,598),*%~]mul(483,209)}*!@mul(124,485)why()'select()!from()$];mul(827,797)!who()&mul(750,119)mul(266,461)<#+(?{[don't()}what()where()+mul(668,848(*!how()%how()>mul(537,81)-<mul(621,554)!{;(,/)%mul>@don't()why()+mul(290,311)'>/! mul(886,782)}>]~);>?mul(800,965){mul(124,560)[mul(54,352)what()!when()what()'-$] mul(485,906)mul(532,777)*mul(899,963)!^> +where(733,202)where())mul(42,658)don't()>what() who()mul(672,366)%-~*who()select()why(654,545)why()<?mul(148,482)what()(@^mul(204,539)!']!^}mul(316,20)?@$&select(168,13)[:<&mulwhen()'mul(346,412)!<,@mul(421,140)%):;when(333,927)what()mul(662,233+)who()-mul(813,444)(what()(who()]mul(257,562)who()from()?who()#? don't()[why(),*mul(135,871)}from()}{!mul(422,420)*!;^@?why()when(53,628)mul(707,263)$-do()what()^+''~!mul(331,55)select()mul(41,984)who()what()mul(732,731)who()select())mul(96,453)mul(45,369),mul(403,541)what()from()mul(958,966}&&[&)#where()#mul(826,845)do()select()mul(276,52)@'&where(37,727)when()!why(){'mul(16,709)from()&mul(169,255)what()!when()}}{from()<mul(516,193)+mul(809,866))}~^:+who()'mul(802,497)mul(353,83)when()mul(753,747)what()-mul(990,592)mul(47,486)@}where()mul(52,937)what(321,510)mul(75,204)[from()(mul(990,863)&{who(857,87)mul(619,79)when()when()^/mul(829,598)?}/$when()/?}how()(mul(551,424)mul(566,613)-mul(881,853)why()$mul(443,62))what()<(when()]'@from()@mul(681,681),mul(41,909)!why()&^?/mul(901,496)[,when()(~{mul(110,732)?'@when()what()mul(340,118))$^mul(548,352)&[?don't()from()<*!'mul(342,834)what()how()@where()@'from()(when(495,987)mul(626,782)<,/?#-%when()'*mul(155,802)how()&!@)+where()!#{mul(617,775){;mul(761,780)^:~]']>mul(393,810)[:[>?mul(581,64)where(){,&'@what()(?;mul(783,54)who()#:mul(554,807)+%&{[^ )^mul(239,651)select(145,543)(>don't()select() $*?who()who()&/]mul(228,402)#*[?when(628,409)what()!where():mul(595,910);,!-&mul(801,570)who()(when()@select()+~mul(357,370),$select()$,$select()!from(703,372)mul(408,165)mul(929,252)}how()#*what()/mul(115,155)what()mul(64,981)what()mul(162,300)# where()do()*from()'}%),how(309,961)$mul(332,232)/ 'from()>@};$]don't()(?:?*what()^#+mul(51,30)mul(79,533)how()select()}?mul(330,382)from(287,801)>/how()~mul(326,971)mul(623,476)+ ',select(632,537)}why(663,480)mul(987,320)[what()mul(626,139)mul(71,973)?)from()<mul(806,627);*$mul(500,493)what()$select();*[mul(420,687)$+#who(),why()(*do()/#/what()mul(479,27)([%where():;*]mul(842,516)!don't()mul(911,520)don't():mul(20,813)#mul(302,928)-where()when()how()'!when()[select()mul(126,179)?]what()#!where()~#!what()mul(817,663);where())~>*{what() mul(999,806)-from()^{mul(153,622)#do()>why()where(10,408),}{#>%mul(995,509)(mul(728,572)#~(;mul(530,132)*:% select()]mul(499,982)><@when()mul(348,550)mul(362,709))$}mul(520,895) where()-mul(950,23)$%%when())>','mul(328,120)+#mul(934,621){from(63,306) :}mul(402,983)where()*select();*select()<mul(483,759)'( diff --git a/2024/_input/day_04.txt b/2024/_input/day_04.txt new file mode 100644 index 0000000..7835c0f --- /dev/null +++ b/2024/_input/day_04.txt @@ -0,0 +1,140 @@ +MMAMMMSAXAXXAXMASMMASAMXMAMMAMXXXXXSMSXMMMXMXXSXASAMXMAMMXSAMXXXXMSSMXMASMMMSMSSSSSXMXSASMSMMMMMXAMXAXMMSMMAXSSSXSXMXAMXMXSXSMSSXSAMXXXMXMXM +ASASAAMXMXMMMXAXAXSSMXSASASMSSXMMSMMSAMXMMSSMASAMXMXMMMSMMMASMXSAMAMMXMAMAAXAAXAAAAMMSAMXAAXAASMSSSMSSSMAAMXMAAXMMASMSSMMXMAXAAAASAMXSXMASAM +MSASMSSMMAAASMXSMMXAAMSAMASAAAMAAAASXMAXSAAAMSMMXAMAMAMAXAXAXAASMMAMMXMASXMSMSMMMMMAXMASMXMSXXMAAXAAAAASXMMAAMSMMSAMXAAXXAMXMMMSMSASAAASASXS +MMAMAXMASMSXXMASXMMMMMMMMMMMMXAXSMXMAMXXMMSSMMAMMAXXSASXSXMAMMMMXSMSMXXAMAASAMMXMASXXXXSXMMXMSMMMSMMMSMMSASMMXAAXAASMSMMSXSAXAAMXSAMMSMMASAA +MMMMXMSXMXXAAMAMASXMAAAXAMXAASMMMXMSXMSXMXAAASAMSSXAXAXAAMXMXSASMMAAAMMMSSMMAMSXSAXMAMMMXAAAAAAAXXAAXAAXSXMASMSSMSXMAAXMAMMASMXXAMXMXAXMXMMM +ASAXMAMAMASXXMASAMASXSSSMSSMXSAASAMXAMMAMMSSMMXMAMXMMSMMMSSMAXXMAMSMSAAXMXASXMSASMSMAMAAMSSSSSMMMSSMSMXMXXXMXAAMAXMSMSXMASXAMXAMSMMXSMXSAXMX +XMASXSSXMASMSSXMASXMMMAAAAAXXSMMMMMSAMSSMAMMAMMMASXXAAAXXAAMXMMSSMAMXXSSMSXMXXMAMAAMSXXXMAMMAMXMAXMAXAASMSXSMMMMSXMAAMMSAMMMSXMXMASXMXAXMMSA +XSXAAXXXMMXAAXAXAMXXAMMMMMSAMXMXXMASAMAMMMMMAMAMAMXMSSSMMSXMAAMAMXXSAMXAAMXMASMSMSMXXAASMSSMAMSMSSMAMSMMAAASMXAAXMSMSMAMASMAMMSASXMASMXXMAXA +MMXMSMAMXSMMMSSMASASXSASXSAMXAMMMMASMMAXAASMMSXMASXMAMXXXMASXSMAXXMMMMSMMMAXMASAAXSAMXMXXMAMXXAAMXMXMMAMMMXMXMMXSASMMMMSAMMAXAXASMXMXAMSMSXS +SXXAAAXMAXASXAMMXMMAASASMAAMMXMAAXXXXSXSSXXAAAMSAMXMSXXMASAMAMMSSMXAAXAMASAMMMSMMMMXSSMXSSSMMSMSMMXSSSMMSMMSAMSMMMMSXAAMASXSXSMAMMMSMSMMAXAA +MXMAMSSSXSMMMMSSMXAMXMAMAXMSAXSSMMMMXAMXMASXMMMXAXXXXMASAMAMXMAMMAMSXSAMAXMXSAMAAAXAMAMXXMAAMAMXMAAMASXAAAASMSASMAXXMMXSAMAMAXMAMASMAAXMAMSM +MSXSMAAMMSAASAAMMSSMMMMMSAAMMMXXAAAXSAMMMAMMASXMXMMXSAMXASMMSMMSMSXMASAMSSMAMASXMMMXXMMMMSSMMAMSMSSMAMMSSXMXXSMSXSXSXSMSMMAMMMSMSXSASMSMMMXX +MAAXMMSMASMMMMMSAAAXAAAMAMXMXAAMSSSXXAMAMXMSAMMXSXMASMSMMMMAXXMAMMAMAMAXAAMXSAMASXAMXXSAAAAAMAMAAMXMASXAMAXXXMMSAMASAXAMXMSSXXAMAMXAMMXMMMMM +MMSMAAXMASAXXXAMMSSSSSXSXSAXMMSMAAMASMMSXSMMAXSAMASMSXAAMAMXMMMMXSAMXSXMSSMAMASAMMXSAAMMSSSMSSSMSMXSAMMAMXMXMSAMAMXMMMMMAXMAMMASXSMSMXMMAAAA +XSMXMMSMMSMMMMMSXAXAAAASAMXSMAMMMSMMXAAXAXXMMXMASAMAXXMSMSSSMXSAASAMXMXAXAMXMAMAMAAMMSMAMAMAAAXXAXAMXSMMSMSAAAMMMMAAAAAMAMMAMSMMASAXAASMSSSS +XMASMXXAMXAASMMMMMMMMXMMAMSXMASXXAAXSMMMMMSSMXSAMXSAMXXMAMAAAAMMXMMMMSASMMMSMSSSMMXSAAMXMAMMMXMMSSSSMSXAAASMSMXASMSSSSSXSASAMMAAMMSMMMSAAAAX +XMAMMMSXMSSMSAAMAXXXASXMAMXAMXSXSMSMXMASAAXAMXMMSMMMAXXMAMSMMMMSSSMAAMXXAAAMXMAMMXAMMSXSSXMXMASAMAAXAXMSMXMXMXSMSAAAAMAAXMSXSMMXXAAMAMMMMMMM +XMASAAXAXMAMSXMMMXMXMXMSMSSSMXXXMXMXXSXSMSXSMMSAAAAXSMMSAMMXMXXAAAMMXSASXMMSSMSMSMMSAXAMXASMMAXAMMMMSMAAXSXMMMMXMMMMMMMMMXSAMXXMMSMSASXSXSXS +XSASMSSMMSAXSAMXSSMMXMAAAXAMAMAMXMXMMAMXAAXMAMMSSSMSXAASASXAXSMMSMMMXMASMMXMMAAXAMXMASAXSMMAMSSMMAMAAMXMMAXMASAMXXXAXMAMSAMAMSXXAMMXASAMASAX +XMASXAAAASAMXAMASAAXAMSMSMSMAAAAASASXXSMMMMSAMAAXMXXMSXSXMXMXXAAXAAAAMSMAXSAMSMSMMXAAMAMXXMSMAAASXSSXXMXXMMSASMAMMSXSAMXMXSAMXXMASAMSMMMXMAS +XMMSMXXMMMAXXXMXSAAMMMMAAXXSMMXSASASMMMMMSXSSMMSMSMSAXXSMMAMXSMMSSMMMXMXAMSAMXXSXASMMSAMXMXAMSSMMMAXXMSMSXAMXSMASMAXAMAAXMSASMSXAMAXMAAXXMAM +MMAXAXXSAMMSMASMMMMSXAMSMMMASAAMAMXMAMAAMMAMMSAAAAAAXSMMMSAMMMAMXAMXSASMSXXAMMXMMMMAAAASMMMAXAXAAAAMXXAAMMXXAXMAMMSMSAMXXXXAXAXMAXMMXSMSMMAS +SMSMSAASASAAXAXXAAAXMSMMAMSAMMSMSMASXMMSXMAMAMSXSMSMSMAAXSMSASASAMXXSASAMXSSMMSAASMMMSASAASMMMSSMMAAASMSMMSMXSMSSMXAMAXMASMSMSMSMMSSMAAAMSAM +XAAAAMMSAMMMMMSSSMMSAMMXAMMAMXXAXXXSXMSAXSAMXXMMMXAXAXXMXXAMXSAMMSAXMAMXMMMMAMAXAMAAXXAMMMXMAXXMSSXXMAMXAAXMASXAAMMMMAAXMMAAAAMXAAAAMMSMXMXS +MMMSMXXMXMAXAAXXASAMXSAMSXSAXAMXMXXMASMAXSAMMSAAXSXSMSMXMMXMXMMMASMXMAMAMAAXAMMMSMSMMMSMAAMSMMMAMMMXMAMMAMXXAMASMMSSSXSMSMSMSMSSMMSSXAAMASMA +MXXMXSXMASMSSMMSXMXSAMMXXASASXMSMMSMSMMXMMAMAMMSXMXMXMXAAXXXAAAMAMSASASASMSSMMXAMAAAXXXXMMXAAAMAMMAAXMMSSSMMMSAMXAAAMAMAAMXMXMMAXAXAMMSSMSAM +MMMAASXSASAAAAMAMXXMMXXAMXMMMXAMXAMSAAAASXMMXXAMASAXAASMSMMSMSMMAMSXSMSMSMMAXXMASASMMMMXMMSMSMSSSMSXSAAAAAXAAMXSXMMXMAMXMMAMXASMMSSMXMAAAXXM +XAXMASAMASMSMXMXAMMMMSSMMMXXAMMMMXSAMMSXSASXSMXXASMMMMMXMAMMXAXSMMSASXSMSMSAMXMXAMXAAAAASXMAXXXAAAAASMMXSMMSXSASXXXXMAMAAMMMSAMXXXMMMMSSMMSS +SSXSAMMMXSAMXAMMSASXAAMXXAXMMXSAAXMMXAMMSMMAMMSMMMMSMSXSXSMSMMMAXAMSXAXXSXMASXXSAMXSXMSMMAMAMAMXMMMXXXXMMXXXAMASXMAMSAMSSXSAMASMMXAAAXMXMSAM +SAAMXSXXAMAMSXMAXXMMMXMAXSMAXAXAXSSXMMSASAMSMAXAMXSAAMAMAMAMAXMXMXSMMSMMMASAMMASXMAMXMXASMMMSXSASAMMMMMAMXSSXMAMAMAXMMXAAMMASAAXAXSSSXSAMMAS +MMMMMMXSMMSMMXMMSAXSAXMSMXASMSMSAAMAMXMASAMXMXSAMXSMSMSMSMAMSXMXSMXXAAAAMMMMSXAXMMAMASMAAXAMMASAXAXSASXSMAXMAMXSXMXSAXMMMMSXMASXXXAMAXMAMSAM +XXAAAMXMXAAAXMSAXXMMXSAMAMXMAAAXMMMXXASXSAMXMASAXMXMAMXAMSAMMXSAMMSSSSSMXSAMXMMSXASXAXMXMMXSMMMSSSMMXMAMMXMSAMXSXSMMMMXXMAMASMMASMMMSMSAMMAS +SSSMSSXMASXSMAMMSMXMAAXMAMAMMMMMXMSAMXSAMXMAMXSAMAAXXAMAMXMSXAMASAAMXMAAMXAMXAAXMAXMSMMSSMMSASAMXXMASMSMMMMSMSASMSXAAXMMMXMAMXMAMAXAXXSXXSAM +MAXXMAXXAMAAXSXAAAAMMSXSXMXSXSASAMXAMAMAMMSMSMSXSSSSSMSMMXMAMASAMMMMXSMMMSSMSMXSXXMAXAXAAAXSAMASXMMAXAAMXAAMMMMSAXMSMXSAMXMSSSMSSSMMSXXAAMMS +MAMMMMMMMXSXMMMSXSASAMASXSXAAXXSAMSAMAXAMAAAAAMAMAMAMXMMSAMMMAMAMSASMXMXAMAAXMASMMSMSMMSSMMMXMAMAASAMXMSSMXMAASMMMAXXASASAMAAXAAMAMXSMMMXMAS +MMSSXAXAMMMMAMMAMMMMAMSMASMMXMASAMSXMSSMSSMSMSMAMSMSMMSASASXMSSSMMAMAAAMSSMMMMAMAXAMAAAXAMXSASXSXMMMSSMAXAASMXSASMSMMMSAMAMMMMXMXAMMMAXXAMAS +AAAMXMSMSAMMAAMASAMXASAMAMMMMSMMMMMSAXAMAAAMXMMMXXAXAMMXSXMAMMAXSMXMSMMXMAMXMMMSSSMSSMMSAMXMASAMMSAMAAMMXSAMXAMAAAAXSXMMSXMMXMMSSSSSSXMAXSAM +SMMSXMAASMSSSSSSSXSSMXAMMSMAMAAMXSAMXMAMXMMMAXXSMMAMAMMXMMSSXMAMXXMAMAXMSAMMXAXAAAXAAAMXAXXMMMAMASASMXMAAMAXAXMXMSMSMXMAXAMXAXAXAXAXMAXMASAM +XAAMASMMMXMAAAXAXAXXMMAMAAMAMSXMAMMXSMXMSSSMMSAAAMSSSMXSAMAAMMASXSXMMSMAXAMMSASMSAMXMMASXMMAAXXMXSAMXAMMASMMMMSMXXMMMAMXSSSSMSSMMMMMXMASASAM +SMMSXMMMMSMMSMMSMMMASMSMSSSMMXAMSXSASAAXAASAMMMMXAAAAMASAMMXASASXMASAASXSXMASAXAAXXAMXMAAAASAMMXXXAMXXMMAMXAAMAMMSMASXMXAMXAAAXAXXXSMAXMASMM +MMMXMSMAAXAAMXMAAAMXMAAAMAXMASMMMAMASMAMMSMXMAXXMMMSMMMMAMXXXMXSASAMXMAXXAAAMMMSMSSSSXXMMMMXAMXMMSXMXSXMASMSXSASAXMASMMXSXXMMMSSMMSAMSSMMMMX +XXMAMAMMSSMMXAXSSMASMSMMMMMMXSXAMMMAMXAMXAMAMXSXXMAXAMSSSMMSXMSSMMASMSMSSXMAMMXXAXAAXXAXXSAMXXAXXAASAMAMAXXAASMMXXMMSASAMAXSXAAAAMSAMAMAMASM +MASASMXSAXAMSMMMAMAXMAMXASXSAMAMMAMXSXMMMASXMSAMXMAMAMMAMAXSAMASASMMAMXAAAMXMXMMSMMSMMXMASXMMSSSXSSMASAMSSMMMMXAAXSAMMMASAAMAMSSSMSAMXSAMSXA +AMSAMAXMASXMASASAMXSMSXSMMAMXSAMMASAXAMXMMXMXXMASMXSSMSAMXMMAMASMMMMAMMXSMMASAASXAXAAXASAMAAAXAMXMXMXMMSAAXMAXMMSXXAMMSAMMMXMMAXAASAMXSXSAMS +SXMAMSMMAMASASMSXXXXAMMXMMSMMSMSXMMASMMSAXAMMAMXSXAMAASXSMSMXMAXAAXXMSMMMAXAXMXSXSMMXXXMASMMSMMMASAMASXMMSMSMMSAMMSXMAMXSXSSXMXSXMMXXMMMMMAX +MSSSXMAMXMASXMASAXSMMMAXSAMAAXASMMMMMXASXSMSAXSMSMXSMMMAXAAXSSSSSMMSAMXAXAMXSXMSAMASMSXSAMXXXAXXXMASASASAMXXSAMAAMXMMMMMXMAMASXMAASMMAAXSXSX +XAXMASXMAMAMAMMMXXXAAMMMMASMSMAMASAMMMXMASAXMSXASMAXXAMXMMMSMAAXMAMMASMXSAMSAMXMAMAMAAAMAMSSSSMMMXAMXSXMASASMXXSMMASXXSMAMMSMMASMMAAXXAMSAMX +MMMMXMXMMMSSXMXMMMSSMSAASAMMXMASXMAAAMAMMMMMXMMMMMAMMSAMXASMMMMMXMASAMAXSAMMMSAMXMSMMMMMAXAAAMAAMMMSMSASAMMMSSXXAMAMAAASAXXMXSXXMSSSMMSAMXMX +SXSXSSSMSAAMMSAMXAXMAMXMMMMXAXMMMSXMASXSXMASAMAAAMMSMAMASXMAAXAAXAAAMMMMSSMMMSASXAXAASASMMMSMSXSXSMAASXMXMXSAMXSMMMXMSMSMSASAMXXMAAAXXXMMXSM +SAAXMASAMMXSAMASASXMMSMMASMSXSASASASXXXAMXMMAMSMXMAAAXMMAASXMSSSSMSMXAXASXSAAMSMMSXSMSAXAAAXXSXMASAMXMMMAXMMMSMMMSXMXMAXMAMMASXMMMSMMMSAMAXA +MXMASAMXMAXMXSAMXXAMAAAMAMXAXSAMASAMXMSSSXXSSMXAMMSSXMMXMXAMXXAAXAAMSSSMSASMSSXXAMXMMSXSXMMSAMAMSMXMAXASMXSAMAAXAAASMMMMMMASMMXAXAAXMASAMXSS +XMXAMASXMXSAASXSXSAMSSSMSSMMMMAMMMXMMAAMAMXXMAMAMXMMMAXXXSMSMMMMMSMMAAMXMAMAXAXMASXMASMSAXAMAMAMAXAXXXMXMASASMSSMSXMAAAAAMMXASMSMXSASXSAMXAM +MAMXXAMXAAMMXMAMXMMMXAXXMAXXXSAMAAAMAMXSASXMMAMAMAASXSMSAMXAAXXXAXXMMSMAMMMSMMMSMMMMAMASAMMSMMMSMSSSSMAMMASAMAAAMXXSSMSSSSXSAMXXASXAXASXMMMA +SAMSSMMXMXMAAMAMAMXSMMMMSAMMMSASMSSSSXXMASAMSMSSMMMMAXAXMMSSSMMMMMMSAXMXSAAMAXAAXMSMASXSSMAAXAAAXMMAAAMXSASAMMMMMMMMAAMMMMMMXXMMMMSMMMMMXSAM +MASAAAAXMASXMXAXXSAMASAXMAXAMSAMXMAMXXMMMSAMXXMAMSMMAMMMMMAMAMXASAAMAXAMXMSSSMSMSAAXAMMXAMXSSMSXSAMSMMXMMASAMXSSMASMMMMAAMXAAXSSMAAXXMASASAX +XSMXSMMMMASAASXSMMAXAXSXMASXXXXMASAMXMXAAMAMXMASXSAMXXAASMSSSXSASMSMSMSMSAMXAAAAMMMMMMSSMMAMAMMMMMXMMXSSMMMMMMMASXXAAMXSMSMMSMAAMSMXMSXMASMM +XAAXMMXAMASMMMMAMXAMXSMXMAMXAAMSXSXSAAMMMSAMXSMMAMMMMSMMSAAXAASAMXMAMXXSXXMXMMMXMASXXAAAXXSSSMSAASAMSAXMASAMXAMAMXSSMSAMXAMAAMSMMAXAMXMMXMAS +XSAMXSSSSXMMMSSSMSMSMAAASMSSXSXAXMXSMSAAAMXSASMMAMXXXAXMMMMMMMMSMAMAMAMMMASXXSXXMASAMXSAMSAAXASMMXAMMMXSAMXSSSSXMAMXAMXMSMSSMMMMSMSXSAMSMMAM +AXXMXMAMAMXAAXXMAAAAMMMMSAAXAMAMSXAXAXMMMMAMMSASXSSMSXMAXAXAMXAAMXSAMAXASAMAXMASMASMMXMASXMMMMMMSSSMAAMXSMXMXMAMMXSMSMSMXXAXAMSAAASMSMMAAMAS +XSMSAMXMASMMSSMMSMSMSXSAMXMMXMAMMMMSMMSXSMMSAXMMMAMAMSSSSMSSMMSSSMMXSXSMMASMXSASMAMXMXMSMXXAASAMMAASMXSMMXAMAMMMSMMAMAXXMMMSMMMMMMMAMASMSSSS +SMASXSASXSXXAAMAAXAMXXMXAASXSSSSXAXAAAXAXAXMMMMAMAMSXAXMAXSAAAXMMMSMMXAAMXMAAMASMSXMAMXMAMSSXSASMSMMMASAMSXXASXAXAMAMSMMAAXAXXAMMSMSMAMXXMAS +XMMMXMMMMMMMMSMSSSMSMSXMAMXAXAMMMSMMSMMMMMMMMASAMAMAMMSSMMSXMSXSAMXAMMSSMAMSMMAMMAAASMSMAMXXASAMAAXAMAXAMASMXSASMSMMSAMAXSMMXSXSAAAXMAXXSMXS +MSAMXMAAXAAAXXXXAMMAMMAMSSMMMMMMAMAAMXSMAMXMSMSASMSMAXMXMAMAXMAMXMSAMMAMXSMAAMXXMMSMMAXSAMXMXMAMMMSAMSSSMAXMASAXXAMXSMMSMXASXSAMXSXMSMMMXMAS +AXAMMSXSSSSSMSAMXMMAXSXMASAAAAXMASMXXAXSSMXMAXMAMAAXMSXMMASMMMXMMAXXXMASMMMSMMMSMMMAMXMSXMAAAMXMMXMAMAAXMAMMMMAMMMMAMXXAASAMXMASAXXAXMASAMAS +SXSMAAAXMMAAAAXXAMSMXMXMMSMMMMSMASAAMMMMMMASXSMSMSMMAXAMSASXAMSMMSSMXSSMMXAAAAAAMXSAMXMXMSMSMSAXXASAMMXMAAXSAMAMASMSXSMMMMAMXSMMASMMMSASAMAS +MAXMMMXMASXMMMXMMXAXASAMXMXSSMAMXSXMASASMSASAMAMAMMMMMAMMMSXXMXXAMMXAMMAMMSSSMSMSASASAXAXAAMAMXMSMSXSAMSSMSAMSSSXSAMASXMAXAMXXXMSMMSAMAMXMAS +AAMAXAXSAMMXAXMAXSASMSASXAXXAMXXAMXMXSXSAMXSMMAMAMXXMASMMMSAMXMMXSAMSMMAMMMMMXXMMAXAMXMMSSXMAXMASAMXMAMAAXSMXAXXAMAMAMASMSMSSMMXMXXAMMSMAMAS +MSSSMSMMASXSASASXMXMXSAMMMAXMMSAMXXMASXMAMXMXMXSAMMAMXMAXXXXAAXMAMMMMMSMSXMAMMXMMXMMMMAAAXMSMMMMMAMXMMMSXMMXMMSMXMAMMMXMAAMAAAAAMSAMXAXSXMAS +MMXMAMASAMAAAAXMMMAMMMAXXMAASAMASXXSASXSMSXAXXMAXXSAMASMMSMMMSMMASAAXMAXMASMSMAMSMXMAMSMMSMASAAXXSMSXSMXAMXAAXXXXXSMMMAMMMMSSMMXSAAXMXXAMXAM +ASAMXMXMXMASMMXXAXAMAXASAMXXXAXAMXMMASAXAMXMXMXASMSASASAAAAXAXXSASMSSSSXMAMXAMASAASXMMMAMXXAMXMSAXAMXSAXXMAXSSMMMMXAAXAMSMXMAASMSXMMMXAXAMSS +XMAMMSMSXXXAMXXMXSSSXSASAMXSSSMAXXASAMXMAMAMASMXSASAMXSMMSSMAMASAMAMAAAMMSSSSSXMMSMAASXSMMMSSMMSMMAMXMAMSXSAAMAAAASXMMXAAXAXAXMAXMSSSMMXXMAS +MSSMAAAMMXSAXMXSXAAAASXSAMMMAMSSSSMXMMXSASXSASAAMXMSMXXXAAXMMMMMMMAMMMMMAMAAAMAMMMMSMMAAASAAAAASMSAMXMXMMAMMMMSXMMSAAASXSSMSMMMXMXAAAMXMXMAS +AAAMSMXMAASAMAAAMMMMMMASMSAMAMMXAAXSSSMSXSAMASMMSAXAXMASMMAAAAXAAXASMSXMASMMMMASAAAXXMSMMMMSSMMSASMXMASMMAMASXXMSMSMMMSAAAXAAAXMMMMSMMAASMAM +ASMMAMXMMMSSSMXSSXMXXMXMASXSMSXMXMMAASAMSMAMAMAMXXSMSXAAAXSSSSSSXSASAMASXSAAXSASMMMMAXASXXAXXMXMAMAASAAAMXMAMMSMAASXSMMMMMSSSMMMAAMAXMXXAMXM +AMXSAXXAMAMAXXAMXAMSXMAMXMAMXSAASMSMXMMMAXAMSMSMAMXMAMMSSMMMAMAAAMMMAMMMAXXMXMASMMSSMMASMMXSXXMMXMSMSMSMMSMAXAAXMSMASAMXMXXXMMASASXASXSMMMSA +AMASASMXMASMSAMXSSMAASXMSMXMAMMMMAAXXXXSMSSXMAAMSMAMASMAMAAMASMMSMMSSMXMXMSMSMXMAAAAAMAMAMAMMMSMAMXAXMMXASMSMSSSXXMXMAMAMMSAAMMMAXMAXAAXAAMX +SMAMAMMASXSXSAMXAMMSMMAAAAXMSSXXMSMMMMMSAAXAMXMMAAXMAMMASXMSASAAXAAMAMAMAMXAAAASMMXSMMASAMXSSXAMSSMMMMMMMSAAAAAAMMSAMXSAMASMMXSMAMXMAXMMMXSA +MMASAXSMMMMMXMXMASXMXSMMMMMSMAMXAXAAXXAMXMMSMAXSAXMMSMSASAMMXSMMSMMSXMAXASMSMSASASXAXSXSMSXMASMSAAAXXXAAXMAMMMSMMAAAXMAXMMXAAAXMMMXMAMXXSAXM +MMAMAXAMXAAMASXMASAMAMAAAAXAAAMMMSMMSMASMXMXSXMASMMXAAMASAMXAXXMAXMMMSSSMSAAMXXMAMXXMMASXSAMMMXMMMMMMSSSSSMSAMXAMAXSXSAXMXSMMSXASASXMASMMMSX +SMSSMSMMXSASXXAXAMXMASMSSMMMSSMXMAMAXXAMXAMASXMAMXXMMSMXMMSMSMMSMXSAXAAAXMXSSMSMMMSSSMAMASMMXSASXMSAMAAAAAASMSXMSMMXAMXMSAMXAMMXMASXMAXAAAAX +AAAAAXMAAXASASMMSSXSAXMAMXAXAMXASMSAMMSSSXMASMMSMAXAXXMXXSAAAAAAAAMXSMSMMMAXXMASAAXAAMMMAMAMASASAMAAMMSMSMMMAXXAAXAMAMAXXAXMMSSMMAMAMAXSMMSA +MASMMMMMXSAMMMAAXSAMXSMAMSXMASMMMXMASXMAMAMXSXXMASMSSXAAXSMSMSSSMSSXSXAMAMSSXSAMMSMMMMSMXSXMASAXAMXMMXAXXAAMAMMSMSMXAMSMMSMAMAMXMSSSMSMXAXXX +XXMASXMAMMMMXSMSMMXMAMMAXSMMMMAMSMMMMMMAMSSXXMASMXMXMMAMXMMXAAAXAXMAMSXSASAMAMXMSAMXSXXMAXAMXMXSXMASXSMMXXSMSSXXXSXMSXMAAXSMMASMAAAXAAXSAMMM +XASXMAMSXMXSAXAAAMSSMSSMMSMAASAMASMSMASAMXAXXMMMMASAMAXSAMXSMMMMMMMXMAMXXXMMSMSMSASXMMMSMSAMXMXMXAMXAAASMXMAMXAXASAMMAMMMMAXSXMAMMXMSMMMXAAX +MMAXMSMMASAMMMSMMMAAMAXMASXSMSASASMASMSAMXMMSXMASASMSMASXSXXAXXAMXMMASMSSSXAAXSAMXMXAAXAAAXSAMXMAMXXSMMMAAMXMMMMMMAMMAMMASXMXAXSSXSXMSAMASXS +AMMXXMASAMXSXAXMSMSSMMSMXSAXASAMMXXAMXMAXAXAAAMXMAMXAXXXAMXSAMSMSAXAXAAAAXMXSAMMMMSSSMMSXMAXAMXSMMAXXASMSMMXXXAAAMXMXAMXAMAMMMMXAAXAASMMAXMX +XAMXMMMMSMMMMAMAAAMMAAAXXMAMAMXMASMSSXMSMSSMSSMAMAMSMSMMAXMAMAXXSASXSMMMMMXXMAXSAMXAAXAMMSXSMSAAAMXMSAMAMAMSASXSMXAXXSSMASAMXXMXMXSMMMMMXSAM +SASAMAXMAXASMSMSMSXSMMSSXSAMAMSSMXAAAAXMAMMMAMXMMAMAAAMMXSMASXMASAAASXXSAMXXXMMSMSMSMMASAMAAAMXXMSMAMXMMMAMXAMXAXXSMMMAMAXAMSAMXXXXAAXXXAAXA +AAMXSMXASXMXAAAXXXAXXSXMASXSXMAAXMMMSMMMXMAMXXAXSASXSMSMAMXASAMASAMAMAXXMAMMSAMXXXMASMAMAMSMSMSMAMMXMMSXMXSMXMMMMXXASMMMMSMMSMSAMSSSMSMMMSMS +MSMXXASAMAXMXMSMSMSMSAMMAMAMMMSMMXMAMASAASMMMSMMMAXAMAXMAMAXMAMAMAXXMSMSSSSMAMMMAXSAXMASMMAMAAAMAMMXMAMAMAXXMAMXSXSAMMXXMAXAXAXMXAXXXXAAAAXX +XAAAMXAAXAMXXXXAAAAXMASMAMMXMXMASXSAMAMSMSAAAAMAMSMSMMMSSSSXXAMMSSMXMXAMAAAXSMSMMXMAXSXSXSXSMSMSSMSAMASAMSMSSSXAAMMAMXMAMAMXMSMSMSSMXXSMSXMM +SMMXASMSMSAMXMMMMSMMXAMMMMXXSAMXSAMXMXMXXSMMXXMAXAAXAXAXXAAMSMMMAAMXSMMMMSMMMAXASMMSMXAXAMMXMXMAMMXAXASXSAAAAMMXMSSSMSMXMSXXAMAXAXAASMMMMAXM +MXMSMMAAMMAMXMASXMASMSSMSAAAMMSAMAMXMASXMMASASMSSMMSXMXSMSMMAXAMSMMAMAAAMAAMXSSMMAAAMXMMMMAASXMASMSSMAXMMMMMAMXSAAAAAAAMXMAXSMMMXMMMMAAASMMA +SAMXAMSMXSAMMXAXASASMMAASMXXAXMASXMXSAMSAMMMAMAMAXASAMAMMAXMMXSXMAMASMMXSMXMAMAAXMMSSMMAAAMMXASXSAAXMAMAMAAXSMAMMMSMSMSAAMSMMAAXAMXXXSMMSXSS +SASMMMXAASXMAXMSMMASXMMMMXMMMMSAMAAXXMXAMMXMAMAMMMXSAMAMSMSASMMASXSASMAXSMSMSSSMMSAMAASXSMSXSMMXMMMSXMAXMMSAAMSXAXAAAAAMXXAASXMXASAXMXAMXMAM +SAMXSAMMMXSXSMMAXMXMASXXMAAAAAMASMMMASMSSSSMMSXMXSASAMXXXAXAMXMAMXMASMXMXAAAXAXAXMASMMMXMXSMAXSMMSXMAMSSMAXMXMAMXXMXMSMMMSSXMMSAMXMSAMXMAMAM +MAMAMASAXAMXMASMSXMXAMMAMXXMAMSMMXXMAMXAXXAAMMMAMMXSAMMAMMMSMMMAMMMMMAASMSMSMSMSMSMMMAXXXAXMMMXAAMASAMMXMAMXSXSASXXSXXAAMAMAXAXAMMXSMSSSXSAS +SAMXXAMXMAMAAMAAAASMSMSASMSMSMSMSXXMSSMMSMSMMAMMSSMMMMXMAAAAAAXASAAAMSMSAMAMAMAXXASAMXMSMXSXXXSMMSASASXMXMXAAAMAASAAAMSMMASMMMSMMMXMXAAAXSXS +XASXMSSMSSMMSMMXMMMAAAXASXAXXAMAMXXXAAAXXAMXMAMAAAXAAMASMMXSSMSXSMSXMAMMMMXMAMXSMMSXSAAXXAMMMXAMAMMSAMXSASMXMXMMMMXMSMMASXMXAMMMAXMAMMMMAMXM +SMMAXAAAAMAXXXAXSSMSMSMAMMMMMXMASMSMMSMSMSMSSSMMSSMSMSAMXSMMMAAXXXMMMASAAXMSXSASAXMASMSMMXSASAAMASMSASMMASXMXXXXAXAXAASAMXMMSMAXXMXXXAMMMSAS +AAXSMSSMSXSMXMXMXAAMAMMXMAXAAASMSAAAAAAXAAAAAMMMAMMAAMASAMAAMSMSMMSSSMMMXSAAAMAXMMAXXXMAMXSASXSMXMAMXSAMSMXMMMMSMSMSMMMAMASAXMSMSMMMSXSAAXAM +SSMMAMXAXAMXXAAMMMMMAMMXMASXMASXMXMXMMSMAMMMXMMMAXMMSMSMXSSMMAAAMAAAASAXMAMMMMXMSMMSASMSSMMMMMXMMMSMMSAMAAAXAAXAAAAAXXSAMASASAMAMXXMAAMMSMSM +AAXMSMMAMMMMSSMSASXSXSASXMMAMAMXMMMMSSMMSXSSSSMSSMMXXXMMXAXMSMSMSMMSMMMSAXXMXMAAMAXSAMAAXXAAAMSAXAAAASASMSMXXXSMSMSMSASMXXMAMMMMMMXAMSMAMAAS +MSSMXSSMSAMXAMMSMSAAXMAMMASXMASAMAAAXAAXXAXXAAAAMAMMMSAAXMSXMAXXXMAMASAXXXXMASMSSMMMAMMMSSSXMMSAMSXSMMAXXAXMSMXMAMAMMXMMMSMMMXAAAMXMSXXAMMMS +XAAAAXMASASMASAXXXMMSMSXSAMAMXXMMSMSSSMMMMMMSMMMSAAAAMXAXXXAMMMAXMAMMMMSASMSASAMAXXMXMXXXMASMMMMMXAMXXAMSMSAMXASMXSXMAAXAAAAXMSSSSMXAAXSSMXS +MMSMSSMAMXMXMMMSMMMXXAAAMXSAMMSMXAXAAAMAAAAXAXMMSXXMMMMAMSSMMMSMMMAXMAMMMAAAASASMMSSMMMMXSAAXSMAAXAMMMXXXAXMMXMMXSAMXMMXSSSMSMXAMMXSMSMAAMAX +MMMAMXMAXAAXSASAAASXMAMSMASASAAXXAMMXMMSSSMXMMSAMMSMSASAAAAXXAAXAMAXXASXXMSMMSMMMAMSAMXSAMXSMASMMSMXAMXMMAMAMXMAMMAMSSMXXXXXAMMAMAAXAMMXMMSS +SAMAMMXMSSSMXMXMXMSAAXAAMXSAMMSSMMMSAAXMAXAASXMASAAASASMSSMMMSSMSAAMSMMAMXXMASAAMSMSMXAMASAAAMMSAAASXXAMAAXASAMAMMSMAAXSMMSSMXSMMMXSASXSXAXM +MASXMAMMAMAMSMSSMMSMMMSXSAMXXSAMAAAXXSMSAMXMMASAMMMMMASMAXAAAAAAXMMMAAMMMSAMXSMMSAXSXMXSAMAMSXAXMXMAMMASXXSASMMXMAMMXXAMXAAAMMMXAXAMAMAAMSSS +MAMXSSMMMSAMXXAAAMXAAAMMXAXASMAMSMMSAXAMMSMASMMXSXMXMAMMMSSSSMMMMMXSMSMAASASXSAMXMASAMXMASAMXMMXSXMASMMMMAMAXXSXMASXSSSSMMSSMAMMSSXMSMSMXASA +SASXMXAAAMASMMSSMMSSMXSASAMXXMAMMAXMXMAMAAAXMXXAMXSAMXSAMXMAXAAXSSMSAAMMMSAMAMMSASXMMSAXAMXXXASAMXMAXAXXMXMSMXAASAMMAAAMXXXXMASAXXXXMAXSXMMM +AAXMASMXMMAMXAAAAAXMAMXMAMMXMXXSMAMMXSAMSSXSMSMAMAMAMXSXSSMMMSMMXAASXMMSXXXMAMAMMMASXMASXMSMSAMASMSMSMMSSXMAAMSMMASMMMMMMXMASASMMMMMMAMMXXAX +MSMMXMMXXMAXMSSXMMXMASXMMMSASAAMMMMMAMAXXMAXAAMAMMSAMMMXMASXAAXAMMMMAXXXSAMXXMMSXSAMXMAMAAAAAAMXMAAMAAAAMASXMMAMMMMAMMSAAXAMMMSXAAASMMMSMMMS +XMXMXAXMAMAMMMMXAMXSASXAAASAMMSMAASXSSSMAMSMSMSMSXSXSAMMXAMMMXMMAXAMAMSMMMSSXAAAXMAMXMASMMMSSSMMMSMSXMMASXMMMSMSAXMMMASAMASXMAMMMSASXMAAAAAX +MMAMSSMASMSXSAXSMXAMSSXMMMMAMAMXSXSAAAAMMMAAXAAAMXMXSASMXSSXSXAXSSMMSXMAXXAXXXMMXSAMXMAXXAAXAAMAXMXXMSMMMAXAXAASMMSAMAMAMSMAMMXMXMXMAMSSSMSS +MMMMAAMSXAAAMAMMMMMSXMXSMSAXMSSMXMXXMSMMASMSMSMSMXMASMMMAMAASXMXMAMAMAMMMMMSSMMMASASXSSSSMSMSMSXSXXMASAASMSSMMMMAAMAMXSSMAMAXXAXAMASXMAAAAMM +MSMMSSMMMMMSMMMAAMMAAMMMAMXSXXAMXMAXAXXSASAMMMAXMXMAXMAMAMMMMAMSSSMSSSMAAAXAAAAMXSAMAAXMXAAAAAXAMXMAASXMMAAMXSAMMMSMMMAASMSMSSMMASAMMMMXMMMS +MAAMMAXMAXAAAASMMSMSXMAMXMAMASXMAXAXXMASAMAMSMAMAAMMXSASXXMASMMAAAAXAASMMMMMSMMXAMAMMMMMMSMXMSMAMASMMMASMMMMAXAXXAAAAAMMXXMMAAASMMMSMASAMXAS +XSSMMSMSSSSSSMSAXMAMMSXSAMXMAXASMXMXXMAMXMAMAMASXMXMASAMXAXXSAMMXMXMMMMXAXSXMASMMSMMAAAAXASAMXMXSXSASXMMASMMSSSMMSXSMSXXMSMMMSMMAAAXXAXAMMAS +XXAAAXMXAXAAMASAMXXSAMASAMXMSMMAMASMSMASXSXXXSAXASXMASASAXSAMXMSXMMSSSMMSMMASAMAMAMMXSSMSASMMMSXMAXAMSXSAMXAAAAXAMAMXMAAAAAAMAXSMMMSMSMSMMSM +ASXMMXMMXMMMMAMMSMMXAXAMAMSMMAMXSXMAASMMMMAAMMMXAMAMASAMASAXXAMXAAAAXAAXXMSAMASASMXSAMAAMAMXMAMAMMMMMXXMASAMMSMSAMMMAXXMSSSMMMMSAASXMMAMXSAS +XXMASAMMMSMAMASAAAASMMXSXMAASXMAMAMSMMXAXMMMMAMXMSMMXMXMXMMSSSXSXMMSSSMMMAMASXSASAAMAMAMSAMAMASAAAAAAXXSAMAXAXXMASXSSMXMAMXMASASMMMAAMAMXSAM +XSXASAMXAASXSAMXSXMASXAXMXMXMXMAMXMAASMSXMAAXAMAMAXAAXAMXAMXAMXMXMXMMAASMXMXMAXAMMMXXMXXSASXSASMMSSMSMMMXSXMXMXMAMMMMAASAMASMMASMSSMMSAMXMAM +XXMASMMMSXSMMAXAMXMXAMXMAXSXMMSMXMXMMXAMSSSSSSSMSAXSASASASXMXMASXMAXSMMMAMXSMSMXMXXXSASXMMMAMAMMMMMMMAMXXMAMSASMAMMMMMMSAMASXMSMMAAAAXMXXSAM +MMMXXXMXMAMASAMXSXSXMXMSSXAAXMASAASXMMXMAXAXAMMXMMMMAMAMXXXMASXSASXXMAAXMMAMAAAASMSXMASMSSSMSMSMAAAAMAMXASAMMAMAMXSMSMMSXMXSMMMAMSMMMSSSMSAS +AAAXMSMAMXSAMXMXMASMMAAAXSMSMMASMMAAMSMMMSMMAMXXMASMXMAXXMASASXSMMSASXMMXMASMMSMSAAMMXMMXAAAAAAXSSMSMMMSXMAXMAMASMMAAMXSMMMMAASMMXXSMMAAASAX +MSXXAAMMMAMMSSXAMAMASXMMMXSAAMMMMMSMMAXAAAXASMXXSASAMSSXSSMMASXSMXAXXMASXSMSAMXMMXMASAXSXSMMMSMMXXAMXMXSXSXMMMSAXAMSMSAMAXASXMSASMMSAMSMMMMM +MAMMSMSMMXXXAXSXMASXMSMXSSMMSMAAXAAASMSMSSXAAXAAMSMAMAAAXASMXMAMMMMXXMASAMAXMAXXMAXSSMXMAMAXXAMXMMXMMSAMXAXSAMMAXSMMAMASMSMAAASXMAASXMMXSAMX +MASAMASMSSSMMXAXMASAAAMXMASAMXSMMSSMMXXMAXMSMMAMMASAMMSMSAMXAMAMASMAMXXMAMXMASMSMSMMXXASMSXMMAMSSMSAAMXMXMASASXMAMAMXMAMMAASXMMASMMMSMAASASX +SAMAMAMAAAAXXXMXMASMSMSASAMXMAMAMXMAMXMXXXMAMXMSMMAXXAMXMXMSMMASASMASXMSMMASXMXAAMSMSSMMASAASAMXAAAXXMXMXXXSAMASMMAMAMXSSXMMMASAMMSXMMMMSMMX +MMSSMASMMMMMSMXMMXSXMASASXSXMAMXXMXXXAAMSSSSMXAAMXMSSMXMSAMXSXMMMMMASXAAXXASAMMMMMASAAAMAXAXMASMMMMMASAMMSMMAMAXMAMSMSMAMSAAXXMASXSAMXMASAAA +MXAASXSASXSAXAXAXMXMMAMXSXAAMASMMSSSSXSXAAAAAMSMMMAAAMAMSASASMAXAXSMMMSMSMAMXXAAAMXMSSMMSSMMSMMAMMXMAMAXAAAMSMXSXAASAMMAMMXXSXXMMMSAMXMAMMAX +MMXXMMMAMAMAMXSMSAAAMXSAXMSXMASAAAAMMMMMMSMMMMAAAXMMMMAMMAMASXSMMMAAAAAAXMXMSMSSSSSMAXAXAAMAAXMAMMAMSSSMSXSXXXAAMXMSAMSSSSMMMMMAAAXMASMSXSAS +MSSXMAMAMXMAMMAASMMMXAMMSAMXMXSMMMSMAAXMAMAMXSSSMSSMASXSMAMXMAXAXAMMMSSSSMAMAAXXAAXMAMMMSSMXSXSASMXSAAAAMAMMAMXSASXXAMAAAAXAMAAXMSXMAMXAAMAA +AAAASMXMSXSMXAMAMAMXMXAAXASAMXSASAXXSXMSMMSXMAXAAAXMMMAMXMMMAXMSMXMXXAAAMXASMSMMMMMMSSSMMMXMAASXMASMMSMMMAMAAMMMXAASMMSMSMMSMSSXSXMMSSMMXMMM +SMMMMSAMXXAMXSXMSAMXASXMMAMAMASAMMSMMXAXAMAXXXXMMMSMMMAMASMAMMMMAASXXSMSMSXSAMXXASXMAAAMMAAMMMMAASXXAAXMSMMSMSAMXMMMSAAXXMAMXAMMXAXXAXMASAXX +XAXXAAMMSSMSAMAASMXSMMASMSMSAAMXMASAMMMSAMMMMSMMXAXAASASXMMAMXAMMMMAXMAMAMAXMAXMMSAMMSMMMXMXXAXXMAXMMSSMAAAMASMSMXXXMXMAMSAMXMSASMMMMSMAMMXS +SSMMSMXAXAAMAMMMMMASAMAMXMAXMMSMSMMAMAAXAAXAAAAMMMSMMSAMXMSSSMMSASMSMMAMAMSMMMSAXSAMAMXMASXSSSSSSMMSAAAMSSMMAMXSMMSSMMXAAMMSMMAMAMAAXAMAXMAM +MAAAXXMSSMMMAMAAAMXSAMXSAMXMAXSAMXSASMSSSMSASXSMXAAAXXAMAMAXXAMSASAAMSAMASXAAASAMSXMXSAMASAAAAXAAXAAMSMMXAAMMSASAAAAAASASXSAAMSSMASXSXSASMAS +SSMMSXMASMXSXSSSSSXSMMASMSXSSMMMMMSMSXXMMAMXMAMAMSSSMSSMXMASMSMMXMXMMAXSXSXMMXMSAMXXASXMMMMMMMMSMMSSXXMASXMMAMASMMSSMMSSXMSAMSAAXMAMXXMASXMM |
