Tasks 7 and 8
authorNeil Smith <neil.git@njae.me.uk>
Sat, 6 Oct 2018 19:01:13 +0000 (20:01 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Sat, 6 Oct 2018 19:01:13 +0000 (20:01 +0100)
data/07-flips.txt [new file with mode: 0644]
data/08-maze.txt [new file with mode: 0644]
data/08-smaller.txt [new file with mode: 0644]
src/task7/task7.hs [new file with mode: 0644]
src/task7/task7.ipynb [new file with mode: 0644]
src/task8/task8.hs [new file with mode: 0644]
summerofcode2018soln.cabal

diff --git a/data/07-flips.txt b/data/07-flips.txt
new file mode 100644 (file)
index 0000000..7d85f88
--- /dev/null
@@ -0,0 +1,100 @@
+burgers: 5255 9606 6854 1356 3453 6060 6651 8386 2916 4925 1685 5568 5043 1341 1855 5374 9919 4121 1107 981 2247 6914 9591 8325 3013 9898 7498 4325 8663 5286 8192 3421 9953 2487 5797 9641 6420 1121 6182 5402 9380 4149 6956 48 5817 7124 5322 2494 4953 9517
+01: 39 50 19 49 42 40 41 4 36 48 13 47 46 44 16 46 42 20 21 45 33 8 13 43 30 42 4 40 37 8 10 3 4 39 37 13 14 37 2 34 33 30 32 33 32 3 16 32 27 30 23 19 20 29 25 6 19 13 14 25 11 23 20 10 11 22 15 20 1 19 16 1 16 18 16 17 7 6 7 4 5 16 12 9 10 13 10 2 5 11 9 4 7 10 8 5 1 9 4 8 7 6 3 7 4
+02: 1 50 47 43 45 5 3 49 48 33 43 24 25 14 16 48 2 44 43 4 5 43 3 41 33 40 8 38 14 4 14 37 27 36 15 11 12 35 24 17 18 33 29 31 3 30 22 29 13 28 23 21 12 26 15 25 16 14 19 3 7 24 21 18 4 2 14 8 8 22 17 21 10 20 16 17 9 16 15 14 15 9 12 15 8 5 6 9 5 2 4 7 4 1 2 4 2 1 2 1
+03: 44 50 17 49 35 48 25 47 45 28 38 46 37 45 30 29 30 43 21 1 8 41 40 7 8 40 34 12 13 38 26 24 25 35 24 17 21 12 14 12 13 7 8 33 4 30 12 29 25 28 21 27 15 9 10 26 22 24 19 23 21 18 19 22 15 20 18 19 13 18 14 17 16 15 3 13 3 11 10 2 7 10 6 3 4 9 4 2 4 3 4 3 4 5 2 1
+04: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 30 14 15 42 27 40 29 17 23 39 34 38 25 10 14 36 21 35 29 27 28 17 21 34 31 21 25 33 30 31 20 27 17 26 13 25 18 24 1 23 22 7 15 8 9 22 2 20 19 1 3 19 18 5 10 18 16 17 15 14 15 12 13 9 10 16 7 3 4 1 2 10 2 8 3 6 1 5 3 4
+05: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 41 28 29 41 39 21 23 7 23 39 34 38 33 37 34 36 34 35 24 33 24 32 30 31 20 2 3 30 28 19 27 28 7 27 21 26 22 8 14 6 7 25 10 9 22 12 14 13 14 23 19 14 15 19 13 16 13 2 13 15 8 12 9 8 9 11 8 3 5 8 4 3 4 2 3 5 2
+06: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 37 11 12 41 20 10 19 39 30 38 30 37 14 36 34 33 20 35 30 34 30 33 29 19 27 17 20 32 30 31 24 29 19 26 23 19 20 25 21 14 15 23 17 14 15 13 14 21 10 18 10 6 8 17 14 11 12 7 11 14 11 8 9 13 8 9 7 1 4 8 7 3 5 7 2
+07: 33 50 34 49 7 48 45 21 27 47 17 46 12 45 28 44 22 16 17 16 17 43 36 5 15 40 37 39 18 38 30 37 5 36 34 4 11 35 34 26 16 34 26 11 19 33 30 31 15 30 25 16 23 29 23 18 19 26 13 5 6 23 11 21 13 7 8 20 11 18 10 8 9 17 14 1 4 15 13 8 11 14 3 13 11 4 10 12 5 9 5 3 5 8 7 2 4 7 2 1 3 2 1 2 1
+08: 33 50 34 49 7 48 45 21 27 47 35 18 19 46 39 44 40 23 31 43 22 41 23 13 19 40 39 20 21 39 34 36 27 34 4 33 12 32 23 16 20 8 9 31 27 29 26 19 20 14 5 27 17 26 22 14 15 25 3 23 21 6 1 21 18 13 17 20 19 8 5 19 11 18 7 17 15 13 14 12 13 16 13 7 12 11 12 11 6 9 5 7 3 6 5 3 2 5 3 4 1 3 2
+09: 45 50 42 49 35 48 37 19 33 47 34 46 28 26 27 44 34 29 30 42 33 40 33 39 5 38 35 24 25 9 10 37 13 34 1 33 19 15 19 5 8 7 8 32 13 30 26 29 15 28 25 17 18 27 10 25 14 11 23 11 13 24 10 9 14 2 6 23 16 11 7 3 21 11 13 21 20 15 18 15 16 14 16 20 12 2 7 12 11 6 8 11 7 5 2 7 6 5 6 3 4 3 4 6 2
+10: 33 50 34 49 30 23 24 48 15 46 20 45 39 44 35 43 34 42 27 41 31 2 13 40 38 27 28 39 33 37 34 36 12 34 30 33 5 32 31 26 21 31 12 5 6 30 12 28 21 27 23 26 6 25 24 22 23 17 18 24 15 21 14 20 9 19 16 18 5 16 15 7 8 14 12 2 3 12 7 9 7 8 4 6 3 5 4 1 1 4 2 1 3
+11: 23 50 29 22 23 49 47 34 1 47 33 22 23 16 19 15 16 5 6 46 42 43 11 41 37 39 33 23 33 14 25 38 14 37 29 28 29 23 25 36 35 20 22 35 30 7 9 30 27 10 21 27 19 26 17 25 24 13 18 24 21 23 11 9 10 7 9 22 15 18 13 17 8 14 7 5 4 13 11 12 9 11 2 10 4 9 7 5 2 7 5 6 3 5 2 4 2 1 2 1
+12: 33 50 34 49 7 48 45 21 27 47 35 18 19 46 39 44 40 23 31 43 37 15 16 41 39 37 38 39 34 36 9 35 34 17 30 34 30 33 12 32 30 31 24 30 29 2 7 29 25 19 21 28 27 22 24 17 18 27 13 25 12 24 19 23 17 8 11 7 8 22 7 20 18 15 17 19 11 14 3 13 3 12 3 11 10 2 7 10 7 9 4 8 1 7 1 5 2 4 2 3 1
+13: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 16 43 34 42 19 41 27 40 39 38 39 35 36 35 9 39 36 38 37 23 32 19 23 37 34 36 30 31 6 30 28 14 19 7 8 29 24 11 23 19 20 27 15 25 17 7 8 1 7 22 17 21 11 19 8 18 17 7 8 17 12 8 9 15 13 9 10 3 4 13 3 9 7 3 7 8 7 5 6 5 6 7 3 4
+14: 33 50 34 49 7 48 19 47 43 46 40 34 35 14 30 45 39 44 35 43 37 18 34 31 6 40 37 39 11 38 35 28 30 24 25 21 22 17 5 37 34 36 35 29 35 26 34 24 28 35 24 30 7 2 1 28 27 14 24 23 12 27 15 26 15 4 5 25 22 12 13 23 21 2 11 21 15 6 13 20 18 19 15 6 7 18 15 8 1 15 3 2 14 12 9 11 10 8 12 9 7 8 7 8 7 8 11 7 5 1 6 1 5 4 3 4 3 4 3 4 3
+15: 48 50 40 49 32 48 11 47 31 46 30 45 42 18 39 44 39 42 27 41 31 39 25 38 37 23 24 23 24 37 8 34 29 33 20 32 19 31 27 12 25 30 23 29 25 14 24 28 19 15 16 13 14 27 23 13 16 23 1 22 18 4 17 21 16 8 9 18 4 15 11 1 11 14 10 8 9 13 6 11 7 3 4 3 4 10 1 7 3 5 2 4 2 3 2 1
+16: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 41 28 29 41 34 2 16 39 34 38 33 37 34 36 32 34 30 33 24 32 30 31 12 30 23 16 17 8 9 29 7 26 22 25 23 4 10 24 19 10 18 21 17 10 11 20 16 7 8 18 9 14 12 13 7 12 10 1 11 9 8 1 10 9 5 6 9 8 4 5 1 3 8 5 3 5 3 4 3 4 5 2 1
+17: 33 50 34 49 30 23 24 48 27 12 13 46 40 35 9 44 40 37 40 21 35 43 30 41 2 39 38 12 37 38 34 36 30 35 15 34 30 33 15 32 30 31 26 12 21 14 15 30 21 28 8 26 24 15 21 25 21 24 21 18 19 7 18 21 14 20 17 19 9 15 13 2 3 14 5 12 8 11 1 9 5 2 3 1 2 8 6 4 5 2 4 6 5 2 3 5 2
+18: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 13 41 1 40 34 17 2 39 38 18 21 19 20 19 10 38 33 37 34 36 35 32 35 10 14 35 32 13 16 32 30 31 25 28 21 5 6 27 13 24 14 23 21 20 11 21 11 20 18 7 12 5 6 19 9 16 12 15 13 5 7 12 11 6 8 11 6 7 3 6 5 3 5 4 1 5 1 4
+19: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 39 21 24 43 11 42 40 12 32 41 22 40 37 24 26 10 11 38 36 11 17 36 31 16 17 15 16 13 14 33 26 8 20 27 18 26 24 17 21 25 22 24 17 4 14 21 12 7 8 20 16 17 13 16 10 15 13 5 9 14 11 6 7 6 7 13 6 9 4 2 3 8 3 6 5 2 3 4 1
+20: 33 50 34 49 7 48 19 47 43 46 40 34 35 14 30 45 39 44 35 43 28 40 37 39 36 38 20 37 30 26 27 23 24 19 20 18 19 36 27 18 23 31 27 9 19 30 21 29 19 26 19 25 3 24 22 1 11 23 14 11 12 22 13 12 13 9 10 19 15 3 13 16 2 15 5 14 12 8 10 5 6 12 7 4 2 8 6 7 4 6 3 5
+21: 39 50 17 49 45 15 20 48 37 47 35 46 25 45 38 34 35 13 14 44 37 17 18 41 35 22 28 39 37 29 30 15 16 38 33 16 17 35 31 24 25 32 24 30 26 20 5 29 25 28 12 27 15 26 11 25 21 15 16 24 20 22 14 21 20 13 14 20 8 18 6 17 2 16 15 10 15 11 13 15 14 9 12 14 12 13 10 7 8 10 4 3 4 8 6 4 5 6 2 1 2 3
+22: 33 50 34 49 7 48 45 21 27 47 17 46 40 34 36 24 31 45 39 44 31 15 16 13 14 40 33 10 24 14 18 37 34 36 30 34 30 33 30 31 4 30 29 6 8 29 28 11 16 15 16 28 25 21 25 26 25 19 20 25 10 6 7 23 20 21 3 20 19 3 1 19 3 18 4 17 13 16 6 14 9 1 2 13 4 2 7 4 6 11 5 10 2 9 6 4 7 2 6 7 5 6 4 3 4 5 3 2
+23: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 16 6 10 4 5 43 11 41 8 40 34 12 13 10 29 18 24 39 36 38 13 11 20 7 11 34 20 33 28 32 25 13 23 31 13 30 25 15 20 29 26 28 21 25 24 22 23 16 17 12 13 12 13 24 13 19 17 18 6 16 12 2 9 15 10 13 8 10 8 9 5 8 7 6 7 6 7 5 1 7 6 1 6 5
+24: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 44 39 40 37 38 22 35 44 19 41 28 7 24 40 35 21 22 39 30 34 24 33 14 32 17 31 26 19 20 17 18 17 18 30 23 22 23 26 21 24 14 22 12 21 19 5 14 9 10 20 11 6 5 18 16 17 15 12 14 11 13 5 7 16 11 4 6 11 10 8 9 10 6 3 5 4 5 6 1
+25: 14 50 41 49 47 22 32 48 14 47 45 27 41 46 42 45 36 33 34 43 31 40 25 11 18 39 33 38 8 5 5 35 33 34 33 28 29 25 26 33 30 14 4 30 29 9 10 29 27 15 21 15 21 27 22 26 9 24 21 20 21 23 21 11 17 7 9 21 14 9 10 18 11 15 5 14 10 6 10 9 4 13 12 9 1 12 11 7 7 11 9 10 7 2 4 7 4 2 3 2
+26: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 22 44 35 43 14 42 40 13 21 41 20 40 38 25 32 39 10 37 33 27 29 36 30 33 23 32 12 4 5 31 19 29 26 28 17 27 16 26 23 6 20 25 23 24 21 23 20 22 8 21 17 20 13 19 3 18 9 17 13 16 12 5 4 13 10 12 8 6 11 4 6 11 5 10 7 9 8 6 8 3 6 8 7 6 7 6
+27: 27 50 34 21 31 24 25 49 39 47 40 16 35 45 41 34 35 44 32 42 27 41 34 30 34 40 38 39 28 36 10 9 10 35 33 27 7 33 15 32 20 31 29 13 20 30 28 8 10 29 28 21 22 28 22 25 9 23 21 22 9 21 16 14 16 15 16 11 12 20 13 15 3 1 2 1 2 14 3 12 10 8 9 8 6 11 7 10 6 9 7 5 6 5 6 8 4 5 4 3 4 3 4 3
+28: 39 50 28 49 45 30 31 28 29 17 18 48 18 44 27 1 17 43 28 42 39 40 14 13 14 39 12 37 34 36 30 35 13 34 28 4 28 33 22 32 20 31 27 16 2 29 28 10 19 28 22 27 25 16 23 15 22 26 20 25 19 22 15 12 1 18 10 16 14 15 8 6 8 13 10 3 5 10 9 3 2 9 5 8 5 7 3 5 1 2 1
+29: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 22 44 35 43 14 42 40 13 21 41 20 40 38 25 32 39 33 23 24 37 22 16 17 13 14 34 30 31 19 30 7 29 5 28 19 27 14 26 21 4 5 25 2 23 6 22 17 21 9 4 1 20 17 19 14 17 15 16 11 15 13 14 9 13 10 12 6 11 9 10 3 9 8 6 7 5 7 8 4 7 5 2 5 6 2 1
+30: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 22 44 35 43 39 17 26 42 40 22 24 41 37 18 22 38 35 23 27 37 34 36 30 33 11 31 23 30 29 13 23 29 24 14 15 28 25 6 21 26 14 12 13 25 15 5 15 23 14 22 10 20 13 3 4 19 16 3 7 17 14 3 4 16 13 4 11 13 6 12 10 7 10 11 6 5 6 7 5 4 2 3 1
+31: 33 50 34 49 30 23 24 48 15 46 40 15 21 45 40 30 31 22 23 44 37 7 37 40 13 39 37 21 36 38 26 23 24 37 34 29 16 35 20 17 18 34 14 11 28 14 18 32 8 7 5 3 13 31 30 20 21 20 21 20 1 30 13 7 8 1 5 29 12 24 20 19 20 17 18 10 11 23 15 12 13 19 16 15 16 4 5 17 14 7 9 2 4 14 11 10 11 10 3 11 9 6 9 4 6 10 9 5 6 9 3 2 3 1
+32: 33 50 34 49 30 23 24 48 27 12 13 46 44 16 31 44 25 20 21 43 40 25 27 41 16 38 37 36 37 31 6 37 33 29 30 17 18 6 7 36 25 32 11 9 11 7 8 31 25 18 4 27 26 10 15 26 22 18 5 25 20 24 11 23 12 22 17 14 15 20 8 4 5 18 14 13 14 13 8 16 10 15 8 13 12 8 9 8 9 12 6 9 5 8 3 7 6 4 6 5
+33: 33 50 34 49 7 48 45 21 27 47 35 18 19 46 39 44 10 43 34 27 31 11 6 42 37 16 17 41 39 19 38 39 15 38 23 37 34 36 12 33 29 26 27 8 19 32 30 31 24 30 1 26 4 25 13 24 14 23 12 9 10 22 19 14 16 20 13 19 15 18 16 13 14 17 7 15 5 14 12 4 5 12 4 10 7 1 2 7 3 5 4 2 3 4 1
+34: 9 50 44 49 47 32 38 48 45 47 20 46 26 45 21 44 43 26 6 43 40 29 37 16 21 16 18 42 38 24 32 39 32 38 35 33 34 36 4 33 29 32 26 31 7 30 26 3 11 29 18 28 7 27 24 4 5 26 23 4 2 24 6 23 18 6 15 22 14 4 8 21 18 4 5 20 11 16 8 15 8 5 6 14 9 7 8 6 7 4 5 12 4 2 3 7 1 4 3 2 3 1
+35: 19 50 38 49 33 48 23 47 42 46 20 17 18 45 14 43 32 42 14 41 24 40 38 39 29 23 24 19 20 38 31 35 6 34 33 13 22 33 28 18 19 32 30 20 21 11 12 30 10 27 24 26 24 17 18 25 19 23 17 15 16 22 17 16 17 20 15 18 13 10 11 17 3 15 2 14 3 13 12 3 4 12 10 5 1 10 4 1 3 2 3 9 6 3 3 7 6 4 2 6 5 1 4 5 1
+36: 33 50 34 49 7 48 45 21 27 47 17 46 12 45 28 44 22 16 17 16 17 43 22 40 30 14 15 39 30 37 26 21 22 36 30 34 30 33 27 7 11 32 29 5 10 31 27 17 18 30 23 26 20 10 11 25 1 23 12 22 17 21 15 2 9 20 17 19 16 7 8 18 14 9 15 8 14 10 3 1 12 10 11 7 10 7 9 5 8 7 5 4 1
+37: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 40 3 15 41 30 40 27 38 30 37 34 36 30 35 30 34 30 33 18 32 30 31 18 30 3 29 27 16 12 28 20 7 9 27 19 6 7 24 5 2 3 1 2 22 7 20 15 19 18 11 17 8 11 18 16 13 15 17 2 11 10 2 4 9 8 2 7 8 5 4
+38: 33 50 34 49 34 4 28 48 25 47 40 22 38 45 39 44 35 43 33 41 28 40 14 39 3 38 23 37 29 19 20 18 19 36 24 20 21 33 30 31 14 30 22 10 20 29 20 28 16 26 22 25 13 23 4 22 12 21 2 20 19 1 16 19 13 18 15 17 13 16 9 15 13 14 11 13 1 12 9 11 5 9 2 8 6 3 4 1 3 6 2 1 3 2 1 1 2 1
+39: 9 50 25 49 37 24 25 48 41 10 25 46 41 45 39 44 41 35 36 43 24 40 31 21 22 39 37 31 34 11 33 37 22 36 32 35 21 34 31 22 30 33 30 25 13 31 21 9 16 30 14 27 13 26 23 25 18 24 22 20 22 4 19 23 16 12 13 22 17 8 16 20 13 19 8 17 15 16 12 15 12 14 6 13 11 9 5 12 8 2 7 8 4 7 1 5 4 1 4 3 1 1 2 1
+40: 33 50 34 49 7 48 45 21 27 47 35 18 19 46 39 44 40 23 31 43 37 15 16 41 39 37 38 39 34 36 31 22 23 35 30 33 20 32 20 5 10 31 27 30 26 28 20 27 17 13 16 26 24 25 20 9 15 23 20 9 10 9 10 22 18 12 2 19 18 3 12 18 8 5 7 14 11 2 5 11 10 7 8 10 8 2 5 8 6 4 5 4
+41: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 26 41 5 40 37 39 12 38 32 18 31 29 30 27 28 37 30 34 30 33 20 32 11 31 23 19 20 7 8 30 26 13 20 27 11 9 10 26 22 15 20 24 21 23 5 20 18 7 17 19 14 18 12 17 12 11 12 16 14 6 13 12 1 14 2 12 11 5 11 7 8 11 6 9 5 3 4 3 4 8 4 5 2 1 2 3 1
+42: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 13 41 32 4 32 40 19 39 16 38 33 37 34 36 34 35 9 34 22 33 30 31 18 10 4 30 20 29 9 28 14 27 9 26 17 25 17 24 19 23 4 22 19 8 5 21 18 20 6 19 18 6 12 9 10 18 13 16 15 8 9 8 9 15 10 6 7 11 8 2 7 9 5 8 5 2 3 5 3 2 3 2
+43: 13 50 40 49 7 48 32 47 41 46 25 45 40 36 37 44 25 10 11 42 40 6 9 40 13 39 30 20 23 10 15 38 35 17 18 37 32 13 14 33 28 11 12 30 27 19 25 12 20 28 14 27 26 10 20 26 22 17 18 24 19 21 11 20 12 7 12 18 14 16 11 3 10 13 7 12 9 5 6 5 6 10 7 3 4 1 2 7 5 1 5 1 4 1 3
+44: 33 50 34 49 34 4 28 48 25 47 43 29 41 45 39 44 13 43 39 21 31 42 33 41 2 39 38 12 17 38 35 37 36 21 27 15 16 36 26 34 30 33 7 32 30 31 29 30 22 29 7 28 24 3 14 27 17 26 23 7 12 24 21 9 10 23 19 21 11 20 16 19 2 18 17 1 10 17 6 16 2 14 13 5 7 12 11 9 11 8 9 11 9 8 9 7 8 7 8 9 3 2 3 2 3 2
+45: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 16 43 34 42 40 35 14 41 29 22 24 40 25 37 34 36 20 35 30 33 9 32 30 16 8 31 30 21 11 30 25 29 13 9 10 28 23 8 9 26 22 24 19 23 7 4 5 22 19 20 11 1 1 19 10 18 9 17 16 9 10 7 6 16 13 6 11 8 10 15 9 6 1 12 8 3 7 4 7 11 1 7 4 1 4 5 4 3
+46: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 44 39 40 37 38 22 35 44 37 18 19 41 35 33 34 39 31 20 31 16 17 13 14 34 30 31 19 30 17 29 25 7 22 21 22 28 18 26 25 17 22 25 21 24 20 22 6 21 19 20 19 9 10 19 8 17 14 15 3 14 12 7 9 8 9 12 10 3 8 10 6 4 5 9 5 3 4 2 1 5 3 4 2 1 2 3 1
+47: 33 50 34 49 34 4 28 48 25 47 40 22 38 45 39 44 35 43 33 41 37 13 36 32 33 40 29 24 25 38 34 36 34 35 5 34 31 4 6 33 32 15 18 32 30 31 10 28 18 27 22 26 19 15 16 25 11 8 9 23 18 21 5 20 19 18 19 15 17 18 17 10 2 17 16 5 15 16 11 7 8 15 10 2 4 10 9 4 7 9 3 8 7 6 7 1
+48: 36 50 31 49 46 16 24 48 41 47 6 45 42 7 40 44 16 43 35 20 21 17 18 42 18 39 36 38 4 37 34 24 8 36 29 21 22 2 7 35 31 34 20 31 17 6 7 30 24 13 22 12 21 28 20 27 24 25 19 24 20 22 1 21 5 20 15 19 10 6 9 18 16 17 13 4 5 15 11 13 10 4 10 12 7 1 5 10 7 9 3 7 1 6 5 3 5 3 1 5 2 4 3 1 2 3 1
+49: 26 50 2 49 48 41 47 48 45 39 40 38 39 8 9 47 43 41 42 17 37 30 31 43 40 41 33 40 35 10 15 39 35 30 31 38 32 29 30 22 23 35 30 24 27 26 27 30 1 27 17 2 13 11 12 26 18 23 7 6 7 22 11 6 10 6 13 6 14 19 5 18 15 17 4 3 4 3 4 15 12 9 12 11 7 12 6 11 5 3 4 3 4 3 1 10 9 6 4 9 7 3 1 8 7 5 6 5 2 7 6 2 3 2 3 6 3 2 3 1
+50: 28 50 29 49 20 48 15 47 37 21 3 46 44 22 23 45 35 14 18 43 40 42 31 21 23 40 39 4 5 39 35 13 27 36 34 35 24 10 11 34 23 15 21 15 16 14 7 31 26 20 24 9 14 30 26 16 17 27 23 13 16 10 11 24 21 22 8 18 12 17 16 7 9 16 15 11 13 9 11 14 11 7 11 10 8 5 6 8 1 2 1
+51: 8 50 10 49 45 23 33 48 11 47 40 38 39 17 18 46 41 21 28 43 37 41 28 39 22 14 15 38 27 26 27 21 22 10 11 36 26 23 26 32 27 22 31 3 25 31 28 30 9 29 26 18 24 19 21 28 21 16 17 9 11 25 14 20 17 19 10 18 17 5 6 17 6 2 4 2 3 15 11 13 8 12 10 11 8 7 6 10 5 8 3 7 5 1 4 5 3 2 3 4
+52: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 39 26 27 18 19 44 33 41 38 11 37 39 29 38 14 37 25 9 11 36 8 33 26 1 14 32 17 31 17 4 6 30 18 27 10 26 4 25 22 14 9 24 22 11 13 11 12 23 15 8 11 19 17 18 2 16 6 15 11 14 13 5 12 13 11 12 8 11 9 6 7 9 8 4 5 3 5 8 4 7 3 1 6 5 3 2 5 4 1 2 4 2 1 2 1
+53: 33 50 34 49 30 23 24 48 15 46 20 45 39 44 35 43 39 21 36 18 21 42 7 41 36 18 1 40 37 5 32 27 28 39 34 36 34 35 30 34 30 33 3 30 29 5 8 29 11 28 22 27 23 26 19 17 3 25 24 7 16 24 2 22 21 4 10 21 12 20 15 13 1 19 15 4 4 18 8 17 16 8 1 16 9 2 8 6 8 15 9 6 8 5 6 12 6 8 6 7 5 2 4 6 2 5 1 4 3 1 3 1 2 1
+54: 33 50 34 49 34 4 28 48 25 47 3 45 37 44 35 43 21 42 13 41 12 40 30 11 12 39 32 37 7 4 5 36 6 34 29 9 5 33 29 32 31 9 30 31 24 14 15 30 19 28 26 13 4 27 20 25 18 23 19 22 11 21 18 20 7 18 14 3 4 17 15 6 11 15 11 14 12 2 3 12 9 6 8 10 3 9 8 4 7 8 6 7 2 1 2 5
+55: 33 50 34 49 30 23 24 48 27 12 13 46 40 35 36 27 28 44 40 39 40 11 12 41 37 25 35 38 31 27 28 37 17 35 20 10 15 34 30 33 31 7 16 31 28 25 26 30 18 27 25 26 7 25 5 24 22 23 21 19 3 22 20 14 9 21 7 20 17 4 5 19 16 10 15 17 6 16 4 15 11 14 8 13 12 11 10 9 2 8 5 6 4 3 4 5 1
+56: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 30 14 15 42 34 7 8 40 34 38 26 37 20 13 14 12 13 36 30 33 32 4 18 32 30 31 20 16 17 30 20 27 21 17 4 26 25 18 19 18 19 17 19 25 19 7 16 20 13 4 11 19 13 18 8 4 5 16 3 14 3 13 12 4 5 12 2 1 9 8 5 5 8 6 3 4 6 3 4 3 2 3 1
+57: 41 50 10 1 2 49 39 29 2 47 37 46 28 45 38 12 30 44 27 43 36 41 39 21 22 17 18 40 35 18 31 37 3 36 34 19 23 35 6 33 29 32 31 24 29 15 27 31 9 30 24 6 19 29 17 28 23 20 21 18 20 26 19 10 14 22 20 12 13 21 16 13 14 17 15 13 14 15 8 13 11 6 7 12 8 10 8 3 7 9 6 4 5 4 5 8 4 2 3 4 3 2 3 2 3 2
+58: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 37 11 12 41 20 10 19 39 32 10 8 38 34 18 28 15 17 37 30 34 30 33 9 31 30 18 26 13 14 30 9 28 22 19 20 15 17 27 20 14 15 23 13 9 12 4 5 21 18 4 8 19 16 18 8 4 5 4 5 2 3 15 10 4 8 12 8 10 7 9 5 3 4 7 4 2 4 5 2 1
+59: 26 50 46 38 44 42 43 49 43 47 37 45 31 44 32 20 21 43 28 41 22 40 34 39 38 9 7 38 20 37 27 36 12 6 7 35 32 23 29 33 22 32 19 31 1 30 18 10 14 29 27 28 19 14 26 27 15 26 25 15 1 25 11 5 8 24 20 22 21 13 20 21 1 20 15 19 10 18 14 6 7 17 15 12 15 6 9 8 9 15 12 13 10 6 8 10 2 9 8 2 4 3 4 5 1
+60: 33 50 34 49 7 48 45 21 27 47 17 46 40 34 6 45 44 32 35 13 14 44 37 39 37 11 17 38 24 37 5 36 34 33 34 18 20 17 18 7 8 35 15 32 30 31 26 22 25 30 1 26 13 11 20 7 19 25 16 24 16 6 9 23 3 22 3 20 8 3 1 18 16 17 11 15 13 14 7 12 5 2 2 11 10 7 8 2 3 10 6 4 5 2 3 2 3 7 1 4 1 3
+61: 18 50 39 49 42 48 11 47 8 46 39 5 27 45 33 44 3 43 6 42 39 3 30 41 24 40 33 39 37 15 32 38 22 37 31 34 23 20 23 33 31 32 21 16 17 30 15 28 17 27 15 26 3 25 23 3 23 24 15 23 18 22 21 17 7 21 20 15 17 20 3 16 15 12 13 14 12 7 5 12 10 11 8 9 6 4 5 8 4 1 2 4 2 1 2 1
+62: 28 50 48 31 35 49 46 48 40 22 30 46 19 45 7 44 42 5 6 43 39 5 11 41 39 40 24 39 30 38 29 27 14 37 35 23 26 36 34 26 33 34 28 33 15 30 24 19 22 29 28 21 22 28 16 26 19 25 7 24 23 18 19 7 8 23 18 20 16 19 14 12 13 18 10 7 8 7 8 16 12 5 7 13 12 9 10 9 10 9 10 12 4 7 5 6 2 5 3 4 3 2
+63: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 12 44 40 19 30 20 21 20 21 43 18 40 26 12 17 11 12 39 34 36 11 34 30 33 29 32 30 24 29 31 27 30 14 28 19 11 12 27 19 25 14 24 19 23 7 21 16 20 17 19 8 18 15 8 11 8 9 17 14 15 3 13 12 8 9 3 4 12 9 2 9 8 6 7 5 6 2 5 3
+64: 18 50 23 49 34 48 43 13 35 47 19 46 38 45 40 44 26 43 30 42 37 36 26 41 18 40 39 10 13 6 7 39 36 11 29 36 12 35 26 34 8 33 30 32 20 31 7 30 26 13 2 28 27 9 18 27 11 7 8 4 5 23 20 16 19 20 14 18 14 17 15 16 10 15 6 1 2 14 8 1 12 5 3 7 5 11 1 9 8 6 7 3 2 3 5 3 1 2 3
+65: 13 50 47 42 32 49 18 48 37 7 8 47 42 32 33 45 42 17 31 43 41 27 28 42 39 16 20 40 37 14 22 39 32 38 18 35 29 13 14 34 25 12 13 32 28 21 22 3 11 29 22 13 14 28 23 19 14 23 9 22 18 21 2 20 19 5 13 19 15 9 10 18 14 8 10 4 5 16 14 7 11 14 4 13 11 5 11 12 10 11 2 6 2 5 3 2 3 1
+66: 33 50 34 49 7 48 19 47 43 46 12 45 39 20 21 12 13 44 40 36 7 41 36 26 35 40 37 39 15 37 36 22 6 36 4 35 31 34 13 33 28 32 30 31 25 30 15 10 4 29 27 26 27 21 26 11 15 28 25 22 23 17 21 20 21 26 5 24 21 9 19 13 17 23 20 22 9 17 9 2 6 16 8 5 3 11 8 10 3 1 2 8 6 1 6 1 5 1 3 2 1 2 1
+67: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 22 44 35 43 14 42 20 41 38 31 37 29 30 39 33 28 29 37 14 34 28 10 12 33 32 12 15 32 30 31 22 28 25 23 24 8 15 9 14 27 23 9 10 26 18 4 6 23 22 16 17 9 10 22 16 11 13 6 7 17 8 15 3 14 9 13 10 6 9 12 10 7 8 11 5 8 7 1 2 7 4 2 3 1 3 5 2 1 2
+68: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 44 39 40 37 38 22 35 44 19 41 28 7 24 40 35 21 22 39 30 34 24 33 31 29 30 19 1 32 30 31 4 30 28 13 24 16 3 29 27 8 15 28 3 26 4 25 22 11 12 7 9 24 14 6 9 3 4 20 17 5 17 18 7 16 14 10 12 14 7 5 6 13 8 5 8 11 6 1 5 4 5 7 1 4 2 1 3 2 1 2
+69: 33 50 34 49 34 4 28 48 25 47 40 22 38 45 39 44 35 43 33 41 37 13 36 32 33 40 29 24 25 38 34 36 34 35 5 34 26 33 20 32 26 11 16 31 27 8 9 30 26 11 19 27 11 26 20 25 23 5 16 24 20 23 21 8 15 21 18 20 4 19 12 18 9 17 8 16 12 15 6 13 12 9 10 12 10 5 9 10 9 4 5 9 6 7 1 5 4 1 3 2 3 4 2 1
+70: 33 50 34 49 7 48 45 21 27 47 35 18 19 46 39 44 40 23 31 43 22 41 23 13 19 40 19 39 33 23 33 38 34 36 31 20 21 34 30 31 12 30 23 29 20 28 21 27 21 26 24 17 21 25 11 24 15 5 12 23 17 22 7 20 19 8 13 12 13 19 6 17 7 16 12 9 10 15 13 4 10 13 3 12 6 4 3 9 6 8 1 7 3 2 6
+71: 24 50 40 21 22 49 13 47 39 14 20 46 41 33 9 45 38 29 22 44 25 43 42 14 25 42 33 26 28 18 19 41 23 39 1 38 26 36 11 1 2 35 29 33 29 32 3 31 4 30 28 25 19 29 20 28 22 27 17 26 21 12 13 25 20 14 19 11 12 11 12 23 17 20 16 6 13 12 13 18 11 16 6 14 4 13 9 12 4 1 2 11 4 9 6 3 6 5 6 8 3 1
+72: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 34 20 23 44 31 8 3 40 38 21 29 22 23 20 21 15 17 39 30 34 32 28 12 33 8 32 29 14 29 21 22 31 4 29 27 12 15 28 27 25 5 27 11 26 22 18 19 25 19 11 19 23 7 22 3 21 19 20 16 13 15 11 15 7 8 7 8 19 8 6 7 6 9 5 9 11 6 4 9 4 2 6 5 1
+73: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 41 28 29 41 34 2 16 39 34 38 33 37 34 36 32 27 32 8 10 7 8 34 16 32 30 31 2 30 29 13 23 11 12 29 8 27 20 26 13 8 8 25 22 24 15 21 15 20 15 19 16 7 8 18 15 16 12 8 10 8 9 15 13 6 10 13 10 12 6 2 9 5 2 1 7 6 4 5 3 4 3 4 3 4 6 2
+74: 10 50 48 42 43 49 21 47 7 46 12 45 44 33 6 44 11 43 40 32 35 24 13 42 32 10 15 41 38 18 19 39 27 9 16 8 9 35 32 8 9 33 28 13 18 31 27 30 4 3 4 3 4 27 24 17 23 10 17 24 22 23 5 22 20 21 5 20 18 4 9 8 9 19 14 12 13 10 11 7 10 9 10 17 14 15 4 3 4 10 7 4 5 4 5 8 3 1 1 5 4 1 4 3 1 2 1
+75: 26 50 43 49 29 48 38 47 3 46 45 31 34 45 2 44 43 3 11 9 10 43 41 21 33 41 30 40 15 38 32 20 21 37 20 15 16 34 5 32 7 31 28 17 18 30 28 6 18 15 17 28 24 25 21 24 19 16 17 23 17 20 13 19 17 10 16 17 12 6 7 16 13 2 7 13 9 8 9 11 6 3 8 6 7 4 6 5 3
+76: 33 50 34 49 34 4 28 48 25 47 43 29 41 45 39 44 13 43 9 42 40 8 16 41 34 29 30 40 35 37 36 11 26 36 27 35 31 20 21 17 18 34 2 31 18 30 21 10 1 29 20 9 12 3 5 28 1 25 21 14 15 12 11 23 21 19 20 11 12 11 12 22 14 18 12 16 6 15 14 4 7 14 12 9 10 3 5 13 12 6 1 12 10 5 11 2 1 6 1 4 3
+77: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 26 45 34 20 23 44 31 8 3 40 38 21 29 22 8 39 31 38 24 19 20 37 31 23 5 35 31 30 11 34 30 7 8 33 30 31 27 13 14 2 3 30 22 1 27 6 26 22 25 24 19 24 6 21 24 21 23 12 22 12 20 10 5 7 19 5 15 10 14 6 13 11 9 11 3 1 11 9 3 7 4 6 10 5 6 4 5 4 3 1
+78: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 39 26 27 18 19 44 33 41 2 39 38 29 19 38 20 37 33 10 19 36 32 35 26 34 24 19 20 33 8 31 18 30 26 29 27 28 21 27 11 26 23 18 20 25 12 24 8 22 19 7 12 21 17 20 4 18 6 17 15 16 6 14 13 12 9 11 8 5 6 4 3 9 5 8 3 7 3 6 4 5 2 3 2
+79: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 16 43 34 42 19 41 35 27 19 40 24 4 18 39 26 38 36 7 31 36 8 34 21 33 18 32 26 13 14 31 24 28 17 27 23 16 17 26 22 24 19 6 13 9 10 23 16 11 12 10 11 21 17 15 16 9 10 16 10 3 8 12 8 11 9 8 7 2 4 7 4 1 3 2 3 4 2 1
+80: 33 50 34 49 34 4 28 48 25 47 3 45 37 44 35 43 21 42 30 17 18 41 30 39 11 38 37 29 36 24 25 16 3 37 21 36 15 35 30 33 24 21 22 11 12 10 11 32 26 18 4 28 27 22 6 27 16 26 20 15 19 15 16 25 21 23 16 14 7 21 19 15 16 15 16 13 15 20 4 15 8 14 10 13 8 12 9 10 9 4 8 9 3 8 7 2 5 7 3 2 1 3 2
+81: 27 50 38 49 45 38 3 48 46 32 41 29 30 47 23 45 40 1 29 44 34 43 36 13 30 42 32 41 35 39 18 16 17 37 34 35 25 34 19 33 29 21 22 32 29 14 18 30 27 14 21 29 23 15 16 28 1 24 14 23 10 4 6 21 17 4 15 18 8 17 15 5 14 15 11 14 12 5 9 13 10 12 9 2 3 9 3 1 1 6 5 1 3 2 3 5 1 3 2 1 2 1
+82: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 16 43 39 29 24 42 19 41 37 40 33 22 29 39 13 5 6 38 36 8 31 36 8 34 32 28 29 2 14 33 19 32 19 31 27 6 15 30 23 28 27 17 19 17 4 27 20 26 16 25 17 8 9 24 16 8 9 22 7 20 16 19 18 7 9 8 9 18 9 16 11 9 5 14 13 4 10 13 9 7 8 7 8 10 7 5
+83: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 13 41 32 4 32 40 19 39 16 38 33 37 34 36 34 35 9 34 27 4 6 33 32 7 8 6 7 32 28 23 27 9 21 28 21 27 14 26 24 15 21 25 22 20 21 14 1 23 9 22 19 10 18 15 16 15 16 21 12 8 9 8 9 18 11 9 10 14 11 12 1 11 2 10 9 6 8 5 6 9 7 6 1 7 6
+84: 33 50 34 49 30 23 24 48 33 6 19 46 34 45 39 21 24 43 41 19 31 42 38 15 16 41 33 31 11 39 37 31 37 27 36 38 30 33 30 31 4 30 29 19 27 29 26 21 26 18 19 27 22 20 3 25 24 4 20 24 9 21 19 9 1 19 16 3 8 18 17 5 12 11 12 17 12 14 12 13 1 10 5 9 5 8 6 3 3 7 5 6 5 1 5 4 2 2 3 1
+85: 33 50 34 49 34 4 28 48 25 47 43 29 41 45 39 44 40 3 28 43 21 42 40 20 28 41 26 40 32 19 26 39 33 36 22 11 12 8 9 34 30 31 30 21 22 16 18 9 10 30 25 18 24 19 20 25 21 23 21 19 20 17 18 12 13 22 16 2 10 17 14 16 12 15 4 13 12 3 6 12 10 4 5 11 7 1 5 8 6 7 6 5 6 3 4 6 2
+86: 33 50 34 49 30 23 24 48 15 46 20 45 39 44 35 43 39 21 16 42 27 41 37 40 5 39 36 38 18 37 34 36 34 35 30 34 30 33 25 31 15 6 7 30 28 14 17 28 5 27 23 26 22 13 13 25 19 24 5 23 19 22 5 20 4 19 13 18 12 15 8 14 3 13 1 12 5 3 3 11 9 4 6 9 8 4 7 8 6 4 1 6 1 5
+87: 33 50 34 49 7 48 19 47 43 46 40 34 35 14 30 45 39 44 35 43 37 18 9 40 37 39 36 38 11 37 24 36 34 35 30 34 30 33 26 32 30 31 10 30 22 17 18 29 21 18 4 27 26 5 18 16 17 26 15 23 21 22 3 20 19 4 8 7 8 19 6 17 16 5 6 16 13 9 12 14 13 11 12 13 9 4 5 9 7 6 7 5 6 7 4 2 3 4 3 2 3 2 3 2
+88: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 37 11 12 41 20 10 19 39 30 38 30 37 14 36 26 14 9 35 30 34 25 33 8 32 30 31 28 30 14 29 22 14 15 28 21 26 8 25 23 20 21 24 15 1 10 22 9 5 20 16 17 15 17 10 11 21 11 15 7 4 5 3 13 14 1 13 4 1 12 9 5 9 8 9 6 11 1 4 3
+89: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 13 41 1 40 34 17 2 39 33 38 33 37 34 36 34 35 30 33 29 32 18 10 17 31 27 30 28 29 9 27 23 13 14 26 21 10 14 24 22 18 5 23 21 20 21 11 18 21 16 19 1 18 17 6 6 17 9 16 13 11 12 15 1 13 5 3 8 4 6 12 11 9 10 9 10 6 8 11 3 10 5 9 1 4 2 3
+90: 33 50 34 49 30 23 24 48 27 12 13 46 14 44 35 43 13 42 38 20 21 41 30 39 11 38 32 37 34 36 25 35 22 34 23 13 15 33 32 8 9 7 8 32 25 4 23 28 16 27 18 26 16 25 19 24 3 23 22 14 8 22 18 21 14 20 17 19 15 13 14 18 2 15 14 7 13 14 9 13 6 3 11 9 10 7 2 2 9 8 1 2 8 6 1 3 6 4 5 2 3 2 1
+91: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 39 26 27 18 19 44 33 41 2 39 38 29 37 33 37 22 23 38 34 36 25 34 30 33 20 32 30 31 30 21 27 10 21 30 20 29 23 27 20 25 16 24 22 19 20 18 3 23 5 22 17 21 14 19 17 18 13 17 6 16 12 15 5 14 11 13 11 6 9 7 4 11 8 10 5 9 5 8 7 5 6 5 4 7 5 2 4 5 1
+92: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 30 14 15 42 34 7 8 40 38 17 34 28 34 27 28 38 34 36 34 35 29 25 26 33 27 10 25 31 26 30 21 18 19 29 21 9 10 5 6 26 19 3 16 13 14 21 11 7 8 19 16 17 11 8 9 4 5 16 12 8 13 10 11 5 7 13 7 6 9 5 7 9 8 5 7 5 7 8 5 4 5 4
+93: 33 50 34 49 34 4 28 48 25 47 40 22 38 45 39 44 35 43 33 41 28 40 14 39 38 21 36 38 25 37 10 36 34 35 17 34 14 33 28 9 19 32 30 31 24 30 27 28 17 27 12 26 25 6 13 11 12 25 21 22 21 8 13 9 10 21 16 9 14 19 15 18 15 11 14 13 14 15 12 4 8 11 2 10 9 1 2 7 5
+94: 33 50 34 49 7 48 45 21 27 47 42 13 26 46 34 8 9 45 26 41 31 29 30 27 28 40 30 37 34 36 22 35 19 14 15 11 12 34 30 31 28 7 8 30 20 11 20 17 18 10 11 28 19 25 20 24 9 23 7 22 19 21 8 20 15 11 14 19 11 18 6 17 4 16 13 12 13 7 11 15 14 7 11 14 11 13 10 11 1 8 2 1 7 6 2 2 6 2 4 2 3
+95: 36 50 39 26 29 49 47 48 4 46 44 10 11 5 6 45 38 30 36 9 3 42 41 40 41 3 15 41 11 40 35 22 11 39 9 38 30 15 27 13 14 37 27 35 27 19 25 33 28 32 9 27 23 26 3 25 24 18 22 7 13 24 19 12 13 23 18 20 15 6 14 18 14 9 10 9 10 17 2 14 12 13 3 12 9 11 5 9 6 8 7 3 6 7 2 6 5 1 2 1 2 5 3
+96: 33 50 34 49 7 48 45 21 27 47 17 46 40 34 36 24 31 45 39 44 19 40 37 39 12 38 32 8 14 37 34 36 22 35 30 34 30 33 30 31 4 30 29 6 21 29 17 28 11 27 16 26 21 25 12 24 13 23 21 5 20 22 14 21 14 20 10 19 17 14 17 10 11 18 4 2 4 12 9 7 10 11 8 10 8 6 7 9 5 3 5 4 5 6 1
+97: 33 50 34 49 34 4 28 48 25 47 45 6 43 45 39 44 35 43 16 42 13 41 1 40 34 17 2 39 38 18 13 38 33 37 34 36 34 35 33 18 32 21 23 33 32 23 26 32 30 31 14 28 17 27 6 26 23 11 12 4 5 25 21 7 4 21 18 20 9 1 1 19 15 6 3 18 13 17 13 16 15 8 10 15 12 7 8 12 1 9 5 2 5 8 7 3 4 3 4 7 2 3 1
+98: 22 50 38 49 31 48 31 47 10 46 44 38 10 45 30 44 38 43 26 42 32 16 17 41 34 28 29 39 33 27 28 37 31 35 21 34 22 15 19 33 30 32 17 30 23 29 24 12 22 21 22 15 16 15 16 28 20 24 20 23 1 21 7 20 18 15 16 12 4 19 17 18 8 17 9 16 10 14 12 6 10 13 5 12 5 11 8 10 9 4 3 9 5 8 6 3 4 7 3 2 3 1
+99: 33 50 34 49 34 4 28 48 25 47 3 45 44 29 39 26 27 18 19 44 33 41 2 39 38 29 37 33 15 38 28 8 27 37 34 36 25 34 30 33 30 31 4 30 29 6 13 29 3 28 26 8 9 27 22 3 19 16 17 25 6 23 19 22 18 21 8 20 19 16 18 19 2 18 10 4 7 17 16 2 4 16 12 7 13 5 9 13 11 7 9 12 5 3 5 4 5 6 1
diff --git a/data/08-maze.txt b/data/08-maze.txt
new file mode 100644 (file)
index 0000000..8920fc9
--- /dev/null
@@ -0,0 +1,50 @@
+....##.#.#...#.##.##..#.#..#.....#..#....#..#.....
+#.#..#.#.###....#..##...#.##.#.####...#####...#.##
+####.#.#.#...#.###....###....###..##.##.##..#####.
+.#.......#.#####.#.####.#.####.##.......#..###.#..
+...##.##...#.......#..#.#.#.#...####.#####.##....#
+.####.####...#.#####.##.#.#.#.###.......#.....#.##
+##..#.#....#####.#.#..#...#...#.####.####.#######.
+.##.#.####..#.#..#...##.###.###.##...#.##.##.#.##.
+.##.#.#.#..##.#.##.####.##...##..###.#.#...#....#.
+....###.##..#.#..#.#.#...#.###..##.#.#.##.##.####.
+###..##.###.#.#.##...#.#.#...##..#.#............#.
+....##..#.#.#.#..#.#.#.###.#.#..##.#.###.#.###.##.
+###.###.......#.##.###.#.#.####......#.#####.###..
+#.#.#.##.####....#..#......#.#####.###..#..#.#...#
+..#.#..###....####.##.######..##.#.#.#.##.##.###..
+#.#.#.##.####.#..#....#.#....##....#.#.....#.#.#.#
+....#..#.##.#.##.#.####.#.#######.##...##.##.#.#..
+###...##..#......#...##.#..#..#....###..####.#...#
+....#..##.####.###.###....##.####.###..##......###
+######..#.#.##.#.#.#.#.#####.##.#...##..####.###..
+#.#.#..##.#.#........#.#......#...#####...##.#.#.#
+..#.##.##...#.#.######...######.####..#.###.......
+#.#..#..###...#..##.#..###..#.#.#..##.#.#...######
+#.#.##.##.###.####..#.##.#.##.#.#.##..#.##.##.....
+....#...#.#...#..##.#..#....#.#.#..##.......##.###
+##.###.##.#.####.#....##.####.#.#.######.####...#.
+.#..#...#.#..##..#.####...#.#......#..#.......#...
+.#.##.###.##..##....#.##.##.#.#######...#.##.#####
+.#.#..#.#.###..##.###.......#..##..####.###.......
+.#...##.#..##.##......#.#.###.##..##.#...#########
+...###....##...#.###########...##.##.##.##........
+##...##.####.###.#.#.....#.###..#.#...#....####.#.
+.#.###...#.#.........##.##.##..##...###.##....###.
+.#.#.##.##...############..#..##..#......######.##
+...#.#...#.###.#....#..##.###....##.##.###.#.....#
+.###.#.###.#.#.#.####.##..#.#.#####.#........###..
+.#......#.........#....##.#.#.#.#.####.#.#.#...###
+...#.#####.########.####...........#.############.
+.#.####........#.##.#.###.#######.##..#....#......
+##..#.##.#######.#..#.#.#.......#.###...####.####.
+.##...#.....##.#.##.#.....#########.###...#.....#.
+.##.###.###..#........#####....#.##.#.#.###.#####.
+..........######.###.##.....####.#..............#.
+###.#######.##.#..#.....##.##.##.#.##########.####
+......#..##......####.###..##.#..........##.###...
+#####...##..##.#....#...##......#.#.##.#..#.....#.
+.#.##.###..##..#.####.#.#..#.##.#########...##.###
+....#.....######...######.##..#.........#.#..#....
+###.#.#####.#.##.###....#.##.####.#.#.###.##.#.###
+...............#.....#.##..#....#.#.#...#..#.#....
diff --git a/data/08-smaller.txt b/data/08-smaller.txt
new file mode 100644 (file)
index 0000000..a9e5194
--- /dev/null
@@ -0,0 +1,10 @@
+.#.#.#....
+.......###
+######.#.#
+#.........
+..##.#.#.#
+.###.#.#..
+.#...#.#.#
+####.#####
+#.#.....#.
+....#.#...
\ No newline at end of file
diff --git a/src/task7/task7.hs b/src/task7/task7.hs
new file mode 100644 (file)
index 0000000..8025911
--- /dev/null
@@ -0,0 +1,67 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+import Data.List
+import Data.Function (on)
+
+import Data.Text (Text)
+import qualified Data.Text.IO as TIO
+
+import Data.Void (Void)
+
+import Text.Megaparsec
+import Text.Megaparsec.Char
+import qualified Text.Megaparsec.Char.Lexer as L
+import qualified Control.Applicative as CA
+
+type Burgers = [Int]
+type Flips = [Int]
+type Flipper = (Int, Flips)
+
+main :: IO ()
+main = do 
+        flipsT <- TIO.readFile "data/07-flips.txt"
+        let (burgers, flippers) = successfulParse flipsT
+        print $ part1 burgers flippers
+        print $ part2 burgers flippers
+
+
+part1 :: Burgers -> [Flipper] -> Int
+part1 burgers = length . filter isSorted . map (enflip burgers) . map snd
+    where isSorted items = items == unburntSort items
+
+part2 :: Burgers -> [Flipper] -> Int   
+part2 burgers = fst . head . filter isSorted . map (\(n, fs) -> (n, enflip burgers fs)) 
+    where isSorted (_, items) = (null $ filter (<= 0) items) && (items == sort items)
+
+
+enflip :: Burgers -> Flips -> Burgers
+enflip = foldl' oneFlip
+    where oneFlip items pos = [-1 * i | i <- (reverse $ take pos items)] ++ (drop pos items)
+
+unburntSort :: Burgers -> Burgers
+unburntSort = sortBy (compare `on` abs)
+
+
+-- Parse the input file
+
+type Parser = Parsec Void Text
+
+-- don't treat newlines as automatically-consumed whitespace
+sc :: Parser ()
+sc = L.space (skipSome (char ' ')) CA.empty CA.empty
+
+lexeme  = L.lexeme sc
+integer = lexeme L.decimal
+symb = L.symbol sc
+
+flipsFileP = (,) <$> burgersP <* newline <*> (flipperP `endBy` newline)
+
+burgersP = (:) <$> symb "burgers:" *> many integer
+
+flipperP = (,) <$> integer <* symb ":" <*> many integer
+
+successfulParse :: Text -> (Burgers, [Flipper])
+successfulParse input = 
+        case parse flipsFileP "input" input of
+                Left  _error -> ([], []) -- TIO.putStr $ T.pack $ parseErrorPretty err
+                Right flips -> flips
\ No newline at end of file
diff --git a/src/task7/task7.ipynb b/src/task7/task7.ipynb
new file mode 100644 (file)
index 0000000..b760261
--- /dev/null
@@ -0,0 +1,125 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def enflip(items, flips, burnt=False, debug=False):\n",
+    "    if debug: i0 = items\n",
+    "    for flip in flips:\n",
+    "        if burnt:\n",
+    "            items = [-i for i in reversed(items[:flip])] + items[flip:]\n",
+    "        else:\n",
+    "            items = [i for i in reversed(items[:flip])] + items[flip:]\n",
+    "        if debug: print('{} -{}-> {}'.format(i0, flip, items))\n",
+    "        if debug: i0 = items\n",
+    "    return items"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def burnt_sorted(pancakes):\n",
+    "    return pancakes == sorted(pancakes)\n",
+    "\n",
+    "def unburnt_sorted(pancakes):\n",
+    "    simple_pancakes = [abs(p) for p in pancakes]\n",
+    "    return simple_pancakes == sorted(simple_pancakes)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "flips_t = [l.strip().split(': ') for l in open('../../data/07-flips.txt')]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "stack = [[int(p) for p in l.split()] for c, l in flips_t if c == 'burgers'][0]\n",
+    "flips = {int(c): [int(p) for p in l.split()] for c, l in flips_t if c != 'burgers'}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "69"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "sum(1 for f in flips.values()\n",
+    "   if unburnt_sorted(enflip(stack, f)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "92"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[f for f in flips\n",
+    "   if burnt_sorted(enflip(stack, flips[f], burnt=True))][0]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/task8/task8.hs b/src/task8/task8.hs
new file mode 100644 (file)
index 0000000..b23198d
--- /dev/null
@@ -0,0 +1,104 @@
+import Data.Maybe (fromMaybe)
+import qualified Data.PQueue.Prio.Min as P
+import qualified Data.HashSet as S
+import qualified Data.Sequence as Q
+import qualified Data.HashMap.Strict as M
+import Data.Sequence ((<|))
+import Data.Foldable (foldl')
+import Data.HashMap.Strict ((!))
+
+
+data Grass = Short | Long deriving (Show, Eq) 
+type Location = (Int, Int)
+data Neighbour = Neighbour {stepLocation :: Location, stepCost :: Int} deriving (Show, Eq)
+type Lawn = M.HashMap Location Grass
+type Closed = S.HashSet Location
+data Agendum = Agendum {current :: Location, trail :: Q.Seq Location, cost :: Int} deriving (Show, Eq)
+type Agenda = P.MinPQueue Int Agendum 
+
+
+main :: IO ()
+main = do 
+    lawnT <- readFile "data/08-maze.txt"
+    let lawn = parseLawn lawnT
+    let goal = goalLocation lawn
+    print $ part1 lawn goal
+    print $ part2 lawn goal
+
+part1 :: Lawn -> Location -> Int
+part1 lawn goal = cost $ fromMaybe (snd $ P.findMin $ initAgenda goal) $ aStar 999 goal lawn (initAgenda goal) S.empty
+
+part2 :: Lawn -> Location -> Int
+part2 lawn goal = cost $ fromMaybe (snd $ P.findMin $ initAgenda goal) $ aStar 3 goal lawn (initAgenda goal) S.empty
+
+
+parseLawn :: String -> Lawn
+parseLawn lawnT = M.fromList lawnCells
+    where lawnLines = zip [1..] $ lines lawnT
+          lawnCells = concatMap (\(r, row) -> zipWith (cellify r) [1..] row) lawnLines
+          cellify r c cell
+            | cell == '#' = ((r, c), Long)
+            | otherwise   = ((r, c), Short)
+
+goalLocation :: Lawn -> Location
+goalLocation lawn = ( maximum $ map fst $ M.keys lawn
+                    , maximum $ map snd $ M.keys lawn
+                    )
+
+initAgenda :: Location -> Agenda
+initAgenda goal = P.singleton (estimateCost (1, 1) goal) Agendum {current = (1, 1), trail = Q.empty, cost = 0}
+
+
+aStar :: Int -> Location -> Lawn -> Agenda -> Closed -> Maybe Agendum
+aStar longCost goal lawn agenda closed 
+    -- | trace ("Peeping " ++ (show $ fst $ P.findMin agenda) ++ ": " ++ (show reached) ++ " <- " ++ (show $ toList $ Q.take 1 $ trail $ currentAgendum) ++ " :: " ++ (show newAgenda)) False = undefined
+    | P.null agenda = Nothing
+    | otherwise = 
+        if reached == goal then Just currentAgendum
+        else if reached `S.member` closed 
+            then aStar longCost goal lawn (P.deleteMin agenda) closed
+            else aStar longCost goal lawn newAgenda (S.insert reached closed)
+        where 
+            (_, currentAgendum) = P.findMin agenda
+            reached = current currentAgendum
+            newAgenda = foldl' (\q a -> P.insert (estimatedCost a) a q) (P.deleteMin agenda) $ candidates longCost lawn currentAgendum closed
+            estimatedCost agendum = estimateCost (current agendum) goal + cost agendum
+
+
+
+candidates :: Int -> Lawn -> Agendum -> Closed -> Q.Seq Agendum
+candidates longCost lawn agendum closed = newCandidates
+    where
+        candidate = current agendum
+        previous = trail agendum
+        succs = successors longCost lawn candidate
+        nonloops = Q.filter (\s -> not $ (stepLocation s) `S.member` closed) succs
+        newCandidates = fmap (\n -> makeAgendum n) nonloops
+        makeAgendum new = Agendum {current = stepLocation new, 
+                                    trail = candidate <| previous, 
+                                    cost = cost agendum + stepCost new}
+
+
+successors :: Int -> Lawn -> Location -> (Q.Seq Neighbour)
+successors longCost lawn (row, column) = Q.fromList $ map neighbourify neighbours
+    where neighbours = filter (\l -> l `M.member` lawn) 
+                                [(r, c) | r <- [(row - 1)..(row + 1)], 
+                                          c <- [(column - 1)..(column + 1)],
+                                          r >= minR,
+                                          r <= maxR,
+                                          c >= minC,
+                                          c <= maxC,
+                                          ((r == row && c /= column) || (r /= row && c == column)) ]
+          neighbourify neighbour = Neighbour {stepLocation = neighbour, stepCost = scCalc neighbour}
+          minR = minimum $ map fst $ M.keys lawn
+          maxR = maximum $ map fst $ M.keys lawn
+          minC = minimum $ map snd $ M.keys lawn
+          maxC = maximum $ map snd $ M.keys lawn
+          scCalc location = if lawn!location == Long
+                            then longCost
+                            else 1
+
+
+estimateCost :: Location -> Location -> Int
+estimateCost (r, c) (gr, gc) = abs (r - gr) + abs(c - gc)
+
index 8b3a1b04edff2086b03344fbe87145d58738f413..02e7ff6d53515ecf31ef1c21933ec804fc0d7c6f 100644 (file)
@@ -94,4 +94,22 @@ executable task6-monad
   build-depends:       base >= 4.7 && < 5
                      , text
                      , unordered-containers
-                                         
\ No newline at end of file
+
+executable task7
+  hs-source-dirs:      src/task7
+  main-is:             task7.hs
+  default-language:    Haskell2010
+  build-depends:       base >= 4.7 && < 5
+                     , text
+                     , megaparsec
+
+executable task8
+  hs-source-dirs:      src/task8
+  main-is:             task8.hs
+  default-language:    Haskell2010
+  build-depends:       base >= 4.7 && < 5                                         
+                     , pqueue
+                     , hashable
+                     , containers
+                     , unordered-containers
+                               
\ No newline at end of file