You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.6 KiB
74 lines
1.6 KiB
ExUnit.start() |
|
|
|
defmodule SevenSegmentSearch do |
|
def load_file(path) do |
|
File.read!(path) |
|
|> String.split("\n", trim: true) |
|
end |
|
|
|
def parse_input(lines) do |
|
lines |
|
|> Enum.map(fn line -> |
|
{signals, output_values} = |
|
String.split(line, "|", trim: true) |
|
|> Enum.map(fn part -> String.split(part, " ", trim: true) end) |
|
|> List.to_tuple() |
|
end) |
|
end |
|
|
|
@spec find_unique([String], [String]) :: [String] |
|
def find_unique(signals, output_values) do |
|
unique_signal_lengths = |
|
signals |
|
|> Enum.map(&String.length/1) |
|
|> Enum.frequencies() |
|
|> Enum.filter(fn {_, occurences} -> occurences == 1 end) |
|
|> Enum.map(&elem(&1, 0)) |
|
|
|
Enum.filter(output_values, fn value -> |
|
Enum.member?(unique_signal_lengths, String.length(value)) |
|
end) |
|
end |
|
|
|
@spec first() :: Integer |
|
def first() do |
|
inputs = |
|
load_file("../input.txt") |
|
|> parse_input() |
|
|
|
Enum.map(inputs, fn {signals, output_values} -> find_unique(signals, output_values) end) |
|
|> List.flatten() |
|
|> Enum.count() |
|
end |
|
|
|
@spec second() :: Integer |
|
def second() do |
|
:second |
|
end |
|
end |
|
|
|
defmodule SevenSegmentSearchTest do |
|
use ExUnit.Case |
|
|
|
describe "find_unique/2" do |
|
test "Example" do |
|
signals = [ |
|
"be", |
|
"cfbegad", |
|
"cbdgef", |
|
"fgaecd", |
|
"cgeb", |
|
"fdcge", |
|
"agebfd", |
|
"fecdb", |
|
"fabcd", |
|
"edb" |
|
] |
|
|
|
output_values = ["fdgacbe", "cefdb", "cefbgd", "gcbe"] |
|
|
|
expected_result = ["fdgacbe", "gcbe"] |
|
assert SevenSegmentSearch.find_unique(signals, output_values) == expected_result |
|
end |
|
end |
|
end
|
|
|