Skip to content

Commit cba43b0

Browse files
committed
Add Day 4
1 parent c88105f commit cba43b0

File tree

2 files changed

+627
-0
lines changed

2 files changed

+627
-0
lines changed

04.exs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
defmodule Puzzle do
2+
def count_valid(lines) do
3+
lines
4+
|> String.split("\n")
5+
|> Enum.count(&valid?/1)
6+
end
7+
8+
def count_valid_anagrams(lines) do
9+
lines
10+
|> String.split("\n")
11+
|> Enum.count(&valid_anagrams?/1)
12+
end
13+
14+
def valid?(""), do: false
15+
def valid?(passphrase) do
16+
words = String.split(passphrase)
17+
_valid?(words)
18+
end
19+
20+
def valid_anagrams?(""), do: false
21+
def valid_anagrams?(passphrase) do
22+
passphrase
23+
|> String.split
24+
|> _valid_anagrams?
25+
end
26+
27+
defp _valid?(words, cache \\ %{})
28+
defp _valid?([], _cache), do: true
29+
defp _valid?([word | words], cache) do
30+
if cache[word] do
31+
false
32+
else
33+
new_cache = Map.put(cache, word, 1)
34+
_valid?(words, new_cache)
35+
end
36+
end
37+
38+
defp _valid_anagrams?(words, cache \\ %{})
39+
defp _valid_anagrams?([], _cache), do: true
40+
defp _valid_anagrams?([word | words], cache) do
41+
normalized_word =
42+
word
43+
|> String.split("", trim: true)
44+
|> Enum.sort
45+
|> Enum.join
46+
47+
if cache[normalized_word] do
48+
false
49+
else
50+
new_cache = Map.put(cache, normalized_word, 1)
51+
_valid_anagrams?(words, new_cache)
52+
end
53+
end
54+
end
55+
56+
mode = List.first(System.argv)
57+
58+
if mode == "test" do
59+
ExUnit.start()
60+
61+
defmodule PuzzleTest do
62+
use ExUnit.Case
63+
64+
describe "valid?(passphrase)" do
65+
test "when passphrase = 'aa bb cc dd ee'" do
66+
valid = Puzzle.valid?("aa bb cc dd ee")
67+
assert valid
68+
end
69+
70+
test "when passphrase = 'aa bb cc dd aa'" do
71+
valid = Puzzle.valid?("aa bb cc dd aa")
72+
refute valid
73+
end
74+
75+
test "when passphrase = 'aa bb cc dd aaa'" do
76+
valid = Puzzle.valid?("aa bb cc dd aaa")
77+
assert valid
78+
end
79+
end
80+
81+
describe "valid_anagrams?(passphrase)" do
82+
test "when passphrase = 'abcde fghij'" do
83+
valid = Puzzle.valid_anagrams?("abcde fghij")
84+
assert valid
85+
end
86+
87+
test "when passphrase = 'abcde xyz ecdab'" do
88+
valid = Puzzle.valid_anagrams?("abcde xyz ecdab")
89+
refute valid
90+
end
91+
92+
test "when passphrase = 'a ab abc abd abf abj'" do
93+
valid = Puzzle.valid_anagrams?("a ab abc abd abf abj")
94+
assert valid
95+
end
96+
97+
test "when passphrase = 'iiii oiii ooii oooi oooo'" do
98+
valid = Puzzle.valid_anagrams?("iiii oiii ooii oooi oooo")
99+
assert valid
100+
end
101+
102+
test "when passphrase = 'oiii ioii iioi iiio'" do
103+
valid = Puzzle.valid_anagrams?("oiii ioii iioi iiio")
104+
refute valid
105+
end
106+
end
107+
end
108+
else
109+
data = "04.txt" |> File.read! |> String.trim_trailing
110+
valid = Puzzle.count_valid(data)
111+
valid_anagrams = Puzzle.count_valid_anagrams(data)
112+
113+
IO.puts "The number of valid passphrases: #{valid}"
114+
IO.puts "The number of valid anagram passphrases: #{valid_anagrams}"
115+
end

0 commit comments

Comments
 (0)