day 1
This commit is contained in:
parent
29d8387656
commit
512ae7d3d7
5 changed files with 257 additions and 5 deletions
|
@ -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
17
bracket.ml
Normal 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
5
bracket.mli
Normal 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
200
data/day1
Normal 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
38
day1.ml
|
@ -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>"
|
||||
|
|
Loading…
Reference in a new issue