Compare commits

..

2 Commits

Author SHA1 Message Date
Shadowfacts c0830f24df
Day 1 2020-12-01 00:14:57 -05:00
Shadowfacts f4ce369998
Add benchmark module 2020-11-30 23:11:12 -05:00
3 changed files with 281 additions and 0 deletions

8
lib/benchmark.ex Normal file
View File

@ -0,0 +1,8 @@
defmodule Benchmark do
def measure(function) do
function
|> :timer.tc()
|> elem(0)
|> Kernel./(1_000_000)
end
end

73
lib/day1/day1.ex Normal file
View File

@ -0,0 +1,73 @@
defmodule Day1 do
@example_1 """
1721
979
366
299
675
1456
"""
def part1(example \\ false) do
if(example, do: @example_1, else: File.read!("lib/day1/input.txt"))
|> String.trim()
|> String.split("\n")
|> Enum.map(&String.to_integer/1)
|> all_pairs()
|> find_sum_to_2020()
end
def part2(example \\ false) do
if(example, do: @example_1, else: File.read!("lib/day1/input.txt"))
|> String.trim()
|> String.split("\n")
|> Enum.map(&String.to_integer/1)
|> all_triples()
|> find_sum_to_2020()
end
def all_pairs(items) do
items
|> Enum.drop(-1)
|> Enum.with_index()
|> Enum.flat_map(fn {a, a_index} ->
{_, rest} = Enum.split(items, a_index + 1)
Enum.map(rest, fn b ->
{a, b}
end)
end)
end
def all_triples(items) do
items
|> Enum.drop(-1)
|> Enum.with_index()
|> Enum.flat_map(fn {a, a_index} ->
{_, rest} = Enum.split(items, a_index + 1)
rest
|> Enum.drop(-1)
|> Enum.with_index()
|> Enum.flat_map(fn {b, b_index} ->
{_, rest_rest} = Enum.split(rest, b_index + 1)
Enum.map(rest_rest, fn c ->
{a, b, c}
end)
end)
end)
end
def find_sum_to_2020(groups) do
Enum.find_value(groups, fn items ->
list = Tuple.to_list(items)
if Enum.reduce(list, 0, &(&1 + &2)) == 2020 do
Enum.reduce(list, 1, &(&1 * &2))
else
nil
end
end)
end
end

200
lib/day1/input.txt Normal file
View File

@ -0,0 +1,200 @@
1695
1157
1484
1717
622
1513
1924
63
1461
1971
1382
1587
1913
1665
1464
1914
1637
1527
1424
1361
1187
272
1909
1448
1623
1164
1931
1646
1096
1655
1962
1961
1694
1792
1989
1616
138
1887
1357
1965
1085
308
2007
1254
1179
1124
1719
1467
1928
1630
1676
1359
1241
1511
1413
1656
1818
1919
1422
1745
1208
1609
1544
1775
1154
1057
1440
1242
1202
1266
1305
1836
1760
1730
1396
1315
1496
1964
1300
1195
1583
1607
1743
1682
1453
1848
1320
1601
954
1473
1847
1486
1853
1668
1342
1087
1139
1349
1568
1728
1420
1233
1073
1376
1658
1477
1871
1958
1950
1503
1758
1474
1203
1336
1981
1309
1618
1846
1974
1940
1333
1119
1756
1918
961
1307
1375
1346
1611
1284
84
1754
1608
2010
1341
1136
1218
1882
1911
1288
1930
1749
1952
1556
1757
1761
1112
1963
1186
1373
1622
1973
1330
1508
1222
1226
1389
1679
1584
1237
1563
1763
1998
1293
1642
95
1661
1674
1100
1262
1895
1548
1400
1205
1435
1156
1034
1577
1701
1198
1173
1500
1858
1809
1780
1412
1982
1070
1523
1776
1598
1113
1144
1777
1313
1102
1999
1405
1784
1196