Day 1
Mix.install([:kino])
Get input
input =
Kino.Input.textarea("Paste input here",
default: """
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
"""
)
defmodule Helper do
def is_numeric_string?(str) do
case Integer.parse(str, 10) do
{_, ""} -> true
_ -> false
end
end
end
Part 1
input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn line ->
line
|> String.split("", trim: true)
|> Stream.filter(&Helper.is_numeric_string?/1)
|> Enum.into([])
end)
|> Stream.map(&"#{List.first(&1)}#{List.last(&1)}")
|> Stream.map(&Integer.parse/1)
|> Stream.map(fn
{i, _} -> i
:error -> 0
end)
|> Enum.sum()
Part 2
digits = %{
"one" => "o1e",
"two" => "t2o",
"three" => "t3e",
"four" => "f4r",
"five" => "f5e",
"six" => "s6x",
"seven" => "s7n",
"eight" => "e8t",
"nine" => "n9e"
}
input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn line ->
Enum.reduce(digits, line, fn {word, value}, acc -> String.replace(acc, word, value) end)
end)
|> Stream.map(fn line ->
line
|> String.split("", trim: true)
|> Stream.filter(&Helper.is_numeric_string?/1)
|> Enum.into([])
end)
|> Stream.map(&"#{List.first(&1)}#{List.last(&1)}")
|> Stream.map(&Integer.parse/1)
|> Stream.map(fn
{i, _} -> i
:error -> 0
end)
|> Enum.sum()