# 2023 - Day 01 ```elixir Mix.install([ {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}, :kino, :kino_vega_lite, :explorer # :nx, ]) alias VegaLite, as: Vl alias Explorer.DataFrame, as: DF alias Explorer.Series ExUnit.start() ``` ## Puzzle [https://adventofcode.com/2023/day/1](https://adventofcode.com/2023/day/1) <!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"1","session_secret":"AOC_TOKEN","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> ```elixir {:ok, puzzle_input} = KinoAOC.download_puzzle("2023", "1", System.fetch_env!("LB_AOC_TOKEN")) ``` ## Solution ```elixir defmodule Parse do @digits %{ "1" => "1", "2" => "2", "3" => "3", "4" => "4", "5" => "5", "6" => "6", "7" => "7", "8" => "8", "9" => "9", "one" => "1", "two" => "2", "three" => "3", "four" => "4", "five" => "5", "six" => "6", "seven" => "7", "eight" => "8", "nine" => "9" } def parse(input, get_digits_from_line_fn) do input |> String.split("\n", trim: true) |> Enum.filter(fn s -> String.trim(s) != "" end) |> Enum.map(fn line -> get_digits_from_line_fn.(line |> String.trim()) end) end def get_digits1(line) do nums = line |> String.split("", trim: true) |> Enum.map(&Integer.parse/1) |> Enum.filter(fn x -> x != :error end) {{first, _}, {last, _}} = {List.first(nums), List.last(nums)} 10 * first + last end def get_digits2(line) do len = String.length(line) digit_str = Enum.reduce( 0..len, "", fn idx, acc -> slice = line |> String.slice(idx..-1) maybe_digit = Enum.find( @digits, fn {digitstr, _v} -> slice |> String.starts_with?(digitstr) end ) next_char = case maybe_digit do {_str, val} -> val _ -> "" end acc <> next_char end ) get_digits1(digit_str) end end ``` ```elixir defmodule DayOne do import Parse def part_one(input) do input |> parse(&get_digits1/1) |> Enum.sum() end def part_two(input) do input |> Parse.parse(&get_digits2/1) |> Enum.sum() end end ``` ```elixir defmodule Test do use ExUnit.Case, async: true @example_input ~s( 1abc2 pqr3stu8vwx a1b2c3d4e5f treb7uchet ) test "part 1" do assert DayOne.part_one(@example_input) == 142 end @example_input2 ~s( two1nine eightwothree abcone2threexyz xtwone3four 4nineeightseven2 zoneight234 7pqrstsixteen ) test "part 2" do assert DayOne.part_two(@example_input2) == 281 end end ExUnit.run() ``` ## Test ```elixir DayOne.part_one(puzzle_input) ``` ```elixir DayOne.part_two(puzzle_input) ``` <!-- livebook:{"offset":2864,"stamp":{"token":"XCP.LNxXq2vcI746FFgVxDWRA8t4BPUITcIT-2jWoe7x0SxDqAwz4b0SBMbx0Q04qtP-r3wVCajeCTMOrTSWbVBwNTqTMHhOEsAw2s-eLKhptGwnTLr7VA","version":2}} -->