this repo has no description
at master 1.8 kB view raw
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}} -->