Skip to content

Commit

Permalink
Day 16
Browse files Browse the repository at this point in the history
  • Loading branch information
sb8244 committed Dec 16, 2019
1 parent fe9d2da commit 79044ab
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
59 changes: 59 additions & 0 deletions lib/16.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
defmodule Sixteen do
def solve_2(digits, {count, max}, _) when count == max do
digits |> Enum.join()
end

def solve_2(digits, {count, max}, back_half_size) do
full_length = length(digits)
half_length = ceil(full_length / 2)
front_size = full_length - back_half_size

rev_digits = Enum.reverse(digits)
half_digits = Enum.take(rev_digits, back_half_size)
first_half_digits = Enum.take(digits, front_size)
{next_back_half_digits, _sum} = Enum.reduce(half_digits, {[], 0}, fn digit, {acc, sum} ->
next_sum = sum + digit
next_digit = Integer.digits(next_sum) |> List.last()
next_acc = [next_digit | acc]

{next_acc, next_sum}
end)

(first_half_digits ++ next_back_half_digits)
|> solve_2({count + 1, max}, back_half_size)
end

def solve(digits, {count, max}, _) when count == max do
digits |> Enum.join()
end

def solve(digits, {count, max}, pattern \\ [0, 1, 0, -1]) do
digit_length = length(digits)

# IO.inspect digits

digits
|> Enum.with_index()
|> Enum.map(fn {digit, index} ->
Task.async(fn ->
# IO.inspect :erlang.system_time(:millisecond)

[first | pattern] = Enum.map(pattern, fn pdigit ->
Enum.map((1..index + 1), fn _ -> [pdigit] end)
end) |> List.flatten()

Stream.cycle(pattern ++ [first])
|> Stream.zip(digits)
|> Stream.reject(fn {pattern, digit} -> pattern == 0 or digit == 0 end)
|> Stream.map(fn {pattern, digit} -> pattern * digit end)
|> Stream.take(digit_length)
|> Enum.sum()
|> abs()
|> Integer.digits()
|> List.last()
end)
end)
|> Enum.map(&Task.await/1)
|> solve({count + 1, max}, pattern)
end
end
39 changes: 39 additions & 0 deletions test/solutions/16_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule SixteenTest do
use ExUnit.Case

test "example" do
Sixteen.solve(Integer.digits(12345678), {0, 100}) # |> IO.inspect()

# Sixteen.solve(Integer.digits(80871224585914546619083218645595), {0, 100}) |> IO.inspect()
end

test "pt1" do
input = 59702216318401831752516109671812909117759516365269440231257788008453756734827826476239905226493589006960132456488870290862893703535753691507244120156137802864317330938106688973624124594371608170692569855778498105517439068022388323566624069202753437742801981883473729701426171077277920013824894757938493999640593305172570727136129712787668811072014245905885251704882055908305407719142264325661477825898619802777868961439647723408833957843810111456367464611239017733042717293598871566304020426484700071315257217011872240492395451028872856605576492864646118292500813545747868096046577484535223887886476125746077660705155595199557168004672030769602168262
assert Sixteen.solve(Integer.digits(input), {0, 100}) == "44098263577767243566465336017484725735409415599895796691021765237776874236590302055780078434486648834240933636976799566773394909867684152933521861174395404543180086836886119875299293558965440502143821973095956509317454599208750519403795800116220801205701913422524240286208878108663213257152190685157009953136173753150428016283102694406655192639305380491258511451386484958938572258565111520396204900638625168489737372772002077482523488722666436234360060362842815301561113791445180697878452550487283315061379956703398946235025295941452853075179024289281258573760516862974004335894617213438227837930586659611531495453514024517982663554177030764602168262"
end

test "pt2 testing" do
digits = Integer.digits(12345678)
full_digits = Stream.cycle(digits) |> Enum.take(length(digits) * 3)
first_seven = Enum.take(digits, 7) |> Integer.undigits()

assert Sixteen.solve(full_digits, {0, 10}) == "142609498794060886940678"
end

test "pt2 testing 2" do
digits = [0 | Integer.digits(03036732577212944063491565474664)]
full_digits = Stream.cycle(digits) |> Enum.take(length(digits) * 10_000)
first_seven = Enum.take(digits, 7) |> Integer.undigits()

assert Sixteen.solve_2(full_digits, {0, 100}, length(full_digits) - first_seven) |> String.graphemes() |> Enum.drop(first_seven) |> Enum.take(8) |> Enum.join() == "84462026"
end

test "pt2" do
input = 59702216318401831752516109671812909117759516365269440231257788008453756734827826476239905226493589006960132456488870290862893703535753691507244120156137802864317330938106688973624124594371608170692569855778498105517439068022388323566624069202753437742801981883473729701426171077277920013824894757938493999640593305172570727136129712787668811072014245905885251704882055908305407719142264325661477825898619802777868961439647723408833957843810111456367464611239017733042717293598871566304020426484700071315257217011872240492395451028872856605576492864646118292500813545747868096046577484535223887886476125746077660705155595199557168004672030769602168262
digits = Integer.digits(input)
full_digits = Stream.cycle(digits) |> Enum.take(length(digits) * 10_000)
first_seven = Enum.take(digits, 7) |> Integer.undigits()

assert Sixteen.solve_2(full_digits, {0, 100}, length(full_digits) - first_seven) |> String.graphemes() |> Enum.drop(first_seven) |> Enum.take(8) |> Enum.join() == "12482168"
end
end

0 comments on commit 79044ab

Please sign in to comment.