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|> Enum.sort_by(& &1.last)
28```
29
30## Implementation
31
32```elixir
33defmodule ElfRanges do
34 def valid?(num) do
35 len = floor(:math.log10(num)) + 1
36
37 valid_n?(num, len, 2)
38 end
39
40 def valid_any?(num) do
41 len = floor(:math.log10(num)) + 1
42
43 Enum.all?(2..len//1, &valid_n?(num, len, &1))
44 end
45
46 def valid_n?(num, len, n) do
47 if rem(len, n) == 0 do
48 step = 10 ** div(len, n)
49
50 Stream.unfold(num, fn
51 0 -> nil
52 val -> {rem(val, step), div(val, step)}
53 end)
54 |> Enum.dedup()
55 |> then(&(not match?([_], &1)))
56 else
57 true
58 end
59 end
60end
61```
62
63<!-- livebook:{"branch_parent_index":1} -->
64
65## Part 1
66
67```elixir
68ranges
69|> Stream.flat_map(& &1)
70|> Stream.reject(&ElfRanges.valid?/1)
71|> Enum.sum()
72```
73
74<!-- livebook:{"branch_parent_index":1} -->
75
76## Part 2
77
78```elixir
79ranges
80|> Stream.flat_map(& &1)
81|> Stream.reject(&ElfRanges.valid_any?/1)
82|> Enum.sum()
83```
84
85<!-- livebook:{"offset":1551,"stamp":{"token":"XCP.GvC7N5ZC0xuQ3hRuVxd-rh5rJDKVZKJfmwspDkAuCFbjn8qdOUksP9Iy1GRtd7t5yLCV6nkfhXZlp_lTw8eZZBcwItn6IlML-jrjiORJQvkuXOHvzlOY17rIAaASRKvS3w","version":2}} -->