Compare commits

...
67 Commits
Author SHA1 Message Date
ryan 8ec58edd08 solve day 18!
it was kinda ez
2024-02-13 23:03:04 -08:00
ryan 1904239ca7 reorganize day 17 code a bit 2024-01-11 10:48:11 -08:00
ryan 46d49dc3fe add pretty printed tower test in day 17 2024-01-11 10:19:39 -08:00
ryan 950f2860df fix day 12 performance regerssion
caused by a change to Grid.at_e that would eagerly format an exception
string even if the function never throws an exception.
2024-01-08 12:48:55 -08:00
ryan d203c9a520 finish day 17 part 2 2024-01-08 12:36:14 -08:00
ryan 8b54ae782c finish day 17 part 1 2024-01-05 11:33:26 -08:00
ryan 9f1499a1d3 implement day 17 rock falling logic 2024-01-04 00:38:09 -08:00
ryan 490696c63d make Grid.draw more flexible
- printer callback includes Vec2.t in the arguments now
- added optional rev_x and rev_y params
2024-01-03 09:18:57 -08:00
ryan a7c039197b fix .ocamlinit ?? 2024-01-03 09:18:27 -08:00
ryan 94f4badcc4 30x speedup on 16.2 from using bitmasks as a set!! 2023-12-04 23:28:54 -08:00
rmanseau 4e57ad4072 clean up 15.1 implementation a bit 2023-11-27 13:45:32 -08:00
ryan f2f3e497d6 get rid of old day 16 solution 2023-11-23 21:35:32 -08:00
ryan 2a515a5323 day 16.1 down to 1.5 seconds !! 2023-11-23 12:22:17 -08:00
ryan 5c0d7867a4 speed up 16.2 by 10x but its still 10 seconds >:( 2023-11-23 11:17:41 -08:00
ryan 1df5532c24 finally solved day 16 part 2 (in 100 seconds :P) 2023-11-22 22:58:22 -08:00
ryan 8db68c9baf use djikstra to get min dist between all valves
now i should be able to rewrite traverse in a way that doesn't suck
2023-11-22 18:27:42 -08:00
ryan 360be1a368 modify djikstra to work without a goal
if you give None as a goal, then it traverses the entire grid and finds
the shortest path to every node. the distances can then be queried via the
get_info that is passed in as an argument
2023-11-22 16:10:47 -08:00
ryan ae2acb87fa refactor generalized djikstra out of day 12 2023-11-22 16:10:47 -08:00
ryan c7eae53378 doesnt work for 16.2 :( 2023-11-21 23:22:43 -08:00
ryan b9a36a476a brute force day 16.1 with incorrect algorithm lol
it gets the right answer for the input but not for the example input
2023-11-21 18:17:35 -08:00
ryan 8270ee7aa8 never touching day 15 ever again 2023-11-21 16:50:51 -08:00
ryan 894e83fe12 fix day 15 for example inputs
part 1 didn't work for the example input :(
2023-11-21 16:48:03 -08:00
ryan 11546bff5f fix ocamlformat
apparently `version = x` simply refuses to format if you dont have the
specified version. doesn't seem very useful for a repo like this.
2023-11-21 16:47:17 -08:00
ryan d1e69ba66e cosmetic refactoring for day 15 2023-11-20 18:57:00 -08:00
ryan 2887274ad9 update the comment in day 15.1 2023-11-20 18:34:44 -08:00
ryan 6758130700 speed up day 15.1 with intersections
also update the vec module to use Iter in some places
2023-11-20 18:26:55 -08:00
ryan ff4bb0ae89 simplify day 15 parsing with regex 2023-11-20 14:26:01 -08:00
ryan b69f867423 update opam file 2023-11-20 14:25:38 -08:00
ryan a652ec69da add memo wrapper for recursive functions 2023-11-20 14:11:04 -08:00
rmanseau 421616a282 add dev env packages to depends 2023-11-20 13:36:40 -08:00
rmanseau f775ed645b fix opam file and add install steps to README 2023-11-20 12:24:23 -08:00
ryan 705c9e9a7c faster 15.2 solution with line intersections :/ 2023-11-10 18:24:41 -08:00
ryan 8d97e7601c very slow solution to day 15 part 2 :)
could be sped up by doing math to find intesections points of the
borders but that sounds boring
2023-11-09 14:23:41 -08:00
ryan b89e9c05ef refac day 14 to use new Vec2.bounds function 2023-11-08 10:37:44 -08:00
ryan b90478cd03 solve day 15 part 1 ! 2023-11-08 10:37:31 -08:00
ryan 383c6c0fca add Vec2.iter_region 2023-11-08 10:36:33 -08:00
ryan 19a763b73f manually implement show & pp for Vec2
so that it prints as if it were a tuple
2023-11-08 09:14:22 -08:00
ryan dcb1338aa3 parse day 15 2023-11-08 09:14:00 -08:00
ryan 724576d120 refactor day 14 a bit 2023-11-01 14:40:16 -07:00
ryan ceaebf895d solve day 14! 2023-11-01 14:14:46 -07:00
ryan ceb0f04a78 implement sand dropping logic & pretty visuals 2023-11-01 12:10:15 -07:00
ryan c5c9b584c0 update Grid.%() operator to return option 2023-11-01 12:09:53 -07:00
ryan 80f29ae00e swap Vec2 up/down
going down on the grid increases the int for y
2023-11-01 12:08:43 -07:00
ryan 2418d2ff0d normalize points in input
this way i can print the full input in as small a space as possible!
2023-10-31 18:06:12 -07:00
ryan 1ca2a95e1d make Grid.set_e throw out of bounds errors 2023-10-31 18:05:10 -07:00
ryan 61e3520ede parse day 14 grid
haven't implemented the falling sand yet, but theres a cool expect test
that draws the grid
2023-10-31 17:04:20 -07:00
ryan 98f47654f8 change Vec2 implementation to a record type 2023-10-31 15:57:13 -07:00
ryan 88acb381f1 move Grid into its own file 2023-10-31 15:57:11 -07:00
ryan 1d60878428 add init_grid func 2023-10-31 14:43:12 -07:00
ryan 63bad67c1b create angstrom wrapper in Utils for int parser
and other common parsers for the future
2023-10-31 14:40:22 -07:00
ryan 8fe7e77b52 put packet in a inline module cuz why not 2023-10-31 10:08:20 -07:00
ryan 06f695b34c tighten up day 13
List.compare is neat!
2023-10-31 09:45:04 -07:00
ryan fa8970b0de day 13, first parser combinator! thx angstrom <3 2023-10-30 15:37:45 -07:00
ryan dfa2cf11a1 add Vec2.origin for (0,0) 2023-10-30 11:21:34 -07:00
ryan 8562bc8385 finished day 12, thx dijkstra !! 2023-10-23 19:49:18 -05:00
ryan 887d961d29 flatten array of array in grid implementation
makes the new find function much simpler to implement
2023-10-22 11:43:27 -05:00
ryan 31a75867fa add expect tests 2023-10-09 14:14:13 -07:00
ryan b6eae27d9d get rid of executable
expect tests will make them kinda pointless
2023-10-09 14:14:06 -07:00
ryan fe5cd3666f move grid parse & iter into Vec2 2023-10-09 13:58:53 -07:00
ryan 250d978a38 solve day 11 :) 2023-10-08 19:10:12 -07:00
ryan c93c273ffd solve day 10 2023-10-07 12:58:57 -07:00
ryan bf5d3c1656 clean up vec stuff 2023-10-07 12:58:50 -07:00
ryan 1ee3a5a3c5 solve day 9 :) 2023-10-05 15:56:02 -07:00
ryan 5e1c30637e move vec2 into a new file & add a pretty printer
now it shows up properly in utop !!
2023-10-05 15:55:05 -07:00
ryan 239af2f93b refactor day 8 a bit 2023-10-01 13:12:36 -07:00
ryan 7d6b43ba93 day 8 complete ! 2023-10-01 01:55:36 -07:00
ryan b7aabdedcb dont let warnings fail the build >:( 2023-10-01 01:54:23 -07:00
44 changed files with 6747 additions and 59 deletions

No files matched your search

+1 -1
View File
@@ -1 +1 @@
eval $(opam config env) eval $(opam env --switch=.)
+1
View File
@@ -1,2 +1,3 @@
.DS_Store .DS_Store
_build/ _build/
_opam/
-1
View File
@@ -1,2 +1 @@
profile = janestreet profile = janestreet
version = 0.26.0
+2
View File
@@ -0,0 +1,2 @@
#install_printer Aoc.Vec2.pp;;
#install_printer Aoc.Grid.pp;;
+6
View File
@@ -0,0 +1,6 @@
## 2022 AOC problems in Ocaml
```sh
$ opam switch create . --deps-only -y
$ dune build
```
+13
View File
@@ -10,8 +10,21 @@ homepage: "https://github.com/username/reponame"
doc: "https://url/to/documentation" doc: "https://url/to/documentation"
bug-reports: "https://github.com/username/reponame/issues" bug-reports: "https://github.com/username/reponame/issues"
depends: [ depends: [
"utop"
"ocaml-lsp-server"
"ocamlformat"
"ocaml" "ocaml"
"dune" {>= "3.10"} "dune" {>= "3.10"}
"re"
"containers"
"iter"
"dune-site"
"angstrom"
"ppx_deriving"
"ppx_deriving_hash"
"ppx_regexp"
"ppx_expect"
"ppx_inline_test"
"odoc" {with-doc} "odoc" {with-doc}
] ]
build: [ build: [
+22 -1
View File
@@ -21,7 +21,28 @@
(name aoc) (name aoc)
(synopsis "A short synopsis") (synopsis "A short synopsis")
(description "A longer description") (description "A longer description")
(depends ocaml dune) (depends
;; development env
utop
ocaml-lsp-server
ocamlformat
;; deps
ocaml
dune
re
containers
iter
dune-site
angstrom
;; ppx
ppx_deriving
ppx_deriving_hash
ppx_regexp
ppx_expect
ppx_inline_test
)
(sites (lib inputs)) (sites (lib inputs))
(tags (tags
(topics "to describe" your project))) (topics "to describe" your project)))
-4
View File
@@ -1,4 +0,0 @@
(executable
(public_name aoc)
(name main)
(libraries aoc))
-11
View File
@@ -1,11 +0,0 @@
open Aoc
let () =
Day1.print ();
Day2.print ();
Day3.print ();
Day4.print ();
Day5.print ();
Day6.print ();
Day7.print ()
;;
+143
View File
@@ -0,0 +1,143 @@
addx 2
addx 3
noop
noop
addx 1
addx 5
addx -1
addx 5
addx 1
noop
noop
addx 4
noop
noop
addx 5
addx -5
addx 6
addx 3
addx 1
addx 5
addx 1
noop
addx -38
addx 41
addx -22
addx -14
addx 7
noop
noop
addx 3
addx -2
addx 2
noop
addx 17
addx -12
addx 5
addx 2
addx -16
addx 17
addx 2
addx 5
addx 2
addx -30
noop
addx -6
addx 1
noop
addx 5
noop
noop
noop
addx 5
addx -12
addx 17
noop
noop
noop
noop
addx 5
addx 10
addx -9
addx 2
addx 5
addx 2
addx -5
addx 6
addx 4
noop
noop
addx -37
noop
noop
addx 17
addx -12
addx 30
addx -23
addx 2
noop
addx 3
addx -17
addx 22
noop
noop
noop
addx 5
noop
addx -10
addx 11
addx 4
noop
addx 5
addx -2
noop
addx -6
addx -29
addx 37
addx -30
addx 27
addx -2
addx -22
noop
addx 3
addx 2
noop
addx 7
addx -2
addx 2
addx 5
addx -5
addx 6
addx 2
addx 2
addx 5
addx -25
noop
addx -10
noop
addx 1
noop
addx 2
noop
noop
noop
noop
addx 7
addx 1
addx 4
addx 1
noop
addx 2
noop
addx 3
addx 5
addx -1
noop
addx 3
addx 5
addx 2
addx 1
noop
noop
noop
noop
+55
View File
@@ -0,0 +1,55 @@
Monkey 0:
Starting items: 97, 81, 57, 57, 91, 61
Operation: new = old * 7
Test: divisible by 11
If true: throw to monkey 5
If false: throw to monkey 6
Monkey 1:
Starting items: 88, 62, 68, 90
Operation: new = old * 17
Test: divisible by 19
If true: throw to monkey 4
If false: throw to monkey 2
Monkey 2:
Starting items: 74, 87
Operation: new = old + 2
Test: divisible by 5
If true: throw to monkey 7
If false: throw to monkey 4
Monkey 3:
Starting items: 53, 81, 60, 87, 90, 99, 75
Operation: new = old + 1
Test: divisible by 2
If true: throw to monkey 2
If false: throw to monkey 1
Monkey 4:
Starting items: 57
Operation: new = old + 6
Test: divisible by 13
If true: throw to monkey 7
If false: throw to monkey 0
Monkey 5:
Starting items: 54, 84, 91, 55, 59, 72, 75, 70
Operation: new = old * old
Test: divisible by 7
If true: throw to monkey 6
If false: throw to monkey 3
Monkey 6:
Starting items: 95, 79, 79, 68, 78
Operation: new = old + 3
Test: divisible by 3
If true: throw to monkey 1
If false: throw to monkey 3
Monkey 7:
Starting items: 61, 97, 67
Operation: new = old + 4
Test: divisible by 17
If true: throw to monkey 0
If false: throw to monkey 5
+41
View File
@@ -0,0 +1,41 @@
abcccccccccccccccccccccccccccccccccccccccccccccccccccaaaaacccccccccccccaaaaaaaccccccccccccccccaaaaaaccccccccccccccccccccccccccaaaaacccaaaccccccccccccccccccccccccccccccaaaaa
abcccccccccaaaccccccccccccaaaccccccccccccccccccccccccaaaaaacccccccccccccaaaaaaaaaaaccaaaaccccaaaaaaacccccccccccccccccccccccccccaaaaaacaaaaccccccccccccccccccccccccccccccaaaa
abcccccccccaaaaaacccccccccaaaacccccccccccccccccccccccaaaaaaccccccccccccaaaaaaaaaaaccaaaaacccaaaaaacccccccccaaacccccccccccccccaaaaaaaacaaaaccccccccccccccccacccccccccccccaaaa
abcccccccccaaaaaacccccccccaaaaccccaacccccccccccccccccaaaaaaccccccccccaaaaaaaaaaaaaacaaaaaaccaacaaaccaacccaaaaaaccccccccccccccaaaaaaaacaaaccccccccccaccccaaaccccccccccccaaaaa
abcccccccaaaaaaaccccccccccaaaacccaaaaccccccccccccaaccccaaacccccccaaacaaaaaaaaaccccccaaaaaacccccaaaccaacccaaaaaacccccccccccccccccaaccccccccccccccccaaacccaaaccccccccccccaaaca
abcccccccaaaaaaacccccccaaacccccccaaaacccccccaaccaaaccccccccccccaaaaacaaaaaaaaaccccccaaaaaccccccccaaaaaaaacaaaaaccaacaaccccccccccaaccccccccccccccccaaaaaaaaaccccccccccccccccc
abcccccccccaaaaaaccaaccaaacccccccaaaacccccccaaaaaaaccccccccccccaaaaaaccccaaaaaacccccccaaaccccccccaaaaaaaaaaaaacccaaaaacccccccaaaccccccccccccccccccaaaaaaaackcccccccccccccccc
abcccccccccaaaaaaccaaaaaaaccccccccccccccccccaaaaaacccccccccccccaaaaaaccccaaaaaaccccccccccccccccccccaaaaccaaaaaccccaaaaaccccccaaaaaccccaaaaaccccccccaaaajjkkkkkccccccaacccccc
abcccccccccaaccccccaaaaaaccccccccccccccccccccaaaaaaaaccccccccccaaaaacccaaaacaaccccccccccccccccccccaaaaaccccccccccaaaaaacccccaaaaaaccccaaaaaccciijjjjjjjjjkkkkkkccaaaaaaccccc
abcaaaccccccccccccccaaaaaaaaccccccccccccccccaaaaaaaaacccccccccccaaaacccaaaccaaccccccccccccccccccccaacaaacccccccccaaaacccccccaaaaaacccaaaaaaciiiijjjjjjjjjoopkkkkcaaaaacccccc
abaaaacccccccccccccaaaaaaaaaccccccccccccccccaaaaaaaacccccccccccccccccccaaaaaaaccccaccaccccccccccccacccaacccccccccccaaccccccccaaaaacccaaaaaaiiiiiijjjjjjoooppppkkcaaaaaaacccc
abaaaaaccccccccccccaaaaaaaaccccccccccccccccaaaaaaaccccccccccccccccccccccaaaaaaccccaaaacccccccccccccccccccccccccccccccccccccccaaaaccccaaaaaiiiinnnoooooooooppppkkkaaaaaaacccc
abaaaaacccccccccccaaaaaaaccccccccccccccccccccccaaacccccccccccccccccccaaaaaaaacccccaaaaccccccccccccaaccaacccccaccccacccccccccccccccccccaaaciiinnnnoooooooouupppkkkaaaaaaacccc
abaaaaccccccccccccccccaaaccccccccccccccccccccccaaacccccccaaccccccccccaaaaaaaaacccaaaaaacccccccccccaaaaaaccccaaaaaaaacccccccccccccaaccccccciiinnnntttooouuuuupppiiacaaacccccc
abaaaacccccccccccccccccaaccccccccccccccccccccccccccccccaaaacacccccccccaaaaaaaacccaaaaaacccccccccccaaaaaccccccaaaaaacccccccccccaaaaaacccccciinnnttttuuuuuuuuuuppiiccaaacccccc
abcccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccaaaaaaaccccaacccccaaccccccaaaaaacccccaaaaaacccccccccccaaaaaccccccciinnntttttuuuuxyuuuppiiicccccccccc
abccccccccccccccccccccccccccccccccccccaaacccccccaaccccccaaaaccccccccccccaaccccccccccccccccaacaaacaaaaaaaacccaaaaaaaaccccccccccaaaaaaaccccchinnnttxxxxuuxyyyuuppiiiiccccccccc
abccccccccccccccccccccccccccccccccccccaaaaaaccccaaacccccaaaaccccccccccccaaccccccccccccccccaaaaaccaaaaaaaaccaaaaaaaaaaccccccccaaaaaaaaccccchhhnnttxxxxxxxyyuvppppiiiccccccccc
abccccccccccccccccccccccccccccccccccaaaaaaaaaaccaaaaaaacacaacccccccccccccccccaaaccccccccaaaaaaccccccaacccccaaaaaaaaaaccccccccaaaaaaaaccccchhhnntttxxxxxxyyvvvppqqiiicccccccc
abccccccccccccccccccccccccccccaacaccaaaaaaaaaaaaaaaaaaacccccccccccccccccccccaaaaaaccccccaaaaaaacccccaacccccaccaaaaacacccccccccacaaaccccccchhhnnnttxxxxxyyyvvvvqqqqiiiccccccc
SbccccccccccccccccccccccccccccaaaaccaaaaaaacaaaaaaaaaaccccccccccccccccccccccaaaaaaccccccccaaaaaaccccccccccccccaaaaccccccccccccccaaacccccchhhmmmtttxxxEzzyyyyvvvqqqqiiccccccc
abcccccccccccccccccccccccccccaaaaaccccaaaaaccaaaaaaaaacccccccccccccccaaaaaccaaaaaaccccccccaaccaacccccccccccccccaacccccccaaaaccccccccccccchhhmmmtttxxxyyyyyyyyvvvqqqjjjcccccc
abcccaaacccccccccccccccccccccaaaaaacccaacaaaaaaaaaaaaacccccccccccccccaaaaacccaaaaaccccccccaacccccccccccccccccccccccccccaaaaacccccccccccchhhmmmttsxxyyyyyyyyvvvvvqqqjjjcccccc
abcccaaaaaacccaacaaccccccccccacaaaacccaacccaaaaaaaaaaaacccccccccccccaaaaaacccaacaaccccccccccccccccccccccccccccccccaacccaaaaaaccccccccccchhhmmmssxxwwwwyyywvvvvvqqqjjjjcccccc
abccaaaaaaacccaaaaaccccccccccccaaccccccccccaaaaaaaccaaccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccaaccaaacccaaaaaacccccccaaachhhmmssswwwwwwyyywvvqqqqqqjjjccccccc
abcaaaaaaacccccaaaaacccccccccccccccccccccccccccaaaccccccccccccccccccaaaaaacccccccccccaaccccaaccccccccccccccccaaacaaacccaaaaaacccccccaaacgggmmsssswwwswwyywwrrqqqjjjjcccccccc
abcaaaaaaaccccaaaaaacccccccccccccccccccccccaaccaaaccccccccccccccccccccaaccccccccccccaaccccaaaacccccccccccccccaaaaaaccccccaacccccccaacaaagggmmmssssssswwwwwwrrqjjjjjddccccccc
abcccaaaaaacccaaaacccccccccccccccccccccccccaaacaaccccccccccccccccccccccccccccccccaaaaacaacaaaaccccccccccccccccaaaaaaaaccccccccccccaaaaaagggmmmmssssssswwwwrrrkjjjjddddcccccc
abcccaaaaaacccccaaccccccccccccccccccccccccccaaaaaccccccccccccccccccccccccccccccccaaaaaaaacaaaacaaccccccaaccaaaaaaaaaaacccccccccccccaaaaaggggmmmmllllsrrwwwrrkkkjdddddaaacccc
abcccaaaccccccccccccaacccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccaaaaacccccccaaaaaaccaaaaaaaaaaaaaacccccccccccccccaaaaaggggmmllllllrrrrrrrkkkdddddaaaccccc
abccccaaaaaaccccccccaacaaaccccccccacccaaccaaaaaaaaccccccccccaaaccccccaacccccccccccaaaaaccccccccaaaaacccaaaaaaaaaaaaccccccccccccccccaaacaacggggggflllllrrrrrrkkddddaaaaaccccc
abccccaaaaacccccccccaaaaacccccccccaaaaaaccaaaaaaaaccccccccccaaacacccaaaaccccccccccaacaaacccccaaaaaaccccaaaaaaaccaaacccccccccccccccccaacccccggggffffllllrrrrkkkdddaaaaaaacccc
abccaaaaaaacccccccaaaaaaccccccccccaaaaaccccccaacccccaaccccaacaaaaaccaaaacccccccaaccccaaccccccaaaaaaaccaaaaaaaaccaaaccccccccccccccccccaaaccccccgffffflllkkkkkkeedaaaaaaaacccc
abccaaaaaaacccccccaaaaaaacccccccccaaaaaacccccaacccccaaacccaaaaaaaaccaaaacccaaaaacccccccccccccccaaaaaacaaaaaaaacccccccccccccccccccccccaaaacaacccccffffllkkkkkeeedccaaaaaacccc
abccccaaaaaaccccccccaaaaaacccccccaaaaaaaacccccaaccccaaaaaaaaaaaaccccccccccaaaaaaaacccccccccccccaaccaaccccaaaccccccaacccccccccccccccccaaaaaaaccccccfffffkkkkeeeecccaacccccccc
abccccaaccaaccccccccaaccaacccccccaaaaaaaacccccaaccaaaaaaaaccaaaaacccccccccaaaaaaaaccccccccccaacaaccccccccaaccccaacaaaccccaacccccccccccaaaaaaccccccaafffeeeeeeecccccccccccccc
abccccaaccccccccccccaaccccccccccccccaacccccaaaaaaaaaaaaaaacaaacaaaaaaacaccaaaaaaacccccccaaacaacccccccccccccccccaaaaaccccaaaacccccccaaaaaaaaccccccaaaaffeeeeeeeccccccccccccca
abacccccccccccccaaacccccccccccccccccaacccccaaaaaaaaaaaaaacccaaccaaaaaaaaaaaaaccaaacccccccaaaaaccccccccccccccccccaaaaaaccaaaacccccccaaaaaaaaaccccccaaacceeeeeccccccccccccccaa
abaaccccccccccaaaaaacccccccccccccccccccccccccaaaacccaaaaaaccccccaaaaaaaaaaaaaaaaaaaccccccaaaaaaacccaaaccccccccaaaaaaaaccaaaaccccccccaaaaaaaaccccccccccccaaacccccccccccaaacaa
abaaccccccccccaaaaaacccccccccccccccccccccccccaaaaacaaaaaaaccccccaaaaaaaaaaaaaaaaaaccccccaaaaaaaaccccaaaaccccccaaaaacaaccccccccccccccccaaaaaaacccccccccccacacccccccccccaaaaaa
abacccccccccccaaaaaaccccccccccccccccccccccccaaaaaacaaaccaaccccccaaaaaaccaaaaaaaaccccccccaaaaaaaaccaaaaaacccccccccaaaccccccccccccccccccaacccccccccccccccccccccccccccccccaaaaa
+449
View File
@@ -0,0 +1,449 @@
[[9,[8,[7]],4,7,[[4,9,3,2],6,5,[1,10,2,4,5],[1,3,2,6,1]]],[4,[6],3],[4,[7,0,3,8,8],[7,[10],[10,10,10,7]]]]
[[],[[6,4,[5],4,[0,5,5]],3,[5,[],9]],[[[5,1,6,2],[6,4,7],[4,7,4,2]],[10,[],[6,9,4],[6,2],9]],[[[10,5,9],10,0,[4,1,4,10,1],1],[7,7,[10,8],6],2]]
[[[8,2],2,[[10],[],6,10,[10,10,3,10,3]]],[],[]]
[[[[7,3,5],10,[4,1,0,8,7],9],10,[]]]
[[6,2,[2,[10,10,0],[2]],7]]
[[7,9],[5,[8,[0,5,5,10,4],6,8,6],3,[4],2],[4]]
[[[5],[6,[5,3,0],[6,2,5,2,6],1,6],[[]],[3,[1,1,0],[],1,[9,4,3,5,7]]],[[1,9,[2,2,6],[8,9],2],1,[[],0,8],[[],9],3]]
[[],[[10,9],[],[[6],9,8,[3]],[0,5,[5],6],2],[[[5,2,5,3,5],4],9,6],[8]]
[[[[9,10,8,4],2],[[10]]],[1,[[],9,[7,2,2,1,0],5]],[[[10],[],[5]],10,[],9],[[],[2,[1],[4],7,[6,1,5,0,1]]]]
[[[[6,9],[8,2,2],[5,1,6],[0,1]],[[2,5,1,3],9,[]],[[10,3,9],10,4]],[[[5,2,0],[7,3],9],[[5,3,2,6]],4]]
[[[1,0,9,[10]],[],[8,2,[0,2],6,[]]]]
[[4,3],[2]]
[[7]]
[[7,[[4,0,9,9]],3,[10,0,6,[5,2,0,1,7]],7],[5,[3,[2,8,7],[9],[2,3,5,0,10]],10,[[3,0,8],6,[5,5,7],[2,10]]],[3,4]]
[[[[0,9,5,2],[6,0,4,10]],[10,7]],[[6]],[7],[[[1,10,8,0,6],7,[3],0],3],[[[1,5,5],[6,6,9],[],[4]],1,9]]
[[[[2,3],[7],10,[2,1,3]],10,[6,9,[0,8]],[[6,6,5],[10,6]],[[],[],7]]]
[[[6],7,[10,[2],3],[[2,3]],[[1,1,7],[0,6,6,2],[7],[]]],[4],[2],[[6,2,10,3,6],[[5,7,10,3,6],8,[1],[]],7,5,[]],[[]]]
[[[],[7,5,8],0,3,[]],[2,8],[7],[8,0,[[0],3,[2]]],[1]]
[[[],5,[0]],[7],[[2,7,[7]],[[8,3],[8,9,8],6,[]],[1,3,[0,4,10],[6,1,9]],8],[[3,0]]]
[[5,[],10]]
[[8,[[0],5,[],3],[0,8]]]
[[],[3,5],[[[8,9,5],1,[3,9]],[[0,0],9,2],[0,1,8]],[0,3,[[3]],[7,[3,5,10],[1,9,10],[9,5],[2,4,3,9,7]]],[[8,3,6],6,[7,5,8],[[],4,1]]]
[[6],[]]
[[],[[[3,5,9],[0,7,5],[3,8,1,9,6]],[1,[3,3,10],0],[5,8,3,0,3],3,8],[[[1],[9,9,3,3],[7],[7,10,1,6]],4,10,[[7,7,2,0,3]],[10,9]],[9]]
[[3,2,4]]
[[[[2],4,[9,4,6,0]],[7,[]],[[0,5,9],[7],7,3],[[8,0,0,4,5]],[9,[3,5,4,10],[7,7,4]]],[[9,[],[8,5,6,4,9]],1,10,4,7]]
[[],[[],[8]],[1,[[8,10,0,2],1,4,[1,10,9]],3],[[[0,4,5,6,6]],5,[[9,0,5],[3,10],8],3],[[9],4,[[3,6],6],[8,[5],10,[7,0]],7]]
[[1]]
[[[[5,3,8,2],1,[10]],9],[[[9,3,0,7],8,[10,1,6,9],[7,6,3],[6,7,5]],[6,1,[1,6,10,8],7,[]]]]
[[8],[[7,[5,6],0],[4,[],[5,2,10,8]],[10]],[[],6,[],[10,5,3],[3,4]],[[[7,4,7,8,0]],9]]
[[7,[7,7],4,1,4],[10,[10,[2,4,9],0,[5,10,7],1],10,[9,2,[0,6,3,9,10],8,[7,9,7,10,3]],[3,[0,2]]],[9,3]]
[[3,[0,[5,0,8,1]],[]],[],[[3,[2,4,4,0,0],2],[4,[9,1,0]],1],[],[]]
[[[[5,10,10,8]],[[5,7,10,10],[],[2,4,10,9],1,[]],9,8,[10,[5],[7,6,8,2],10,[2,9]]],[8,3,[[],3,[4,3,0],1,2],[6,[2,8],[2],0,0],5],[2,[[6,0,0,4,9],[7,10],1,[]],[[8],10],[[1,10]]],[6,10,[[3,6,7,9],5],4]]
[[[]],[[[10,5,9],2],4,[0,[8],[0,8,9,2,6]],[8,0,[4,4,10],7]],[[6,[]],10,[[],[5,10]],[6,9],[3,10,[2,5,1,7,7],[2,6,10]]],[[],[[],5],[[5],[7],[8,2,2,8]],[2,[4,0],8]],[[[10],8,[10]],[],[]]]
[[[[6,6,1],[3,10,5]],[[3,9,6,0],2,[10,1,8,8]],[],[[6,9],5,5,[],4]],[[7],3],[[[],[8,4,2,0,8]],10,2,7],[8],[10,7,[[2,6,0,0,8],[3,10,10],[],9,[7,9,3]],6]]
[[6,8,[[9,0,8,7,5],0,3],[],0],[8,[6,9],8,[[0],7,[10,6],6,[7]],8]]
[[[[9],[6,6],0,8,[7,2]],[7,[],[9,6,2],9,[]],[[],7,7,[6,6]]],[1,3,1],[1,[[8,0,10,1,9]],9],[10,5]]
[[[[4,6,8,9],8,[3,3,6],[10]],[[3,6,7,5],[],[4,9]],[6,0,8],[],[5,[2]]],[[[5,1,6,2,8],2],3,[9,9,[],0,1],5,[10,[9,5,2],5]],[]]
[[[]],[]]
[[8,[5,[6,3,2],[10,5,4],[5,1],[5,10,5,9,7]],4,[8,2,0,6],4],[[[0,9,5,7],9],6,[[0,8,10,8],9,[9,0,3,7,1],[6,8,2,5,10],[]],7,[1,[],4,[0],[2]]],[1],[[7,[],6,2,1]],[2,3]]
[[5],[3,[1],[[6]],[[2],[],3,[6,1,8,6,1],[4,6,4,7]],[3]]]
[[[[6,5,1],9],[],7,7],[0,4]]
[[[],5,4,7,[[9,5,9],[]]]]
[[10,[1,[2,3],9,[3]]],[[[5,7,9,10,8],[]],0]]
[[6,8,[0,1,10]],[[4,7],[[7,0,0,3],6,2]],[[[10],[6,5,3,10,0],[0,2,4],[8,10],[7]],1],[2,[2]]]
[[],[5,8,[[],[6,3,2,3],9,3,[]],[0,[4,1,5],4],[[0,6,4],[],[3,6,10,9],3,[0,0]]],[[6,3],6,2,10,8],[5,[[0,9,4,6,1],[6,9,4]],3,[],0]]
[[4,8],[],[],[7,6,4]]
[[],[[5],[[8],[10],7,[9,10]],9],[3],[[9],[[3,0,5]]],[10,[[6,0,3],[2,4,3,0],4,10,10]]]
[[4,10,[[8],[6,4,8,8,10],1,[10,2],[7,8,9,0]],1],[6,4,3],[7,8,4],[[9,[10,4,8,7,2]]],[3,5]]
[[],[[[0,0,5,10],9,10],[[6,7,5]],[[3,6,7,2,2],[9],[7,5],9],[[0,0,10,9,8],5,[3,2]],[]]]
[[[],[[],8,0]],[[[],[],[]],9],[[7],3,10,4,[3,[4,7,0,2]]],[[[0,9,2,1],[2]]],[[[1,7],6,8,[2,5]],8,7]]
[[],[1],[6,[],1,[4,[],[10]],[[10,9,1],[]]],[[[2,1,5,10],[9,9,5,7,9],[9,1]],[[2],[5,9]],[[8],[2,8,2,4,5],4,[3,9,3],9],9]]
[[7,[4,9,[],[7,6,8,7],3],6,7],[7,9,[[2,3],7,5,[7]],[[6],4,[2,8,5,10],[4,9,10,6]]],[[],10],[5,[5],8,[],[3,[6,1,7,10,1],7,5,[10,8]]],[[[7,7,8],8,8]]]
[[7,[10,1,[5,3,9],1,[]]]]
[[[[8,2,10,7,3],8,[0,7,0]]]]
[[4,7],[[2,[],7],4,[10,[4],[5,6],1,1]],[5,[[9,1]]],[[6,2],[2,3,[1,4,1]]],[]]
[[6,[[],10],[5,3]],[],[6,4,9],[7,[6]],[0,[],[[8,7,8,10,7],[],[10,6,4],[4],0],8,[8,7,1,[10,6,5],[10,1,5]]]]
[[3,8],[[3,[1],10]],[[6,2,[],[9,6],5],[[1,8,9,2,9]],[3,[],[7,6,4,7,6]]],[[[3,9,5,0,2]]],[[],7,7]]
[[10,7],[9,7,2,5,1]]
[[],[],[[]],[[7,2,[],[2,10,7],8],4,0,[2,[],[8,8,9],5,[6,1]],[1,4,[6,5,4,1,4],[7,7,9],2]],[[],5]]
[[[[6,7,10,0,4],[5,3,2,8,4]],[[1],[],[5,4],8,2],0],[1,5,10],[[2]]]
[[],[10,1,[[1,3,0],[0,1,7,7],[1,5,10,7,3],[4,6]],4,[]],[9,9,[8,[4,1,7],[4,1,8,9],[7,6,5,10,5]],[0,6,[6]],6]]
[[[[2,3,3],2,[]]],[[[4,6,7,5],[7,3,3,10],[4,6,10,2,3],[4],7]],[[[1,3,4,0,4],10],[10,[],4,3]],[],[3,[],9,2,8]]
[[],[[[9,1,8,4],7]]]
[[],[3,10,[[1,6,1],[1,2,1],[9],[3,7,9,10]],[[]]],[[[9,3,7,6],[6,8,2,3],10],[8,8,1,5],[6,2,4,[2,8],1]],[[[6,8,9,8],5,5],[[],[0,4,5],[4,5,8,7]]],[]]
[[[]],[[1,[2,4,0,4,4]],[2,[],4],[7,[9,5,5],[0,2,0,5]],10,8]]
[[],[],[],[3,[8,5,[7,2,9,9]],[[2],[4,10]]],[]]
[[9,[9,10,8,[4,6,3,0]],7],[[4,[8,4,2,8],5,[0,10,9,4,9],2],[2,10],[4,[10,1]]],[10]]
[[4,[[10,5],8]],[4,8,7],[[[7],[],5],10],[[],5]]
[[[[0,7],[9,8],[]],9,[[6,2],4],1,[]],[1],[[7,4,2,[8,2,3]],8,3,[[1,9,10,7],[2,2,3,2]]],[[[3,1,8],8,[6,1,1,6,5],[1],6],[6,[],10],[[],3],7,10]]
[[[7,[5,6,3,2,5],[0,6,0,3],[0,4,10,6,8]],4],[],[[],[[10,9],[10,4,9]],[[1,8,6],6,[]]],[5,9],[[],[[],[3,3]]]]
[[],[6],[[3,[1],4,[10,0,1,6,3],7],[],9],[0,[[],6,4,2]],[]]
[[7,[]]]
[[5,3,[6],[],[10,[0,7,3,9]]],[[[9,1,5],5,0,1,8]],[[[2,3,10,1],10],10],[[[],5,4,1,8],[0,[5,1,4,9,3],2,10],[],[9]],[2,10,8,6,4]]
[[[],1,8,[4]]]
[[[5,5,[]],[[],[3,2,5,10],[4],[5,5,8,2,6]],6],[[10],[[5,0],[2]],9],[[4],[]]]
[[[2,6,[9,10]],9,7],[8],[7,6],[8],[8,0,3,0]]
[[[],[[],4,[1],6,[5,9,0,0]],9,9,4]]
[[[],9],[[10,8],6,[[8,0,0,7],[6],3,[5,5,1],10],[[9,3,6],[8,3,0]],[]],[[0,7,1],3,3],[5],[4]]
[[[8,[4,6,0,4],2,[8]],[[6,10,6],[2],4],5,9,[3,[3],[10],7]],[6]]
[[[6,6,[0,5,3,10],10],[3,0,7,[8],[3,9,10,1,7]],8,[6,9,[]],[1]],[],[5],[5,[4,[6,9],2,[8],[]],0]]
[[],[],[[6,[],6],[9,8],7,[],[3,[5,9],4]],[[7,[3,7],[4,8,10,9],10],[[],9],8,[5],5]]
[[[[],6,0,[2,6,7,7]],9],[[7,1,[5,4,5,2,10],[]],7,[4,2,1,0],10],[6,7,[]]]
[[1,[[],5,10,[8]],[8,1,[],[1]],[[2,0,1,10,6],[10,7,3,5]]],[[[10,5,5,10],[]]],[0,[[5,7],[],9,6],[5,0,3],[]],[[6,5,0,[0,1,9,3],[9]]],[0,[4,1,3],7]]
[[[],[1],[],10],[6,9],[10,10],[]]
[[9,7,[[0,2],5,[8,1,5]]]]
[[],[0,[[7,8,4,1],9,0,2]],[[2,7,[],[1,6],[4,6]],[7,[]],0,[[1,0,5]],1],[5,[6,[9,4,2,6,4],10,[7,7,8,8,1]],[7,9,[7]]],[]]
[[],[9,3,[[2,8,6,3,9],1,6,[6,8]]]]
[[[6,6,[7,7,3]],[]],[3,2,0,[3,[8,4]],5],[9,10,7,10],[[9,[0],10,10,[1,9,0]],[[],1,3]]]
[[2,4,5],[],[0,[],[[0,2,8,0,7]],[[],[7],[0,2,9]]],[]]
[[[[]]]]
[[[[],[10],[0,9,7,9],5,[]]],[]]
[[[],[[],10,1,[7,3,0],[4,10]],[]],[[],[10,[7,4,7],[],9,[0,4,3,8]]]]
[[],[[[],10,1,2,0],10,[[]]],[[4],[[8,7,10],8,7],0],[[0,[4],[],[0,1,10,3],9]]]
[[[7,[],[1],[6,4,0]]],[[[7,1,10]],[[1],[1,9,4,6]]],[9]]
[[1],[4,5,3,8,[9,4,[0],[4,7,0]]],[9,[4]]]
[[],[[[10],6],[],[[2,1,9,10]],4,[4,1,10,3,0]],[[],[],0,[[]],[5,[10,5,9,1,1],[9,4,8]]],[],[3]]
[[9,[[6]],[],[[],5]],[[[3],10,9],1,[5,[10,1,10,1],[8,2,2,10,7],9,10],0],[8,3,[[0,10,3],6,[8,10,7,0,6]]],[[],2,7]]
[[7],[9]]
[[[[6,2,0,5],9],[[2,4,5],5,[0,6,8],[9],3],[[5,5,8],10,[0,5,2,3],7,[3,0,9,3,7]],7],[8,[[2,1,2,6],2,4],6,[],[2,[7,2,6,9],1]],[8,5,[10,[1,3,4,9],1,3],8],[[3,7,[9,5],[10,5,1],10],[[5,7,5,2,8]],[2,7,[],3,2],[[0,2,0,6],[5,7,9],7,[7,8]],[7]],[0,[[],[],4,10],5,[[9,10,5],3]]]
[[4,8,[9,[],[0,6,9,0,7]],[[2]],[1,4,8,10]],[[]],[[6,[1,3,2,7],[7,10,4,9,0]],5,3],[[[],[8],[2,7,1,3,4]],[]]]
[[],[],[4,9,7,6],[3,10,0,[]],[10]]
[[],[[],[],8,10]]
[[[[0,10,2,6],[3,8,9],6,[3,9,8]]],[[5,0,[2,3,9],[0,5],[4,4,1]],[[],7,[6,3,2,10,2]],5,9,[3]],[[]],[3,[[],7]],[[2,6,7,1],[1],3,[9,9]]]
[[[],7,[],[6,3,3,[4,5,6,10,8],[6,3,1,2,10]]],[[[],1,[8],[5,0,0],9],[],[[1,2,8,6]],[[4,3,7,1],2,[1,7,3,0]],[6,[7,5,3,6],5,5,3]],[[[],[6,1,7],[3,0,1,0,5]],0,[[0,10],4,[3,7,5,8,1]]],[4]]
[[5],[6],[],[5]]
[[[8,[7],[9,7,5],[4,4,4,0,9],[0,8]]]]
[[[[3,2,6,6],[1,4,1,7,0],[],10,[8,6]],[[5,4,2],[],6,[10,6,2,2,7]],7,[[6,4],[],8,[2,7]],8],[],[],[[[],7,6],1]]
[[6,[1,6,[9,3,7,5],8,[8,2]]]]
[[[9,3,[6,10],[],[9,5,1,2]],[[9,8],[6,4,8,9],[6,8,3],[9,7,9,10]],0,[[3,5,6,10],[7,0,7]],0],[6,[[8],[0,7,1],7,[8,1]],[4,4,3],[5,[],6,9],10],[7],[]]
[[9,[3,3],[10,[8,10,9,9]],6,3],[[[6,2],6,5],[[6]],[1,[3,2,6]]],[9,7,1,5]]
[[3],[9,[7],[3],[7,5,7],7],[],[[[],[3,3,0,9],[8]],2,8]]
[[[[7,1,1],0,4,7,2],[[3,4,9,2],[8,7,5,0,9],5],[9]],[[[3,8,4,2,8]]],[]]
[[0,3,[[8,10,9,0,4],5],[]]]
[[[]],[[]]]
[[[[2,6,8,2],2,6,0,8],[10,5,[0,2,1,0],0]],[4,3,[0,4,[3,7,0,0,5]],[[1,3,9],4],0]]
[[[10],[[9],0,[6],2,0]],[[1,3,[7,3,1]],[8,[6,3,0,1,1]],5],[[7,[1,0],2,[]],5,4,3,4],[9,7,9,7,5]]
[[9,0,[9,4]],[[[3]],5,5]]
[[5,[10,0,[3,1],[0,8]]],[7,[[8,6,8,4,7],[],5,[7,10,8,3,9]],4,6]]
[[[[7,6,6],8],[[9,7,10,6,3],8],0],[2,9,7],[[[3,9,8,7],[8,0],5],[[0,8,2],[]],[3,3,[3,4],0,6],[6,[8,5,4,6,2]]],[]]
[1,0,10,1]
[1,0,10,1,0]
[[9],[2,6],[]]
[[4,1,[[9],[8,6,10,5,2],3,[6,5,9,5],[8,0,2]],7,2],[1,[[1],6,[0,7],9],[10,5,4]],[6,9],[[[6],[1,5,5,10],5,[],[10,4,6,6,4]]]]
[[[6,7,[],[8,3,9,3,7]],0,5,5,2],[4,[],8,[[10,10,3,0],5],[[4],3,10]],[],[7,10]]
[[[7,[6]],[2,8,[8,1,4]],[[3,1,7,10],10,2],2,[4]],[8],[[]],[[1,[6,0,3,1,1]],[[5,2,7,3,10],8,[0,1,1,2]],[9,4],0],[[[7,9]]]]
[[2,[],[],9,3]]
[[0,9,4,2],[8,6],[[[8,7,3,1],[],[8],3,[4,2]],4,1,0,[]],[[],[]]]
[[[2],[]],[[[3,5,2,3],10],[],[9,2,5,2,3],6],[],[[0,4,0,9],[[],[]],3,[8,5,[],[6]],[[],[],6,[7]]],[[],[9,3,1,[],[8,0,7]]]]
[[6],[6,[[7,3,5,1]],7,3]]
[[5,[[10],[0],[3],[2,4,5]]],[[8,[8,10,5,0],0,[1,7,8,1]],[10,[5,6,4,5],3],[0,3,[5,4,5,8],7],[4,[5,6],0,[0,10,7]]],[8,9],[[5,[10,3],3,[]],[7,1,8,[9],8],[],[9,[2,5],[3,5,2,4],[4]]]]
[[8,10,4,[[],1,2,8,8],8]]
[[[2,9],6,[],[5,0,10]]]
[[[2],[[8,10,7,0],[7],[10,9,7,6]],8,[[8,10],8],[[2,8,9,3],[3]]],[7,2,8]]
[[],[],[2,[6]],[[]],[1,3]]
[[],[4,4,4,[[],3,[],7,[]]],[6,[]],[[9]],[[]]]
[[[[4,5,9,3]],1,[],4,[[],[],[],7]],[[[0,6,9,8,7],[],3,[4,8,1],5]],[6,[9,10,6,9],[[9,10,2,1],[8,7,1],[10,10,3]],[[0,4,3]]],[]]
[[5,[]]]
[[4,8]]
[[],[],[0,6,[10,[5,10],2,1,[3,3,1]],8]]
[[7,10,[[2],10,7,[5,0,5],9],10],[4,[[5],[1,5,8,10,5]]],[0,1,[[2,6],[1,8],8,0],[10,[7,1,10,3,1],[],[0,0,6,10]]],[],[7]]
[[],[3],[[3,1,1,3],1],[10,9,[],2],[[[9,3],6],[[2,10],7,9,[7,8,7,10,6]],10]]
[[[0,5]],[[8,9,10,8]],[[[2,9,6],7,0,3],0,[[7,4],[5,7,0,10],[]]],[[3,9,[7,1,2,6],9,7],[[],10]]]
[[6,[9,[6,1],[6,3,8]]],[9,[]],[[[3,3,7,4,7]],[]],[[[]],[[],7,[10,3]],10,7],[[],7]]
[[[[1,3,7],[],1],5,2,[1,[10,3,7]]],[[8,7],9],[[[3,9,0,8,2],[6],0,[7,4,10]],[6,0,3,1,[6,9]]],[10,7,1,10],[0,[[1],9,7,[7,7,5,4],2],[],[[5,1,9],7,7,9]]]
[[5],[9,3,[1,10],7],[[6,6,[3],3,[0,2,2,8,7]]],[7]]
[[[4,[7,6],9,7],1,[],7,6]]
[[8,[[5,6],[6,4,3,9]],7,10,[3,[],9,[6,5,4]]]]
[[4,2,1,[[4],8,[7,4,0,8]],10],[],[[[7,3,5]],[7,5,1,[7,2,4],[6]],[4,[1],1],[7,[10,10,10,6],[9,2,0]],[[5,1,9,3,5],[3,10,4,9,8]]],[[],6,3],[6]]
[[],[[],[0]],[[2,5,[1,4],6],1,4,[3,[],[10],[2,7,8,4,2]]],[[10],7],[[[4,10,6,3],7,[],1],2,3,3]]
[[6,0,7]]
[[5,2,[4],[[3,0,8,10],0,[4,8,9]]],[[],[[8,9,7,5,3],4,6],7,10,[[5,6],[2,10,5],[9,5,6,0],1,1]],[2,3,[7,10],9,1],[]]
[[4,[2,[],7]]]
[[[6,9,6,[3,6,7,2,3]],4,[1,2,5],6,4],[9,[1],[8,[7]],2],[[[1,3,6,3,6]],0,[],[]],[0,[[9,10]],5,[2],9],[[[3,1],[10,1],[5,0,9]]]]
[[5],[2,[[]],9,[[]]],[1,5,[]]]
[[[0]],[3,1],[10,6],[]]
[]
[[[7]],[[1,[4,10,9,2]],8,[10,[7],[2,1,1,4],2,10]],[],[[[10,6,4,7],7],[],4,8,9]]
[[6,[[6,0,10,7,9],0,[5,1,2]],2],[[[3,1,6,1],7,[],5,4],[[10,10,3],0],8],[],[[[6,7,0,1,5],5,5,[3,7,2]],[6],7,3,1],[10]]
[[],[[[],[1,2,10,9,5]],[[5,7],[7,4,9,9,0]],10]]
[[9,4,8,[],8],[[3,[6],0,[3,1,10,9,2]]],[],[8,0,3,4]]
[[1,1,0],[3],[[[9,1],5,[7]],7,10,[5,[2,4,2,6],6],[[2,2],[6,0,2,0],[3,4,1,3,0]]],[8,[]]]
[[9,5],[[[],8,[0,9],[],0]],[[],7],[3],[10,9,6]]
[[8,[0,[9,5,0]],[],4,1],[]]
[9,10,2,8,0]
[9,10,2,8]
[[6,4,[9,5]],[[[10]],[[4,2,2,5],0,[3,2,1,10],5,[10,1]],0,9]]
[[7,[8,[0,1],4,0],[7,[5,1,9,4],10]],[[10,[0,7,8,5,9]],[10,6,[3,9]]]]
[[3,0,1,2]]
[[[[5,2]],5,9],[],[[[9,6,5,8],[1],[],[],1]],[[[],[3,5],9,[],8],4,[[9,6,8,9,3],9,10,[0,8,1],[]],8,[[],7,[7,5],8,2]]]
[[[[4,4]]],[8],[6,2,[8,9],2]]
[[],[9,[[],2,3],[6]],[[[10,2,9,0]],8,10,0,10]]
[[7],[[4,4,5,8,5],[9,[9,9]]],[[[4,4,1,5,6]],10],[[],[[0,0,2,10]],[[6,9,8,5,6]]],[[[],0,[3,7,1,6,6],[0,7,8,6],[9,7]],7,[2,[9,2]]]]
[[8,7,[7,[],4]],[1,[[4,0,8,7],3],[7,[7,8,1,2],10,6],8,[[3,7,10,7]]],[2,0]]
[[[[3,9,2],[7,2,9,10],4,[6],9],9,[[6,0,9,10,5]],[9,[10,5,7],5,6]],[],[9,4]]
[[[[8,9,9,5]]],[[[4,8],2]]]
[[[6,10,4],[],[7,[5],[0,9,1,4,3],8,8],[4,4,7],9],[[[3,7],3,[5,4,7,0],6],2],[[[7,1,6,0,4],[],[4],[9,0],1],[[8,3,9,6],9,[2,7,8]]],[]]
[[]]
[[],[7,6,[],[3,6,10,[9,7],4],[]],[4,9,8,[],2],[]]
[[],[4,[9,1,10,9,6],4,0],[[],[[],[10,7]],[[6,5],5,[3,2,6,3]],[2,3,10,10],[]],[9,[2,9]],[[5],10]]
[[[[2,2,9,8],[5,2,8,5,5],[5,9,5,9],4,2],7,[],[9,[2,7,9,7]],2],[],[0,9,5],[[6],[3,[],[],0,2],5],[]]
[[[1,[9,8,8,1],3,10,[7,10,2,7]]],[[],[],[[],[10,10,4],10],10],[8,9,0,4],[],[1]]
[[[7,[0,6,8],6],[[10,4,5,1,10]],[],4,7],[[[5,9],[4,4],5,2],2,2,[[7,10,3,7,9],10,6],2]]
[[],[]]
[[[5,[6],[7,9,4,0]],[[4,4],[],5,[6]],[7,[5,6,9,9],6],[]]]
[[],[],[2,10,[],[[]]],[[8,7,[8],1,1]]]
[[],[[7,0,[1,10,5,2,1],[2],[]],[[2,9,3,3],[10,9,3]],[[2],8,1]]]
[[[[5,8,6,5]],2,[3,8,10,9,0],[[5,9,1,4],[7,7],9],7]]
[[5,3],[10,5],[]]
[[6,10,[],[[8]],[[],0,[]]],[],[],[],[]]
[[5,[7,[5],[6,3,10],9,3],3],[[[7,0,0,1],9,[1,4],3,[0,5,8,7,7]],1,[2,[1],[3]],4,7],[[1,10,4,1,[10,3,3,8]],3,[[6,5],[1,4]]],[3,[[7],[2,3,3,5,3],[4,2],[8,7,9,1,10]],[[9,10,7]],10],[[[2]],7,5]]
[[4,7],[[10,[2,4]],[8,1,9],9],[[4],8,[],9,5],[[5,[1,0,1,1,8]],[[5,2,4],[],[],8],8,[[4,4,6,10,4]]]]
[[8,1],[[[5],9],9,[]]]
[[9,[],3,3],[[[10,3,4,1],6,7,[9]],10,5,2],[[0,3,8],9,4,[8,7],[]],[4,4]]
[[3],[7]]
[[1],[4,3],[6,[1],[[5],3,[]]],[0],[2]]
[[[9,4,8],[[8,8,10],[4,6],10,10],3,6],[[[1,4],4,[],[8,3],[0,0,5]],[0,[0],4,[1,9,2,6,0],5],[4]],[[2],[0],7,6,[]]]
[[[[],[9,4,7],[9,1],5,[3,4,9]],[8]],[1,[],[[0,4]],[6,1,9],2],[],[[6]]]
[[[[],10,8],[6,[],7,[7,6],[10,8]],[[],8,9]],[]]
[[6],[[]]]
[[],[7,[[0,4],[],5,1],[[8,1,7,0],0,[4,3],5],[3,[],[3,9,3],[0,4,5,2],6]],[[[5,2,0],[8],[3,10,9,3,5],[],[0,5]],5,0,[],4]]
[[[[],5],[9,[5,7,8],5,[],[5,2,2,10]]],[[9],[1,5,0]]]
[[[],[4,0,[1,7],3,7],8],[5,[],3,7,[[8,9]]],[[],[7],[[3],0]]]
[[3,8,5,[[9,10,5,5],[0,1],[2]],7],[1,1,9,4],[[[4,8,9,0],[],[],[5]]],[[],[],1,8,5],[]]
[[5,[1,0,[9]],[[1,8,10,10,1],[],[0],[4,10,9,8,5],7]],[[6,3,2,0],[6],9,[9,7,[1,0,0],5]]]
[[10,5,1,4],[6,0,[]]]
[[[3,9],5,[[0],[6]],[[9,9,3],[],8],5],[],[]]
[[8,8,4,[],[[9,9,7,3,8],[4,6,8,7,8],[10],2,7]],[10,0,1,[[3,10],[6,2,10,3]]],[3,6],[],[[],4]]
[[],[9],[2,9,[[],[5,1,0,2,1],[9,10],0],[[7,3],5,10],2],[[9,[9],3],[4,[10,2,10],[0,2]],1,[2,4,[4,1,7,1,0],[],[1,0,1]],[10,[1,4,5],9]]]
[[[[],[9,1,3],[5,0,1,7],7]]]
[[[[0,5,10],[7,8],[0,5],[7,10,1]]],[[2,10,[3],[5,4],[8,9,0,1,6]],0],[]]
[[6,[8,4,4,[10,9,4,2,9]],4,[5,1]],[1,6,5,[],[10,[7,3,10,6],[0,2]]],[4,[2,5],[3,[7,7,2,10,5],3,[0,4]],[2,9,2,[]],[2,[1],1,[6,6,5,5]]],[4,[],10,[[2,7,0,4,8]],[0,2]],[[[8,10],[7,9]],[10,5,[6,5,8,2],0,[10,8,2,9]],8]]
[[[3,9,[],[4,1,6],6],8,[[3,8,1,3,10]],[]],[5],[],[]]
[[3,10,[]],[[9,[1,8],2,[4,3,6],7],3],[0,[[9,0,7],3,9,8,[]],5,[[],[10,5,7]],[[4,3,3,6],10,[3,9,0,6]]],[[2,[4],[5]],10,[6],6,2]]
[[[[4,0,8],[4,3,8,10]],8,10,[10,0,3]],[[],0,7,5],[2,[[],[1,6,9,2],4,[8,2,6]],6,[6,[10,0]],[[],[4],[5,6]]],[]]
[[5,[[]],2,2],[[[10,4,7,9],10,8,[]],9,5],[[[10,10,8],2,[8,7,1,2],8],1]]
[[5,4,3],[4,[8],1,[[]],[]],[[]],[4,[],[[1,5,5],[]]],[6,6,8,9]]
[[[5,[10,7,7,6],5,7],6,6,4,10]]
[[2,[[]],[6,[0]],[[3,7,5,2,1],0,[9,6]],[]],[[[4,9,6]],3,8]]
[[[]],[2],[[[4,6],[6,4,10,7],10,[4,5,10]],7,[4,7,[9,1,3],8]],[[9,5,7,[],9],[8],[],7,[[1,1,7,2]]]]
[[],[[[7,6,1,0],6,7,7]],[6],[[],6]]
[[],[],[[],[[]],[[8,5],9,[2],8,5],4]]
[[1,2,[9,[7,5,1,0,9],[8,7,2],0,[4,10,10,7]],9],[9,[],[[0,8,10]],10]]
[[5,[[10,7,3,0,9],[0,6,4],[9,10,0]]],[1]]
[[[],3],[[0,[6,10,6,3,10],[3,7,6,0,5],10,1]],[5],[[]],[10,0,[],8]]
[[[9,[5,10,6],7,0],8,[6,6,[2,0,9,5,1]],[[],3,[10],7],7],[[[2,3,9],[2,6,9],[10,2],[]],[2,[0,6,9],[8,5,4]],[4,[4,8,6,4],[1,1,1,4,8],10,1],4,[5,1,[]]]]
[[[],[]],[[[10,4,6]],[[2],4,[1,1,3]],[7,9,[3,3,10,5]]]]
[[0,6,0,[10,6],10],[7,10]]
[[[],[2,[8,3],[3,5,9,9]],[8,[8,9,2],2,[4]]]]
[[7,6,[[5,2,8,5,0],[5,2,5,5,7]],4,6],[[9,2,5],[],7],[6]]
[[5,0]]
[[[2,[3,5,6,6],9,[6,8,8,7,2],0],1,2,7,[0,2]],[4],[9,0,4]]
[[[[4],0,[4,6],5],[],[3,4]],[1,7,[8],6],[[1,0,[],[2,1,7,5,7],7],[6,10],[],6,[8,[9,9,9,5],2,1]],[7,[],5,[]],[7,[]]]
[[[4,1,[10,0]]]]
[[1,[],2,6,[[6,10,2,4]]],[],[4,5,0]]
[[[],8,10],[[5,[10,9],0],10,8,3],[[[5],8],0],[]]
[[0,10],[[[4,6]],[]],[10,0],[],[6]]
[[6,0],[[],8],[3,[8,[3,4,10],9,[6,5,10,5,9]],4,[2,[6,3],8],[10,[2,6,2],[0,4],[4],6]],[[[],[8,1]],8,5,8,3],[3,2]]
[[[],6,[[9,3,0],[2,2,10],9,8,[]]]]
[[[5,0],[0,4,8,[7]]],[[[4],2,4,[1],[3,7,0,6,7]]]]
[[[[7],2],[[8,9]],[],4,10],[[0,[9,0,7]],[[2,9],10]],[]]
[[[],4,[0,3,0],5],[7,0],[2,8,[6,[3,8,10,3]],5],[],[[3,[10,9],[1,6]],4,8,[[],7,[2,6,10,9],9,[8,6,3]],1]]
[[[[0,8,6,9]],0,4],[[8,6,5,4],8],[7,[[],[10,0,9,5,9],0,6]],[10,1,3,[[8,9,9,8],[0,10,7],[2,10,9,2,10],4,2]]]
[[3,[]],[1,0,10,4,[[2,1,9,1],[]]],[0,[[],[9,1,1],1,[10,7,7,2,1]],5],[[[8,3,4,8],7,4,8,[7,4,9,1]],[5,[0,6,10],[]],[],8],[[9,0,[10,5],1],6,[5,[1,4,1,0,8],[5,10]],7]]
[[1],[3,[[],[6],[1,6,2,9,8],[10,3,3,5]]]]
[[[3,[4,9,8,5,0]],[[3,2],[],[9,1,3,7,7]],[7,[],[7],4],[]],[2],[6,5,6,[]],[[2,[6],[6,7]],7,8],[5,[[7,6,8,6,9],[]]]]
[[[10,[],2,3,[]],[[]],[7,[],[5,10,7,1],2],[4,[3,7,2,1,2],[7,8,4,0]],[7]],[[],[[6,3],6,[5,7,7,4],[1,7,3,4,0],6],5,1,9],[[6,[7,0,4,10,8],6,[7,7,10],[1,7]],6,3,10]]
[[],[2],[[0,4,[6,6,10,8,4],[7,8,10,1],0],[[9,6,8,0,10],1,[2,5,2,10,1],10,8],3,10]]
[[],[],[],[[[4,0,10,8,2]]],[[],10,3,2,[[],7]]]
[[[[6,6,4,4,4],[1,4],9],[9],[[3,7,0],[10,8,10],6,[6]],7,[]],[]]
[[[[5,0,4],[9,2,7,0],[4,4],2,6],4,7],[[[0,4,9],[5,9,1,1,5],[]]],[7]]
[[[[8,5,9,4,8],4]],[],[[[9,1,4,9],0,2],10],[2,[6,2,9,[3,4,10,2],[5,8]],[[6,5,6,6,9],[3,2,6,3,5]],[[],7,[8,3,8,7,4]]]]
[[5,[],5],[[5],9,[8,[3,6],[10,5,7],10,2],[],[]]]
[[0,[[7,10],[7,2,6,5,2]]],[],[[[7,6],[],0],2,[[2,5,3]],0,[5,[8,7,1,3,1],5]]]
[[[10,9,[],6]],[5,3],[3,5,10,[[1],[7,5,8,7,4],[4,4,2]]],[[4,[7],1,[10],[3,8,1]],[[],[10,0,10],[7,4,2],[5,6,1,4]],[[10,4,5],[2]],[4,[5,2,5,8],2]]]
[[[],[[6,1,9],5,[8,2,8],[5,5]],5],[10,[[10,5,8,10],10],[[3,8,1,6,0],3,8],7],[6,[5,[3,7,3,0],6,0,[0,6]],10,6]]
[[],[[[7]],7,5],[[[8,3,0],[9,8]],3,3,[[3,1,8,1,9],10]],[[[9,4,4,7],[3,0,7,1],[6,2,9,4],[0,2,3,8],[]],[8,1,[8,6]],0,[],[[10]]],[2]]
[[2,[[2,6,10],[],7]],[[9,8,2,[10,10]],3,0,[6,0,1,3],[]],[[],9,10],[[6,10,[0,1,6,8],6,[7,5,10,10]],[[10,4,2,5],9,[4],0,0],[[9,3,5],[],[7],6,[10,0,4,7,6]],[[8,6],10,6],[]]]
[[[3],[5,9,1,10,[8]],6,4],[[[],8,4,2],1,[10,[1,10,10],10],8],[0,[],[[6,2,1,10],4],7],[0,3,[10,[9,4,4],0,4,[1]]]]
[[],[[9,[1],[],[]]],[6],[6,[5,[8,5,5]],[9,9,[6],[8,3,7,5]],[9,[5],4,9,[10,7,8,9,4]],4],[[[4],[9,1,8],7,8,[4,2,10,10,1]],[8,7,[],10]]]
[[],[8,9,3,5]]
[[10,[[5,5,1,6],[],5],8,[6],6],[]]
[[10,2,[],[[]]],[2,[6,8,[10,4,1,7],3],[4,2,[9,1,3,6]]],[[]],[[2,9,[4,2,10,7],8],[10,[7,1]]]]
[[[6,7,[4,0]]],[[[5,7,5,10]]],[10,5,[[5,4,3,5,6]],10,[]]]
[[10],[],[[[6]]],[],[[6,[7,4,5,4,8],[],[2,0,9,5,3],2],[[8]],[0,10,2,[1,0]]]]
[[[1,10,[5,6]],[[10,3,3,1,10],3,2],[[7,4],6],[],[]],[10,[[2,9,2,5],2,[6,6,10,8],2,8]]]
[[[],[3],[[8,6,5,2,2],8,[9,3,1,1],[0,4,9,10]],4]]
[[],[[9],7,10]]
[[[[7,6,10],6,6],[9],[1],7],[3,9],[7,[4,4]],[1,[4,3],[[5,7,9,4],8,[0,10,5],[4,1,10,6,3],[7]],[[]],[7,10,[4,4,6,5,10],9,[7,0,10,7]]],[[]]]
[[],[[[6],3,[]],[[3,6],10],9],[[[3,4,0,3],5,3,9]],[0,10,9],[3]]
[[5,0,[6]],[[[],2],[[5],2,[5,8,2],[2,8,3,9,1],[7]]],[10,[4,[4,7,3,9,2],7,[6,0,0,7,2],0],[10,[10,4,3,7],1,10]],[3,[[9,10,9],[8,1,4],6,[],5],[8,[6,1],[6,2]],[[5,9],8,5],[[8],[6,9,6],7]]]
[[7,8],[[[6,5,8,0,7],[1,2],[4,6,4]],[],[[],8,10]]]
[[[[10,5],3,[5,2,2,6,3]]]]
[[10,[[5,0],4,1,[0],[5,8,0]]],[8,0,10,4],[1,8,[9,[7,8,8],4,[5,0,6,0],0]],[[],6],[6]]
[[[0,0,5,10,[9,10,0,5,8]]],[0,9,[[],[2,9,5,2],[7,7]]]]
[[[10,0,5,4,[]],8,5,8],[[10,4,[7,5,3]],9,4]]
[[4,5,10],[7,9],[2,[2,[3],[5,5,2]],5,2]]
[[10,1,[[5,3,6],1,7,[1],[7,9,8,5]],6,10],[6,5,[5,9]],[],[[6,1],8,3]]
[[6,[3,4,4],[],[8,[7,6,1,10],7,[4,6,1,4],3]],[10],[[0]],[[8,3,[8,4,4,8],8]]]
[[[10],[[5],3],1,4,0],[[1],2]]
[[5,2],[3,8,[]],[[[5,8]],5,2,9],[[5,1,6,[0,6,10,4,10]]]]
[[[[5,2,10,8],3],[[1]]],[0,[0],[3,[10,2,0,2],[]],[10,[8,2,7]],0],[[7,[5,2,0,7,8],[9,6,5,0],10],[[10,5],[4,4,9,6],[],4,6],0,[],9],[0,[[],[10,10],3],5],[[[10,10,3],[],[8,2,3],5,[2,1,9]]]]
[[4,2],[],[8,9,[],1],[],[]]
[[0,[10,[1,10,5],[3,2,6,7],5],[[7,3,10],6,8,[6,8,8,4,2],7],9],[0,2]]
[[[0,[],8],[[8,7,4],10,8,9],0,[2,6,[3,2,9,7],6]],[0,[0,5,6]],[2],[[[0,4,1,2,9],5,[3]],[[6,10,7,8,9],0,[1,4,6],[9,4,10,9]],[[],1]]]
[[3,[]],[[0,3],[8,[4,5,7,10,5]],10,[],[4]]]
[[[]],[],[[],[]],[],[]]
[[[8],[9,[10,4,0,9],2,6]],[0,[6,5,[4,5,10,8,2]],6],[8],[7],[10,[8]]]
[[],[4,[[4,7,0,5,3],2,[7,6,5,1]],8],[]]
[[[[2,2,3,7],0,[6,3],[5]],[8]],[[[10,5,5,10,2],0,8,[5]],[],[[8,10,1,10],1,[4],[1,8,1,8],1],10,[[10]]],[2,6,[[]],3,[8,[0],[0,0,0,9]]]]
[[5],[[[5,1,1],[1,2,10],5,10],2,[[3],[],3],10,[1]],[]]
[[7,5,7],[],[9,[6,4,8,[5,2,10,2],5],4],[],[3]]
[[8,5,6,10,[8,[10],0,3]],[6],[[[]],[6,5,[0,4,9,1,9],[1,6,2]],[[4,7,2,7],1]]]
[[8,[0,8,[8,4,4],[10,5],[10,10,1,2]],10],[1,10,[9,9,[10,1],7,6]]]
[[[5,7],[4,[0,1,1,2,6]],[5],3],[]]
[[4,[4,[6,6]]],[[[],[9,4,4,2,8]]],[[[7]],[3],[],[3]]]
[[[4,4,[0,3],5],3,6],[[4,[2,9],1,[]],2,0,[]],[6],[8,[[]]]]
[[10],[1,[8,[],10],3,9],[],[[5,7],7,8]]
[[[],3,5,[[3,4,8,2]]],[3],[10,[[2,3],1,9,[],[7,9]],[[5,6],10,3,0,1]]]
[[1],[5]]
+148
View File
@@ -0,0 +1,148 @@
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
502,32 -> 507,32
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
516,32 -> 521,32
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
512,30 -> 517,30
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
506,34 -> 511,34
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
512,173 -> 517,173
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
545,94 -> 550,94
539,100 -> 544,100
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
553,100 -> 558,100
501,170 -> 506,170
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
546,100 -> 551,100
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
542,97 -> 547,97
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
535,97 -> 540,97
533,108 -> 533,109 -> 538,109 -> 538,108
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
509,32 -> 514,32
513,34 -> 518,34
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
507,164 -> 512,164
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
557,103 -> 562,103
538,94 -> 543,94
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
501,28 -> 506,28
505,173 -> 510,173
531,87 -> 531,88 -> 543,88
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
524,126 -> 524,127 -> 528,127 -> 528,126
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
508,28 -> 513,28
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
511,167 -> 516,167
549,97 -> 554,97
541,91 -> 546,91
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
520,34 -> 525,34
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
505,30 -> 510,30
543,103 -> 548,103
510,146 -> 515,146
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
498,173 -> 503,173
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
498,13 -> 498,15 -> 492,15 -> 492,23 -> 506,23 -> 506,15 -> 501,15 -> 501,13
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
533,108 -> 533,109 -> 538,109 -> 538,108
517,146 -> 522,146
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
513,144 -> 518,144
515,170 -> 520,170
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
519,173 -> 524,173
532,100 -> 537,100
524,126 -> 524,127 -> 528,127 -> 528,126
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
521,148 -> 526,148
504,167 -> 509,167
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
520,130 -> 520,133 -> 515,133 -> 515,138 -> 533,138 -> 533,133 -> 525,133 -> 525,130
514,148 -> 519,148
510,141 -> 515,141
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
533,108 -> 533,109 -> 538,109 -> 538,108
524,126 -> 524,127 -> 528,127 -> 528,126
550,103 -> 555,103
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
529,103 -> 534,103
504,26 -> 509,26
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
508,170 -> 513,170
523,63 -> 523,66 -> 515,66 -> 515,71 -> 529,71 -> 529,66 -> 528,66 -> 528,63
499,34 -> 504,34
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
495,32 -> 500,32
507,148 -> 512,148
515,60 -> 515,52 -> 515,60 -> 517,60 -> 517,55 -> 517,60 -> 519,60 -> 519,50 -> 519,60 -> 521,60 -> 521,56 -> 521,60 -> 523,60 -> 523,53 -> 523,60 -> 525,60 -> 525,53 -> 525,60
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
531,87 -> 531,88 -> 543,88
536,103 -> 541,103
501,161 -> 501,152 -> 501,161 -> 503,161 -> 503,157 -> 503,161 -> 505,161 -> 505,155 -> 505,161 -> 507,161 -> 507,154 -> 507,161 -> 509,161 -> 509,155 -> 509,161
522,84 -> 522,76 -> 522,84 -> 524,84 -> 524,75 -> 524,84 -> 526,84 -> 526,81 -> 526,84 -> 528,84 -> 528,74 -> 528,84 -> 530,84 -> 530,79 -> 530,84 -> 532,84 -> 532,77 -> 532,84 -> 534,84 -> 534,78 -> 534,84 -> 536,84 -> 536,80 -> 536,84
522,47 -> 522,43 -> 522,47 -> 524,47 -> 524,41 -> 524,47 -> 526,47 -> 526,39 -> 526,47 -> 528,47 -> 528,39 -> 528,47
498,30 -> 503,30
492,34 -> 497,34
529,112 -> 529,116 -> 526,116 -> 526,122 -> 541,122 -> 541,116 -> 535,116 -> 535,112
+36
View File
@@ -0,0 +1,36 @@
Sensor at x=13820, y=3995710: closest beacon is at x=1532002, y=3577287
Sensor at x=3286002, y=2959504: closest beacon is at x=3931431, y=2926694
Sensor at x=3654160, y=2649422: closest beacon is at x=3702627, y=2598480
Sensor at x=3702414, y=2602790: closest beacon is at x=3702627, y=2598480
Sensor at x=375280, y=2377181: closest beacon is at x=2120140, y=2591883
Sensor at x=3875726, y=2708666: closest beacon is at x=3931431, y=2926694
Sensor at x=3786107, y=2547075: closest beacon is at x=3702627, y=2598480
Sensor at x=2334266, y=3754737: closest beacon is at x=2707879, y=3424224
Sensor at x=1613400, y=1057722: closest beacon is at x=1686376, y=-104303
Sensor at x=3305964, y=2380628: closest beacon is at x=3702627, y=2598480
Sensor at x=1744420, y=3927424: closest beacon is at x=1532002, y=3577287
Sensor at x=3696849, y=2604845: closest beacon is at x=3702627, y=2598480
Sensor at x=2357787, y=401688: closest beacon is at x=1686376, y=-104303
Sensor at x=2127900, y=1984887: closest beacon is at x=2332340, y=2000000
Sensor at x=3705551, y=2604421: closest beacon is at x=3702627, y=2598480
Sensor at x=1783014, y=2978242: closest beacon is at x=2120140, y=2591883
Sensor at x=2536648, y=2910642: closest beacon is at x=2707879, y=3424224
Sensor at x=3999189, y=2989409: closest beacon is at x=3931431, y=2926694
Sensor at x=3939169, y=2382534: closest beacon is at x=3702627, y=2598480
Sensor at x=2792378, y=2002602: closest beacon is at x=2332340, y=2000000
Sensor at x=3520934, y=3617637: closest beacon is at x=2707879, y=3424224
Sensor at x=2614525, y=1628105: closest beacon is at x=2332340, y=2000000
Sensor at x=2828931, y=3996545: closest beacon is at x=2707879, y=3424224
Sensor at x=2184699, y=2161391: closest beacon is at x=2332340, y=2000000
Sensor at x=2272873, y=1816621: closest beacon is at x=2332340, y=2000000
Sensor at x=1630899, y=3675405: closest beacon is at x=1532002, y=3577287
Sensor at x=3683190, y=2619409: closest beacon is at x=3702627, y=2598480
Sensor at x=180960, y=185390: closest beacon is at x=187063, y=-1440697
Sensor at x=1528472, y=3321640: closest beacon is at x=1532002, y=3577287
Sensor at x=3993470, y=2905566: closest beacon is at x=3931431, y=2926694
Sensor at x=1684313, y=20931: closest beacon is at x=1686376, y=-104303
Sensor at x=2547761, y=2464195: closest beacon is at x=2120140, y=2591883
Sensor at x=3711518, y=845968: closest beacon is at x=3702627, y=2598480
Sensor at x=3925049, y=2897039: closest beacon is at x=3931431, y=2926694
Sensor at x=1590740, y=3586256: closest beacon is at x=1532002, y=3577287
Sensor at x=1033496, y=3762565: closest beacon is at x=1532002, y=3577287
+60
View File
@@ -0,0 +1,60 @@
Valve XB has flow rate=0; tunnels lead to valves WZ, LE
Valve BM has flow rate=0; tunnels lead to valves PL, RI
Valve GC has flow rate=0; tunnels lead to valves HN, IT
Valve RM has flow rate=0; tunnels lead to valves ZQ, YL
Valve ZM has flow rate=5; tunnels lead to valves SN, KE, UW, MY, GW
Valve UH has flow rate=0; tunnels lead to valves HM, HN
Valve GW has flow rate=0; tunnels lead to valves LE, ZM
Valve HN has flow rate=19; tunnels lead to valves UW, UH, GL, WZ, GC
Valve VT has flow rate=0; tunnels lead to valves ZD, PE
Valve VI has flow rate=0; tunnels lead to valves JS, AA
Valve YL has flow rate=12; tunnels lead to valves PM, MH, RM, CM
Valve LA has flow rate=0; tunnels lead to valves SN, IY
Valve CM has flow rate=0; tunnels lead to valves YL, UL
Valve JI has flow rate=24; tunnels lead to valves UV, WH, XW, OJ
Valve ZD has flow rate=25; tunnels lead to valves VB, XW, VT
Valve VB has flow rate=0; tunnels lead to valves QX, ZD
Valve FO has flow rate=0; tunnels lead to valves WH, PE
Valve JS has flow rate=0; tunnels lead to valves VI, IY
Valve RI has flow rate=0; tunnels lead to valves PE, BM
Valve XD has flow rate=14; tunnel leads to valve CP
Valve ES has flow rate=11; tunnels lead to valves GU, WU
Valve WZ has flow rate=0; tunnels lead to valves XB, HN
Valve HW has flow rate=0; tunnels lead to valves QY, LE
Valve KE has flow rate=0; tunnels lead to valves AA, ZM
Valve IY has flow rate=22; tunnels lead to valves JS, AB, LA, IT
Valve XW has flow rate=0; tunnels lead to valves ZD, JI
Valve BE has flow rate=0; tunnels lead to valves AB, LE
Valve QY has flow rate=23; tunnels lead to valves AM, HW, MY
Valve MH has flow rate=0; tunnels lead to valves YL, AM
Valve IT has flow rate=0; tunnels lead to valves GC, IY
Valve DA has flow rate=0; tunnels lead to valves QR, CP
Valve PM has flow rate=0; tunnels lead to valves LE, YL
Valve WU has flow rate=0; tunnels lead to valves SM, ES
Valve UL has flow rate=0; tunnels lead to valves CM, QR
Valve SM has flow rate=13; tunnel leads to valve WU
Valve XC has flow rate=0; tunnels lead to valves ZJ, AA
Valve OJ has flow rate=0; tunnels lead to valves GI, JI
Valve SN has flow rate=0; tunnels lead to valves LA, ZM
Valve WH has flow rate=0; tunnels lead to valves JI, FO
Valve UW has flow rate=0; tunnels lead to valves HN, ZM
Valve HM has flow rate=0; tunnels lead to valves UH, PE
Valve AB has flow rate=0; tunnels lead to valves BE, IY
Valve QR has flow rate=8; tunnels lead to valves WW, UL, DA
Valve UV has flow rate=0; tunnels lead to valves JI, FF
Valve ZQ has flow rate=20; tunnel leads to valve RM
Valve ZJ has flow rate=0; tunnels lead to valves PE, XC
Valve GL has flow rate=0; tunnels lead to valves HN, PL
Valve CP has flow rate=0; tunnels lead to valves DA, XD
Valve AM has flow rate=0; tunnels lead to valves QY, MH
Valve PL has flow rate=17; tunnels lead to valves GL, YE, BM, FF, QX
Valve YE has flow rate=0; tunnels lead to valves PL, AA
Valve PE has flow rate=4; tunnels lead to valves FO, RI, ZJ, VT, HM
Valve MY has flow rate=0; tunnels lead to valves QY, ZM
Valve QX has flow rate=0; tunnels lead to valves VB, PL
Valve GI has flow rate=0; tunnels lead to valves OJ, AA
Valve WW has flow rate=0; tunnels lead to valves GU, QR
Valve FF has flow rate=0; tunnels lead to valves UV, PL
Valve LE has flow rate=6; tunnels lead to valves HW, GW, XB, BE, PM
Valve GU has flow rate=0; tunnels lead to valves ES, WW
Valve AA has flow rate=0; tunnels lead to valves KE, GI, VI, YE, XC
+1
View File
@@ -0,0 +1 @@
><<<<>>>><>>><<><<<<>>>><<>>><>>><<<<>>>><<>>>><<<>>>><<<>>>><<<>>><<<<>><>><<<<>>><><<<><><>>>><<<<><<<<>><<<>>>><<>><><>>>><<<>>><<<>>><<>>>><>>>><>><>>><<>><><<<<><>><<<>>>><<<>>><<<>><>><<<>>><<<<>>>><><<<>>><<<>>><<<<><<<<>>><<<<>>><<<>>><<<<>>><<>>><<><<<>><<<>>><<<<><<<<>>><<<><<>>>><<<>><>>><<>>><<<><<<<>>><<><<<<>>>><<>>>><<>>>><<<<>>><><<<<><>><<<>>>><<<<>><>>>><>><>><>><<<>><<<>>>><<<>><<>><<<<><<<<><<>>>><<<<><<<>>><>><<<>>><<<><<<><<<<><<><<<>>><<<<>>>><<<<><<>><<<<>>><>>><<<<><<<>>>><<><>><<<<>><<<<>>>><<<><<<<><<<<>>><<<><<>>><>>><<<<>>><<>><<<<>>><<<><<<>><<<<>>>><<<<><<><<<<>>>><>>>><<<<>>>><<<>>>><<<><<>>><>>><<<<>><<<<>>><><>><<<>>>><<<<>><<<>><<>><<<>>><<<>>>><<<<>>>><<>>>><<>>>><><<<<>><<<<>>>><<<<>>><<<<>><>><<<>>><>>>><><<>><<>>><<<>>>><>>><<>><<<>><>>><>>><><>><>><<<><<<>>>><>><<<><<<>>><<<<><<>>>><<<><<<>>>><>><<<>>>><<<>>>><>>><><>>>><>><<><<<>>>><<>>>><<<>>><<<<>>><<<>><>>>><<<<>>>><>><<>>><<<<>>>><<<<><>>>><<>><<>>>><>><<<<>>>><<<<>><<<>>>><<>><><>><<<<>><<<>>>><<<>>><<>><><<<>>>><<>><>><<>><>><<<<>><<<>>><<<<>>><<>>>><<>>><<<<>>><>><<><<<>><>>><<<>><<<<>>>><<<>>><<>>><<<>>><<<<>>>><<<<>>><<<>>><<>>>><<>>><<<>>><<><<>>>><<>>>><<><<>>><<><<<>>>><<<<><<<<>><<<>>>><>>><<<<>>><<<<>>>><<>><<<<>>>><<<><<<><<>>>><<<>>>><<<>>>><<<>><<>>><>>><<<<>>><<<<>><<<>>><<<>><<<<>>><<<<><<><>>><<<<>>><<<<>>>><>><<<<>><<<<>>>><<<<><<<>>>><>><<<<><<<<>>>><>><<><<<>>><<>>><<<<>><<<><<<><>><<>>>><<<><<<<><<<>>>><<<<>><<>><<<<>>>><><<<><<<>>>><<>>>><<>><<<<>>>><><><<<<><><<>>><<><<>>><>>><<>><><<><<>>>><<<<><<<>>>><<>><><<>>>><<<<><><<<>>>><<>>><<<><<<>>>><>><<<<>>>><>>><<><>>>><>>>><<<><>>><>>>><<<>><<<>>><<<<>>>><<>>>><<<<>>>><<><>><<<<>><<<<>>><<>>><>>>><<><<>>><>>>><<><<><<><><<<>><>><<<<>>><<<>>>><<<><<<<>><>><>>><<<<><<<>>>><<<>>><><<<<>>><<<<><<<<>>>><>><>>><<<><<>><<<><>>><<<<>><><<<<><>><<>><<>><>><<<<><<<>><>>>><<>><<<<>>><><<<>><<>><<>><>>><>>>><<><>><<<<>>><>>><<>>><<>>>><<>><<<<>>><>><<<>>><<<>>><<<<>>>><<<><<<<>><<><<<><<<>>><<><<>><>><>>><<<>>><<>><<>>><<>><<>><>><<<<>>>><<<<>>><<<>>>><<<<>>><<<>><<<>><<<<>>>><<>><<<<><<<<>><<>>><><<><<<<>>>><><>>>><<<<>>>><<<<>>>><<>><<<<>>>><<<><>><<>>>><<>>>><<<<>>>><<<>>><>><<>>>><<<>>>><<<<>>><<<<>><<<<>>>><<>>><<>>>><>>><>>>><><>><<<<>>>><<<>>>><<<>><<>>><<<<>>><>>>><<>>>><<<><>>><><<>>>><<>>>><<<>>>><<<<><<<<>>>><>>>><>><<<>>><<<>>>><<<>><<<>>><>><<>>><<><><<><<>>>><>>><<<<>><><>><>>><<<<><>>><<<>>><<<><<<<>>><<<>><<<>>><<>>><<<<><<<<><>><><<<<>>><<<>><<>><<<>><<<<>><>><>>>><<>>><<<>><<<>><<<<>><><<<<>>><<<>>>><<<<>>><<>><>><<>>><><<>>><<<>>><<<>><<>>>><<<<>><<<<>>>><<<><<><<<<>><<<<>><<<>>>><>><<<><>>>><<>>>><<><<<>>>><<<<>><<<>>>><<>>><>><<<<>>>><<<<>>><>>>><<<<><<><<>><>><>>><<<><<<<><<<<>><<<>>><<<<>><<><<<<>>>><<<>>>><<<>>>><<<<>>><<><<>><<><<<<>>>><<<><<<<>>>><<>>><<<<>><>>>><<<<>><<<>>>><<><<<<>>>><<<>><>>>><><<<>><<<><<<>>><>>>><>>><<<<><<<<>>><<>>><<<>>><<<<><<<<>>>><<>>><<<>><<>>><><<<>>>><<><>>><<>><<<>>>><<<><>><<<>>><<>>>><<<>>>><>><<><>><<>>>><<<>>>><<<<>>>><<<>>><<<>><<<<><<<<>><><<><<<>><>>><<<<>>><<<<>><<<>>><<>><<<<><<<><<<><<<>>><<<<>>><<<<>><<>>><<>><<<<>>>><<>>>><<>>>><<>><>>><>>>><<>>>><<<>>><<<<>>><>>><>>>><<<>><<>>><<>>>><<>>>><<<>>><<>>><<<><<<>><>>>><<<>><>>><<<>>><>>>><>><<>>><<<<>>><<<<>><>>><<<<>>><<<<><<<>>><><>>><<<>>><>><>>>><<>>>><<<>><<>>><<>><<<<>><<<<><>>><<>><<<<>>><<<>>><<>>>><>>>><<<><>>>><<><><>>><<>>>><<<>>>><><>><<<<>><<<>>>><<<<><<<<>>>><<<<>><>>>><<<>>>><<><<>>>><<<<>>>><<<<>>><>><>>>><>>>><>><<>>>><>>>><<>>><<<<>>>><<>>><><<>>>><<>><<<<><<><>>>><<<<>><<><<><<>><<<><<<>><<<<>>><<<<>><<>><>>><<<<>>>><<<<>>>><<<<>>><><<<<><<<<><><<<<><<<<>>>><<<<>>>><><>>><<<<><<<<><<<><><<<<>><><<<><<<<>><>>><><><<<><>>><<><<>><<<>><<<>>>><<<<>>><<>><<<<><>>><>>><<>>>><<<<>>><<<>>>><<<>>>><<<>><<<>><<<<>>><<<<>><>>><<<<><>>>><<<>><>>><<>>><<<<>><<><<<>><>>><<<>><<<<>>><<<>>>><>>><><<<><<<>>>><<>>><<><>>>><>>>><<<<>>><><><>>>><<<<>><<<<>>><<>>><<<><<<>>>><<><<<>><<<>>>><<<<>>>><>>><<<>>><><<<>><<<<>><<<>>>><>><<><><<>><<<>><<<>>><<<<>>>><<<><<<<>><<<<>>>><<<<>>>><<><<<<>>><<<<>><<<<>><<<>><<<<>>><<>>>><<>>><>><<>>>><>>><>>><<<><>>>><<<>>><<<<><<<<>>><<><><>>>><<>>>><<>>>><<<<>>>><<><<><<<>>><<<>>>><<><<<><<>>><<<><<<>>>><<<<>>><<>>>><<>><><<<><<>><<>>><<<<>><>><<<>><<<<>><<<<><<>>><<><<<<>>>><<<>><<<<>><<>>>><>>>><>>><>>>><<<>>><<<>>>><<>>>><>><>><<<>><<<>>><<>>><<<<>>><<<<>>><<>>>><>>><>><<<<>>>><<>>>><<>>>><<<<>>>><>>>><><>>><<>>>><<<<><<>>>><<<<>><<<<>>>><<>><<<<><<<<>>><<<<>><<>>>><<<>>>><<<><>><<<><<>>><<<<>><<<>>><><<<<>><<<<>><>>><<<<>>><<<<>>>><>>>><<>>>><<>>><>>>><<<<>>><<>><<<><<><<<>>>><<<>>>><<<<><<>>><>><<<<><<<>>><>><><<<><<>>>><>>>><>><<>>><<>>>><<>>>><<<<>><<>><><<>>><<>><<>><<>>><>><<<<>>>><<>>>><<<<>>><<>><><<<><>><<<>><>>><>><<>>><><>>><<>>>><<<>>><<<<>>><<<>><<>><<<<>>><<<><<<>><<<<><<>><>><<<<>><<>>>><<<>><<<>>>><<<<>>>><<<<>><<>>><<<>>><<<>>>><<<<>>><<<<>>>><>><<<<>>>><<>>><><<>>>><<<<>>>><<<<>>>><>><<>><<<<><<<<>>><><>>><<<<>>><<><>>>><<<<><<<>>>><>>>><<<>>>><<<>>>><<>>><<>>><<<<><<<>><>>><<<><<<>>><Line truncated
+2025
View File
File diff suppressed because it is too large. Load diff
+99
View File
@@ -0,0 +1,99 @@
201111211202111301212201403141040230323033312212134523125000140404300230341330300221220012110101011
011220103113221111202122124010033421404432343233535151335133353340034134034332440001110102010010220
122121120300202230411332402004044235424325455343231124521355323541403402031010313440121321321322221
200021211323122312440342411331012332252341254144425451345233324423152201041200212200331121111210011
022213121203213301221100041021415245132424534145512125411151335224315551123141404223410032032000022
101131310332214402243114310442325141344331525541232153453225442351235123130234413214313330121121101
101102011001014411302320032155533351421345311554341111544153414344211242545240114004311012303003230
101023122212322231421422241433315213542415532226334465642351151321144451152132311230002433230001110
101102012000130221414322332331245251153242654525425363234533655232423135443124134230202313201000123
113023100223214000232555442143243135556634652423636245645335623323351235221252344243002420033131123
021023012400222133115232154155255455226363244263663662564362455342612241224452135301204334403311211
011011120014313211333124154235235522553465256455435352362343343356452125515224121432404101240133203
011310103034221123212123555245622666563625344356454344325522453265262433154414231333142413311331323
303301320412010454251154421242542562366466364652264364325544554624545256254413534434331434344310311
211332131030004243315521542363644424356453643345544752562524552255353324654134525543231434112230100
002102403432244535421254566353326346446265345654366646566543552562536326635315453214125414141214102
331140031313041444123423526426422252527375577546753455777737547626364645566461554234123523430311313
330401323101512253253516526653653542734767336644345445665364743533364355534236521342413154132413122
330411204212311445244535522655343573747374364345564574375763553465534526662642244443311121403103124
023332003431144254543626226245566455744465356337347475347374637637653442626233624414255134423423042
244210400021232153266652252325756653575474576355747475663555354556777566436342344532415443212134234
243022342335541213565253544236755753776564447733743446775775654547533666422423326624134345443023202
400214112533143341263455565263566576767643378645664845674353474533736575624522664521123334133420203
314412035353435253634446462463763443376476847467648547566465453356757464475343435464134531133123324
210413325433315134452365563547564744658868746684566644877466576346553654766362254362221413424430422
440400434542543525543663633667763537556667668747746756785587458767563547637623326226661151144334010
203031334152125642466635547657766584664687848767577545486757587488654373354446324524564152231113112
241001452244343336664255646743677756848545865758665674685886656454447657464556245442364333553250131
014023224515325454455574567445744885857785756585855854887668646555746475564455722536445351532451133
240034522142434662453346666663547675448567854897757695674874464454475574464737776424553231541143102
202432344512662423437374345345446848546655697769865799957684557848684543374647545532223321334341333
123325111441445225523673536445447568774877677796777678697975965546774547536673437544656344512135444
310254211535525232233446556788846647746897588857688579889788855477655648566666635426236522424112342
034313254213653456477557533774786647669769587699976668986696667747555648883667447465462526444143342
143141533334542466354344755484874754698685556789559989587957999587645467546553365742323424612353420
023355513126235334753777564744657489776767789956675687857787669856547584455737646446352333233414322
223531421366552557666573477756875578695968796778976887859959556598778688876655735777332545512434212
324553233365452565557437476777687565788999986896686778796755558896856684686773556344634525262453452
213242455253625376773454787557859959899988899999978889797885876979769647857487767764545335245255213
153212131552226337374543645684765767796896876966989866686867979876788867784675754744525622655431425
043231154325334367553646774578457959887979898666866967789799775569887978674668454463732263426513135
335542344226645477333775676444769565755967887779666696689698896656597875884556557743462633443124152
335323556552426765767775874764689686976988996666779796996969887796587577847457535454643262525413534
031342356243536356663654658854697858887697788666879779897996867856867654685767655656766443625531132
335345116666525747477647458845785958767699688899778878776776988777668657478884857465753336533142152
431315146645532647447566887678656986686996889897797878877768979656986556466744563333546332255135135
345455244545432335674458658587555587989897879999798888988976986779787768754855836367363664566413353
512151454564534653477764765466595799679979878789789879998767887865797755765458674344355656253343334
223351266325633575663774564489796879687898688978997788798999779796767956656764647364636656442223522
453333263535357446366584455459557799968998879988898977978787696768578657875454473547567326532334111
522431356454444356554374544846975859978878977879979897898976787967789578746656874774547443245541214
524451243233255555453685476745875568898798878799987879899778979895889689545784464464664644546653534
351343243662255667567757864679695778779676778997998897779866887675677768667848643753754363345434313
422125253344236737334386654576687898997799677887987777887686867895579866465457665345774366464351334
421312154235324535653777678786976887577869769887898799897698686878966689468464555357752255363554413
134231353356532647544747466746997955968966989988799777786898667996595997676454734577542423644111423
254152156456563434474788846574786769698798686897989989968667786695865858667776755455566654264132134
325554124554345334573567875686789766777879789968978788797868997657598864755765764646452636426312235
054421142246245654657458647846877765696688798786967788769769989568865887586878654537663362654432212
313445116364256444775744655676857696698998799776867668888686999587568854476648764345346236246232241
143114554233652245375455887678668996669686996999796887877777686757966588885786556444465552442533324
251331534446564265464364486744686986675876988887767766688896987878765756544754746565355566534235144
043312335432626344536643484678579666899596766779666899678676979556965588747766665377565544465543531
242445211324566636637644588748444588767957766968968978786788586989657745475556775355542555362121442
243253334442556446446767754567476657566957796656988796979699968699856846446535677455225423345132114
431231245536522344674653635685865849787997986689665576586668667768645854645567336572252526524445114
431352413545636624334373564776844687557987796967657766857786797968874766656443453336264564435235253
320554134146445446354475753477858558775599755977987865757897668588588666485457344365453335234122310
333244132156433233245637373688448784459857795676588655998585696485786865554473364636554335355224153
113345451542245623453737457745456844757575897756758966757557585554868888643374344325656234154414322
444045515145356432335647545655765786587886758778866688968984877775888576477747477332355221552413204
111132223523345626324747765577376687656748476986565687576768448558884573773436752362454612221523223
022004333435234546566255554533348546676766478456868467444674448586545655467537436553554433123421120
333231125332152663266433667535537778555667876464765456758647764446877656465367323254523253352510413
122420553331452433333353464676537646864677748867574756565588454444657764464332235454635225432522004
120442052444321222226423365375645435468656658447866466574856466886677654746522644365264535531343440
421404315233111265423463525657764565658784687768567656464684688763534555373553346542234345145442244
331231242152133344456244633655545655745345664668565885467456447677744435752654334432232553354400240
203040023155425242246555225235473556554656638646764676455766756555576576336522336454124215215404311
020211430251454452662234222644467675755747776474545447746753537773655567623542436262213453434423110
121222320253353333233652252225333343646436546477634345533376676557363636362664225322253234514301234
131331122021145511555626563643364773337345554777664437674344775376757362452454652245212143131222333
333033033132243135213222343542265476344656453763774355443644566737723253264252451243142121312244244
002204430244435144434515354453332632665637375363445456667774576662453443646454532431524140202312242
121314024424022223215424644426642356264655357667436346735353466356245254264535315425323522230030301
021012030013043135124451434556465446663353754754774574457663344656553456246613524313152023413220330
323211122442404125421353336334324324563564625653556556652432462453235325362525324531133444231304313
221212242244240214314234323556334553353656452662622464552256465443444565421332134313540102100220131
003121311143322334241133533143446663652225433332652353542523664466644655215235421122322101243201202
302132313044423014553344334444135543546462343625633335635554425246463354552555544450021401441212013
211320002042341321404351332421424422345645623225243263532425463422453534224512413420003024103010003
121321233203044310220544225434555523322652465244626362265436622244421244514121221412000233313302001
033330113222134212123014455534453323452146635634333522662322621122442141151325121244124021100331010
003211203200004004334013134312421412135211541122652523655533352215155345414442033214440410020130131
000310132331000133341101412343222324131145425545545422415232421245514432554132410203120223330322031
010222121001201110014203011212115523421525414334222144411533424243442552424243301203331330320011211
202210333132013102411304342331452231412212555243242135532222244343234442033031110220213320300213112
021110333231201113044040042034211335553321154444412432243122252145522223420412102042311030021122200
212222233011232310420321434331332422434543133323345512355241515513414041433311311240302022331021120
+2000
View File
File diff suppressed because it is too large. Load diff
+12 -7
View File
@@ -1,4 +1,5 @@
let part1 lines = let part1 () =
let lines = Utils.lines_of_input 1 in
let rec most_calories most current lines = let rec most_calories most current lines =
match lines with match lines with
| [] -> most | [] -> most
@@ -10,7 +11,8 @@ let part1 lines =
most_calories 0 0 lines most_calories 0 0 lines
;; ;;
let part2 lines = let part2 () =
let lines = Utils.lines_of_input 1 in
let accum_calories elves calories = let accum_calories elves calories =
match elves, calories with match elves, calories with
| elves, "" -> 0 :: elves | elves, "" -> 0 :: elves
@@ -23,9 +25,12 @@ let part2 lines =
| _ -> failwith "wtf" | _ -> failwith "wtf"
;; ;;
let print () = let%expect_test "Day 1.1" =
let lines = Utils.lines_of_input 1 in Printf.printf "%d" @@ part1 ();
Printf.( [%expect {| 75622 |}]
printf "Day 1.1: %d\n" @@ part1 lines; ;;
printf "Day 1.2: %d\n" @@ part2 lines)
let%expect_test "Day 1.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 213159 |}]
;; ;;
+57
View File
@@ -0,0 +1,57 @@
open Containers
let parse_lines () =
let lines = Utils.lines_of_input 10 in
let _, state_history =
List.fold_flat_map
(fun (cycle, reg) instruction ->
match String.split ~by:" " instruction with
| [ "noop" ] -> (cycle + 1, reg), [ cycle + 1, reg ]
| [ "addx"; num ] ->
let num = int_of_string num in
(cycle + 2, reg + num), [ cycle + 1, reg; cycle + 2, reg ]
| _ -> failwith @@ Printf.sprintf "failed to parse '%s'" instruction)
(0, 1)
lines
in
state_history
;;
let part1 () =
let history = parse_lines () in
history
|> List.find_all (fun (cycle, _) ->
match cycle with
| 20 | 60 | 100 | 140 | 180 | 220 -> true
| _ -> false)
|> List.fold_left (fun acc (cycle, reg) -> acc + (cycle * reg)) 0
;;
let part2 () =
let screen_width = 40 in
let history = parse_lines () in
history
|> List.map (fun (cycle, reg) ->
let column = Int.(cycle mod screen_width) in
let sprite_dist = abs @@ (reg + 1 - column) in
if sprite_dist <= 1 then '#' else ' ')
|> List.chunks 40
|> List.map String.of_list
|> List.iter Fun.(print_string %> print_newline)
;;
let%expect_test "Day 10.1" =
Printf.printf "%d" @@ part1 ();
[%expect {| 14760 |}]
;;
let%expect_test "Day 10.2" =
part2 ();
[%expect {|
#### #### ## #### ### # # ### #####
# # # # # # # # # # # # #
### ### # ### # # # # # # ### #
# # # ## # ### # # ### #
# # # # # # # # # # # #
#### # ### #### # # ## # # #### |}]
;;
+87
View File
@@ -0,0 +1,87 @@
open Containers
type monkey =
{ mutable items : int list
; mutable inspected : int
; operation : int -> int
; test : int -> int
; test_num : int
}
let parse_monkeys () =
let lines = Utils.lines_of_input 11 in
let rec parse lines monkeys =
let lines = List.drop_while (String.equal "") lines in
let lines, rest = List.take_drop_while Fun.(String.equal "" %> not) lines in
let lines = List.map Fun.(String.trim %> String.split ~by:" ") lines in
match lines with
| [ [ "Monkey"; _ ]
; "Starting" :: "items:" :: items
; [ "Operation:"; "new"; "="; "old"; op; op_num ]
; [ "Test:"; "divisible"; "by"; test_num ]
; [ "If"; "true:"; "throw"; "to"; "monkey"; if_true ]
; [ "If"; "false:"; "throw"; "to"; "monkey"; if_false ]
] ->
let items =
List.map Fun.(String.replace ~which:`All ~sub:"," ~by:"" %> int_of_string) items
in
let op = if String.equal op "+" then ( + ) else ( * ) in
let operation =
match op_num with
| "old" -> fun old -> op old old
| num -> fun old -> op old @@ int_of_string num
in
let test_num = int_of_string test_num in
let if_true = int_of_string if_true in
let if_false = int_of_string if_false in
let test score = if Int.(score mod test_num) = 0 then if_true else if_false in
let monkey = { items; operation; test; test_num; inspected = 0 } in
parse rest (monkey :: monkeys)
| _ -> monkeys
in
Array.of_list @@ List.rev @@ parse lines []
;;
let throw item monkey = monkey.items <- List.append [ item ] monkey.items
let round monkies ~manageable =
let divisor = Array.fold_left (fun acc monkey -> acc * monkey.test_num) 1 monkies in
let destress score = if manageable then score / 3 else Int.(score mod divisor) in
monkies
|> Array.iter (fun monkey ->
monkey.items
|> List.iter (fun item ->
let item = destress @@ monkey.operation item in
let throw_to = monkey.test item in
throw item monkies.(throw_to));
monkey.inspected <- monkey.inspected + List.length monkey.items;
monkey.items <- [])
;;
let solve rounds ~manageable =
let monkies = parse_monkeys () in
for _ = 1 to rounds do
round monkies ~manageable
done;
monkies
|> Array.to_list
|> List.map (fun monkey -> monkey.inspected)
|> List.sort Int.compare
|> List.rev
|> List.take 2
|> List.reduce ( * )
|> Option.get_exn_or "aoc goofed up the input"
;;
let part1 () = solve 20 ~manageable:true
let part2 () = solve 10_000 ~manageable:false
let%expect_test "Day 11.1" =
Printf.printf "%d" @@ part1 ();
[%expect {| 56350 |}]
;;
let%expect_test "Day 11.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 13954061248 |}]
;;
+100
View File
@@ -0,0 +1,100 @@
open Containers
type node =
{ char : char
; mutable visited : bool
; mutable distance : int
}
[@@deriving show]
let parse_grid start_anywhere =
let start_nodes = ref [] in
let end_node = ref @@ Vec2.origin in
let grid =
Utils.lines_of_input 12
|> Grid.of_lines (fun char -> { char; visited = false; distance = Int.max_int })
in
Grid.iter grid (fun pos ->
let node = Grid.at_e grid pos in
match node.char with
| 'E' -> end_node := pos
| 'S' -> start_nodes := pos :: !start_nodes
| 'a' when start_anywhere -> start_nodes := pos :: !start_nodes
| _ -> ());
grid, !end_node, !start_nodes
;;
let reachable f t =
let height c =
match c with
| 'S' -> 'a'
| 'E' -> 'z'
| c -> c
in
Char.compare (height f) (height t) >= -1
;;
let get_neighbors grid node_pos =
let node = Grid.at_e grid node_pos in
Vec2.directions
|> Iter.of_list
|> Iter.filter_map (fun dir ->
let neighbor_pos = Vec2.(node_pos + dir) in
match Grid.at grid neighbor_pos with
| Some neighbor when reachable node.char neighbor.char -> Some neighbor_pos
| _ -> None)
;;
let path_distance grid goal start_nodes =
let set_info position (dist, visited) =
let node = Grid.at_e grid position in
node.distance <- dist;
node.visited <- visited
in
let get_info position =
let { char = _; distance; visited } = Grid.at_e grid position in
distance, visited
in
Utils.djikstra
~set_info
~get_info
~eq:Vec2.( = )
~get_weight:(fun _ _ -> 1)
~get_neighbors:(get_neighbors grid)
~goal
~start_nodes
|> Option.get_exn_or "couldn't find"
;;
let%expect_test "Day 12.1" =
let grid, goal, start_nodes = parse_grid false in
Printf.printf "%i" @@ path_distance grid (Some goal) start_nodes;
[%expect {| 497 |}]
;;
let%expect_test "Day 12.2" =
let grid, goal, start_nodes = parse_grid true in
Printf.printf "%i" @@ path_distance grid (Some goal) start_nodes;
[%expect {| 492 |}]
;;
let%expect_test "Day 12 test" =
let grid, goal, start_nodes = parse_grid false in
let _ = path_distance grid None start_nodes in
let print_dist_to pos =
let node = Option.get_exn_or "invalid pos!" grid.Grid.%(pos) in
Printf.printf "%s %c %i\n" (Vec2.show pos) node.char node.distance
in
print_dist_to goal;
print_dist_to Vec2.(goal + right);
print_dist_to Vec2.(goal + down);
print_dist_to Vec2.(of_tuple (121, 23));
print_dist_to Vec2.(origin + right);
[%expect
{|
(149, 20) E 497
(150, 20) z 498
(149, 21) y 496
(121, 23) a 138
(1, 0) b 21 |}]
;;
+55
View File
@@ -0,0 +1,55 @@
open Containers
module Packet = struct
type t =
| I of int
| L of t list
[@@deriving show { with_path = false }]
let of_str line =
let open Utils.Parse in
let int = int >>= fun i -> return @@ I i in
let packet =
fix (fun packet ->
let lb, delimited, rb = char '[', sep_by (char ','), char ']' in
let list = lb *> delimited packet <* rb >>= fun p -> return @@ L p <?> "list" in
choice [ int; list ])
<?> "packet"
in
Result.get_or_failwith @@ parse_string ~consume:All packet line
;;
let rec compare a b =
match a, b with
| I a, I b -> Int.compare a b
| L a, L b -> List.compare compare a b
| (I _ as a), (L _ as b) -> compare (L [ a ]) b
| (L _ as a), (I _ as b) -> compare a (L [ b ])
;;
end
let%expect_test "Day 13.1" =
Utils.lines_of_input 13
|> List.filter Fun.(not % String.is_empty)
|> List.map Packet.of_str
|> List.chunks 2
|> List.mapi (fun i packets ->
match packets with
| [ a; b ] when Packet.compare a b < 0 -> i + 1
| _ -> 0)
|> List.reduce_exn ( + )
|> print_int;
[%expect {| 6272 |}]
;;
let%expect_test "Day 13.2" =
Utils.lines_of_input 13
|> List.filter Fun.(not % String.is_empty)
|> List.map (fun line -> false, Packet.of_str line)
|> List.append [ true, Packet.of_str "[[2]]"; true, Packet.of_str "[[6]]" ]
|> List.sort (fun (_, a) (_, b) -> Packet.compare a b)
|> List.mapi (fun i (is_divider, _) -> if is_divider then i + 1 else 1)
|> List.reduce_exn ( * )
|> print_int;
[%expect {| 22288 |}]
;;
+190
View File
@@ -0,0 +1,190 @@
open Containers
type tile =
| Empty
| Rock
| Sand
| Start
| Path_D
| Path_L
| Path_R
let char_of_tile _ = function
| Empty -> '-'
| Rock -> '#'
| Sand -> 'o'
| Start -> 'v'
| Path_D -> '|'
| Path_L -> '/'
| Path_R -> '\\'
;;
let is_sand = function
| Sand -> true
| _ -> false
;;
let parse_line line =
let open Utils.Parse in
let vec = Vec2.of_tuple <$> both int (char ',' *> int) in
let vec_list = sep_by (string " -> ") vec in
Result.get_or_failwith @@ parse_string ~consume:All vec_list line
;;
let draw_rocks grid points =
let open Grid in
let _ =
points
|> List.reduce (fun a b ->
iter_region grid a b (fun pos -> grid.%(pos) <- Rock);
b)
in
()
;;
let parse_grid lines start =
let points = Iter.map Fun.(parse_line %> Iter.of_list) lines in
let Vec2.{ x = lx; y = ly }, Vec2.{ x = hx; y = hy } =
points |> Iter.flatten |> Iter.cons start |> Vec2.find_bounds 0
in
let pad_floor = 1 in
let pad_x = 2 in
let height = 1 + hy - ly + pad_floor in
let lx = min lx (start.x - height) in
let hx = max hx (start.x + height) in
let width = 1 + hx - lx + (pad_x * 2) in
let extra = Vec2.of_tuple (lx - pad_x, ly) in
let start = Vec2.(start - extra) in
let open Grid in
let grid = init ~width ~height (fun _ -> Empty) in
grid.%(start) <- Start;
Iter.iter
Fun.(Iter.map (fun point -> Vec2.(point - extra)) %> Iter.to_list %> draw_rocks grid)
points;
grid, start
;;
type is_done =
| Continue
| Done
let rec drop_sand_abyss draw_path grid start =
let d = Vec2.(start + down) in
let l = Vec2.(d + left) in
let r = Vec2.(d + right) in
let open Grid in
match grid.%(l), grid.%(d), grid.%(r) with
| _, None, _ -> Done
| _, Some Empty, _ ->
if draw_path then grid.%(d) <- Path_D;
drop_sand_abyss draw_path grid d
| Some Empty, _, _ ->
if draw_path then grid.%(l) <- Path_L;
drop_sand_abyss draw_path grid l
| _, _, Some Empty ->
if draw_path then grid.%(r) <- Path_R;
drop_sand_abyss draw_path grid r
| _, _, _ ->
(match grid.%(start) with
| Some Empty ->
grid.%(start) <- Sand;
Continue
| _ -> failwith "oh no!")
;;
let rec drop_sand_floor grid start =
let d = Vec2.(start + down) in
let l = Vec2.(d + left) in
let r = Vec2.(d + right) in
let open Grid in
match grid.%(l), grid.%(d), grid.%(r) with
| _, Some Empty, _ -> drop_sand_floor grid d
| Some Empty, _, _ -> drop_sand_floor grid l
| _, _, Some Empty -> drop_sand_floor grid r
| _, _, _ ->
(match grid.%(start) with
| Some Empty ->
grid.%(start) <- Sand;
Continue
| Some Start ->
grid.%(start) <- Sand;
Done
| _ -> failwith "oh no!")
;;
let rec drop_all_sand drop grid start =
match drop grid start with
| Continue -> drop_all_sand drop grid start
| Done -> ()
;;
let%expect_test "Day 14.1 example" =
let lines =
Iter.of_list [ "498,4 -> 498,6 -> 496,6"; "503,4 -> 502,4 -> 502,9 -> 494,9" ]
in
let start = Vec2.of_tuple (500, 0) in
let grid, start = parse_grid lines start in
drop_all_sand (drop_sand_abyss false) grid start;
let _ = drop_sand_abyss true grid start in
let count = Grid.count grid is_sand in
Printf.printf "%i grains\n%s" count @@ Grid.draw grid char_of_tile;
[%expect
{|
24 grains
-------------v-------------
-------------|-------------
------------/o-------------
-----------/ooo------------
----------/#ooo##----------
---------/o#ooo#-----------
--------/###ooo#-----------
--------|--oooo#-----------
-------/o-ooooo#-----------
------/#########-----------
------|-------------------- |}]
;;
let%expect_test "Day 14.2 example" =
let lines =
Iter.of_list [ "498,4 -> 498,6 -> 496,6"; "503,4 -> 502,4 -> 502,9 -> 494,9" ]
in
let start = Vec2.of_tuple (500, 0) in
let grid, start = parse_grid lines start in
drop_all_sand drop_sand_floor grid start;
let count = Grid.count grid is_sand in
Printf.printf "%i grains\n%s" count @@ Grid.draw grid char_of_tile;
[%expect
{|
93 grains
-------------o-------------
------------ooo------------
-----------ooooo-----------
----------ooooooo----------
---------oo#ooo##o---------
--------ooo#ooo#ooo--------
-------oo###ooo#oooo-------
------oooo-oooo#ooooo------
-----oooooooooo#oooooo-----
----ooo#########ooooooo----
---ooooo-------ooooooooo--- |}]
;;
let%expect_test "Day 14.1" =
let lines = Iter.of_list @@ Utils.lines_of_input 14 in
let start = Vec2.of_tuple (500, 0) in
let grid, start = parse_grid lines start in
drop_all_sand (drop_sand_abyss false) grid start;
let count = Grid.count grid is_sand in
Printf.printf "%i" count;
[%expect {| 683 |}]
;;
let%expect_test "Day 14.2" =
let lines = Iter.of_list @@ Utils.lines_of_input 14 in
let start = Vec2.of_tuple (500, 0) in
let grid, start = parse_grid lines start in
drop_all_sand drop_sand_floor grid start;
let count = Grid.count grid is_sand in
Printf.printf "%i" count;
[%expect {| 28821 |}]
;;
+167
View File
@@ -0,0 +1,167 @@
open Containers
let example_lines =
[ "Sensor at x=2, y=18: closest beacon is at x=-2, y=15"
; "Sensor at x=9, y=16: closest beacon is at x=10, y=16"
; "Sensor at x=13, y=2: closest beacon is at x=15, y=3"
; "Sensor at x=12, y=14: closest beacon is at x=10, y=16"
; "Sensor at x=10, y=20: closest beacon is at x=10, y=16"
; "Sensor at x=14, y=17: closest beacon is at x=10, y=16"
; "Sensor at x=8, y=7: closest beacon is at x=2, y=10"
; "Sensor at x=2, y=0: closest beacon is at x=2, y=10"
; "Sensor at x=0, y=11: closest beacon is at x=2, y=10"
; "Sensor at x=20, y=14: closest beacon is at x=25, y=17"
; "Sensor at x=17, y=20: closest beacon is at x=21, y=22"
; "Sensor at x=16, y=7: closest beacon is at x=15, y=3"
; "Sensor at x=14, y=3: closest beacon is at x=15, y=3"
; "Sensor at x=20, y=1: closest beacon is at x=15, y=3"
]
;;
type sensor =
{ pos : Vec2.t
; beacon : Vec2.t
; dist : int
}
[@@deriving show { with_path = false }]
let taxicab_dist a b =
let x, y = Vec2.(abs (a - b) |> to_tuple) in
x + y
;;
let parse_sensor line =
match List.map int_of_string Re.(matches (Pcre.regexp {|-?\d+|}) line) with
| [ sx; sy; bx; by ] ->
let pos, beacon = Vec2.(of_tuple (sx, sy), of_tuple (bx, by)) in
{ pos; beacon; dist = taxicab_dist pos beacon }
| _ -> failwith "parse error"
;;
let could_be_beacon sensors ignore_known pos =
sensors
|> Iter.fold_while
(fun _ s ->
let d = taxicab_dist pos s.pos in
if d <= s.dist && (ignore_known || not Vec2.(pos = s.beacon))
then false, `Stop
else true, `Continue)
true
;;
(*{[
equation for line
y = m*x + c
beacon range boundaries are made up of four lines:
slope 1 passing thru bx + dist + 1, by
slope 1 passing thru bx - dist - 1, by
slope -1 passing thru bx + dist + 1, by
slope -1 passing thru bx - dist - 1, by
to find the constant given a slope, plug a point into
c = y - m*x
constants are stored separately for boundaries with positive and negative
slope so that they can be handled separately
p1 = y - bx - dist - 1
p2 = y - bx + dist + 1
n1 = y + bx + dist + 1
n2 = y + bx - dist - 1
]}*)
let get_consts sensors extra =
sensors
|> Iter.fold
(fun (p_slope_consts, n_slope_consts) { pos; beacon = _; dist } ->
let p1 = pos.y - pos.x + dist + extra in
let p2 = pos.y - pos.x - dist - extra in
let n1 = pos.y + pos.x + dist + extra in
let n2 = pos.y + pos.x - dist - extra in
Iter.(
( append p_slope_consts (of_list [ p1; p2 ])
, append n_slope_consts (of_list [ n1; n2 ]) )))
(Iter.empty, Iter.empty)
;;
let solve_part_1 lines scan_y =
let sensors = lines |> Iter.of_list |> Iter.map parse_sensor in
let p_slope_consts, n_slope_consts = get_consts sensors 0 in
(*{[
for a known y to intersect with a positive slope boundary:
y = x + p
x = y - p
and for a negative slope boundary:
y = -x + n
x = n - y
]}*)
let intersection_xs =
Iter.append
(Iter.map (fun p -> scan_y - p) p_slope_consts)
(Iter.map (fun n -> n - scan_y) n_slope_consts)
|> Iter.sort_uniq ~cmp:Int.compare
in
let check x = could_be_beacon sensors false @@ Vec2.of_tuple (x, scan_y) in
let rec count_not_beacons count xs =
match xs with
| x :: next :: rest ->
(* if there is a region [x+1, next), the value of check
is the same for each point within it. intersection points
must be checked separately from the regions between them *)
let intersection = if check x then 0 else 1 in
let region = if x + 1 < next && check (x + 1) then 0 else next - (x + 1) in
count_not_beacons (count + intersection + region) (next :: rest)
| _ -> count
in
count_not_beacons 0 @@ Iter.to_list intersection_xs
;;
let%expect_test "Day 15.1 example" =
Printf.printf "%i\n" @@ solve_part_1 example_lines 10;
[%expect {| 26 |}]
;;
let%expect_test "Day 15.1" =
Printf.printf "%i\n" @@ solve_part_1 (Utils.lines_of_input 15) 2000000;
[%expect {| 5525990 |}]
;;
let solve_part_2 lines range mult =
let sensors = lines |> Iter.of_list |> Iter.map parse_sensor in
let in_bounds = Vec2.(in_bounds origin @@ of_tuple (range, range)) in
let p_slope_consts, n_slope_consts = get_consts sensors 1 in
(*{[
boundaries only itersect if they have opposite slope.
to find the intersection, set equations to be equal and solve.
y = x + p
y = -x + n // set equal
x + p = -x + n // add x and subtract p
2x = n - p // divide 2
-> x = (n - p)/2 // substitute x into original
y = (n - p)/2 + p // multiply 2
2y = n + p // div 2
-> y = (n + p)/2
]}*)
let point =
Iter.product p_slope_consts n_slope_consts
|> Iter.fold_while
(fun _ (p, n) ->
let i = Vec2.of_tuple ((n - p) / 2, (n + p) / 2) in
if in_bounds i && could_be_beacon sensors true i
then Some i, `Stop
else None, `Continue)
None
|> Option.get_exn_or "no distress beacon found :("
in
(mult * point.x) + point.y
;;
let%expect_test "Day 15.2 example" =
Printf.printf "%i\n" @@ solve_part_2 example_lines 20 4000000;
[%expect {| 56000011 |}]
;;
let%expect_test "Day 15.2" =
Printf.printf "%i\n" @@ solve_part_2 (Utils.lines_of_input 15) 4000000 4000000;
[%expect {| 11756174628223 |}]
;;
+141
View File
@@ -0,0 +1,141 @@
open Containers
let example_lines =
String.lines
{|Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
Valve BB has flow rate=13; tunnels lead to valves CC, AA
Valve CC has flow rate=2; tunnels lead to valves DD, BB
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
Valve EE has flow rate=3; tunnels lead to valves FF, DD
Valve FF has flow rate=0; tunnels lead to valves EE, GG
Valve GG has flow rate=0; tunnels lead to valves FF, HH
Valve HH has flow rate=22; tunnel leads to valve GG
Valve II has flow rate=0; tunnels lead to valves AA, JJ
Valve JJ has flow rate=21; tunnel leads to valve II
|}
;;
type valve =
{ flow : int
; mask : int
}
let parse_valves lines =
let rooms = Hashtbl.create 100 in
lines
|> List.iter (fun line ->
let int_matches = List.map int_of_string Re.(matches (Pcre.regexp {|\d+|}) line) in
let valve_matches = Re.(matches (Pcre.regexp {|[A-Z]{2}|}) line) in
match int_matches, valve_matches with
| [ flow ], name :: tunnels -> Hashtbl.add rooms name (flow, tunnels)
| _ -> failwith "parse error");
let valves =
Hashtbl.to_list rooms
|> List.filter (fun (_, (flow, _)) -> flow > 0)
|> List.mapi (fun i (name, (flow, _)) ->
let mask = Int.(1 lsl i) in
name, { flow; mask })
in
let distances = Hashtbl.create 100 in
valves
|> List.map (fun (valve, _) -> valve)
|> List.cons "AA"
|> List.iter (fun from ->
let dist_of =
Fun.(
Utils.djikstra_hash
~get_weight:(fun _ _ -> 1)
~get_neighbors:(fun room ->
match Hashtbl.get rooms room with
| Some (_, tunnels) -> Iter.of_list tunnels
| None -> failwith "sad")
~start_nodes:[ from ]
()
%> Option.get_exn_or "big sad")
in
valves
|> List.remove_assoc ~eq:String.equal from
|> List.iter (fun (valve, _) ->
Hashtbl.replace distances (from, valve) (dist_of valve)));
let get_dist f t =
match Hashtbl.get distances (f, t) with
| Some dist -> dist
| None -> failwith @@ Printf.sprintf "cant find distance %s -> %s" f t
in
valves, get_dist
;;
let traverse
get_dist
(valves : (string * valve) list)
?(current = "AA")
?(released = 0)
?(opened = 0)
time
=
let states = Hashtbl.create 1000 in
let rec traverse' current time released opened =
Hashtbl.update
states
~f:(fun _ current ->
match current with
| Some r when r >= released -> Some r
| _ -> Some released)
~k:opened;
valves
|> List.iter (fun (name, { flow; mask }) ->
if Int.(mask land opened) = 0
then (
let dist = get_dist current name in
let time' = time - (dist + 1) in
if time' > 0
then (
let released' = released + (flow * time') in
let opened' = Int.(mask lor opened) in
traverse' name time' released' opened')))
in
traverse' current time released opened;
states
|> Iter.of_hashtbl
|> Iter.sort ~cmp:(fun (_, a_score) (_, b_score) -> b_score - a_score)
;;
let solve_part_1 lines =
let valves, get_dist = parse_valves lines in
let states = traverse get_dist valves 30 in
match states |> Iter.take 1 |> Iter.to_list with
| [ (_, score) ] -> score
| _ -> failwith "no traversals ?"
;;
let%expect_test "Day 16.1 example" =
Printf.printf "%i\n" @@ solve_part_1 example_lines;
[%expect {| 1651 |}]
;;
let%expect_test "Day 16.1" =
Printf.printf "%i\n" @@ solve_part_1 @@ Utils.lines_of_input 16;
[%expect {| 2265 |}]
;;
let solve_part_2 lines =
let valves, get_dist = parse_valves @@ lines in
let states = traverse get_dist valves 26 in
states
|> Iter.filter_map (fun (a_set, a_score) ->
match Iter.find_pred (fun (b_set, _) -> Int.(a_set land b_set) = 0) states with
| Some (_, b_score) -> Some (a_score + b_score)
| None -> None)
|> Iter.fold Int.max 0
;;
let%expect_test "Day 16.2 example" =
Printf.printf "%i\n" @@ solve_part_2 example_lines;
[%expect {| 1707 |}]
;;
(* god damn bitmasks are fast, 30x speedup from StrSet! down to 50ms now *)
let%expect_test "Day 16.2" =
Printf.printf "%i\n" @@ solve_part_2 @@ Utils.lines_of_input 16;
[%expect {| 2811 |}]
;;
+201
View File
@@ -0,0 +1,201 @@
open Containers
let cave_width = 7
let example_lines = [ ">>><<><>><<<>><>>><<<>>><<<><<<>><>><<>>" ]
let dir_of_char = function
| '<' -> Vec2.left
| '>' -> Vec2.right
| _ -> failwith "oof"
;;
let next_stream_idx stream idx = (idx + 1) mod Array.length stream
(*[{
#
# # #
### # # ##
#### # ### # ##
row plus angle col square
}]*)
type shape =
| Row
| Plus
| Angle
| Col
| Square
let get_shape idx = [| Row; Plus; Angle; Col; Square |].(idx mod 5)
let shape_points shape pos =
let points =
match shape with
| Row -> [ 0, 0; 1, 0; 2, 0; 3, 0 ]
| Plus -> [ 0, 1; 1, 0; 1, 1; 1, 2; 2, 1 ]
| Angle -> [ 0, 0; 1, 0; 2, 0; 2, 1; 2, 2 ]
| Col -> [ 0, 0; 0, 1; 0, 2; 0, 3 ]
| Square -> [ 0, 0; 1, 0; 0, 1; 1, 1 ]
in
points |> List.map (fun point -> Vec2.(pos + of_tuple point))
;;
type loop_key =
{ rock : shape
; stream_idx : int
; normalized_topo : int array
}
type loop =
{ rock_idx : int
; height : int
}
type cave =
{ grid : char Grid.t
; mutable grid_topo : int array
; mutable grid_height : int
; total_rocks : int
; mutable rocks : int
; mutable stream_idx : int
; loop_cache : (loop_key, loop) Hashtbl.t
; mutable height : int
}
let init_cave max_height total_rocks =
let grid = Grid.init ~width:7 ~height:max_height (Fun.const '.') in
{ grid
; height = -1
; grid_height = -1
; rocks = 0
; stream_idx = 0
; grid_topo = Array.init cave_width (Fun.const 0)
; loop_cache = Hashtbl.create max_height
; total_rocks
}
;;
let draw_cave cave = Grid.draw cave.grid ~rev_y:true (fun _ contents -> contents)
let place_shape cave shape pos =
shape_points shape pos
|> List.iter (fun point ->
let delta = point.Vec2.y - cave.grid_height in
if delta > 0
then (
cave.height <- cave.height + delta;
cave.grid_height <- cave.grid_height + delta);
cave.grid_topo.(point.x) <- max point.y cave.grid_topo.(point.x);
Grid.set_e cave.grid point '#')
;;
let can_place_shape cave shape pos =
shape_points shape pos
|> List.fold_while
(fun _ point ->
match cave.grid.Grid.%(point) with
| Some '.' -> true, `Continue
| _ -> false, `Stop)
false
;;
let drop_shape cave stream =
let shape = get_shape cave.rocks in
let rec drop pos =
let stream_pos = Vec2.(pos + stream.(cave.stream_idx)) in
cave.stream_idx <- next_stream_idx stream cave.stream_idx;
let pos = if can_place_shape cave shape stream_pos then stream_pos else pos in
let drop_pos = Vec2.(pos + Vec2.up) in
if can_place_shape cave shape drop_pos
then drop drop_pos
else place_shape cave shape pos
in
cave.rocks <- cave.rocks + 1;
drop Vec2.{ x = 2; y = Int.(cave.grid_height + 4) }
;;
let normalize_topo topo =
let min = Array.min_exn Int.compare topo in
Array.map (fun x -> x - min) topo
;;
let rec drop_shapes cave stream =
let loop_key =
{ rock = get_shape cave.rocks
; stream_idx = cave.stream_idx
; normalized_topo = normalize_topo cave.grid_topo
}
in
let remaining_rocks cave = cave.total_rocks - cave.rocks in
let loop_rocks loop = cave.rocks - loop.rock_idx in
let loop_fits loop = loop_rocks loop < remaining_rocks cave in
match Hashtbl.get cave.loop_cache loop_key with
| Some loop when loop_fits loop ->
let loop_height = cave.height - loop.height in
cave.height <- cave.height + loop_height;
cave.rocks <- cave.rocks + loop_rocks loop;
drop_shapes cave stream
| _ when remaining_rocks cave > 0 ->
let loop = { height = cave.height; rock_idx = cave.rocks } in
Hashtbl.add cave.loop_cache loop_key loop;
drop_shape cave stream;
drop_shapes cave stream
| _ -> ()
;;
let solve remaining_rocks lines =
let stream = lines |> List.hd |> Iter.of_str |> Iter.map dir_of_char |> Iter.to_array in
let cave = init_cave 100_000 remaining_rocks in
drop_shapes cave stream;
cave.height + 1
;;
let%expect_test "Day 17.1 Example" =
Printf.printf "height: %i\n" @@ solve 2022 example_lines;
[%expect {| height: 3068 |}]
;;
let%expect_test "Day 17.1" =
Printf.printf "height: %i\n" @@ solve 2022 (Utils.lines_of_input 17);
[%expect {| height: 3227 |}]
;;
let%expect_test "Day 17.2 Example" =
Printf.printf "height: %i\n" @@ solve 1_000_000_000_000 example_lines;
[%expect {| height: 1514285714288 |}]
;;
let%expect_test "Day 17.2" =
Printf.printf "height: %i\n" @@ solve 1_000_000_000_000 (Utils.lines_of_input 17);
[%expect {| height: 1597714285698 |}]
;;
let%expect_test "Smol tower" =
let stream =
example_lines |> List.hd |> Iter.of_str |> Iter.map dir_of_char |> Iter.to_array
in
let cave = init_cave 18 8 in
drop_shapes cave stream;
Printf.printf "%s" @@ draw_cave cave;
[%expect
{|
.......
.......
.......
.....#.
.....#.
..####.
.###...
..#....
.####..
....##.
....##.
....#..
..#.#..
..#.#..
#####..
..###..
...#...
..####. |}]
;;
+121
View File
@@ -0,0 +1,121 @@
open Containers
let example_lines =
String.lines
{|2,2,2
1,2,2
3,2,2
2,1,2
2,3,2
2,2,1
2,2,3
2,2,4
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5|}
;;
module Vec3 = struct
type t = int * int * int [@@deriving show, eq, ord, hash]
let directions = [ 1, 0, 0; -1, 0, 0; 0, 1, 0; 0, -1, 0; 0, 0, 1; 0, 0, -1 ]
let ( + ) (x1, y1, z1) (x2, y2, z2) = x1 + x2, y1 + y2, z1 + z2
let ( - ) (x1, y1, z1) (x2, y2, z2) = x1 - x2, y1 - y2, z1 - z2
let ( = ) = equal
let iter_region (ax, ay, az) (bx, by, bz) callback =
for z = az to bz do
for y = ay to by do
for x = ax to bx do
let p = x, y, z in
callback p
done
done
done
;;
let in_bounds (lx, ly, lz) (hx, hy, hz) (x, y, z) =
not (x < lx || x > hx || y < ly || y > hy || z < lz || z > hz)
;;
let find_bounds points =
let first = Iter.head_exn points in
let padding = 1, 1, 1 in
let min, max =
points
|> Iter.drop 1
|> Iter.fold
(fun ((lx, ly, lz), (hx, hy, hz)) (x, y, z) ->
(min lx x, min ly y, min lz z), (max hx x, max hy y, max hz z))
(first, first)
in
min - padding, max + padding
;;
end
module Vec3Set = Set.Make (Vec3)
let parse_points lines =
lines
|> List.map (fun line ->
match List.map Int.of_string_exn Re.(matches (Pcre.regexp {|\d+|}) line) with
| [ x; y; z ] -> x, y, z
| _ -> failwith "oopzi doopers")
|> Vec3Set.of_list
;;
let solve_part_1 lines =
let points = parse_points lines in
let min, max = Vec3.find_bounds @@ Vec3Set.to_iter points in
let surface_area = ref 0 in
Vec3.iter_region min max (fun point ->
if not @@ Vec3Set.mem point points
then
Vec3.directions
|> List.iter (fun dir ->
let n = Vec3.(point + dir) in
if Vec3Set.mem n points then incr surface_area));
!surface_area
;;
let%expect_test "Day 18.1 example" =
Format.printf "%i" @@ solve_part_1 example_lines;
[%expect {| 64 |}]
;;
let%expect_test "Day 18.1" =
Format.printf "%i" @@ solve_part_1 @@ Utils.lines_of_input 18;
[%expect {| 3662 |}]
;;
let solve_part_2 lines =
let points = parse_points lines in
let min, max = Vec3.find_bounds @@ Vec3Set.to_iter points in
let in_bounds = Vec3.in_bounds min max in
let surface_area = ref 0 in
let directions_iter = Iter.of_list Vec3.directions in
let get_neighbors point =
directions_iter
|> Iter.map Vec3.(fun dir -> point + dir)
|> Iter.filter (fun neighbor ->
let in_droplet = Vec3Set.mem neighbor points in
if in_droplet then incr surface_area;
(not in_droplet) && in_bounds neighbor)
in
let _ignore =
Utils.djikstra_hash ~get_weight:(fun _ _ -> 1) ~get_neighbors ~start_nodes:[ min ] ()
in
!surface_area
;;
let%expect_test "Day 18.2 example" =
Format.printf "%i" @@ solve_part_2 example_lines;
[%expect {| 58 |}]
;;
let%expect_test "Day 18.2" =
Format.printf "%i" @@ solve_part_2 @@ Utils.lines_of_input 18;
[%expect {| 2060 |}]
;;
+12 -7
View File
@@ -52,7 +52,8 @@ let match_outcome = function
| _, _ -> Lose | _, _ -> Lose
;; ;;
let part1 lines = let part1 () =
let lines = Utils.lines_of_input 2 in
let parse_line line = let parse_line line =
match Re.Pcre.(split ~rex:(regexp {|\s+|}) line) with match Re.Pcre.(split ~rex:(regexp {|\s+|}) line) with
| them :: me :: _ -> parse_move them, parse_move me | them :: me :: _ -> parse_move them, parse_move me
@@ -66,7 +67,8 @@ let part1 lines =
lines lines
;; ;;
let part2 lines = let part2 () =
let lines = Utils.lines_of_input 2 in
let parse_line = let parse_line =
function%pcre function%pcre
| {|(?<them>\w)\s*(?<outcome>\w)|} -> parse_move them, parse_outcome outcome | {|(?<them>\w)\s*(?<outcome>\w)|} -> parse_move them, parse_outcome outcome
@@ -86,9 +88,12 @@ let part2 lines =
lines lines
;; ;;
let print () = let%expect_test "Day 2.1" =
let lines = Utils.lines_of_input 2 in Printf.printf "%d" @@ part1 ();
Printf.( [%expect {| 11841 |}]
printf "Day 2.1: %d\n" @@ part1 lines; ;;
printf "Day 2.2: %d\n" @@ part2 lines)
let%expect_test "Day 2.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 13022 |}]
;; ;;
+12 -7
View File
@@ -10,7 +10,8 @@ let priority char =
| _ -> failwith @@ Printf.sprintf "'%c' is not a valid item" char | _ -> failwith @@ Printf.sprintf "'%c' is not a valid item" char
;; ;;
let part1 lines = let part1 () =
let lines = Utils.lines_of_input 3 in
List.fold_left List.fold_left
(fun acc line -> (fun acc line ->
let half_len = String.length line / 2 in let half_len = String.length line / 2 in
@@ -30,7 +31,8 @@ let part1 lines =
shout out https://doc.sherlocode.com/ for helping me find Containers and its shout out https://doc.sherlocode.com/ for helping me find Containers and its
List.chunks and List.reduce functions List.chunks and List.reduce functions
*) *)
let part2 lines = let part2 () =
let lines = Utils.lines_of_input 3 in
let groups = List.chunks 3 (List.map set_of_string lines) in let groups = List.chunks 3 (List.map set_of_string lines) in
List.fold_left List.fold_left
(fun acc group -> (fun acc group ->
@@ -44,9 +46,12 @@ let part2 lines =
groups groups
;; ;;
let print () = let%expect_test "Day 3.1" =
let lines = Utils.lines_of_input 3 in Printf.printf "%d" @@ part1 ();
Printf.( [%expect {| 7446 |}]
printf "Day 3.1: %d\n" @@ part1 lines; ;;
printf "Day 3.2: %d\n" @@ part2 lines)
let%expect_test "Day 3.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 2646 |}]
;; ;;
+10 -6
View File
@@ -19,22 +19,26 @@ let count_overlaps is_overlapping =
0 0
;; ;;
let part1 = let part1 () =
count_overlaps (fun pairs -> count_overlaps (fun pairs ->
match pairs with match pairs with
| (l1, r1), (l2, r2) when (l1 <= l2 && r1 >= r2) || (l2 <= l1 && r2 >= r1) -> true | (l1, r1), (l2, r2) when (l1 <= l2 && r1 >= r2) || (l2 <= l1 && r2 >= r1) -> true
| _ -> false) | _ -> false)
;; ;;
let part2 = let part2 () =
count_overlaps (fun pairs -> count_overlaps (fun pairs ->
match pairs with match pairs with
| (l1, r1), (l2, r2) when r1 < l2 || r2 < l1 -> false | (l1, r1), (l2, r2) when r1 < l2 || r2 < l1 -> false
| _ -> true) | _ -> true)
;; ;;
let print () = let%expect_test "Day 4.1" =
Printf.( Printf.printf "%d" @@ part1 ();
printf "Day 4.1: %d\n" part1; [%expect {| 547 |}]
printf "Day 4.2: %d\n" part2) ;;
let%expect_test "Day 4.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 843 |}]
;; ;;
+8 -4
View File
@@ -73,8 +73,12 @@ let solve crane_move =
let part1 () = solve crane_move1 let part1 () = solve crane_move1
let part2 () = solve crane_move let part2 () = solve crane_move
let print () = let%expect_test "Day 5.1" =
Printf.( Printf.printf "%s" @@ part1 ();
printf "Day 5.1: %s\n" @@ part1 (); [%expect {| PSNRGBTFT |}]
printf "Day 5.2: %s\n" @@ part2 ()) ;;
let%expect_test "Day 5.2" =
Printf.printf "%s" @@ part2 ();
[%expect {| BNTZFPMMW |}]
;; ;;
+8 -4
View File
@@ -24,8 +24,12 @@ let find_start window =
let part1 () = find_start 4 let part1 () = find_start 4
let part2 () = find_start 14 let part2 () = find_start 14
let print () = let%expect_test "Day 6.1" =
Printf.( Printf.printf "%d" @@ part1 ();
printf "Day 6.1: %d\n" @@ part1 (); [%expect {| 1833 |}]
printf "Day 6.2: %d\n" @@ part2 ()) ;;
let%expect_test "Day 6.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 3425 |}]
;; ;;
+8 -4
View File
@@ -101,8 +101,12 @@ let part2 () =
| None -> failwith "not possible!!" | None -> failwith "not possible!!"
;; ;;
let print () = let%expect_test "Day 7.1" =
Printf.( Printf.printf "%d" @@ part1 ();
printf "Day 7.1: %d\n" @@ part1 (); [%expect {| 1453349 |}]
printf "Day 7.2: %d\n" @@ part2 ()) ;;
let%expect_test "Day 7.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 2948823 |}]
;; ;;
+55
View File
@@ -0,0 +1,55 @@
open Containers
let parse_grid () =
Grid.of_lines Fun.(Char.to_string %> int_of_string) @@ Utils.lines_of_input 8
;;
let part1 () =
let grid = parse_grid () in
let num_visible = ref 0 in
Grid.iter grid (fun start ->
let start_height = Option.get_exn_or "unreachable" @@ Grid.at grid start in
let rec walk_shorter_trees start step =
let next = Vec2.(start + step) in
match Grid.at grid next with
| Some height when height < start_height -> walk_shorter_trees next step
| opt -> opt
in
let visible =
Vec2.directions
|> List.map @@ walk_shorter_trees start
|> List.map Option.is_none
|> List.reduce_exn ( || )
in
if visible then incr num_visible);
!num_visible
;;
let part2 () =
let grid = parse_grid () in
let best_score = ref 0 in
Grid.iter grid (fun start ->
let start_height = Option.get_exn_or "unreachable" @@ Grid.at grid start in
let rec trees_in_view start in_view step =
let next = Vec2.(start + step) in
match Grid.at grid next with
| Some height when height < start_height -> trees_in_view next (in_view + 1) step
| Some _ -> in_view + 1
| None -> in_view
in
let score =
Vec2.directions |> List.map @@ trees_in_view start 0 |> List.reduce_exn ( * )
in
if score > !best_score then best_score := score);
!best_score
;;
let%expect_test "Day 8.1" =
Printf.printf "%d" @@ part1 ();
[%expect {| 1803 |}]
;;
let%expect_test "Day 8.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 268912 |}]
;;
+72
View File
@@ -0,0 +1,72 @@
open Containers
let parse_input () =
Utils.lines_of_input 9
|> List.concat_map (fun line ->
match String.split ~by:" " line with
| [ dir; count ] ->
let count = int_of_string count in
let dir =
match dir with
| "U" -> Vec2.up
| "D" -> Vec2.down
| "L" -> Vec2.left
| "R" -> Vec2.right
| _ -> failwith "failed to parse instructions"
in
List.init count (fun _ -> dir)
| _ -> failwith "failed to parse instructions")
;;
let next_pos head tail =
let dx, dy = Vec2.(to_tuple @@ (tail - head)) in
if abs dx <= 1 && abs dy <= 1
then tail
else (
let x_dir = if dx > 0 then Vec2.right else Vec2.left in
let y_dir = if dy > 0 then Vec2.down else Vec2.up in
let dir =
if abs dx = abs dy
then Vec2.(x_dir + y_dir)
else if abs dx > abs dy
then x_dir
else y_dir
in
Vec2.(head + dir))
;;
let solve length =
let moves = parse_input () in
let start = Vec2.origin in
let tail = List.init (length - 1) (fun _ -> start) in
let _, _, last_knot_hist =
List.fold_left
(fun (head, tail, last_knot_hist) dir ->
let new_head = Vec2.(head + dir) in
let last_knot, new_tail =
List.fold_map
(fun head knot ->
let new_knot = next_pos head knot in
new_knot, new_knot)
new_head
tail
in
new_head, new_tail, last_knot :: last_knot_hist)
(start, tail, [ start ])
moves
in
last_knot_hist |> List.uniq ~eq:Vec2.( = ) |> List.length
;;
let part1 () = solve 2
let part2 () = solve 10
let%expect_test "Day 9.1" =
Printf.printf "%d" @@ part1 ();
[%expect {| 6030 |}]
;;
let%expect_test "Day 9.2" =
Printf.printf "%d" @@ part2 ();
[%expect {| 2545 |}]
;;
+14 -2
View File
@@ -1,7 +1,19 @@
(library (library
(name aoc) (name aoc)
(libraries re containers dune-site) (libraries re containers iter dune-site angstrom)
(preprocess (pps ppx_regexp))) (inline_tests)
(preprocess (pps
ppx_regexp
ppx_deriving.show
ppx_deriving.eq
ppx_deriving.ord
ppx_deriving_hash
ppx_expect
ppx_inline_test)))
(env
(dev
(flags (:standard -warn-error -A))))
(install (install
(section (site (aoc inputs))) (section (site (aoc inputs)))
+99
View File
@@ -0,0 +1,99 @@
open Containers
type 'a t =
{ width : int
; height : int
; items : 'a array
}
[@@deriving show]
let vec2_of_idx ~width ~idx =
let y = idx / width in
let x = idx mod width in
Vec2.of_tuple (x, y)
;;
let idx_of_vec2 width vec = Vec2.(Int.((width * vec.y) + vec.x))
let in_bounds grid point =
let x, y = Vec2.to_tuple point in
x >= 0 && x < grid.width && y >= 0 && y < grid.height
;;
let at grid point =
if in_bounds grid point
then Array.get_safe grid.items @@ idx_of_vec2 grid.width point
else None
;;
let at_e (grid : 'a t) (point : Vec2.t) =
match at grid point with
| Some point -> point
| None -> failwith @@ Format.sprintf "point %a out of bounds!" Vec2.pp point
;;
let set_e grid point item =
if in_bounds grid point
then Array.set grid.items (idx_of_vec2 grid.width point) item
else failwith (Format.sprintf "point %a out of bounds!" Vec2.pp point)
;;
let ( .%() ) = at
let ( .%()<- ) = set_e
let find (grid : 'a t) pred =
let open Option.Infix in
let* idx, item = Array.find_idx pred grid.items in
Some (vec2_of_idx ~width:grid.width ~idx, item)
;;
let count grid pred =
Array.fold (fun count item -> if pred item then count + 1 else count) 0 grid.items
;;
let init ~width ~height init =
{ width
; height
; items = Array.init (width * height) (fun idx -> init @@ vec2_of_idx ~width ~idx)
}
;;
let of_lines parse_char lines : 'a t =
match lines with
| first_line :: _ ->
let width = String.length first_line in
let height = List.length lines in
let yeet =
lines
|> List.map String.to_list
|> List.flatten
|> List.map parse_char
|> Array.of_list
in
{ width; height; items = yeet }
| _ -> failwith "somethin fucd up"
;;
let iter_region grid a b callback =
Vec2.iter_region a b (fun pos -> if in_bounds grid pos then callback pos)
;;
let iter grid callback =
let a = Vec2.of_tuple (0, 0) in
let b = Vec2.of_tuple (grid.width - 1, grid.height - 1) in
iter_region grid a b callback
;;
let draw grid ?(rev_y = false) ?(rev_x = false) printer =
let line = ref [] in
let lines = ref [] in
iter grid (fun point ->
let item = grid.%(point) in
let char = printer point (Option.get_exn_or "iter is broken" item) in
line := if rev_x then char :: !line else !line @ [ char ];
if List.length !line = grid.width
then (
lines := !lines @ [ String.of_list !line ];
line := []));
String.concat "\n" (if rev_y then List.rev !lines else !lines)
;;
+14
View File
@@ -0,0 +1,14 @@
type 'a t [@@deriving show]
val at : 'a t -> Vec2.t -> 'a option
val at_e : 'a t -> Vec2.t -> 'a
val set_e : 'a t -> Vec2.t -> 'a -> unit
val ( .%() ) : 'a t -> Vec2.t -> 'a option
val ( .%()<- ) : 'a t -> Vec2.t -> 'a -> unit
val init : width:int -> height:int -> (Vec2.t -> 'a) -> 'a t
val of_lines : (char -> 'a) -> string list -> 'a t
val find : 'a t -> ('a -> bool) -> (Vec2.t * 'a) option
val count : 'a t -> ('a -> bool) -> int
val iter_region : 'a t -> Vec2.t -> Vec2.t -> (Vec2.t -> unit) -> unit
val iter : 'a t -> (Vec2.t -> unit) -> unit
val draw : 'a t -> ?rev_y:bool -> ?rev_x:bool -> (Vec2.t -> 'a -> char) -> string
+121
View File
@@ -9,3 +9,124 @@ let lines_of_input day =
let path = Printf.sprintf "%s/day%d.tt" base_path day in let path = Printf.sprintf "%s/day%d.tt" base_path day in
IO.(with_in path read_lines_l) IO.(with_in path read_lines_l)
;; ;;
(** [f] in [memo f] should be a function that makes recursive calls
via the memoized function passed as its first argument. ie:
{[
let fib_m =
memo (fun self x ->
match x with
| 0 | 1 -> 1
| x -> self (x - 1) + self (x - 2))
;;
]} *)
let memo f =
let open Hashtbl in
let cache = create 100000 in
let rec f_mem k =
try find cache k with
| Not_found ->
let v = f f_mem k in
add cache k v;
v
in
f_mem
;;
let%expect_test "fib memoized" =
let fib_m =
memo (fun fib_m x ->
match x with
| 0 | 1 -> 1
| x -> fib_m (x - 1) + fib_m (x - 2))
in
Printf.printf "%i\n" @@ fib_m 100;
[%expect {| 1298777728820984005 |}]
;;
let djikstra ~eq ~get_info ~set_info ~get_weight ~get_neighbors ~goal ~start_nodes =
let seen = ref [] in
let rec djikstra' c_node =
let c_dist, _ = get_info c_node in
set_info c_node (c_dist, true);
get_neighbors c_node
|> Iter.iter (fun neighbor ->
let n_dist, n_visited = get_info neighbor in
if not n_visited
then (
let new_dist = c_dist + get_weight c_node neighbor in
if new_dist < n_dist then set_info neighbor (new_dist, n_visited);
seen := List.add_nodup ~eq neighbor !seen));
seen
:= List.fast_sort
(fun a b ->
let a_dist, _ = get_info a in
let b_dist, _ = get_info b in
Int.compare a_dist b_dist)
!seen;
match goal, !seen with
| Some goal_node, next :: _ when eq goal_node next ->
let dist, _ = get_info next in
Some dist
| None, [] -> Some 0
| _, next :: rest ->
seen := rest;
djikstra' next
| Some _, [] -> None
in
List.iter (fun node -> set_info node (0, false)) start_nodes;
match start_nodes with
| first :: rest ->
seen := rest;
djikstra' first
| _ -> failwith "start_nodes cannot be empty"
;;
let djikstra_hash
(type k)
?(hash = Hashtbl.hash)
?(eq = Stdlib.( = ))
?(slots = 100)
~get_weight
~get_neighbors
~start_nodes
()
=
let module Tbl =
CCHashtbl.Make (struct
type t = k
let equal = eq
let hash = hash
end)
in
let table = Tbl.create slots in
let get_info node = Tbl.get_or ~default:(Int.max_int, false) table node in
let set_info node info = Tbl.replace table node info in
let dist_of node = Option.(Tbl.get table node >|= fun (dist, _) -> dist) in
let _ =
djikstra ~eq ~get_info ~set_info ~get_weight ~get_neighbors ~goal:None ~start_nodes
in
dist_of
;;
module Parse = struct
include Angstrom
let sign = option 1 (char '-' >>= fun _ -> return (-1))
let digits =
take_while1 (function
| '0' .. '9' -> true
| _ -> false)
>>| int_of_string
;;
let int = map2 sign digits ~f:( * )
let not_int =
skip_while (function
| '0' .. '9' | '-' -> false
| _ -> true)
;;
end
+57
View File
@@ -0,0 +1,57 @@
open Containers
type t =
{ x : int
; y : int
}
[@@deriving eq, ord, hash]
let pp (fmt : Format.formatter) v = Format.fprintf fmt "(%i, %i)" v.x v.y
let show v = Format.asprintf "%a" pp v
let origin = { x = 0; y = 0 }
let up = { x = 0; y = -1 }
let down = { x = 0; y = 1 }
let right = { x = 1; y = 0 }
let left = { x = -1; y = 0 }
let directions = [ up; down; left; right ]
let of_tuple (x, y) = { x; y }
let to_tuple { x; y } = x, y
let ( + ) a b = { x = a.x + b.x; y = a.y + b.y }
let ( - ) a b = { x = a.x - b.x; y = a.y - b.y }
let ( = ) = equal
let abs a = Int.{ x = abs a.x; y = abs a.y }
let iter_region a b callback =
for y = min a.y b.y to max a.y b.y do
for x = min a.x b.x to max a.x b.x do
callback { x; y }
done
done
;;
let fold_region a b callback init =
let acc = ref init in
iter_region a b (fun pos -> acc := callback !acc pos);
!acc
;;
let find_bounds padding points =
let lx, hx, ly, hy =
points
|> Iter.fold
(fun (lx, hx, ly, hy) { x; y } ->
let lx = min lx x in
let hx = max hx x in
let ly = min ly y in
let hy = max hy y in
lx, hx, ly, hy)
(Int.max_int, 0, Int.max_int, 0)
in
let lx = Int.(lx - padding) in
let hx = Int.(hx + padding) in
let ly = Int.(ly - padding) in
let hy = Int.(hy + padding) in
of_tuple (lx, ly), of_tuple (hx, hy)
;;
let in_bounds l h p = p.x >= l.x && p.x <= h.x && p.y >= l.y && p.y <= h.y
+24
View File
@@ -0,0 +1,24 @@
type t =
{ x : int
; y : int
}
[@@deriving eq, ord, hash]
val show : t -> string
val pp : Format.formatter -> t -> unit
val origin : t
val up : t
val down : t
val left : t
val right : t
val directions : t list
val of_tuple : int * int -> t
val to_tuple : t -> int * int
val ( + ) : t -> t -> t
val ( - ) : t -> t -> t
val ( = ) : t -> t -> bool
val abs : t -> t
val iter_region : t -> t -> (t -> unit) -> unit
val fold_region : t -> t -> ('a -> t -> 'a) -> 'a -> 'a
val find_bounds : int -> t Iter.t -> t * t
val in_bounds : t -> t -> t -> bool