Solve day 4
parent
d1b90dfefb
commit
3a3764bf4c
|
|
@ -0,0 +1,10 @@
|
||||||
|
..@@.@@@@.
|
||||||
|
@@@.@.@.@@
|
||||||
|
@@@@@.@.@@
|
||||||
|
@.@@@@..@.
|
||||||
|
@@.@@@@.@@
|
||||||
|
.@@@@@@@.@
|
||||||
|
.@.@.@.@@@
|
||||||
|
@.@@@.@@@@
|
||||||
|
.@@@@@@@@.
|
||||||
|
@.@.@@@.@.
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
@@@@@@.@@..@@.@.@@.@@...@@.@@@.@.@.@.@@.@@@@@@@@@@@@.@.@@.@.@...@.@@@@@@@@..@@..@@@..@@@.@@@@..@.....@@@.@@.@@@@@@.@@.@@.@.@@@@@@.@@.@@.@
|
||||||
|
..@@.@@@@.@.@.@.@.@@..@@.@@@@@@.@@@..@@.@@.@.@.@.@.....@@..@.@@@@...@@@.@.@@.@..@.@@@@@..@..@@@@.@@@@.@@@@@@@@@@@@@@.@@..@.@.@..@.@@@@@@@
|
||||||
|
@.@.@@@@@@@@@@@@..@@@.@...@@.@..@.@@@.@..@@@.@@@.@@@@..@@@@.@@@@@.@@@@.@@@@@..@@@@@@@@.@@@@@@@@.@@@@.@.@.@..@@..@@@..@..@.@@@@.@.@..@@..@
|
||||||
|
@@@@@@@@@@...@@@.@@.@@@.@@@@.@..@@@..@@@@@.@.@@..@.@..@@@@..@.@@..@.@@..@@@@@@@@..@@@@@@.@@.@@@.@.@.@....@@@@.@.....@.@..@@@@@..@.@@..@.@
|
||||||
|
.@@@@@@@...@@.@@@@.@@.@@.@@@@@.@..@@@.@@.@@@..@.@@.@@..@@.@@@@@@.@@@@@@@@@..@@@.@@@..@@@..@..@@@@.@@@.@@@.@@@.@@..@@@@.@@@..@.@...@@..@@@
|
||||||
|
.@......@@@@.@.@.@@..@...@@@@.@@..@@@..@.@.@@@@.@..@@.@.@.@@@@@....@@.@@.@..@@@.@.@....@@..@@@@@@@@......@@@@@@.@@.@.@.@@..@.@.@@@@@@@@@@
|
||||||
|
@.@..@@@@.@@.@@@@@@.@@@.@@@@@.@.@@@@@.@@@@.@@@@@@@@.@.@@@..@@@.@@@@@@.@@@.@.@@.@...@.@@.....@.@...@@@.@.@@@.@@.@@..@@@@...@@.@@.@@.@..@@@
|
||||||
|
@..@@@@@@@@..@@@@@@.@@@@@.@.@@@@@@.@@..@@@@.@@@@...@@..@@.@.@@@@.@..@@@@.@.@@@...@@@..@@@.@.@....@.@@.@@.@@@..@@@@@@@.@@.@@..@@..@.@@.@@.
|
||||||
|
..@@.@@@@@@@@@@@@@...@.@@@@@.@@.@@@@...@@@@@@..@@@.@@...@.@.@@@.@.@@@.@@@@@.@@.....@@.@@@@@@.@@@@@@.@@@.@@..@@@@@@@.@..@@@@@@@.@@@.@@@@@.
|
||||||
|
@.@@@..@@@@@@@@@@@@@@.@@.@.@@.@@@@@@@@@@@@.@.@@@.@@@.@@.@@@@..@.@@@@@@@@@@@@@@.@.....@..@.@@@@@@.@..@.@@....@@..@.@@....@@@@@@.@.@@@@....
|
||||||
|
@@.@@.@@.@@@.@@@@@@.@@.@.@@@@@@.@....@@@.@.@.@.@@.@@.@@...@.@.@..@.@..@@@.@.@@.@@@@@@..@@@@@@.@.@....@@@..@@..@.@@.@.@@.@.@@@@@.@.@.@@..@
|
||||||
|
@@@@@@@@.@@@@@@@@@.@@@@@@..@.@@.@@.@@@...@.@.@@@.@@@@@@@@.@@@@..@.@.@@@@@.@@@.@@@@@@.@@@@.@.@@@@@@.@@..@...@@..@@@......@@..@..@@.@@@@@..
|
||||||
|
.@@@@.@@@@.@@.@@.@.@@@@...@@@..@@@.@..@@@@.@@.@@@@@@@@..@@@..@@.@@@@@.@@..@@..@.@@@...@@..@.@@@@@...@..@@....@.@.@@@@.@@@.@....@@.@@.@@@@
|
||||||
|
@@.@.@.@@@@@@@@@@@.@@@@@.....@..@@.@@@.@@..@.@.@.@@@..@@..@@@@@@@@@@@@@@.@@..@.@.@@@..@@@@@@@@@@......@.@@@@..@@@.@@@.@@@.@.@@@@@@@@@@@..
|
||||||
|
@@@@@@.@..@.@@@.@@@@@@@@@..@..@..@@@@@...@.@@@.@@@@..@@@...@@.@@@..@.@.@@..@.@@.@@@.@@@@.@@.@@@@@@@@..@@@@@.@@@.@@@@@@@@@@....@@@@@.@.@.@
|
||||||
|
@@@@@@.@@.@@@.@@@@.@@@.@.@.@.@@@@.@.@@.@.@@@@...@@@..@@@@.@@..@@..@@.@@.@@.@@@@..@@.@.@.@.@.@@@@@@.@.@.@@.@.@.@@@....@@.@@@@..@.@@..@@@@@
|
||||||
|
@@@@.@.@.@@@@.@.@@@.@@@.@..@.@@..@...@..@....@@..@@@...@@@@..@.@...@@@..@@@@@@@@..@..@.@@.@@@@@@@.@@@.@.@@@.@.@@.@@@@@.@@.@.@.@@.@@.@@.@@
|
||||||
|
.@...@@@@.@.@@@@.@@.@..@@@@.@@@.@@@.@.@.@@@@.@.@.@.@.@@@.@@@.@@@@@..@.@.@@@@@..@@.@@@@@.@..@..@.@@@@..@@@.@@@.....@@@@@@@.@@@@@@@@..@..@@
|
||||||
|
@@..@@@@.@@..@@.@@.@..@.@@.@@@@.@@@@@.@@@@..@@..@@.@.@@..@.@@@.@@@@.@.@.@@@@.@..@..@@@@...@.@@@.@@@.@@.@@@.@@@@@@.....@@@...@@..@@.@..@@@
|
||||||
|
@.@@@..@@.@@@@@@@@@@..@@@@@@@.@..@@@@@..@@@@.@@@.@@..@.@@.@...@.@@@@.@.@.@@@@..@..@..@.@@..@.@@.@@..@@@@@@@@.@@.@@@@@...@.@@@@@.@..@..@..
|
||||||
|
@@@..@@@@@.@..@@..@@..@@@.@@..@...@..@@@@@@@@@@..@@@@@@..@.@.@@@@@...@@@@@@@@.@.@.@@@.@@.@@@@@@.@..@..@..@@@@..@@@@.@@..@...@@@.@..@@.@@.
|
||||||
|
.@@@.@.@@.@@.@.@...@@..@@@@@...@@@...@@@@.@@@@.@@@@@@@@.@@@@@.@@@..@@@@@..@....@.@@@@@@@@..@@@@@@@.@@.@.@.@@.@@@.@.@.@@@@.@....@@.@@@@.@.
|
||||||
|
@@@@@@@.@.@.@@.@.@@.@@.@@@.@@@@..@@@@@@@@@@@@.@@@@....@@..@@@..@@@@@@.@.@@@.@..@..@@.@@@.@@..@......@@@@.@.@@.@@...@@....@@.@@@@@@@.@@@@@
|
||||||
|
@@.@@...@@..@@.@@@.@@@@@.@@...@@..@@...@@@.@@..@.@.@.@@.@.@.@@@@@@@.@@..@...@.@@@@@...@@@.@@@.@@.@..@@.@@@..@..@@@..@.@@.@@@@@.@..@@@@@@@
|
||||||
|
.@@@.@@....@@@.@@.@@...@.@.@@@@@@@...@.@.@@@@@.@.@..@@@.@@..@@@..@@@..@.@.@..@@.@@..@@.@...@.@.@@@@@@.@@@@.@..@.@@@@.@.@@.@@...@@@.@@@@..
|
||||||
|
.@...@@@@.@@.@@@...@@.@...@@@.@@.@@.@@@.@.@@@.@@@@@@@@..@@.@@..@.@@@@..@@.@@@..@.@@.@.@.@@.@@.@@@@@@@@@.@@@@@..@@@@@@@@...@..@..@@@@@@..@
|
||||||
|
...@@@@...@.@.@.@@@@@..@.@@.@@.@@@@@.@@@@..@@.@...@@@@@..@@@@@..@@...@..@@@..@@@@.@.@.@@@@@@@.@@@@@@.@@@@........@@.@@@@.@@@@@@@@.@@@@@@@
|
||||||
|
@@@@@@.@@.@..@@@@@.@@@@.@@..@@@@@.@@@@@@.@@.@.@@..@@@@@.@@@@.@@.@@@.@@.@.@@@...@@...@..@@@.@@@@@@.@@@@.@@.@..@@@@@@.@@..@.@@....@.@....@@
|
||||||
|
@.@.....@@@@@@@@.@@.@@..@@@...@..@@.........@@.@@@@@@@@.@@@@..@.@@.@@@@...@@..@@@@...@@.@..@@@@@@@@@@.@@@.@@@@.@.@@.@@@..@.@@@.@.@...@@.@
|
||||||
|
@.@.@..@..@.@@..@@@@.@.@.@...@@@@@.@.@.@@@@.@@@.@@....@.@@.@@@.@@.@@@.@@.@..@@@@@@@.@@...@@@@..@.@@@.@@@@@@@@.@@@@.@..@.@.........@@@...@
|
||||||
|
@@@@@.@@@@@@@@@..@@@.@.@@@@@.@@@@..@@@.@@@@@.@@@@@@.@@@.@@@.@.@@@.@.@.@@...@@@.@@@@.@...@@@.@@@..@@.@@.@@@@...@.@.@@.@.@@.@.@@@...@@@@@@@
|
||||||
|
@..@.@@@..@@@@@@@@.@@@@@@.@@.@.@@@@@@.....@@..@@.@@..@.@.@@@..@@@@.@@@@@.@@@@@.@...@@..@@@@.@@@@@.@@@@@@...@@@@@@@@@@@@@.@@@.@@@@.@@..@@@
|
||||||
|
@@.@..@@@....@@@@.@.@@..@@..@.....@@.@.@@.@..@@@@.@..@@.@.@@...@@@@.@@@@@@...@..@@.@@@@@@.@@@@@@@@.@.@.@....@@.@@..@@@.@..@@@.@@@@@@.@@@@
|
||||||
|
@@@@@@..@@@@@...@@@.@@@@...@.@@....@.@@.....@@@@@@..@@@@@@@@@@@.@.@.@@@@..@..@@@..@.@.@@@@.@@@@@..@....@@@.@..@.@@@@@@@@@@@@.@..@.@..@@.@
|
||||||
|
@@.@@.@@@.@@.@.@@@@@@@@@@@.....@.@@..@@..@@@@@.@@..@@@@@@.@.@@.@@.@@..@@@@@.....@@@@@@@.@@.@@@@@@@@@.@.@.@@..@@@@.@@..@....@@@@.@@@..@@@@
|
||||||
|
@@@.@@..@@.@.@@@@@@.@.@@.@.@@@@@..@@.@@@@@@.@@..@@...@....@@..@.@@.@.@.@@@.@@@@..@.@@@@@@@@@..@.@@@.@.@...@@.@@@@@..@..@@@@@@@@.@.@..@@.@
|
||||||
|
@.@@@.@@..@@@@@@.@..@@@@..@.@@...@@.@..@@.@.@.@@.@@@@@@@.@@.@.@@...@@@@@@.@@.@@@@@@@@@@@@@...@@..@@@@@@@@.@@.@.@@@@@@@@@.@@@..@@@.@..@@.@
|
||||||
|
..@.@@.@..@@@.....@@@@.@@.@@@@@@@@.@..@@@@.@.@.....@@.@@..@@@@..@@.@.@@.@.@.@@@.@@@@@.@@.@@@@@@@@@@@@.@@@.@@.@@@..@@.@@..@..@.@.@..@@@@@.
|
||||||
|
.@@@.@@.@@@@.@@@@.@@..@@@@.@.@..@.@@@.@.@@@@@@@@..@@@@.@.@.@@@@.@@@@.@@...@@@@@@@@.@@.@.@@.@@@@.@@@@.@@..@.@@..@...@@@@..@@@@@@@@@.@@@@@@
|
||||||
|
@.@.@.@@@@.@.@.@@@.@@@.@@....@.@@@.@@@@@@@@@..@..@@@@....@...@@@@.@@@@..@@...@@@@@@@@@@@@@@....@.@@.@@.@@@@@@@...@.@.@@@.@@@@@@@@.@@.@.@@
|
||||||
|
@@@...@..@@@.@@...@..@@@@@@@@@.@@@@@@@.@@.@@@.@.@@@@....@@@..@.@@.@@@@@@@.@@@@..@.@@@..@.@@..@@@@@@@@@.....@.@...@@@@.@@.@@@@@@@@@@.@@@@@
|
||||||
|
..@.@@@@..@.@@.@@@.@.@@@@@.@@@@@@..@@@.@@.@.@.@.@..@@@@@@@@@@.@.@@@@.@@@.@@@@.@@@.@..@@......@@@@@@@@@@@@@@@.@@@.....@@@..@@@@@.@@.@.@@@@
|
||||||
|
@@.@@@...@....@...@..@@@@...@.@@@@@@@..@....@.@@@@.@.@.@@@@...@@.@@@@.@.@@@@.@.@@@@@..@@@@@.@@.@.@@@@@.@.@@@@@@@@@@@@@@.@....@.@@@.@@..@.
|
||||||
|
@@@.@@.@@.@@@@@@@.....@@@@.@@@..@@.@....@@.@@@@.@@@@@..@..@......@@@@@@@@.....@.@...@@@.@@@@@..@@@@...@@.@@@.@@@.@@@@.....@@.@@@@@.@..@.@
|
||||||
|
.@@.@..@@@@@@@@@@.@@@@@@.@@.@@@@@..@@@@.@@@@@@...@@.@@.@.@@...@@.@@@@@@@@@.@.@@@@.@@@@@@.@@@@.@.@@@@@.@@@.@.@.@.@@.@@@@@@@@.@@.@@.@@.@.@@
|
||||||
|
.....@.@@...@@@.@.@@.@..@.@@@...@.@@@@@@@.@@.@@@@@..@.@@@@@..@@@@@@..@@@@..@..@.@.@..@@@...@@@@@.@.@@@.@@.@@..@@@@@.@@@@@.@@@@@@@@.@..@.@
|
||||||
|
.@.@@.@.@@.@....@@@@..@@@@.@@..@.@..@@@.@@@...@@@.@@@..@.@@@@...@..@.@@.@@@@@..@@@.@@.@@..@...@.@@.@@@.@@@@...@@@@.@@@@..@@@@@@@@@@..@@.@
|
||||||
|
.@@.@.......@@@@...@.@@@..@@.@..@@@.@@@.@.@...@@..@@@@.@.@@@.@.@.@@@@@@..@@@@..@@@@.@.@@.@@@..@@..@@@@@@@@@@@@.@@@@..@@.@.@@@.@.@..@@..@.
|
||||||
|
.@@@@.@@@@@.@.@@@..@..@.@.@@.@.@@@.@@.@@@@..@.@@@@.@@@@.@.@.@@@@.@..@.@@@@.@@@.@@.@.@@@@.@@@@..@@@@@...@@@..@@@@.@@.@...@@@@@.@@@@@@.@@@.
|
||||||
|
@@@.@.@.@@@@@.@@@.@@@@@@@..@@@..@@@.@@.@.@.....@@@@@@@..@@@@.@.@.@@@.@@@@@@.@..@...@@@@@@..@...@@@@@@.@@@...@.@@..@@@..@@@.@@@@.@@.@@@@@.
|
||||||
|
@.@...@@@.@...@@@.@.@@@..@.......@.@@@@@.@@.@.@@@..@@.@@@@..@.@@@@@@@@@@@@@.@@.@@@...@@@..@@@@...@.@.@@@..@@@@...@@@@@..@@.@@.@@@@@.@@@.@
|
||||||
|
.@.@...@..@.@@@@@.@@@@@@@@.@.@@..@@....@..@@.@@..@.@@....@@@@@@@.@@@@...@@@@@@@@.@@.@..@@@@.@@@@@.@@.@..@@@@.@@...@@@@@.@@@@@@@@@@.@@.@@@
|
||||||
|
.@.@......@@@..@@@.@@.@@@@.@@@@@.@...@.@@@.@@@@@@@@@@@...@@@@.@@@@@.@@@@@.@..@@@.@.@@.@@@@.@@.@.@@@.@@.@.@@.@.@.@@.@.@@.@@.....@.@@@@..@@
|
||||||
|
@@@..@@.@@.@@..@@.....@.@....@.@@@.@@.@@@.@..@@.@@@.@@.@@@@.@.@.@@...@.@@@..@..@@.@@@@@@@@.@@@@.@@@.@@@@@..@@@.@@@...@@@..@@.@@@...@..@@@
|
||||||
|
@.@.....@@.@@.@.@@@.@@@.@.@@.@@@@......@@@@@.@.@.@@.@..@.@@@..@@@..@@@@..@@..@@@@@@.@@@.@..@@@.@@@@@@.@.@..@@@@..@@@@.@@@@@@..@@@@@@@@.@.
|
||||||
|
@@@@@@@.@.@@@@@..@.@@@.@@@.@@.@@@@@@.@@@@.@@@@@@@@@@.@@@.@@@@.@.@....@@@.@.@@@@@@@@@..@@@.@@@.@.@@@@@@@.@@@@@..@@@@@@.@.@.@@@@@@@.@..@@@.
|
||||||
|
.@@@@..@.@@@.@@@@@..@@@..@@@@.@.@.@@.@.@@@.@..@@@@@.@@.@@@.@@@@@@.@@@..@.@@.@@....@.@@@@@@@@.@@@@...@@@@@@.@..@@@@@.@.@@.@@@@..@@@@@..@@@
|
||||||
|
@@.@..@@....@@.@@.@@@.@..@@@..@@@@.@.@.@..@@@.@@@@@.@@.@@@@@.@..@@.@@@@@...@@@@@@@@@@.@@@@@@@.@@...@..@@.@@.@@@@@.@@.@@@@@.@......@@.@.@@
|
||||||
|
@@@@.@@@@@.@@@.@.@@@@@@@@@@@@@@@..@@.....@@..@@@@@.@@@@..@@@@@@@.@...@@@.@..@@@@@.@@@..@@..@..@@.@@.@@@.@@@@@@@.@..@@.@.@....@@@@@.@@.@.@
|
||||||
|
@@..@@@@.@@.@.@@...@..@@@@@.@@..@.@...@@.@@@@@.@@.@..@@@.@@@...@..@..@@...@@@@..@@@@@..@@@..@@.@@@@.@..@@@@.@@@...@@@..@@@@.@@.@.@@..@@@@
|
||||||
|
@.@@@@..@@.@@........@@@@@@.@@@@.@@@@..@@.@..@@@@@..@@...@...@..@.@@@..@.@@@..@...@.@@@.@.@.@@@@@.@.@@@@....@@@@..@..@@..@.@@@@@@@@@@@@@.
|
||||||
|
@@@.@.@@@@@@@@.@..@@..@..@@@@@@@..@@.@@@.@...@@...@@@@@@@@.@..@.@@@@@..@@@@.@.@.@@@@.@@...@@@@@@.@.@@@.@.@@@@.@@@@..@....@@.@@@@..@@@@.@.
|
||||||
|
@@@@@..@@@@.@@@...@@@@@..@@.@@@@@@@...@@.@..@@@..@@.@.@@@@@@..@.@@@@@.@@@.@@@@..@@.@@@.@..@@@...@@@@.@.@..@..@@@@..@.@@@@@@@@.@@@.@@@..@@
|
||||||
|
..@.@.@@.@@.@@@.@@.@.@@@.@@.@@@@@@@.@@.@@@.@@@@@@@@.@@@.@..@@@..@.@@..@.@@@@..@..@...@@@.@.....@@@.@@...@@..@@..@..@@@@@.....@@@@@@@@@@@@
|
||||||
|
@@@@@.@...@.@.@@@.@@@@@@@@.@@@@@..@..@..@.@....@.@.@@@@@@..@@.@@.@.@@.@@.@@@@@@..@.@@@@..@@.@@@@.@.@@@@.@..@@@@.@...@.@.@@.@@.@@@@.@@@.@@
|
||||||
|
@..@@@.@@...@@@@@.@@@.@@@.@@@@@@@@@@...@.@@@@...@..@..@.@.@@@.@.@.@@.@.@@@@@.@@@@@@@@@@@..@@.@@.@@.@@..@@@@@.@.@@@@@@.@@.@....@@.@@.@@@@@
|
||||||
|
.@@@@@@@.@@@.@@@.@@@@@@@.@.@@@@@@@@..@@....@@.@.@@..@@.@@@@@@@.@@@..@.@@@@@@@@.@@@.@...@@.@@..@.@@...@@@@.@.@.....@@@@@@@@@@@@@@@@...@@..
|
||||||
|
@@@@.@...@.@.@.@@@@.@@@.@...@@@.@@@@@.@@@@@@@@@...@@@..@..@@@.@@@@@..@.@@@@@@@.@..@.@@@@@..@@.@.@@@.@.@..@@@@@@@.@....@@@.@.@.@@....@@@..
|
||||||
|
@@@@.@@.@@@@@.@@@@@@@@@@@@@@@.@@.@@@@@@.@@@@.@.@.@@@..@@...@@@@@....@.@@.@@@@..@@.@@@...@@@@.@.@@.@@@@@.@@@@....@..@@@..@..@@@@..@@@@...@
|
||||||
|
@..@@@.@@..@@.....@@@.@.@@@@@.@.@@.@.@.@.@@@@@@@.@@@.@.@@.@@..@@@..@@@@@@.@..@@.@@.@@@@.@@@@@@@.@@@@@@...@@@..@.@@@@@.@@@.@@@.@@.@@.@@@..
|
||||||
|
...@@@.@@@@@@@@..@.@@..@@.@@...@@@@@@.@@..@..@@@@@@.@.@@@@@..@.@..@@@@@@@.@.@@@@@@@@@@@@@.@.@...@@@@@.@@.@@@@..@@@@@@@...@..@.@@@@@.@..@@
|
||||||
|
@.@.@@....@@@.@.@@..@@.@@@.@.@.@.@@@@.@@@..@..@.@..@@.@.@@@@@.@@.@.@@@@..@..@@@@@@@@@@@..@@@.@@@@.@.@@.@.@@..@@@......@@@@.@..@.@@@@@.@..
|
||||||
|
@@@@@@@@.@.@@@...@@@@@@.@@@.@@@@@@@.@@@@@@@@.@.@..@@.@@@@@@@.@@@@@.@@@@@@@..@@@@.@.@@.@.....@@@.@@@@@@@.@@.@@@@..@@@@@..@.@.@.@@.@..@@@.@
|
||||||
|
.@@..@.@..@@@.....@@@@@.@@@.@@@@@@.@.@@@.@@@@@.@@@.@..@.@@@..@..@@..@@@@..@@@...@@@@@@@@.@@@@@@@@@@..@.@@@..@@@.@@@..@@.@.@@@@.@@.@@.@.@.
|
||||||
|
.@..@..@.@@.@.@@.@.@@..@@.@@@@@@..@.@@@.@..@.@..@@.@@@..@.@@@@@@@.@@@@.@@.@@@@@.@@@.@@@@@@@@..@.@@..@.@@@@@@.@@@.@..@@@@.@@.@@@@@@..@@.@.
|
||||||
|
.@.@..@..@@@.@..@.@@.@.@.@@@@@@.@..@@@@..@..@.@@@..@...@....@@@...@@@@@.@.@@.@@.@@.@.@@.@@@@@@@..@@@@@.@@@..@@@@@@@..@.@@..@@.@@@.@@@.@.@
|
||||||
|
@@..@...@@@@@@..@.@@....@.@.@@@@@@@@....@@@@@@..@@.@@@..@..@@@@@...@@@@..@@.@@@@.@@@.@@@@@.@...@@@@@@@@.@@@.@@@@@.@@@@..@@.@.@.@.@.@.@.@@
|
||||||
|
.@@@.@@..@@..@@@.@..@@@@.@@@.@..@@@@.@@@@@@@.@@@@@.@@@@..@.@.@@@@.@@@..@@@..@@...@@@@@@.@@@.......@@...@..@.@@@..@.@@@@@..@..@...@.@@..@@
|
||||||
|
@@@.@...@@@.@@@.@...@.@@.@@.@.....@..@...@.@.@.@...@..@.@.@@@.@@@..@.@@@@.@@....@@@@.@@@.@@@@@@@..@@.@@@@@@@@@@@@@@@.@@@@..@@@....@@.@..@
|
||||||
|
@...@.@@.@.@.@@...@@@.@...@@@@@..@@@...@@@.@@.@.@@.@.@@..@.@@@@@.@@@@@.@@@@@@.@@@.@@.@.@@@.....@.@.@..@.@.@...@.@@@...@@...@...@...@@@@@.
|
||||||
|
@@@.@@@.@@..@@.@.@@...@@@....@.@@.@..@@@.@.@@@@..@@@.@....@@@@@@@@.@@.@@@@@..@@@.@.@@@..@..@..@@.@@@@@.@@.@@@.@.@..@...@@.@@.@..@.@.@@@@.
|
||||||
|
@@.@@....@@@@@.@@.@@.@.@@@@@.@@@@@.@@@.@@@.@.@@@.@@.@.@@@.@@@@..@@@@@@@@..@@...@@....@@@@.@@.@@.@@.@.@.@@@@..@@@..@@.@@.@.@@..@@@@@.@..@@
|
||||||
|
.@@@@@@.@..@.@@@@.@@...@@@.@@.@@@@@.@..@.@.....@.....@.@@@@..@@..@@.@@@@@@@...@@@@@@@....@.@@@@@@@.@@.@@....@.@@.@@.@.@@@..@.@@.@..@@@@@@
|
||||||
|
@@.@@@@.@@.@.@.@.@@@@@@@@@@.@@.@@.@@@@.@.@@....@@.@@..@@@@@@.@@@..@@@@...@@@@.@@@@@@@@@..@@@@..@@@@...@@....@.@@...@@.@@@@@@..@..@..@@@.@
|
||||||
|
..@@@@.@@@@.@@@@@@@@@@@@@@@@@.@@@@.@@...@@.@@@@@@..@@.@@@.@@.@@@.@.@..@@@@@..@.@@.@@@.@@@@@.@.@.@...@@@..@....@@...@.@@@.@.@@@@@@...@@@@@
|
||||||
|
@.@@.@@@@@@..@...@@.@@@.@@@@@@@@@...@..@.@@@...@.@@..@@@.@..@@@@@.....@@.@@...@@.@.@@@@.@..@.@..@.@@@.@..@.@..@@@@@@@@@@..@.@@.@...@@@.@.
|
||||||
|
@@.@..@.@..@@.@@...@@.@@.@@@..@@@@.@@.@@@@@@@@@@@@@.......@@@.@@@@@@.@@...@@..@.@@@@@@..@@@@@@...@@@..@@@.@@.@@@@.@..@..@..@.@@@@@.@@@@.@
|
||||||
|
@@@.@@.@.@@@..@@@@.....@@@@@@.@..@@@.@.@@@@@...@....@@@@..@...@@@@@@@@@@@..@...@@@@@..@@@@@...@.@@@.@...@.@..@@@@.@...@@.@@.@.@...@.@@@@@
|
||||||
|
@..@@@@@.@@.@@..@..@@@....@@..@..@@.@@@.@.@....@@@@@.@@@@..@@@.@.@@@@@@.@@.@.@@@@@.@@.@.@@@.@...@@@@@@@@@@@@@@@@@@@...@.@..@@@@..@@.@...@
|
||||||
|
...@@@@.@@@@@@@@@.@..@@@@..@@.@....@@@.@.@@..@..@@.@.@@....@@.@@@@.@@....@@@.@@@.@@..@..@@@@@@@....@@@@.@@@@@@.@...@@.@@@@.@@@..@@@@..@.@
|
||||||
|
..@.@@@@@..@..@@.@.@...@@@@.@.@..@@@.@@@@..@@.@@.@@@@@@...@@@@@@.@@@@@@@@.@@@.@@@@@.@.@@.@@@@..@@@@@@@@...@..@.@@@..@@@@@.......@...@@@@@
|
||||||
|
@.@@.@@@.....@@@@@@@@@@@@@@@.@.@...@.@@..@@.@@.@.@.@.@@..@@@.@...@@..@...@.@.@...@@@.@@@@@@.@@...@@..@.@@.@..@.@@.@..@@.@..@..@@@.@.@@@@.
|
||||||
|
@.@@@.@..@.@..@@@@@@@@@@.@@@@.@@@@@.@.@.@@@@@@..@@@@@@@.@@@...@@...@.@@@@@@@@...@@..@...@@@@@@.@@@.@@@@@@@@.@@.@@.@.@@@@@@@.@@@@@@.@.@@.@
|
||||||
|
@@..@@@.@..@@@@..@.@@.@@@@@.@@.@@.@@@@@@.@@@@@@.@@@@@.@@@@.@@@....@@@@.@@..@.@.@@.@.@...@@@@@@.@..@@@@@@@@.@@@.@@.@@@@@@..@..@@..@.@@.@@@
|
||||||
|
@.@@@@.@@@@..@..@@..@@@...@@@@@@@...@..@@@@....@.@@.@..@@@@.@@.@@..@@@.@@@@@.@@.@@@@@@@.@..@..@.@@@@.@@@@..@..@..@.@@@@@@.@@@@@@@..@@@.@@
|
||||||
|
..@@@..@@.@@@@@@@.@.@.@.@@@@.@@@@@.@@@...@.@@..@@@..@@@@@@@@@..@@@@......@@@@.@@@..@@.@@@@@.@@@.@@@@.@.@@@.@@.@.@@@@@.@.@@@.@@@.@.@@@..@@
|
||||||
|
@@.@@.@.@.@@..@@@@@..@....@.@@@@@.@.@@.@...@@..@@..@@@.@.@..@@@@@@..@@.@@..@@@.@..@@@@@@@@@@@@@..@@..@@..@@@@@..@.@@.@@@.@@@@.@@@@@@@@.@@
|
||||||
|
@@.@@..@@@@@...@..@@@.@..@@@@..@@.@@@@.@@.@@..@@@@@...@...@@@..@@..@@@.@...@.@@@.@@..@.@...@@..@@..@@@@.@.@.@@@..@@@@@@@@@@@..@@@@@..@@@@
|
||||||
|
@@...@.@.@@@..@..@..@.@.@@@@.@..@@@.@@@.@@@.@@.@@@@@@..@@.@.@@@..@.@.@......@@.....@@@...@@.@@@@@...@@@@...@@@@@@@@@...@@..@@@.@.@@@@.@@@
|
||||||
|
@...@.@@@..@.@@@@.@@@..@@@@@..@@@@.@.@@@@@.@..@@@@@@@.@.@@@.@...@@@@..@@@@@@.@@@@@@@@@@.@@.@@@.@.@@@...@@.@.@.@.@@.@.@@@.@.@@@.@@@..@@.@.
|
||||||
|
.@@@@@..@@.@@@@@@@.@.@@...@@@.@@@...@@.@@@@@@@.@@@@@.@@@@@@@@@@@@@@@@.@.@@@@@...@@.@.@...@@.@@@@@.@@@.@.@...@@@.@@.@@..@@@@..@@.@@@.@@@.@
|
||||||
|
@@@.@@..@@....@@@.@@@@@.@.@.@...@@@..@@.@@@@..@@@@.@.@.....@@@@@@@@@@.@.@@.@.@@.@@@.@@.@@@.@.@.@@.@@@@@.@@@.@@@@@.@.@@..@.@.@@@@@@@@.@.@@
|
||||||
|
.@@@@.@@@@@...@@@@.@@..@.@.@@.@.@..@.@@.@......@.@...@@@@@@...@...@@@@@@@..@..@@.@@@...@.@@....@@...@@@..@@@@@@@.@.@@@@@@@@@@.@.@@@@@.@@@
|
||||||
|
.@.@@@@@@@@@.@@@@.@@.@...@@@...@.@@.@@@..@.@.@.@.@@.@.@@@@@@@@....@..@.@.......@@.@@..@@@.@..@@@@@@..@.@@@..@.@@@@@@@..@.@@@@@@@@@@.@.@.@
|
||||||
|
@@@@@@@@.@...@@@.@...@...@@..@@.@@.@@.@.@.@...@@@..@..@..@@@@@@@.@@.@@@@@@@@.....@@@@@@@@.@@@@@@@@..@@.@@@@@@@@@@@.@..@....@@..@@@@@@@@@@
|
||||||
|
@.@@@@@@....@..@@..@@.@@@..@..@@@.@@@..@@@@.@.@@@@..@@@@@@@@@@.@@@.@@.@@@....@@.@@@..@@@@@@.@....@@...@.@@.@@.@..@.@@@@@@@@@@@@.@@@@..@@@
|
||||||
|
@@@@.@@@@@..@.@.@....@.@@.@@@.@@...@.@.@@.@.@@.@.@.@@@..@@@@@@@.@.@..@.@@@@@@.@@.@.@.........@.@@@..@..@@@@@@@..@.@@@@.@@@@..@@@@@.@@.@@@
|
||||||
|
@@@@.@@@.@@@@..@@..@..@@@..@.@@@@.@@@.@@..@@@..@@.@@@@@@@@@@@.@.@@.@...@.@.@@.@@@.@@@@@.@@@..@.@@@....@@.@@@@@....@@.@@@.@@.@..@.@@.@@@@.
|
||||||
|
.@@...@.@.@@.@@@.@.@.@@@@@.@.@@@@@@@..@@@@.@.@@@@@@@@.@.@@@.@..@@@.@@@.@@@@.@...@.@@.@..@.@..@@.@@..@@.@.@.@..@@@.@@@@@.@@@@@.@@@@...@@@@
|
||||||
|
@@@@@@@@.@.@....@@@@@@@@@@@@.@@@@@@@@..@..@@.@@@...@.@@..@.@@@@@...@@@@.@@@@@@.@@@@.@@@..@.@.@@@@...@@@.@@@@.@.@@@@.@.@@@.@.@.@@@@@.@.@@.
|
||||||
|
.@.@@@@@.@@@@@@@@@..@@@@...@.@@@@@@..@@@@@@@@@.@@@@@@..@.@.@@.@.@@@@@.@..@.@@....@.@@..@..@@.@@@.@@@@.@.@@.@.@..@.@.@@@@@.@@@.@@.@.@@.@.@
|
||||||
|
.@@@@.@@.@@.@.@.@.@@@@@..@@.@@@@@@..@..@@.@.@@@@.@@.@.@.@@...@@.@@@@@.@...@...@...@@@@..@.@@@@@@@@.@@.@@@@@.@.@@@.@@..@.@@.@@.@.@@@@.@@@.
|
||||||
|
@@..@@.@@.@..@@.@@@..@@@@.@.@@@@.@@@.@@@@.@@@.@@@.@@@..@@...@@@@..@..@@@@@@.@@@.@..@..@@.@@@.@@@..@..@.@@@@..@.@@@@.@@@.@@..@@.@.@..@..@.
|
||||||
|
@@.@@.@...@@..@@@@@@..@@@@@..@@@@.@@@@@@@.@@.@.@@@...@@@@@@@.@@@@.@@@.@...@@@.@@@@@@@@@@@.@.@@..@.@@@@@..@@@@@@@@.@@@@@@@.@..@@.@.@@@@..@
|
||||||
|
@@@@@@@@@.@@@..@.@@.@@...@.@@@..@.@.@@@@...@@....@@@@@@@@@@@@.@@@.@@@.@@@.@@@.@.@@.@@@.@.@@@@@@@.@.@@..@..@@@.@@.@.@.@..@@@@@.@@@.@@.@@@.
|
||||||
|
@.@@@@.@@@@@@@..@.@@...@@.@@.@...@@....@.@..@@@...@.@@.@@.@@@.@.@@@.@@@..@.@@....@@@.@.@@@@@@@@@@@...@@@.@.@@@..@@.@@@@@@.@@@.@.@@@@.@@..
|
||||||
|
@.@@@@..@.@@...@@@.@@@..@.@.@@@.@@..@@.@@@@.@.@@.@...@@@@.@.@@@..@@.@@@@@@@..@.@@@@..@@@@.@@.@@.@@.@@.@@@@..@@.@@@.@@@@@@@....@.@@.@@@@@@
|
||||||
|
.@@@@...@.@.@@@.@@.@@@@@.@..@@.@@@@.....@@.@@..@.@@.@.@.@..@.@.@.@.@.@@...@.....@@@@@@.@@@@.@.@@@.@@@@@@..@@@@.@.@@..@..@@@@@@.@@@.@.@@@@
|
||||||
|
.@@@@.@@.@.@@......@.@.@@@@....@.@@.@.@.@@@@@@..@@@.@@....@@@@@.@@@.@@@@.@@@.@@@@.@@@@@@..@@..@@.@..@@.@.....@@@@@@@@.@@.@@@@@@@..@@@@@.@
|
||||||
|
@.@@..@@..@@....@@@@.@@@@@@@.@..@@@@@@...@@.@@@@@@@..@@.@.@.@@@.@@.@@@@@.@@...@@.@@@@..@...@..@@.@..@@..@@@.@@@@@.@@@@@@@@@.@@.@@@@@@@@.@
|
||||||
|
@@@.@@@@...@@.@@@..@@.@@@@@@@@@.@@@.@@@@@@@.@@@@@..@.@.@.@@@@@@..@@..@@.@.@@.@@..@.@@@@..@@@@@..@@@.@@@@@@.@@...@@..@..@@@...@@@.@@@@.@@@
|
||||||
|
.@@@@.@.@@....@.....@@.@@@@@@@@@@.@@.@@@@@@@@.@@@@.@@..@@@...@@@.@@@@@@@.@@..@..@@@.@@.@.@....@@@.@....@.@@@.@@@.@@@@.@@.@@@@.@.@.@@@.@@@
|
||||||
|
@@.@.@.@@.@@@@.@@..@.@.@.@..@@.@@@@...@@......@.@..@.@@.@@.@@@@.@@@@.@@@@..@.@@.@@@@@@....@.@@@@@.@@..@...@@.@@....@.@@.@@@.@@.@@.@@@@@@@
|
||||||
|
@.@..@@.@..@.@.@@@@@@.@.@.@.@@@.@@@@..@@@...@@@..@@@....@.@@.@@@@@@@@@@@...@@@.@@@..@@.@@@@@....@@@.@@.@@.@@@..@@@@@@@.@@@@..@.@@..@@@..@
|
||||||
|
.@@@@@...@..@@@.@...@@@@@@@@@.@.@@.@@@.@@@@@.@@.@.@@@@@@.@..@@.@@..@@@@@@....@.@@@@@@@@@@@.@@@@@@@...@@.@@@.@@@.@.@@@@@@.@.@..@.@@@@@.@.@
|
||||||
|
@@.@.@.@.@.@@....@@@.@@@@...@.@@.@@@@@@.@@@@@@.@@@.@..@@@@@@@@@@.@@@@@.@@@@@@.@@.@....@.@@...@..@@..@..@@@@.@@.@@@@.@...@.@.@@@@@.@..@@.@
|
||||||
|
...@@@@@.@@@@.@@.@@@@.@@.@@.@@.@@@.@.@@@@@...@@@@...@@@..@.@.@.@@@@@@@@.@@@@@@@@.@@@..@..@@..@.@.@...@..@@@.@@..@.@...@.@@@@@.@.@@..@.@@@
|
||||||
|
.@@@@@.@@@@@.@@@@.@.@@@@@@@..@@@@@@@@@@.@@@.@..@@..@.@.@@@@.@@.@.@@@.@@@.@@@@@@.@@@@.@....@@.@@@@@@@.@@@@@...@@@@.@@@@@@@@@@@@.@@.@@@.@@.
|
||||||
|
@.@@@...@..@..@@.@@.@@@...@@@@@@@@@..@@...@@..@@.@@@.@@.@@@@.@@...@@@@..@@.@@@@@......@@.@@@@@..@.@@.@@..@..@...@@...@@@.@..@@.@.@@@@.@@@
|
||||||
|
.@@.@@.@@@@@@@@@@.@@@.@.@@..@@@@@.@@@.@.@.@@.@@.@.@@@.@@@@@@@@.@@..@@...@..@@.@@.@.@@@@@@@@.@@.@.@@@.@.@@@@.@@..@@@@.@...@.@.@@..@@@..@..
|
||||||
|
@@...@@.@@@@.@@@.@.@.@..@@@@@.@@@@@..@@..@@@..@..@@.@@.@@.@.@@@@@@@.@.@.@@...@@.@...@@@...@@.@@@@@.@@..@@@@@@@.@@@@.@@@.@@@@@@..@@@@@@...
|
||||||
|
@.@...@@..@@@.@.@@@@@@@@..@@@@@@@@.@@@@..@@@.@@..@.@@@@@@.@@@@@@@@.@@@.@@@@@@..@@..@.@.@.@@@.@@@@@@.@...@@@.@@.@@@.@@@.@@@.@@@@.@@...@@@@
|
||||||
|
@..@.@@@..@@.@@@@@@.@@@.@@@...@@@@..@..@@@.@.@@@...@@@@@.@@@@@@@@.@@@@.@@@@.@..@@@@....@@.@@.@@.@...@@@.@@@...@.@.@@@@@@@@..@..@@@@@@@@@.
|
||||||
|
..@@.@@..@@.@@..@@@@.@.@.@@@@..@@@@@.@...@@@@.@@...@@.@@@@@@.@@..@.@@@..@..@.@@@.@.@@@...@@@@@@@@.@@@..@@.....@@.@@.@@@..@@...@@..@@....@
|
||||||
|
.@@@@.@@@..@@@.@@@......@@@..@@@@@@@@@@.....@@@.@@@@@@.@@.@@@..@@@@@@@@@.@..@.@.@..@@@.@@@.@...@.@.@.@.@@.@@@.@@@@@@@@@..@@@@..@@@@@@@@.@
|
||||||
|
@@.@@@....@.@.@@@@@@@.@@@.@@@@.@...@@.@.@@@@@.@.@.@.@.@@.@@..@@@@.@@@@@@@..@@@.@@.@@@@.@...@@.@.@@.@.@@.@@@.@@@@@@@.@@@.@..@@@@@@.....@.@
|
||||||
|
.@.@@@@.@@.@@.@.@.@@@@@@.@@@.@@.@..@@.@@@@..@@@.@@@@@.@@.@.@@.@@@@@@@@..@.@@@@@@@@@@.@.@@@@...@@.@@@@@.@@.@@@.@@.@@.@@@@.@@@@..@@...@@@@.
|
||||||
|
|
@ -0,0 +1,126 @@
|
||||||
|
require 'debug'
|
||||||
|
|
||||||
|
# Generic FileHandler
|
||||||
|
class FileHandler
|
||||||
|
def initialize(file_path)
|
||||||
|
@file_path = file_path
|
||||||
|
end
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# FileHandler.new('/path_to_file').read_lines do |line|
|
||||||
|
# # process line
|
||||||
|
# end
|
||||||
|
def read_lines
|
||||||
|
File.foreach(@file_path, chomp: true).map do |line|
|
||||||
|
yield(line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# file_content = FileHandler.new('/path_to_file').read_file(
|
||||||
|
def read_file
|
||||||
|
File.read(@file_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class PuzzleSolver
|
||||||
|
def initialize(file_handler, debug: false)
|
||||||
|
@handler = file_handler
|
||||||
|
@debug = debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def debug(message)
|
||||||
|
puts message if @debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def print_debug(message)
|
||||||
|
print message if @debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve
|
||||||
|
raise NotImplementedError, 'Please implement this method in subclasses.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Puzzle-specific
|
||||||
|
class Grid
|
||||||
|
attr_reader :cells, :num_rows, :num_columns
|
||||||
|
|
||||||
|
# @param [<<Integer>>] an array of arrays of of 1's and 0's e.g., [[1, 0], [0, 1]]
|
||||||
|
def initialize(grid)
|
||||||
|
raise "Invalid grid: 0 rows in #{grid}" if grid.length == 0
|
||||||
|
raise "Invalid grid: 0 columns in #{grid}" if grid[0].length == 0
|
||||||
|
raise "Invalid grid: inconsistent number of columns in #{grid}" unless grid.all? {|column| column.length == grid[0].length}
|
||||||
|
|
||||||
|
@num_rows = grid.length
|
||||||
|
@num_columns = grid[0].length
|
||||||
|
@cells = grid
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [Grid]
|
||||||
|
def self.from_file_handler(handler)
|
||||||
|
grid = []
|
||||||
|
handler.read_lines do |line|
|
||||||
|
next if line.nil? || line.empty?
|
||||||
|
grid << line.split('').map {|cell| cell == '@' ? 1 : 0}
|
||||||
|
end
|
||||||
|
Grid.new(grid)
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [<[Integer, Integer]>] list of coordinates of adjacent cells of [x,y].
|
||||||
|
def adjacent_coordinates(x, y)
|
||||||
|
adjacent_cells = [-1, 0, 1].flat_map do |x_offset|
|
||||||
|
[-1, 0, 1].map do |y_offset|
|
||||||
|
[x + x_offset, y + y_offset]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
adjacent_cells.delete([x, y])
|
||||||
|
|
||||||
|
# only return cells on the grid
|
||||||
|
adjacent_cells.select do |cell|
|
||||||
|
0 <= cell[0] && cell[0] < @num_rows &&
|
||||||
|
0 <= cell[1] && cell[1] < @num_columns
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def adjacent_cell_values(x, y)
|
||||||
|
adjacent_coordinates = adjacent_coordinates(x, y)
|
||||||
|
adjacent_cell_values = adjacent_coordinates.map {|x, y| @cells[x][y]}
|
||||||
|
adjacent_cell_values
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [Integer] the number of rolls in the adjacent positions of cell (x, y)
|
||||||
|
def num_adjacent_rolls(x, y)
|
||||||
|
adjacent_cell_values = adjacent_cell_values(x, y)
|
||||||
|
adjacent_cell_values.sum
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class GridSolver < PuzzleSolver
|
||||||
|
def solve
|
||||||
|
grid = Grid.from_file_handler(@handler)
|
||||||
|
num_accessible_rolls = 0
|
||||||
|
(0...grid.num_rows).each do |x|
|
||||||
|
(0...grid.num_columns).each do |y|
|
||||||
|
num_accessible_rolls += 1 if grid.num_adjacent_rolls(x, y) < 4 and grid.cells[x][y] == 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
num_accessible_rolls
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if ARGV[0].nil? || ARGV[0].empty?
|
||||||
|
puts "Usage: ruby part1.rb <file_name> [debug]"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
file_path = ARGV[0]
|
||||||
|
debug = (ARGV[1] == "debug")
|
||||||
|
file_handler = FileHandler.new(file_path)
|
||||||
|
|
||||||
|
## Puzzle-specific
|
||||||
|
cls = GridSolver
|
||||||
|
##
|
||||||
|
|
||||||
|
puts "The answer is: #{cls.new(file_handler, debug:).solve}"
|
||||||
|
|
@ -0,0 +1,152 @@
|
||||||
|
require 'debug'
|
||||||
|
|
||||||
|
# Generic FileHandler
|
||||||
|
class FileHandler
|
||||||
|
def initialize(file_path)
|
||||||
|
@file_path = file_path
|
||||||
|
end
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# FileHandler.new('/path_to_file').read_lines do |line|
|
||||||
|
# # process line
|
||||||
|
# end
|
||||||
|
def read_lines
|
||||||
|
File.foreach(@file_path, chomp: true).map do |line|
|
||||||
|
yield(line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# file_content = FileHandler.new('/path_to_file').read_file(
|
||||||
|
def read_file
|
||||||
|
File.read(@file_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class PuzzleSolver
|
||||||
|
def initialize(file_handler, debug: false)
|
||||||
|
@handler = file_handler
|
||||||
|
@debug = debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def debug(message)
|
||||||
|
puts message if @debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def print_debug(message)
|
||||||
|
print message if @debug
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve
|
||||||
|
raise NotImplementedError, 'Please implement this method in subclasses.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Puzzle-specific
|
||||||
|
class Grid
|
||||||
|
attr_reader :cells, :num_rows, :num_columns
|
||||||
|
|
||||||
|
# @param [<<Integer>>] an array of arrays of of 1's and 0's e.g., [[1, 0], [0, 1]]
|
||||||
|
def initialize(grid)
|
||||||
|
raise "Invalid grid: 0 rows in #{grid}" if grid.length == 0
|
||||||
|
raise "Invalid grid: 0 columns in #{grid}" if grid[0].length == 0
|
||||||
|
raise "Invalid grid: inconsistent number of columns in #{grid}" unless grid.all? {|column| column.length == grid[0].length}
|
||||||
|
|
||||||
|
@num_rows = grid.length
|
||||||
|
@num_columns = grid[0].length
|
||||||
|
@cells = grid
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [Grid]
|
||||||
|
def self.from_file_handler(handler)
|
||||||
|
grid = []
|
||||||
|
handler.read_lines do |line|
|
||||||
|
next if line.nil? || line.empty?
|
||||||
|
grid << line.split('').map {|cell| cell == '@' ? 1 : 0}
|
||||||
|
end
|
||||||
|
Grid.new(grid)
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [<[Integer, Integer]>] list of coordinates of adjacent cells of [x,y].
|
||||||
|
def adjacent_coordinates(x, y)
|
||||||
|
adjacent_cells = [-1, 0, 1].flat_map do |x_offset|
|
||||||
|
[-1, 0, 1].map do |y_offset|
|
||||||
|
[x + x_offset, y + y_offset]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
adjacent_cells.delete([x, y])
|
||||||
|
|
||||||
|
# only return cells on the grid
|
||||||
|
adjacent_cells.select do |cell|
|
||||||
|
0 <= cell[0] && cell[0] < @num_rows &&
|
||||||
|
0 <= cell[1] && cell[1] < @num_columns
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def adjacent_cell_values(x, y)
|
||||||
|
adjacent_coordinates = adjacent_coordinates(x, y)
|
||||||
|
adjacent_cell_values = adjacent_coordinates.map {|x, y| @cells[x][y]}
|
||||||
|
adjacent_cell_values
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [Integer] the number of rolls in the adjacent positions of cell (x, y)
|
||||||
|
def num_adjacent_rolls(x, y)
|
||||||
|
adjacent_cell_values = adjacent_cell_values(x, y)
|
||||||
|
adjacent_cell_values.sum
|
||||||
|
end
|
||||||
|
|
||||||
|
def removable_roll_coords
|
||||||
|
cells = []
|
||||||
|
(0...@num_rows).each do |x|
|
||||||
|
(0...@num_columns).each do |y|
|
||||||
|
cells << [x, y] if num_adjacent_rolls(x, y) < 4 and @cells[x][y] == 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
cells
|
||||||
|
end
|
||||||
|
|
||||||
|
def remove_rolls(coords)
|
||||||
|
coords.each do |x, y|
|
||||||
|
puts "Warning: No roll in cell (#{x},#{y})" if @cells[x][y] == 0
|
||||||
|
@cells[x][y] = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class GridSolver < PuzzleSolver
|
||||||
|
def solve
|
||||||
|
grid = Grid.from_file_handler(@handler)
|
||||||
|
total_rolls_removed = 0
|
||||||
|
|
||||||
|
removable_roll_coords = grid.removable_roll_coords
|
||||||
|
|
||||||
|
while removable_roll_coords.length != 0
|
||||||
|
total_rolls_removed += removable_roll_coords.length
|
||||||
|
grid.remove_rolls(removable_roll_coords)
|
||||||
|
removable_roll_coords = grid.removable_roll_coords
|
||||||
|
end
|
||||||
|
|
||||||
|
total_rolls_removed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if ARGV[0].nil? || ARGV[0].empty?
|
||||||
|
puts "Usage: ruby #{__FILE__} <file_name> [debug]"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
file_path = ARGV[0]
|
||||||
|
debug = (ARGV[1] == "debug")
|
||||||
|
file_handler = FileHandler.new(file_path)
|
||||||
|
|
||||||
|
## Puzzle-specific
|
||||||
|
cls = GridSolver
|
||||||
|
##
|
||||||
|
|
||||||
|
puts "The answer is: #{cls.new(file_handler, debug:).solve}"
|
||||||
|
|
||||||
|
# The answer is: 9206
|
||||||
|
|
||||||
|
# real 0m8,510s
|
||||||
|
# user 0m8,450s
|
||||||
|
# sys 0m0,059s
|
||||||
Loading…
Reference in New Issue