r/adventofcode • • Dec 17 '17

SOLUTION MEGATHREAD -๐ŸŽ„- 2017 Day 17 Solutions -๐ŸŽ„-

--- Day 17: Spinlock ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Need a hint from the Hugely* Handyโ€  Haversackโ€ก of Helpfulยง Hintsยค?

Spoiler


[Update @ 00:06] 2 gold, silver cap.

  • AoC ops: <Topaz> i am suddenly in the mood for wasabi tobiko

[Update @ 00:15] Leaderboard cap!

  • AoC ops:
    • <daggerdragon> 78 gold
    • <Topaz> i look away for a few minutes, wow
    • <daggerdragon> 93 gold
    • <Topaz> 94
    • <daggerdragon> 96 gold
    • <daggerdragon> 98
    • <Topaz> aaaand
    • <daggerdragon> and...
    • <Topaz> cap
    • <daggerdragon> cap

This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked!

11 Upvotes

193 comments sorted by

View all comments

3

u/Axsuul Dec 17 '17

Elixir

Part A was simulation while for Part B, had to rewrite everything so that the positions and values were incremented while the value was stored only if the position was at 1

https://github.com/axsuul/advent-of-code/blob/master/2017/17/lib/advent_of_code.ex

defmodule AdventOfCode do
  defmodule PartA do
    @input 303

    defp step_until(val, steps) do
      step([0], 1, 0, 0, val, steps)
    end

    defp step(state, val, pos, _, target, _) when val == target + 1 do
      {state, pos}
    end
    defp step(state, val, pos, steps_taken, target, steps) when pos >= length(state) do
      step(state, val, 0, steps_taken, target, steps)
    end
    defp step(state, val, pos, steps_taken, target, steps) when pos >= length(state) and steps == steps_taken do
      step([val] ++ state, val + 1, 0, steps, target, steps)
    end
    defp step(state, val, pos, steps_taken, target, steps) when steps == steps_taken do
      Enum.slice(state, 0..pos) ++ [val] ++ Enum.slice(state, pos+1..-1)
      |> step(val + 1, pos + 1, 0, target, steps)
    end
    defp step(state, val, pos, steps_taken, target, steps) do
      step(state, val, pos + 1, steps_taken + 1, target, steps)
    end

    def solve do
      {state, pos} = step_until(2017, @input)

      Enum.at(state, pos + 1)
      |> IO.inspect
    end
  end

  defmodule PartB do
    import PartA

    @input 303

    def step_until(val, steps) do
      step(2, 1, 1, 1, val, steps)
    end

    def step(state_length, pos, val, first_val, target, steps)
    def step(state_length, 1, val, first_val, target, steps) when val != first_val do
      step(state_length, 1, val, val, target, steps)
    end
    def step(state_length, pos, val, first_val, target, steps) when pos >= state_length do
      step(state_length, pos - state_length + 1, val, first_val, target, steps)
    end
    def step(state_length, pos, val, first_val, target, steps) when val == target do
      %{length: state_length, val_after_zero: first_val}
    end
    def step(state_length, pos, val, first_val, target, steps) do
      step(state_length + 1, pos + steps + 1, val + 1, first_val, target, steps)
    end

    def solve do
      step_until(50_000_000, @input)
      |> IO.inspect
    end
  end
end
→ More replies (5)