day1-4
This commit is contained in:
commit
493336905c
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
5
Cargo.lock
generated
Normal file
5
Cargo.lock
generated
Normal file
@ -0,0 +1,5 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "aoc2020"
|
||||
version = "0.1.0"
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "aoc2020"
|
||||
version = "0.1.0"
|
||||
authors = ["Stefan Bühler <stbuehler@web.de>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
200
data/day1/input
Normal file
200
data/day1/input
Normal file
@ -0,0 +1,200 @@
|
||||
1934
|
||||
1702
|
||||
1571
|
||||
1737
|
||||
1977
|
||||
1531
|
||||
1428
|
||||
1695
|
||||
1794
|
||||
1101
|
||||
13
|
||||
1164
|
||||
1235
|
||||
1289
|
||||
1736
|
||||
1814
|
||||
1363
|
||||
1147
|
||||
1111
|
||||
1431
|
||||
1765
|
||||
1515
|
||||
1184
|
||||
1036
|
||||
1803
|
||||
1791
|
||||
1638
|
||||
1809
|
||||
1283
|
||||
1980
|
||||
1854
|
||||
1878
|
||||
1574
|
||||
1352
|
||||
1151
|
||||
730
|
||||
1581
|
||||
1990
|
||||
1919
|
||||
2003
|
||||
1538
|
||||
1663
|
||||
1735
|
||||
1772
|
||||
1830
|
||||
1152
|
||||
1022
|
||||
1774
|
||||
1544
|
||||
1551
|
||||
1835
|
||||
1383
|
||||
1614
|
||||
1396
|
||||
1715
|
||||
1530
|
||||
295
|
||||
1208
|
||||
1978
|
||||
1104
|
||||
1691
|
||||
1176
|
||||
1183
|
||||
1909
|
||||
1192
|
||||
1535
|
||||
1924
|
||||
1268
|
||||
1969
|
||||
1954
|
||||
1760
|
||||
1077
|
||||
1734
|
||||
1371
|
||||
1676
|
||||
1933
|
||||
1400
|
||||
1928
|
||||
1982
|
||||
1541
|
||||
1106
|
||||
1248
|
||||
1346
|
||||
1782
|
||||
1142
|
||||
1849
|
||||
1798
|
||||
1362
|
||||
1379
|
||||
1886
|
||||
1265
|
||||
1226
|
||||
1751
|
||||
1575
|
||||
1027
|
||||
1710
|
||||
1601
|
||||
1205
|
||||
1922
|
||||
1452
|
||||
1206
|
||||
1263
|
||||
2000
|
||||
1957
|
||||
1951
|
||||
1834
|
||||
1533
|
||||
1149
|
||||
1245
|
||||
1564
|
||||
1182
|
||||
1237
|
||||
1013
|
||||
1254
|
||||
1895
|
||||
1504
|
||||
1480
|
||||
1556
|
||||
1821
|
||||
1589
|
||||
1864
|
||||
1573
|
||||
1698
|
||||
1927
|
||||
1434
|
||||
516
|
||||
1722
|
||||
1360
|
||||
1940
|
||||
1212
|
||||
1329
|
||||
1675
|
||||
1812
|
||||
1917
|
||||
1302
|
||||
1604
|
||||
1336
|
||||
1233
|
||||
1405
|
||||
1179
|
||||
1169
|
||||
1081
|
||||
1941
|
||||
1553
|
||||
1236
|
||||
1824
|
||||
1923
|
||||
1938
|
||||
1475
|
||||
1446
|
||||
1545
|
||||
1853
|
||||
1664
|
||||
317
|
||||
1489
|
||||
1884
|
||||
1743
|
||||
1621
|
||||
1128
|
||||
1474
|
||||
1505
|
||||
394
|
||||
1387
|
||||
1509
|
||||
1627
|
||||
1914
|
||||
1913
|
||||
1949
|
||||
1843
|
||||
1847
|
||||
1882
|
||||
1486
|
||||
1082
|
||||
1802
|
||||
1645
|
||||
1690
|
||||
1629
|
||||
1377
|
||||
2004
|
||||
1044
|
||||
1191
|
||||
1014
|
||||
1857
|
||||
1813
|
||||
1572
|
||||
1055
|
||||
1002
|
||||
1721
|
||||
1273
|
||||
1417
|
||||
1968
|
||||
1888
|
||||
1863
|
||||
1278
|
||||
1141
|
||||
1964
|
||||
1259
|
||||
1823
|
||||
1181
|
||||
1779
|
1000
data/day2/input
Normal file
1000
data/day2/input
Normal file
File diff suppressed because it is too large
Load Diff
323
data/day3/input
Normal file
323
data/day3/input
Normal file
@ -0,0 +1,323 @@
|
||||
.#....#..##.#..####....#.......
|
||||
......#..#....#....###......#.#
|
||||
#..#.....#..............##.#.#.
|
||||
#.#...#....#...#......##..#..#.
|
||||
...#..#.##..#..#........###.#.#
|
||||
...#.#..........#.........##...
|
||||
...#.#....#.#....#..#......#...
|
||||
..##.#.....#.......#.###..#..##
|
||||
..#.......#.......#....##......
|
||||
....##........##.##...#.###.##.
|
||||
#.......#.......##..#......#...
|
||||
..##.............##.#......#...
|
||||
...#.####....#.....#...##......
|
||||
.............##.#......#.......
|
||||
..#...#....#......#....#.......
|
||||
..#....#..#............#.......
|
||||
##...#..#........##..#......#..
|
||||
##........##........#.#.......#
|
||||
#.......#........#.#..#....###.
|
||||
.....#..#.#..........##...#....
|
||||
..##...#......#.#...#..#...#...
|
||||
##.##...#......#....#....#...#.
|
||||
#.......#..#.#..#....#..###.#.#
|
||||
#.............#.#....#..#.#....
|
||||
...#.......###.#.##.##.#...#..#
|
||||
.##.......##..##...#..###......
|
||||
.......#.#.#.#..####..#..#..#..
|
||||
...##......#.#.##.###....#.###.
|
||||
###......###......#.#####..#...
|
||||
..#........##..#..##.##..#...#.
|
||||
.....##..#...#..#.##.....#.#...
|
||||
#......#.##....#..##.#....#.#..
|
||||
##.#.##..#................#....
|
||||
......#.#....#......##.....#...
|
||||
..#...##..#..#...#..#.#..#.....
|
||||
........#.#.#.##...#.#.....#.#.
|
||||
#.#......#.....##..#...#.......
|
||||
..#.#......#...........###.....
|
||||
......##....#....##..#..#.#.#.#
|
||||
##....#.###...#......#..#...#..
|
||||
#.#.##....###...####.......#..#
|
||||
##...........#.....#........#.#
|
||||
.##.#..#.....#......#.......#..
|
||||
##..##..###....#.........##....
|
||||
..#..#..#.##...#.#...#........#
|
||||
#.##.###...#.......#...........
|
||||
.........#.................#...
|
||||
#.##...#.....#..##........#....
|
||||
....#.#...##...#...........#...
|
||||
.#.....#.#..#...##..##.....#...
|
||||
.#.....####....#..##..#........
|
||||
...#..#......##.#..##.#.#.#..#.
|
||||
.##.#.....#.....#...#.......##.
|
||||
......#..#..#......#...####....
|
||||
.......#......##..#..##.....#..
|
||||
......#.#..#...#..#.#..........
|
||||
....##.........#...............
|
||||
.#....#..##.....#....##.##.....
|
||||
#.#.....#...#....####....#.#...
|
||||
#.....#....#.#...#.............
|
||||
...#..#.....#....##..#..#......
|
||||
...#.#............#...........#
|
||||
###.#..#.#......#.....##.....#.
|
||||
####....#....###.....#..#.#####
|
||||
.###..#...#.#..#......##.#.#.#.
|
||||
.....#.##.#....#..##....#..#..#
|
||||
...#....#...##.....#......#.#..
|
||||
....#...#....#...#....#.....#.#
|
||||
.#.....#.....#.#..#......#..#..
|
||||
..#..##....##.##....#.....##...
|
||||
#..##...#.##...#..#.#.#.....#..
|
||||
...#..##.#..#....#.#....######.
|
||||
..........#..#.....#....#...##.
|
||||
#.#####.#.###..#.....#.........
|
||||
#....#......#..#.#.##.##..###..
|
||||
..#...###.#.#....##.##...##....
|
||||
.......#....#..#...##......#...
|
||||
...#.#...#..#.....#..##.#......
|
||||
###..##...........#............
|
||||
..#....#.##....#.#..##...#.....
|
||||
##....#...#....#.....#.#..##...
|
||||
..............#.##.#..#..##.###
|
||||
......#..#..#..#.#....###...##.
|
||||
.#...#..#.#.#....#..........#..
|
||||
..#.#.....#..#...........#.##..
|
||||
...#.#......#......#..#..#.#...
|
||||
...#....#.#.#.....#...#.##..#..
|
||||
.#.#..#...#........##.......#..
|
||||
##..........#..#...#....###.#..
|
||||
#.....###......#..#.#.#....#.#.
|
||||
..###.......#.#...............#
|
||||
#....#.....#.#......#..##.##...
|
||||
#.##.#.#....#..#.#...#.#...#..#
|
||||
#....#..#...........#.......#..
|
||||
...#.####.....#.........###.##.
|
||||
......#..#.....#..........#..#.
|
||||
#...#.#..####...#...#.#.##...##
|
||||
.##.........#......#.#.#.......
|
||||
.......##...##.##....###...##..
|
||||
...#..#....#..#.#.#.....#.#....
|
||||
#....#.#.#.......##..###..##...
|
||||
......#............#.#...#..#..
|
||||
#.#.....#......#...#.......###.
|
||||
...#.#................#...#....
|
||||
.....#......#.#..#...##.#.#...#
|
||||
#....#.#..#..#..##..#.##..#....
|
||||
#.................#..#....#....
|
||||
..#....#.......####....###.....
|
||||
.#..#.#.#...###..#...#..###....
|
||||
..#..#.#......#.###..........#.
|
||||
.....#......#.......##....##.#.
|
||||
.#....#........#.#.##.#........
|
||||
#.#..##..#..#.#...####....##...
|
||||
...#....#.#..#...#..........#..
|
||||
.#.....#.##....#...##..........
|
||||
....##....#.....#.....#...#.###
|
||||
.#...##.#.#..##..#...#.#..#..#.
|
||||
..#.......#.##.....#.#........#
|
||||
...#...#.....##..#.#.#....#....
|
||||
...#.....#.......##.........#.#
|
||||
.##.....#..#.#...#.#...#.#...#.
|
||||
...........#...#.###..#...#..#.
|
||||
#.##........#..###.##...####...
|
||||
.#.....#.#...##...#..#..#...##.
|
||||
..#....#..#...#.....#.....##...
|
||||
..###..#.#.....##........#.##..
|
||||
.#.#..##........#.##....#..#.##
|
||||
.####.#..##..#.#..#....##....#.
|
||||
.##....##...#.#........#.......
|
||||
....#..#..#...#..#..#..#.#.....
|
||||
...#......................#....
|
||||
#.....#.#....#..#..#.#..#....#.
|
||||
##.....#.....##..........###...
|
||||
.#..#..............#...##.#.#.#
|
||||
...#...#.#.............#.#..#.#
|
||||
..#.....#.......#......#.#.....
|
||||
.###.#..#..#..#.#..#.....#.....
|
||||
.....##..##...##.......#....###
|
||||
.#........###...##..#....##....
|
||||
#....#.#......##..#....#.##..#.
|
||||
#....#.#...#........##...###...
|
||||
.#.....#...#.###....#.##.#.####
|
||||
###......#....#...#....##..#..#
|
||||
##....#..###......#...#.#.#....
|
||||
..........#......##.#..#.......
|
||||
.#..#......###.........##...#..
|
||||
....#......#....#.........#.#.#
|
||||
##.#.#...#.#...#...#..#......#.
|
||||
....#.##.........#..#.....##.#.
|
||||
........#...#..#.#.#.#.....##..
|
||||
..#......#.#.#..#.....##.......
|
||||
..............#....#....##.#..#
|
||||
....#.#.....#....#.#.###.#....#
|
||||
..#..........#..#......#.##..#.
|
||||
...#...#.#.............#..#....
|
||||
#.......#..#..##.........##..#.
|
||||
..##..#............#.....#.....
|
||||
....#.#..##...#.#..#.........#.
|
||||
........#.......#.##....#....#.
|
||||
...#.....#.#.....#.#....#......
|
||||
..#......##.#.............#.#.#
|
||||
#.#.............#.#.....#......
|
||||
.##....##.#.....#....#...##....
|
||||
.#.#....##....#.....##.........
|
||||
...#.....#.....#.....#..#.###..
|
||||
.......#....#...##.#...#...#..#
|
||||
..#.#.......#...###.#...#....#.
|
||||
.....###..##....###.#.##.......
|
||||
....#..................##.#.##.
|
||||
.#.......###.##...#.#.....#....
|
||||
....#....##...##.....#.#...#..#
|
||||
#..#.....#......##...#....#....
|
||||
#..##.........#.....#...#......
|
||||
...#..##.......##......#..#####
|
||||
.#..###.###.#.##........#......
|
||||
.#...#....#....#.#....#...##...
|
||||
##........#....#.........##..#.
|
||||
.#.....##............#.#.......
|
||||
....#....#...........###.....##
|
||||
.#......#.#.#..#....#.#.....##.
|
||||
......#.##.#..##....#.#.#..#...
|
||||
#....#......#...#..####........
|
||||
......#..#..##..#.......#.#..#.
|
||||
##....##.###.#...#.##.#..#.###.
|
||||
.#.........#...##...#.#......#.
|
||||
..#.#...........####.#....##.##
|
||||
.....#.#..##.#...###...#..#.#..
|
||||
...#..#..##.#...#.....#.##...##
|
||||
..##......##..........#..###...
|
||||
.#......##.....#.##....#.#.##.#
|
||||
...#.......##..##.....#....#...
|
||||
.##...#...#....#..#............
|
||||
#..#....#...........#..........
|
||||
......#...#.#.......#...#.##..#
|
||||
..#.###..#.....#.....#..#.....#
|
||||
....#....#..........##....#..#.
|
||||
.......##.#.#.#......#....#...#
|
||||
####..#.###........#..#......#.
|
||||
#........##.#.#.#.............#
|
||||
.#......#......#..#.##.....#...
|
||||
.....##.##......##.#.....#.#.#.
|
||||
.......##.#.....##.......#.#.#.
|
||||
.#.#..#.#..#.##...#.#....#.#..#
|
||||
.#..##....#..#...##.......#..#.
|
||||
.#.#..#.......#................
|
||||
#........#.#.#......#.#.#.#....
|
||||
##......#...#..##.#...##.##....
|
||||
##.#..#...........##...#..###..
|
||||
......#.####...#........#.#.#..
|
||||
...#........##..###.#.#...#...#
|
||||
.#.....##..#......##......###..
|
||||
..#.#...#......#..#..##.#.....#
|
||||
#....#..#.#..........#...#.....
|
||||
.#......#.##..###..#.#....#..##
|
||||
.......#.......#..#..#......#..
|
||||
..##.....##.#..#..#.....##.....
|
||||
........#.##...#.#.#..#..#..#..
|
||||
...#.######.........#.....#..##
|
||||
.#.#............#....#.........
|
||||
#...#....###.#......#.#........
|
||||
#.........#....#...##..........
|
||||
....#...........#.###.#...###..
|
||||
.........#........#.#.#..#...#.
|
||||
.#.......#.#.....#.#.....#.##..
|
||||
.....#.......#.....#.#.#.......
|
||||
#.##..#..##.......#...#......#.
|
||||
.###.....##...##.#...##.##.#.#.
|
||||
...#......##..##............#.#
|
||||
...#......................#..##
|
||||
#..#..#................#...#...
|
||||
#..#....#.#.#...##.......#..#..
|
||||
....#.#..###.##...#..#.###..#..
|
||||
..#...#....####.#............#.
|
||||
......#....#.#...#.#.#.........
|
||||
#...#........#.....##..###.#..#
|
||||
#....#...#...##...#..#....##...
|
||||
#..#...#..#.......#.#..##.#..#.
|
||||
#.#..........#...........##....
|
||||
.#...###...#......#.......#.#.#
|
||||
.........#.........#...#...##..
|
||||
##.#..###......##..#.....#..#..
|
||||
....##...............#.....#...
|
||||
.....#.....###.#.....#.#.......
|
||||
....#..#......###..#..##..#....
|
||||
......................#.....#..
|
||||
..#..#...##....##....#........#
|
||||
..#....#...#...#.......#.....#.
|
||||
...##.#.#.##......#.#.#.#.####.
|
||||
.###...#..#......#.#..#........
|
||||
#..#...##.#..#..##..##....#...#
|
||||
...#...#..#..#..#........#..##.
|
||||
.##....#.##.#....#...#.#.#....#
|
||||
#..#....#..#....#.......##..#.#
|
||||
...#.#....####...........#...#.
|
||||
#...#####...#.#..#......#...#.#
|
||||
.##....#.#.#..#......#..##.....
|
||||
..........#..#.#.#.....##......
|
||||
.....#....#..................#.
|
||||
.........#...#...#....#..###...
|
||||
.#.#.#....#....................
|
||||
......##............##.###..#..
|
||||
#.#...#........####.##..#.#.##.
|
||||
#........#.#.#.#..#.##.....#...
|
||||
......####..#.##.......#....#..
|
||||
.........#...#...#.....#.......
|
||||
..##.....#...#...#.....##.....#
|
||||
....#...##....#.....#..#..##.##
|
||||
..#.........##...##..###..#....
|
||||
#....#.#.........##.###.#...##.
|
||||
.##...#....#..#..#.#....##.....
|
||||
##..#..#..#...........#.##....#
|
||||
....#..........#...#..#.....#..
|
||||
........###..#..#.#.#.....##...
|
||||
#...#...#..###............###..
|
||||
..#.....#.#.#..#..#.#..#......#
|
||||
..#...##..#....#...#......#....
|
||||
#....#........##.....#..##....#
|
||||
#.....#.#.#..#.......##.#.#.##.
|
||||
..##...#...#.....#..........#..
|
||||
##.....#....#......#..........#
|
||||
......#..#..........#.#..####..
|
||||
......#...#............##...##.
|
||||
..#.......##.......#...###.###.
|
||||
.#..#.#.#...#..##.#......#.#...
|
||||
.##.....##.#.#...#.##.........#
|
||||
#.#.######...........#.#####.#.
|
||||
........#.##...##....##.#.##.#.
|
||||
....#......#.....#.....###...##
|
||||
#..............#.#....#.#....#.
|
||||
....#..###.#.........##.#.#....
|
||||
..#.#.#..##....####..........#.
|
||||
...#..#.......#................
|
||||
...#....#..............#....#..
|
||||
.....#...#...#....#.#.#..#...#.
|
||||
......##.............###.##..##
|
||||
.#...#.#..#......#..#.##.......
|
||||
##.....#.....#.##...#....#.....
|
||||
..#..#.#.#.#.#..........#..###.
|
||||
##..........#........#....#.#..
|
||||
.....#...#........#.#..###....#
|
||||
.###.#........#.##......#.#...#
|
||||
#...##....#....#....##.#.#.....
|
||||
.....#.#............#..........
|
||||
..#.##....................#....
|
||||
.....#..#..#.#..#.##.......#...
|
||||
.....###......#......##......##
|
||||
#.....#.#.......##.......#...#.
|
||||
.#.#...#......#..###...#.....#.
|
||||
#.#..#...#..##.....#...#.#..#..
|
||||
.....#.#..........#..#.........
|
||||
.###..##..##.....#...#...#..##.
|
||||
#...#.#....#.......##..#.......
|
||||
###...#.#.#..#.......#......#..
|
||||
....##........#..........##....
|
||||
............#....#...........#.
|
||||
#..#.#....##..#.#..#......##...
|
||||
.###....##...#....##..........#
|
||||
.###........#........###.....#.
|
||||
...#...#.#......#...#....#.....
|
||||
.###.......#.........#.........
|
||||
....##.#......#...###......##.#
|
||||
.###...#..##.....##.......#....
|
||||
.#.#...#..#.##....#........#...
|
1146
data/day4/input
Normal file
1146
data/day4/input
Normal file
File diff suppressed because it is too large
Load Diff
35
src/bin/day1/main.rs
Normal file
35
src/bin/day1/main.rs
Normal file
@ -0,0 +1,35 @@
|
||||
const INPUT: &str = include_str!("../../../data/day1/input");
|
||||
|
||||
fn main() {
|
||||
let expenses: Vec<_> = INPUT.split_whitespace().map(|s| s.parse::<u32>().unwrap()).collect();
|
||||
'outer: for (pos, &exp1) in expenses.iter().enumerate() {
|
||||
for &exp2 in expenses[pos+1..].iter() {
|
||||
if exp1 + exp2 == 2020 {
|
||||
println!(
|
||||
"Found: {exp1} + {exp2} = 2020; {exp1} * {exp2} = {}",
|
||||
exp1 * exp2,
|
||||
exp1 = exp1,
|
||||
exp2 = exp2,
|
||||
);
|
||||
break 'outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
'outer2: for (pos, &exp1) in expenses.iter().enumerate() {
|
||||
for (pos2, &exp2) in expenses[pos+1..].iter().enumerate() {
|
||||
for &exp3 in expenses[pos2+1..].iter() {
|
||||
if exp1 + exp2 + exp3 == 2020 {
|
||||
println!(
|
||||
"Found: {exp1} + {exp2} + {exp3} = 2020; {exp1} * {exp2} * {exp3} = {}",
|
||||
exp1 * exp2 * exp3,
|
||||
exp1 = exp1,
|
||||
exp2 = exp2,
|
||||
exp3 = exp3,
|
||||
);
|
||||
break 'outer2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
69
src/bin/day2/main.rs
Normal file
69
src/bin/day2/main.rs
Normal file
@ -0,0 +1,69 @@
|
||||
use std::convert::TryInto;
|
||||
|
||||
const INPUT: &str = include_str!("../../../data/day2/input");
|
||||
|
||||
struct Policy {
|
||||
min: usize,
|
||||
max: usize,
|
||||
chr: char,
|
||||
}
|
||||
|
||||
impl Policy {
|
||||
fn parse(text: &str) -> Self {
|
||||
let tokens: Vec<_> = text.trim().split_whitespace().collect();
|
||||
let [range, chr]: [&str; 2] = tokens.try_into().unwrap();
|
||||
let tokens: Vec<_> = range.split("-").collect();
|
||||
let [min, max]: [&str; 2] = tokens.try_into().unwrap();
|
||||
assert!(chr.len() == 1);
|
||||
let chr = chr.chars().next().unwrap();
|
||||
let min = min.parse::<usize>().unwrap();
|
||||
let max = max.parse::<usize>().unwrap();
|
||||
Self { min, max, chr }
|
||||
}
|
||||
|
||||
fn test(&self, input: &str) -> bool {
|
||||
let count = input.chars().filter(|&c| c == self.chr).count();
|
||||
count >= self.min && count <= self.max
|
||||
}
|
||||
|
||||
fn test_crazy(&self, input: &str) -> bool {
|
||||
let chars: Vec<_> = input.chars().collect();
|
||||
assert!(self.min > 0 && self.max > 0);
|
||||
assert!(self.min <= chars.len() && self.max <= chars.len());
|
||||
(chars[self.min-1] == self.chr) != (chars[self.max-1] == self.chr)
|
||||
}
|
||||
}
|
||||
|
||||
struct Entry {
|
||||
policy: Policy,
|
||||
password: String,
|
||||
}
|
||||
|
||||
impl Entry {
|
||||
fn parse(line: &str) -> Self {
|
||||
let tokens: Vec<_> = line.split(":").collect();
|
||||
let [policy, password]: [&str; 2] = tokens.try_into().unwrap();
|
||||
Self {
|
||||
policy: Policy::parse(policy),
|
||||
password: password.trim().into(),
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_list(input: &str) -> Vec<Self> {
|
||||
input.lines().map(Self::parse).collect()
|
||||
}
|
||||
|
||||
fn valid(&self) -> bool {
|
||||
self.policy.test(&self.password)
|
||||
}
|
||||
|
||||
fn valid_crazy(&self) -> bool {
|
||||
self.policy.test_crazy(&self.password)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let entries = Entry::parse_list(INPUT);
|
||||
println!("Valid entries: {}", entries.iter().filter(|e| e.valid()).count());
|
||||
println!("Crazy valid entries: {}", entries.iter().filter(|e| e.valid_crazy()).count());
|
||||
}
|
65
src/bin/day3/main.rs
Normal file
65
src/bin/day3/main.rs
Normal file
@ -0,0 +1,65 @@
|
||||
const INPUT: &str = include_str!("../../../data/day3/input");
|
||||
|
||||
struct Forest {
|
||||
pub rows: usize,
|
||||
stride: usize,
|
||||
trees: Vec<bool>,
|
||||
}
|
||||
|
||||
impl Forest {
|
||||
fn parse(text: &str) -> Self {
|
||||
let first_line = text.lines().next().unwrap();
|
||||
let stride = first_line.len();
|
||||
let mut trees = Vec::new();
|
||||
let mut rows = 0;
|
||||
for line in text.lines() {
|
||||
assert_eq!(line.len(), stride);
|
||||
trees.extend(line.as_bytes().iter().map(|&c| c == b'#'));
|
||||
rows += 1;
|
||||
}
|
||||
Self {
|
||||
rows,
|
||||
stride,
|
||||
trees,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_tree(&self, row: usize, column: u64) -> bool {
|
||||
assert!(row < self.rows);
|
||||
let column = (column % self.stride as u64) as usize;
|
||||
self.trees[column + row * self.stride]
|
||||
}
|
||||
|
||||
fn hit_trees(&self, slope_y: usize, slope_x: u64) -> u64 {
|
||||
let mut row = slope_y;
|
||||
let mut col = slope_x;
|
||||
let mut hits = 0;
|
||||
while row < self.rows {
|
||||
if self.is_tree(row, col) {
|
||||
hits += 1;
|
||||
}
|
||||
row += slope_y;
|
||||
col += slope_x;
|
||||
}
|
||||
hits
|
||||
}
|
||||
}
|
||||
|
||||
const TEST_SLOPES: &[(usize, u64)] = &[
|
||||
(1, 1),
|
||||
(1, 3),
|
||||
(1, 5),
|
||||
(1, 7),
|
||||
(2, 1),
|
||||
];
|
||||
|
||||
fn main() {
|
||||
let forest = Forest::parse(INPUT);
|
||||
println!("Hit trees: {}", forest.hit_trees(1, 3));
|
||||
println!(
|
||||
"Hit product: {}",
|
||||
TEST_SLOPES.iter().map(|(slope_y, slope_x)| {
|
||||
forest.hit_trees(*slope_y, *slope_x)
|
||||
}).product::<u64>(),
|
||||
);
|
||||
}
|
13
src/bin/day4/main.rs
Normal file
13
src/bin/day4/main.rs
Normal file
@ -0,0 +1,13 @@
|
||||
pub mod passport;
|
||||
|
||||
use passport::Passport;
|
||||
|
||||
const INPUT: &str = include_str!("../../../data/day4/input");
|
||||
|
||||
fn main() {
|
||||
let passports = Passport::parse_list(INPUT);
|
||||
let all_required_fields: Vec<_> = passports.iter().filter(|p| p.require_all_but_country_id()).collect();
|
||||
println!("Required fields Passports: {}", all_required_fields.len());
|
||||
let valid: Vec<_> = passports.iter().filter(|p| p.valid()).collect();
|
||||
println!("Valid Passports: {}", valid.len());
|
||||
}
|
106
src/bin/day4/passport.rs
Normal file
106
src/bin/day4/passport.rs
Normal file
@ -0,0 +1,106 @@
|
||||
#[derive(Clone, Debug, Default)]
|
||||
pub struct Passport {
|
||||
// "byr": birth_year
|
||||
pub birth_year: Option<String>,
|
||||
// "iyr": issue_year
|
||||
pub issue_year: Option<String>,
|
||||
// "eyr": expiration_year
|
||||
pub expiration_year: Option<String>,
|
||||
// "hgt": height
|
||||
pub height: Option<String>,
|
||||
// "hcl": hair_color
|
||||
pub hair_color: Option<String>,
|
||||
// "ecl": eye_color
|
||||
pub eye_color: Option<String>,
|
||||
// "pid": passport_id
|
||||
pub passport_id: Option<String>,
|
||||
// "cid": country_id
|
||||
pub country_id: Option<String>,
|
||||
}
|
||||
|
||||
impl Passport {
|
||||
pub fn parse(text: &str) -> Self {
|
||||
let mut result = Self::default();
|
||||
for token in text.split_whitespace() {
|
||||
let colon = token.find(':').expect("missing separator");
|
||||
let key = &token[..colon];
|
||||
let value = &token[colon+1..];
|
||||
match key {
|
||||
"byr" => result.birth_year = Some(value.into()),
|
||||
"iyr" => result.issue_year = Some(value.into()),
|
||||
"eyr" => result.expiration_year = Some(value.into()),
|
||||
"hgt" => result.height = Some(value.into()),
|
||||
"hcl" => result.hair_color = Some(value.into()),
|
||||
"ecl" => result.eye_color = Some(value.into()),
|
||||
"pid" => result.passport_id = Some(value.into()),
|
||||
"cid" => result.country_id = Some(value.into()),
|
||||
_ => panic!("unknown field {:?}", key),
|
||||
}
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
pub fn parse_list(text: &str) -> Vec<Self> {
|
||||
text.split("\n\n").map(Self::parse).collect()
|
||||
}
|
||||
|
||||
pub fn require_all_but_country_id(&self) -> bool {
|
||||
self.birth_year.is_some() &
|
||||
self.issue_year.is_some() &
|
||||
self.expiration_year.is_some() &
|
||||
self.height.is_some() &
|
||||
self.hair_color.is_some() &
|
||||
self.eye_color.is_some() &
|
||||
self.passport_id.is_some()
|
||||
}
|
||||
|
||||
fn _valid(&self) -> Option<()> {
|
||||
let birth_year = self.birth_year.as_ref()?.parse::<u16>().ok()?;
|
||||
if birth_year < 1920 || birth_year > 2002 {
|
||||
return None;
|
||||
}
|
||||
let issue_year = self.issue_year.as_ref()?.parse::<u16>().ok()?;
|
||||
if issue_year < 2010 || issue_year > 2020 {
|
||||
return None;
|
||||
}
|
||||
let expiration_year = self.expiration_year.as_ref()?.parse::<u16>().ok()?;
|
||||
if expiration_year < 2020 || expiration_year > 2030 {
|
||||
return None;
|
||||
}
|
||||
let height = self.height.as_ref()?;
|
||||
if height.ends_with("cm") {
|
||||
let height = height[..height.len() - 2].parse::<u16>().ok()?;
|
||||
if height < 150 || height > 193 {
|
||||
return None;
|
||||
}
|
||||
} else if height.ends_with("in") {
|
||||
let height = height[..height.len() - 2].parse::<u16>().ok()?;
|
||||
if height < 59 || height > 76 {
|
||||
return None;
|
||||
}
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
let hair_color = self.hair_color.as_ref()?;
|
||||
if !hair_color.starts_with("#") || hair_color.len() != 7 {
|
||||
return None;
|
||||
}
|
||||
if !hair_color[1..].chars().all(|c| (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')) {
|
||||
return None;
|
||||
}
|
||||
let eye_color = self.eye_color.as_ref()?;
|
||||
match eye_color.as_str() {
|
||||
"amb"|"blu"|"brn"|"gry"|"grn"|"hzl"|"oth" => (),
|
||||
_ => return None,
|
||||
}
|
||||
let passport_id = self.passport_id.as_ref()?;
|
||||
if passport_id.len() != 9 || !passport_id.chars().all(|c| c.is_ascii_digit()) {
|
||||
return None;
|
||||
}
|
||||
Some(())
|
||||
}
|
||||
|
||||
pub fn valid(&self) -> bool {
|
||||
self._valid().is_some()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user