days 1–4
parent
3dbf136103
commit
2f92fcc170
@ -0,0 +1,10 @@
|
|||||||
|
#lang br
|
||||||
|
(require racket/file rackunit)
|
||||||
|
|
||||||
|
(define (solve combo-length)
|
||||||
|
(for/first ([c (in-combinations (map string->number (file->lines "01.rktd")) combo-length)]
|
||||||
|
#:when (eq? 2020 (apply + c)))
|
||||||
|
(apply * c)))
|
||||||
|
|
||||||
|
(check-equal? (solve 2) 1007331)
|
||||||
|
(check-equal? (solve 3) 48914340)
|
@ -0,0 +1,200 @@
|
|||||||
|
1834
|
||||||
|
1546
|
||||||
|
1119
|
||||||
|
1870
|
||||||
|
1193
|
||||||
|
1198
|
||||||
|
1542
|
||||||
|
1944
|
||||||
|
1817
|
||||||
|
1249
|
||||||
|
1361
|
||||||
|
1856
|
||||||
|
1258
|
||||||
|
1425
|
||||||
|
1835
|
||||||
|
1520
|
||||||
|
1792
|
||||||
|
1130
|
||||||
|
2004
|
||||||
|
1366
|
||||||
|
1549
|
||||||
|
1347
|
||||||
|
1507
|
||||||
|
1699
|
||||||
|
1491
|
||||||
|
1557
|
||||||
|
1865
|
||||||
|
1948
|
||||||
|
1199
|
||||||
|
1229
|
||||||
|
1598
|
||||||
|
1756
|
||||||
|
1643
|
||||||
|
1306
|
||||||
|
1838
|
||||||
|
1157
|
||||||
|
1745
|
||||||
|
1603
|
||||||
|
1972
|
||||||
|
1123
|
||||||
|
1963
|
||||||
|
1759
|
||||||
|
1118
|
||||||
|
1526
|
||||||
|
1695
|
||||||
|
1661
|
||||||
|
1262
|
||||||
|
1117
|
||||||
|
1844
|
||||||
|
1922
|
||||||
|
1997
|
||||||
|
1630
|
||||||
|
1337
|
||||||
|
1721
|
||||||
|
1147
|
||||||
|
1848
|
||||||
|
1476
|
||||||
|
1975
|
||||||
|
1942
|
||||||
|
1569
|
||||||
|
1126
|
||||||
|
1313
|
||||||
|
1449
|
||||||
|
1206
|
||||||
|
1722
|
||||||
|
1534
|
||||||
|
1706
|
||||||
|
1596
|
||||||
|
1700
|
||||||
|
1811
|
||||||
|
906
|
||||||
|
1666
|
||||||
|
1945
|
||||||
|
1271
|
||||||
|
1629
|
||||||
|
1456
|
||||||
|
1316
|
||||||
|
1636
|
||||||
|
1884
|
||||||
|
1556
|
||||||
|
1317
|
||||||
|
1393
|
||||||
|
1953
|
||||||
|
1658
|
||||||
|
2005
|
||||||
|
1252
|
||||||
|
1878
|
||||||
|
1691
|
||||||
|
60
|
||||||
|
1872
|
||||||
|
386
|
||||||
|
1369
|
||||||
|
1739
|
||||||
|
1460
|
||||||
|
1267
|
||||||
|
1935
|
||||||
|
1992
|
||||||
|
1310
|
||||||
|
1818
|
||||||
|
1320
|
||||||
|
1437
|
||||||
|
1486
|
||||||
|
1205
|
||||||
|
1286
|
||||||
|
1670
|
||||||
|
1577
|
||||||
|
1237
|
||||||
|
1558
|
||||||
|
1937
|
||||||
|
1938
|
||||||
|
1656
|
||||||
|
1220
|
||||||
|
1732
|
||||||
|
1647
|
||||||
|
1857
|
||||||
|
1446
|
||||||
|
1516
|
||||||
|
1450
|
||||||
|
1860
|
||||||
|
1625
|
||||||
|
1377
|
||||||
|
1312
|
||||||
|
1588
|
||||||
|
1895
|
||||||
|
1967
|
||||||
|
1567
|
||||||
|
1582
|
||||||
|
1428
|
||||||
|
1415
|
||||||
|
1731
|
||||||
|
1919
|
||||||
|
1651
|
||||||
|
1597
|
||||||
|
1982
|
||||||
|
1576
|
||||||
|
1172
|
||||||
|
1568
|
||||||
|
1867
|
||||||
|
1660
|
||||||
|
1754
|
||||||
|
1227
|
||||||
|
1121
|
||||||
|
1733
|
||||||
|
537
|
||||||
|
1809
|
||||||
|
1322
|
||||||
|
1876
|
||||||
|
1665
|
||||||
|
1124
|
||||||
|
1461
|
||||||
|
1888
|
||||||
|
1368
|
||||||
|
1235
|
||||||
|
1479
|
||||||
|
1529
|
||||||
|
1148
|
||||||
|
1996
|
||||||
|
1939
|
||||||
|
1340
|
||||||
|
1531
|
||||||
|
1438
|
||||||
|
1897
|
||||||
|
1152
|
||||||
|
1321
|
||||||
|
1770
|
||||||
|
897
|
||||||
|
1750
|
||||||
|
1111
|
||||||
|
1772
|
||||||
|
1615
|
||||||
|
1798
|
||||||
|
1359
|
||||||
|
1470
|
||||||
|
1610
|
||||||
|
1362
|
||||||
|
1973
|
||||||
|
1892
|
||||||
|
1830
|
||||||
|
599
|
||||||
|
1341
|
||||||
|
1681
|
||||||
|
1572
|
||||||
|
1873
|
||||||
|
42
|
||||||
|
1246
|
||||||
|
1447
|
||||||
|
1800
|
||||||
|
1524
|
||||||
|
1214
|
||||||
|
1784
|
||||||
|
1664
|
||||||
|
1882
|
||||||
|
1989
|
||||||
|
1797
|
||||||
|
1211
|
||||||
|
1170
|
||||||
|
1854
|
||||||
|
1287
|
||||||
|
1641
|
||||||
|
1760
|
@ -0,0 +1,21 @@
|
|||||||
|
#lang br
|
||||||
|
(require racket/file rackunit)
|
||||||
|
|
||||||
|
(struct rec (password target low high))
|
||||||
|
(define recs (for/list ([ln (file->lines "02.rktd")])
|
||||||
|
(match-define (list range target password) (string-split ln))
|
||||||
|
(match-define (list low high) (map string->number (string-split range "-")))
|
||||||
|
(rec password (string-ref (string-trim target ":") 0) low high)))
|
||||||
|
|
||||||
|
(check-equal?
|
||||||
|
(for/sum ([rec recs])
|
||||||
|
(define howmany (count (λ (c) (char=? c (rec-target rec))) (string->list (rec-password rec))))
|
||||||
|
(if (<= (rec-low rec) howmany (rec-high rec)) 1 0))
|
||||||
|
422)
|
||||||
|
|
||||||
|
(check-equal?
|
||||||
|
(for/sum ([rec recs])
|
||||||
|
(define low? (char=? (rec-target rec) (string-ref (rec-password rec) (sub1 (rec-low rec)))))
|
||||||
|
(define high? (char=? (rec-target rec) (string-ref (rec-password rec) (sub1 (rec-high rec)))))
|
||||||
|
(if (or (and low? (not high?)) (and high? (not low?))) 1 0))
|
||||||
|
451)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,20 @@
|
|||||||
|
#lang br
|
||||||
|
(require racket/file rackunit)
|
||||||
|
|
||||||
|
(define (trees-in-slope horiz vert)
|
||||||
|
(for/fold ([mod 0]
|
||||||
|
[sum 0]
|
||||||
|
#:result sum)
|
||||||
|
([(ln lidx) (in-indexed (file->lines "03.rktd"))]
|
||||||
|
#:when (zero? (modulo lidx vert)))
|
||||||
|
(values (+ mod horiz)
|
||||||
|
(if (char=? #\# (string-ref ln (modulo mod (string-length ln)))) (add1 sum) sum))))
|
||||||
|
|
||||||
|
(check-equal? (trees-in-slope 3 1) 151)
|
||||||
|
|
||||||
|
(check-equal? (apply * (list
|
||||||
|
(trees-in-slope 1 1)
|
||||||
|
(trees-in-slope 3 1)
|
||||||
|
(trees-in-slope 5 1)
|
||||||
|
(trees-in-slope 7 1)
|
||||||
|
(trees-in-slope 1 2))) 7540141059)
|
@ -0,0 +1,323 @@
|
|||||||
|
.#......#..####.....#..#.......
|
||||||
|
#.#...#...#..#.#...#.#...##.##.
|
||||||
|
#.#....#..........#...##.....##
|
||||||
|
#.#.#.....##......#.#.......###
|
||||||
|
..#..###....#.#....#.#.#..#....
|
||||||
|
.......#.#....##..##...#...#...
|
||||||
|
..#..#..#..###.......#.....#.#.
|
||||||
|
.#.......#...##...##.##......##
|
||||||
|
#.#.##..##.#..#....#..###..#.#.
|
||||||
|
#.....#.#.........#.....##.#.#.
|
||||||
|
..#.#....##..#...#...##........
|
||||||
|
......#....#..##.#.#......###..
|
||||||
|
.......#.......#......##...#...
|
||||||
|
.##.....#.......#...###.....##.
|
||||||
|
.#...#.##..##.#..##....#.......
|
||||||
|
..#......##...#..#...#.#.##.###
|
||||||
|
.##.##.....##....#..#......#.#.
|
||||||
|
.#.....#..###..#.##.#.....##.#.
|
||||||
|
......##..........#..........#.
|
||||||
|
.##....#.....#..##.#..#.#..###.
|
||||||
|
..##.......#....#...##...#..#..
|
||||||
|
.##...#.....#.###.#.#..#...#.#.
|
||||||
|
.....##.#.##..##...#...........
|
||||||
|
..#..###.##.#.#.###...###..#.#.
|
||||||
|
.#........#..#.#........#.#...#
|
||||||
|
....##.......#....#.#.##.#.....
|
||||||
|
....##........######..###..#.#.
|
||||||
|
#.#.#............#.......#..#..
|
||||||
|
...##...#.##.....#.#..#......#.
|
||||||
|
......#.##.#....##..#.#..###...
|
||||||
|
##.....#.#....#....#.##.#.###..
|
||||||
|
#..#..#..##.#..##.##.##.#.##...
|
||||||
|
.###.####..#..#........#.....##
|
||||||
|
.......##..#.......#...........
|
||||||
|
.##...#............#.#.##...#..
|
||||||
|
....##.....#...##..#..#.#..###.
|
||||||
|
...#.....#####.#..#...##....##.
|
||||||
|
#.....#.#.#....##.......##.#.#.
|
||||||
|
......#.#..#.##.#######......#.
|
||||||
|
#.##...##....#..###.#.......#..
|
||||||
|
.....##...#....#...#....##.##.#
|
||||||
|
....###......#...###..#......##
|
||||||
|
..#...##..##.######..#.#......#
|
||||||
|
......##....#....##..#......##.
|
||||||
|
.#...#..##..#.###.#......#....#
|
||||||
|
##....##..#..####.#.....#...#..
|
||||||
|
.#.......#...#.......##......#.
|
||||||
|
......#...#...#........#.......
|
||||||
|
.#........#.###...#..####.#..#.
|
||||||
|
##...#.#............#.....###..
|
||||||
|
.....###.#.##...........###..#.
|
||||||
|
.#.#...#.....#.#.##..##...####.
|
||||||
|
..##.......#..#.##.#....#.....#
|
||||||
|
.#..#.#..####.....###.#.....#..
|
||||||
|
..#..###.....####..#.##.#.#.##.
|
||||||
|
.###..#.....#......#...####....
|
||||||
|
...#.#..#.#..#...#...#....##.##
|
||||||
|
..###....#.##.....#..........#.
|
||||||
|
###...#####......##............
|
||||||
|
..###.....#........##.#...#..#.
|
||||||
|
..##.##.#.....##........##..#.#
|
||||||
|
##..#.#...#.#..#..###.#....#..#
|
||||||
|
....#..#.#.....#..#####...#....
|
||||||
|
....#.........#......##.##.....
|
||||||
|
.#...####.##......##..##.#..#.#
|
||||||
|
...#...#.##..#...##..###...#...
|
||||||
|
###...#.....#.##.###.###..#.#..
|
||||||
|
..#......#.###.....#..##.#...#.
|
||||||
|
#.....##.########...#####....#.
|
||||||
|
........##..#..##..##.#........
|
||||||
|
....#.######....##..#..#.##..#.
|
||||||
|
#.......#..##..#..#.#.#..##.##.
|
||||||
|
...#.#..#..#.......#......###.#
|
||||||
|
.#.#..#.#..#.##.#.............#
|
||||||
|
#....#.##.#.#.....#..#.#..#....
|
||||||
|
...###..#...#....#.........#.#.
|
||||||
|
.#..#.....##..#.#..#.#.......#.
|
||||||
|
..#...##...#......#......####..
|
||||||
|
....#..#.......#.......#.#..#..
|
||||||
|
#...#..#...........#.#..#.....#
|
||||||
|
#...#.#.......#...#....###....#
|
||||||
|
.#..#.#.##....#......#........#
|
||||||
|
..#...#..##..#..#..#..#...#.#..
|
||||||
|
..#.#.........#....#....##.....
|
||||||
|
##.....##.#.#.#.........##.....
|
||||||
|
.##...#.##...........#...#...##
|
||||||
|
.##..##.#.#..........##..##....
|
||||||
|
#....#....#.#...#.#..#....#.#..
|
||||||
|
####....##.....#..##.###.......
|
||||||
|
#..#....#......##.#.#....#.....
|
||||||
|
.....#....#.###.##.........###.
|
||||||
|
#.......#.####..#..#..##.......
|
||||||
|
##.#.......#..##..#....#..#.#..
|
||||||
|
..###...#.#...#.....##.##.####.
|
||||||
|
....#...#.#....#..#..#.....#.##
|
||||||
|
#.....##.#.#..#.##..#..##......
|
||||||
|
................###..#....##...
|
||||||
|
..#.##.....#..........##.#...#.
|
||||||
|
..#.#..#.#....#.#.#..#..#..#.#.
|
||||||
|
#...#..##.#.#...#..#...#..#....
|
||||||
|
#..#.#.........#..###........#.
|
||||||
|
.#...#.............#..###..#..#
|
||||||
|
#.........#.#..#...#.#.....#..#
|
||||||
|
....#..#..#.#.#...#...#.....##.
|
||||||
|
##...###.#.####..#......#...#..
|
||||||
|
..#..##...#.#......#.#.......#.
|
||||||
|
#......###....##.#.##..........
|
||||||
|
#####....###..#...............#
|
||||||
|
##.#...####....#....#...#....#.
|
||||||
|
.#.......#..#.....#...#.....###
|
||||||
|
...#..#.#.#....##......##...#..
|
||||||
|
...#.....#...#.##.#..#.#....#..
|
||||||
|
#...###....#...#.#....#........
|
||||||
|
.#.......#........#...##.##.##.
|
||||||
|
.....#....#...##.....##...###.#
|
||||||
|
....#....#.#..#...##.##.##.....
|
||||||
|
.......#............#...#.#..#.
|
||||||
|
.#............#.....##.......#.
|
||||||
|
........#....#....##......##.##
|
||||||
|
.......##..#.#..#.##..###..##.#
|
||||||
|
#..##..##.........####.#.###...
|
||||||
|
#....#..#...##...#.............
|
||||||
|
#...#...###..........##..#..#..
|
||||||
|
....#...#..#.....##...#........
|
||||||
|
#.....#......#.#.....#...#..#..
|
||||||
|
..#.....#.....#....#..#........
|
||||||
|
..#..#.....#.#.........#..###..
|
||||||
|
................###..#.#....#..
|
||||||
|
#.....#.....#.#.#.#.#..#...#.#.
|
||||||
|
#....#....#.#..........#.#....#
|
||||||
|
....#..#......#..##.#...##.....
|
||||||
|
..#.#...#.####....#.#..#.#..#..
|
||||||
|
.........##......#.....##......
|
||||||
|
##.#.###.#.....#.....####.#..#.
|
||||||
|
.....#.....#..#....#..###.#....
|
||||||
|
##..#.#...#.##....#....#.......
|
||||||
|
.....#......#.#...##..#.#......
|
||||||
|
....##..#...#...##..##.#....#.#
|
||||||
|
............#..........##.#....
|
||||||
|
##..#..#.##..##..#.#....#.#.#..
|
||||||
|
.......#.#...#...#.#...#..#....
|
||||||
|
#....#.#...#...#........#..#...
|
||||||
|
...........#.......#...##..###.
|
||||||
|
.#..##......#.##.........##..#.
|
||||||
|
...#...#...###.#.##....##.#..#.
|
||||||
|
#...#..#.#.#.....##..#.......#.
|
||||||
|
.##..#.###.##......#.#....#.#.#
|
||||||
|
..#....#.......#..#..#.#.#.##..
|
||||||
|
#...#...###...###.........#....
|
||||||
|
.#.#...#.....##.#.#..#....#.##.
|
||||||
|
.........#.#.##.....#.#.###....
|
||||||
|
...#.#...#......#...####......#
|
||||||
|
...##..##....##......##...###..
|
||||||
|
###...#..#.......##.....#....#.
|
||||||
|
...#..#..#..###...##.##..#..#..
|
||||||
|
...#......#......##..#.#.##..#.
|
||||||
|
...#.........#....#.#....#.#...
|
||||||
|
##................#..#.#.....#.
|
||||||
|
....#.##...#..#.##...##.#.....#
|
||||||
|
......#..##.##..###.#..#.##.##.
|
||||||
|
.#.#...###.....###.....##...###
|
||||||
|
.##.....#.#.#..#..###..#..#..#.
|
||||||
|
#.......#..#..#....##.....#....
|
||||||
|
...#.#.##..#..#......##.##...#.
|
||||||
|
....##.#......#...#..#..#......
|
||||||
|
.####.#..#.....#..##.#...##..##
|
||||||
|
..#..#...#..........###..#....#
|
||||||
|
.#.#.##.##...#............#....
|
||||||
|
........##..##......#.##..#.###
|
||||||
|
...#.#....###......##.......#..
|
||||||
|
..##...#...#.#..#.....#.....#..
|
||||||
|
##..#...###..#..#.#.#...#...#..
|
||||||
|
.....#..#....##.....##.....###.
|
||||||
|
....##...###.#..#.#....##..#..#
|
||||||
|
#......#...#....#......#...##..
|
||||||
|
....#.##...#.#......#.#.##...#.
|
||||||
|
.......#.....#...#####...#.#...
|
||||||
|
...#.....##.#............#.....
|
||||||
|
...#.#........#.#.#..#.........
|
||||||
|
....###......#.#.#..#.####.#..#
|
||||||
|
#.....#.#.#.....#.#.#.....#..#.
|
||||||
|
..##.##......#...#.#...........
|
||||||
|
###..###....#.#####......###...
|
||||||
|
..##..............##.#.#....#.#
|
||||||
|
#..#...#..........#..#.#.#..###
|
||||||
|
##.###............#....#.#...#.
|
||||||
|
#.#..#.#..##.#.#....#...#......
|
||||||
|
#....#...#..##.....#..#.#..###.
|
||||||
|
..#.....#.#....#.#..#.##.#..##.
|
||||||
|
...##...#.#.##...#....###....#.
|
||||||
|
......###.####.......#..#.#.#.#
|
||||||
|
.#..............##........#....
|
||||||
|
...##.##...##....#..#.......#..
|
||||||
|
.....#.....#....###...#..#..#.#
|
||||||
|
.#.....#..#.....#......#.....##
|
||||||
|
#.#.##.#..#..#.....#.##..###...
|
||||||
|
..#......#...##.###..#.#...#..#
|
||||||
|
......#.....#...##......#......
|
||||||
|
##.#........#..........#.....#.
|
||||||
|
#........##.#............##....
|
||||||
|
...#......##...#.#.....##......
|
||||||
|
...##.......#....#.#..#.#.###..
|
||||||
|
..#....##..##.##.....###....#..
|
||||||
|
..#...#.#...#.....#..........#.
|
||||||
|
......#...#...#.#.##.#...#.#.#.
|
||||||
|
.#...#......#.##........#......
|
||||||
|
.##.##..#....#...#.#...##......
|
||||||
|
#..#......#.#...........#....#.
|
||||||
|
....##.#....#...#..#....#.#..##
|
||||||
|
#....##.##....#.#..##.#........
|
||||||
|
.##.##.#....##.....#..#....#..#
|
||||||
|
...#...#.....###.#.##..........
|
||||||
|
....#...#....##.......###......
|
||||||
|
#.........#......#.#.......#...
|
||||||
|
#..........#..##..#.#..........
|
||||||
|
.....#.......#..##.##....##...#
|
||||||
|
........................#.#....
|
||||||
|
#..#.........#.............#..#
|
||||||
|
#..#.....#.......#....#....#.#.
|
||||||
|
..##..##.......##....#...#.....
|
||||||
|
.##......#..##......#.###......
|
||||||
|
...#.#........#.......##..###..
|
||||||
|
..##...###.###......#...#....##
|
||||||
|
#...#...#.....###.#.#.#..#.....
|
||||||
|
#....#.........#..##...#...##..
|
||||||
|
#..###..#.#.#.##.#..#.#....#.##
|
||||||
|
#...#.#.....#.###.#.......#....
|
||||||
|
..##..#..#....#.#...........#.#
|
||||||
|
#.........#.#......#...##......
|
||||||
|
.######......#..#....#.#.#....#
|
||||||
|
##..#.#..####.###.........#....
|
||||||
|
###########.....##.##...#..#...
|
||||||
|
#...##.#.#....#.#....#......#..
|
||||||
|
...#..##..#..##..#......#....#.
|
||||||
|
.#....#...#....#.#..##....##...
|
||||||
|
#..#.#............#....#.#...#.
|
||||||
|
...#...#..#.#.##......#..#.#...
|
||||||
|
#.#...##.....#..#.##......####.
|
||||||
|
.#.#..##..#.....#.#..#.##......
|
||||||
|
#.#.##......##.....#..#.#..#...
|
||||||
|
#..##...#.##.#.......#.##......
|
||||||
|
..#.......#.#.#...##..##...#...
|
||||||
|
.#...#..#..#.#.........#..##...
|
||||||
|
#..#.......#....#.#...#.###...#
|
||||||
|
.......#..#.......##.#.#...#.#.
|
||||||
|
.#.................###.#..###..
|
||||||
|
..........#.#.....##..#####...#
|
||||||
|
#......#.#..##.#.#...#.##.#....
|
||||||
|
#......#.#..##.##.#...#....#...
|
||||||
|
....#..#......#....#....#######
|
||||||
|
.#...#......#....###......#.###
|
||||||
|
#.#....#.#...#.###......#..#..#
|
||||||
|
.###......#.#...#.####.#..####.
|
||||||
|
######.#.....###.#...#.#.....#.
|
||||||
|
.#.###....#..#.#.....#.....####
|
||||||
|
.......###.#.........#..#......
|
||||||
|
#...#.....##.#......####.......
|
||||||
|
..#.#..##.#.#...#...#..##..##..
|
||||||
|
.....#...##.....#...##......##.
|
||||||
|
##..#..#.##..#.#......#.....#..
|
||||||
|
##.........#.#.##.#..#.#....#.#
|
||||||
|
.#........###...#.........#....
|
||||||
|
...#..#.#..#....####...........
|
||||||
|
#.#....#..##..####.#...#.##....
|
||||||
|
.#.....#.......#..........#..##
|
||||||
|
...#.......#...###..#.....#..##
|
||||||
|
.........#.###.#..##...#.##...#
|
||||||
|
.#..........##..####...#..#.#.#
|
||||||
|
.#...##...#............##...#.#
|
||||||
|
...#....#.#..........#.#..#.#..
|
||||||
|
.#.#...##....##.#.#.#....#.....
|
||||||
|
....#..#.....#.#..#.#..#.##.###
|
||||||
|
.....#.#.....#..#......#.#.#...
|
||||||
|
.....#.#.#..###..#.#..###...#..
|
||||||
|
#.......####...#.#..#......##.#
|
||||||
|
....#..#..###......###.##....#.
|
||||||
|
##.....#.....#.............#..#
|
||||||
|
#..#..#...##.....##..#..#.#....
|
||||||
|
.....#.#.###...#...............
|
||||||
|
#.#.#.....#.#..#.#...#.......#.
|
||||||
|
..##.##............#....#..##..
|
||||||
|
#....##...#.....#.###...#.#....
|
||||||
|
#...##.#.........#...#....#....
|
||||||
|
##.##.#...#.#...###..#....##..#
|
||||||
|
....#....##..#..#.......#...##.
|
||||||
|
.#...#...#..#.....#..###.#..#.#
|
||||||
|
....#..###......#....##....#...
|
||||||
|
#.#.....#....##.#..#.#...###...
|
||||||
|
.......#............#......#...
|
||||||
|
.##..#.###.#.............###...
|
||||||
|
..##...##.#.#.#.....#........##
|
||||||
|
....#.###....#..#..#...#...#..#
|
||||||
|
.....#...#...#..#....#.....##..
|
||||||
|
###.#.#.....#......####.....#..
|
||||||
|
#.#.###............#......#....
|
||||||
|
..#.....#..#..#..#....#......#.
|
||||||
|
#...######...#....#.##...##.#.#
|
||||||
|
##.#.#.#..##......##.#..#.#...#
|
||||||
|
............#.#..#.##....#.....
|
||||||
|
......#............#.#...#..#.#
|
||||||
|
.#..##...##..#.#.#..###.....##.
|
||||||
|
#.###.#...........#...#....#...
|
||||||
|
....##.....#...##...#...###.#.#
|
||||||
|
.####.#.#.....#.#..#.#.##......
|
||||||
|
.#...##......###...#..##..#.#..
|
||||||
|
.#......#...#....##.....##..#..
|
||||||
|
..........##.....###.##.#...#.#
|
||||||
|
.#........##.#..............#..
|
||||||
|
#...###..#...#.....#....#.....#
|
||||||
|
...#......#..#...#...#..###.#..
|
||||||
|
.#...##..#........#.......#.#..
|
||||||
|
.#.#.##.........##.##......#..#
|
||||||
|
#...#.#.#...#.....#.#...#.#..#.
|
||||||
|
#.#..#...#...#...##..........#.
|
||||||
|
.#...........#....#..#.#..#.#..
|
||||||
|
#.......#......#..#...#........
|
||||||
|
.....#..#...##..###..##........
|
||||||
|
......#...#.....#..#.#.#....##.
|
||||||
|
....##..##..##....###.##.......
|
||||||
|
.#........##.#.#...#..#........
|
||||||
|
.....##...##...#......#..#...#.
|
||||||
|
..#.....#....###.#..##....#..#.
|
||||||
|
......#..#...####.#.....##.####
|
@ -0,0 +1,35 @@
|
|||||||
|
#lang br
|
||||||
|
(require racket/file rackunit)
|
||||||
|
|
||||||
|
(define passports (for/list ([pstr (string-split (file->string "04.rktd") #rx"\n\n+")])
|
||||||
|
(for/hash ([kvstr (string-split pstr)])
|
||||||
|
(apply values (string-split kvstr ":")))))
|
||||||
|
|
||||||
|
(define required-fields '("byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid")) ; "cid" is not required
|
||||||
|
|
||||||
|
(define (passport-keys-valid? p)
|
||||||
|
(for*/and ([passport-keys (in-value (hash-keys p))]
|
||||||
|
[field required-fields])
|
||||||
|
(member field passport-keys)))
|
||||||
|
|
||||||
|
(check-equal? (count passport-keys-valid? passports) 202)
|
||||||
|
|
||||||
|
(define (stringval-in-range str low high)
|
||||||
|
(<= low (string->number str) high))
|
||||||
|
|
||||||
|
(define (passport-values-valid? p)
|
||||||
|
(and
|
||||||
|
(stringval-in-range (hash-ref p "byr") 1920 2002)
|
||||||
|
(stringval-in-range (hash-ref p "iyr") 2010 2020)
|
||||||
|
(stringval-in-range (hash-ref p "eyr") 2020 2030)
|
||||||
|
(let ([hgt (hash-ref p "hgt")])
|
||||||
|
(cond
|
||||||
|
[(string-suffix? hgt "cm") (stringval-in-range (string-trim hgt "cm") 150 193)]
|
||||||
|
[(string-suffix? hgt "in") (stringval-in-range (string-trim hgt "in") 59 76)]
|
||||||
|
[else #false]))
|
||||||
|
(let ([hcl (hash-ref p "hcl")])
|
||||||
|
(and (regexp-match #rx"#......" hcl) (string->number (string-trim hcl "#") 16)))
|
||||||
|
(member (hash-ref p "ecl") '("amb" "blu" "brn" "gry" "grn" "hzl" "oth"))
|
||||||
|
(let ([pid (hash-ref p "pid")]) (and (= 9 (string-length pid)) (string->number pid)))))
|
||||||
|
|
||||||
|
(check-equal? (count (λ (p) (and (passport-keys-valid? p) (passport-values-valid? p))) passports) 137)
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue