This commit is contained in:
Rhiannon Morris 2020-12-02 10:31:32 +01:00
parent 29d8387656
commit 512ae7d3d7
5 changed files with 257 additions and 5 deletions

View File

@ -3,4 +3,4 @@ let days = [|Day1.main|]
let _ =
match Array.to_list Sys.argv with
| _exename :: day :: args -> days.(int_of_string day - 1) args
| _ -> Usage.exit "[day_num] args..."
| _ -> Usage.exit "<day> args..."

17
bracket.ml Normal file
View File

@ -0,0 +1,17 @@
let bracket ~make ~act ~free =
let x = make () in
match act x with
| result -> free x; result
| exception e -> free x; raise e
let infile ~act name =
bracket ~make:(fun () -> open_in name) ~act ~free:close_in_noerr
let infile_lines ~line:f ~of_seq name =
let get_line file =
match input_line file with
| exception End_of_file -> None
| line -> Some (f line, file)
in
let act file = of_seq (Seq.unfold get_line file) in
infile name ~act

5
bracket.mli Normal file
View File

@ -0,0 +1,5 @@
val bracket: make:(unit -> 'a) -> act:('a -> 'b) -> free:('a -> unit) -> 'b
val infile: act:(in_channel -> 'b) -> string -> 'b
val infile_lines: line:(string -> 'a) -> of_seq:('a Seq.t -> 'b) -> string -> 'b

200
data/day1 Normal file
View File

@ -0,0 +1,200 @@
1293
1207
1623
1675
1842
1410
85
1108
557
1217
1506
1956
1579
1614
1360
1544
1946
1666
1972
1814
1699
1778
1529
2002
1768
1173
1407
1201
1264
1739
1774
1951
1980
1428
1381
1714
884
1939
1295
1694
1168
1971
1352
1462
1828
1402
1433
1542
1144
1331
1427
1261
1663
1820
1570
1874
1486
1613
1769
1721
1753
1142
1677
2010
1640
1465
1171
534
1790
2005
1604
1891
1247
1281
1867
1403
2004
1668
1416
2001
1359
686
1965
1728
1551
1565
1128
1832
1757
1350
1808
1711
1799
1590
1989
1547
1140
1905
1368
1179
1902
1473
1908
1859
1257
1394
1244
1800
1695
1731
1474
1781
1885
1154
1990
1929
1193
1302
1831
1226
1418
1400
1435
1645
1655
1843
1227
1481
1754
1290
1685
1498
71
1286
1137
1288
1758
1987
1471
1839
1545
1682
1615
1475
1849
1985
1568
1795
1184
1863
1362
1271
1802
1944
1821
1880
1788
1733
1150
1314
1727
1434
1833
1312
1457
160
1629
1967
1505
1239
1266
1838
1687
1630
1591
1893
1450
1234
1755
1523
1533
1499
1865
1725
1444
1517
1167
1738
1519
1263
1901
1627
1644
1771
1812
1270
1497
1707
1708
1396

38
day1.ml
View File

@ -1,6 +1,36 @@
let main2 _input =
print_endline "boop"
module IntSet = Set.Make(Int)
let read_ints =
Bracket.infile_lines ~line:int_of_string ~of_seq:IntSet.of_seq
let find_with target ints =
let open IntSet in
let p x = mem (target - x) ints in
let res = min_elt (filter p ints) in
res, target - res
let find = find_with 2020
let main_part_1 input =
let ints = read_ints input in
let x, y = find ints in
Printf.printf "%d * %d = %d\n" x y (x * y)
let main_part_2 input =
let ints = read_ints input in
let exception Found of int * int * int in
let go x =
match find_with (2020 - x) ints with
| exception Not_found -> ()
| y, z -> raise (Found (x, y, z))
in
match IntSet.iter go ints with
| exception Found (x, y, z) ->
Printf.printf "%d * %d * %d = %d\n" x y z (x * y * z)
| _ -> raise Not_found
let mains = [|main_part_1; main_part_2|]
let main = function
| [input] -> main2 input
| _ -> failwith "usage: $0 1 infile"
| [part; input] -> mains.(int_of_string part - 1) input
| _ -> Usage.exit "1 <part> <infile>"