Skip to content

Commit ad8f98d

Browse files
committed
Add Days 1 & 2
1 parent 7ab7a6e commit ad8f98d

File tree

4 files changed

+266
-0
lines changed

4 files changed

+266
-0
lines changed

01.exs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
defmodule Puzzle do
2+
def sum(string, delta \\ 1)
3+
4+
def sum("", _), do: 0
5+
def sum(<<_ :: utf8 >>, _), do: 0
6+
def sum(string, 0), do: string
7+
8+
def sum(string, delta) do
9+
shifted = rotate(string, delta)
10+
11+
sum_(string, shifted)
12+
end
13+
14+
def sum_mid(string) do
15+
delta = div byte_size(string), 2
16+
sum(string, delta)
17+
end
18+
19+
defp sum_("", ""), do: 0
20+
defp sum_(string, shifted) do
21+
{ a, rest_string } = String.next_grapheme(string)
22+
{ b, rest_shifted } = String.next_grapheme(shifted)
23+
24+
inc = if a == b, do: String.to_integer(a), else: 0
25+
inc + sum_(rest_string, rest_shifted)
26+
end
27+
28+
defp rotate("", _), do: ""
29+
defp rotate(string, 0), do: string
30+
31+
defp rotate(<<head :: utf8>>, _), do: <<head :: utf8>>
32+
33+
defp rotate(<<head :: utf8, rest :: binary >>, shift) do
34+
rotate(<< rest :: binary, head >>, shift - 1)
35+
end
36+
end
37+
38+
mode = List.first(System.argv)
39+
40+
if mode == "test" do
41+
ExUnit.start()
42+
43+
defmodule PuzzleTest do
44+
use ExUnit.Case
45+
46+
describe "sum(string)" do
47+
test "empty string" do
48+
sum = Puzzle.sum("")
49+
assert sum == 0
50+
end
51+
52+
test "22" do
53+
sum = Puzzle.sum("22")
54+
assert sum == 4
55+
end
56+
57+
test "23" do
58+
sum = Puzzle.sum("23")
59+
assert sum == 0
60+
end
61+
62+
test "1122" do
63+
sum = Puzzle.sum("1122")
64+
assert sum == 3
65+
end
66+
67+
test "1111" do
68+
sum = Puzzle.sum("1111")
69+
assert sum == 4
70+
end
71+
72+
test "1234" do
73+
sum = Puzzle.sum("1234")
74+
assert sum == 0
75+
end
76+
77+
test "91212129" do
78+
sum = Puzzle.sum("91212129")
79+
assert sum == 9
80+
end
81+
end
82+
83+
describe "sum_mid(string)" do
84+
test "empty string" do
85+
sum = Puzzle.sum_mid("")
86+
assert sum == 0
87+
end
88+
89+
test "22" do
90+
sum = Puzzle.sum_mid("22")
91+
assert sum == 4
92+
end
93+
94+
test "23" do
95+
sum = Puzzle.sum_mid("23")
96+
assert sum == 0
97+
end
98+
99+
test "1122" do
100+
sum = Puzzle.sum_mid("1122")
101+
assert sum == 0
102+
end
103+
104+
test "1212" do
105+
sum = Puzzle.sum_mid("1212")
106+
assert sum == 6
107+
end
108+
109+
test "1221" do
110+
sum = Puzzle.sum_mid("1221")
111+
assert sum == 0
112+
end
113+
114+
test "123425" do
115+
sum = Puzzle.sum_mid("123425")
116+
assert sum == 4
117+
end
118+
119+
test "123123" do
120+
sum = Puzzle.sum_mid("123123")
121+
assert sum == 12
122+
end
123+
124+
test "12131415" do
125+
sum = Puzzle.sum_mid("12131415")
126+
assert sum == 4
127+
end
128+
end
129+
end
130+
else
131+
data = File.read!("01.txt") |> String.trim_trailing
132+
sum = Puzzle.sum(data)
133+
sum_mid = Puzzle.sum_mid(data)
134+
IO.puts "The sum is: #{sum}"
135+
IO.puts "The sum mid is: #{sum_mid}"
136+
end

01.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3294199471327195994824832197564859876682638188889768298894243832665654681412886862234525991553276578641265589959178414218389329361496673991614673626344552179413995562266818138372393213966143124914469397692587251112663217862879233226763533911128893354536353213847122251463857894159819828724827969576432191847787772732881266875469721189331882228146576832921314638221317393256471998598117289632684663355273845983933845721713497811766995367795857965222183668765517454263354111134841334631345111596131682726196574763165187889337599583345634413436165539744188866156771585647718555182529936669683581662398618765391487164715724849894563314426959348119286955144439452731762666568741612153254469131724137699832984728937865956711925592628456617133695259554548719328229938621332325125972547181236812263887375866231118312954369432937359357266467383318326239572877314765121844831126178173988799765218913178825966268816476559792947359956859989228917136267178571776316345292573489873792149646548747995389669692188457724414468727192819919448275922166321158141365237545222633688372891451842434458527698774342111482498999383831492577615154591278719656798277377363284379468757998373193231795767644654155432692988651312845433511879457921638934877557575241394363721667237778962455961493559848522582413748218971212486373232795878362964873855994697149692824917183375545192119453587398199912564474614219929345185468661129966379693813498542474732198176496694746111576925715493967296487258237854152382365579876894391815759815373319159213475555251488754279888245492373595471189191353244684697662848376529881512529221627313527441221459672786923145165989611223372241149929436247374818467481641931872972582295425936998535194423916544367799522276914445231582272368388831834437562752119325286474352863554693373718848649568451797751926315617575295381964426843625282819524747119726872193569785611959896776143539915299968276374712996485367853494734376257511273443736433464496287219615697341973131715166768916149828396454638596713572963686159214116763

02.exs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
defmodule Puzzle do
2+
def checksum(""), do: 0
3+
4+
def checksum(spreadsheet) do
5+
spreadsheet
6+
|> String.split("\n", trim: true)
7+
|> Enum.map(&minmax/1)
8+
|> Enum.map(
9+
fn { nil, nil } -> 0
10+
{ min, max } -> max - min
11+
end
12+
)
13+
|> Enum.sum
14+
end
15+
16+
def checksum_div(""), do: 0
17+
18+
def checksum_div(spreadsheet) do
19+
spreadsheet
20+
|> String.split("\n", trim: true)
21+
|> Enum.map(&divides/1)
22+
|> Enum.map(
23+
fn [{ nil, nil }] -> 0
24+
[{ divided, divider }] -> div(divided, divider)
25+
end
26+
)
27+
|> Enum.sum
28+
end
29+
30+
defp minmax(""), do: { nil, nil }
31+
defp minmax(row) do
32+
row
33+
|> String.split
34+
|> Enum.map(&String.to_integer/1)
35+
|> Enum.reduce(
36+
{ nil, nil },
37+
fn(digit, acc) ->
38+
cond do
39+
is_nil(elem(acc, 0)) ->
40+
{ digit, digit }
41+
digit < elem(acc, 0) ->
42+
put_elem(acc, 0, digit)
43+
digit > elem(acc, 1) ->
44+
put_elem(acc, 1, digit)
45+
true ->
46+
acc
47+
end
48+
end
49+
)
50+
end
51+
52+
defp divides(""), do: { nil, nil }
53+
defp divides(row) do
54+
ints = row |> String.split |> Enum.map(&String.to_integer/1)
55+
for a <- ints,
56+
b <- ints,
57+
a > b,
58+
rem(a, b) == 0,
59+
do: { a, b }
60+
end
61+
end
62+
63+
mode = List.first(System.argv)
64+
65+
if mode == "test" do
66+
ExUnit.start()
67+
68+
defmodule PuzzleTest do
69+
use ExUnit.Case
70+
71+
describe "checksum(spreadsheet)" do
72+
test "for 3 lines" do
73+
spreadsheet = """
74+
5 1 9 5
75+
7 5 3
76+
2 4 6 8
77+
"""
78+
79+
checksum = Puzzle.checksum(spreadsheet)
80+
assert checksum == 18
81+
end
82+
83+
test "for 2 lines with eq values" do
84+
spreadsheet = """
85+
5 5
86+
5 5
87+
"""
88+
89+
checksum = Puzzle.checksum(spreadsheet)
90+
assert checksum == 0
91+
end
92+
end
93+
94+
describe "checksum_div(spreadsheet)" do
95+
test "for 3 lines" do
96+
spreadsheet = """
97+
5 9 2 8
98+
9 4 7 3
99+
3 8 6 5
100+
"""
101+
102+
checksum = Puzzle.checksum_div(spreadsheet)
103+
assert checksum == 9
104+
end
105+
end
106+
end
107+
else
108+
data = File.read!("02.txt") |> String.trim_trailing
109+
checksum = Puzzle.checksum(data)
110+
checksum_div = Puzzle.checksum_div(data)
111+
IO.puts "The checksum is: #{checksum}"
112+
IO.puts "The checksum div is: #{checksum_div}"
113+
end

02.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
104 240 147 246 123 175 372 71 116 230 260 118 202 270 277 292
2+
740 755 135 205 429 822 844 90 828 115 440 805 526 91 519 373
3+
1630 991 1471 1294 52 1566 50 1508 1367 1489 55 547 342 512 323 51
4+
1356 178 1705 119 1609 1409 245 292 1434 694 405 1692 247 193 1482 1407
5+
2235 3321 3647 212 1402 3711 3641 1287 2725 692 1235 3100 123 144 104 101
6+
1306 1224 1238 186 751 734 1204 1275 366 149 1114 166 1118 239 153 943
7+
132 1547 1564 512 2643 2376 2324 2159 1658 107 1604 145 2407 131 2073 1878
8+
1845 91 1662 108 92 1706 1815 1797 1728 1150 1576 83 97 547 1267 261
9+
78 558 419 435 565 107 638 173 93 580 338 52 633 256 377 73
10+
1143 3516 4205 3523 148 401 3996 3588 300 1117 2915 1649 135 134 182 267
11+
156 2760 1816 2442 2985 990 2598 1273 167 821 138 141 2761 2399 1330 1276
12+
3746 3979 2989 161 4554 156 3359 173 3319 192 3707 264 762 2672 4423 2924
13+
3098 4309 4971 5439 131 171 5544 595 154 571 4399 4294 160 6201 4329 5244
14+
728 249 1728 305 2407 239 691 2241 2545 1543 55 2303 1020 753 193 1638
15+
260 352 190 877 118 77 1065 1105 1085 1032 71 87 851 56 1161 667
16+
1763 464 182 1932 1209 640 545 931 1979 197 1774 174 2074 1800 939 161

0 commit comments

Comments
 (0)