|
| 1 | +ExUnit.start() |
| 2 | + |
| 3 | +defmodule SevenSegmentSearch do |
| 4 | + def load_file(path) do |
| 5 | + File.read!(path) |
| 6 | + |> String.split("\n", trim: true) |
| 7 | + end |
| 8 | + |
| 9 | + def parse_input(lines) do |
| 10 | + lines |
| 11 | + |> Enum.map(fn line -> |
| 12 | + {signals, output_values} = |
| 13 | + String.split(line, "|", trim: true) |
| 14 | + |> Enum.map(fn part -> String.split(part, " ", trim: true) end) |
| 15 | + |> List.to_tuple() |
| 16 | + end) |
| 17 | + end |
| 18 | + |
| 19 | + @spec find_unique([String], [String]) :: [String] |
| 20 | + def find_unique(signals, output_values) do |
| 21 | + unique_signal_lengths = |
| 22 | + signals |
| 23 | + |> Enum.map(&String.length/1) |
| 24 | + |> Enum.frequencies() |
| 25 | + |> Enum.filter(fn {_, occurences} -> occurences == 1 end) |
| 26 | + |> Enum.map(&elem(&1, 0)) |
| 27 | + |
| 28 | + Enum.filter(output_values, fn value -> |
| 29 | + Enum.member?(unique_signal_lengths, String.length(value)) |
| 30 | + end) |
| 31 | + end |
| 32 | + |
| 33 | + @spec first() :: Integer |
| 34 | + def first() do |
| 35 | + inputs = |
| 36 | + load_file("../input.txt") |
| 37 | + |> parse_input() |
| 38 | + |
| 39 | + Enum.map(inputs, fn {signals, output_values} -> find_unique(signals, output_values) end) |
| 40 | + |> List.flatten() |
| 41 | + |> Enum.count() |
| 42 | + end |
| 43 | + |
| 44 | + @spec second() :: Integer |
| 45 | + def second() do |
| 46 | + :second |
| 47 | + end |
| 48 | +end |
| 49 | + |
| 50 | +defmodule SevenSegmentSearchTest do |
| 51 | + use ExUnit.Case |
| 52 | + |
| 53 | + describe "find_unique/2" do |
| 54 | + test "Example" do |
| 55 | + signals = [ |
| 56 | + "be", |
| 57 | + "cfbegad", |
| 58 | + "cbdgef", |
| 59 | + "fgaecd", |
| 60 | + "cgeb", |
| 61 | + "fdcge", |
| 62 | + "agebfd", |
| 63 | + "fecdb", |
| 64 | + "fabcd", |
| 65 | + "edb" |
| 66 | + ] |
| 67 | + |
| 68 | + output_values = ["fdgacbe", "cefdb", "cefbgd", "gcbe"] |
| 69 | + |
| 70 | + expected_result = ["fdgacbe", "gcbe"] |
| 71 | + assert SevenSegmentSearch.find_unique(signals, output_values) == expected_result |
| 72 | + end |
| 73 | + end |
| 74 | +end |
0 commit comments