this repo has no description
1# Day 02
2
3```elixir
4Mix.install([:kino_aoc])
5```
6
7## Parsing
8
9<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIyIiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjUifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
10
11```elixir
12{:ok, puzzle_input} =
13 KinoAOC.download_puzzle("2025", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
14```
15
16```elixir
17ranges =
18 puzzle_input
19 |> String.trim()
20 |> String.split(",")
21 |> Enum.map(fn range ->
22 range
23 |> String.split("-")
24 |> Enum.map(&String.to_integer/1)
25 |> then(&apply(Range, :new, &1))
26 end)
27```
28
29## Implementation
30
31```elixir
32defmodule ElfRanges do
33 def valid?(num) do
34 len = floor(:math.log10(num)) + 1
35
36 valid_n?(num, len, 2)
37 end
38
39 def valid_any?(num) do
40 len = floor(:math.log10(num)) + 1
41
42 Enum.all?(2..len//1, &valid_n?(num, len, &1))
43 end
44
45 def valid_n?(num, len, n) do
46 if rem(len, n) == 0 do
47 step = 10 ** div(len, n)
48
49 Stream.unfold(num, fn
50 0 -> nil
51 val -> {rem(val, step), div(val, step)}
52 end)
53 |> Enum.dedup()
54 |> then(&(not match?([_], &1)))
55 else
56 true
57 end
58 end
59end
60```
61
62## Part 1
63
64```elixir
65ranges
66|> Stream.flat_map(& &1)
67|> Stream.reject(&ElfRanges.valid?/1)
68|> Enum.sum()
69```
70
71## Part 2
72
73```elixir
74ranges
75|> Stream.flat_map(& &1)
76|> Stream.reject(&ElfRanges.valid_any?/1)
77|> Enum.sum()
78```
79
80<!-- livebook:{"offset":1434,"stamp":{"token":"XCP.NoAgOlNzs9jV0M8QxQDrdfMwKQR_xYkBG2FLF06XnKPtJ5ps3S83JucEVQZ7fJF0utUaryiCOT7xPWESlw3lS3TI6Jujiw8uFAZdKEXUL_jmZMHVF37TxiY4vRwKjfwvfg","version":2}} -->