Skip to content

Instantly share code, notes, and snippets.

@danj3
Created December 15, 2017 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danj3/9240fce3d2fe79973ce9814ad9ab5d2d to your computer and use it in GitHub Desktop.
Save danj3/9240fce3d2fe79973ce9814ad9ab5d2d to your computer and use it in GitHub Desktop.
Advent of Code (AOC) 2017 Day 3
defmodule Day3 do
# This does more work than required but is still O(1)
# diagonal low right is even square root
def start1( val ) do
col_height = :math.sqrt( val ) |> Float.ceil |> trunc
col_height = if Integer.mod( col_height, 2 ) == 0, do: col_height+1, else: col_height
low_right_corner = :math.pow( col_height, 2 ) |> trunc
distance = low_right_corner - val
ring_length = col_height * 4 - 4
side = distance / ring_length
side_length = Integer.floor_div(ring_length, 4 )
side_pos = Integer.mod( distance, side_length)
quarter = Integer.floor_div( ring_length, 8 )
#steps_to_middle = Integer.mod( distance , quarter )
hside = Integer.floor_div( side_length, 2 )
steps_to_middle = hside - side_pos
before = steps_to_middle > 0
side_name = cond do
side == 0.0 -> { :corner_se, quarter, :up, :left }
side == 0.25 -> { :corner_sw, quarter, :up, :right }
side == 0.50 -> { :corner_nw, quarter, :down, :right }
side == 0.75 -> { :corner_ne, quarter, :down, :left }
side < 0.25 -> { :bottom, steps_to_middle, before && :left || :right, :up }
side < 0.50 -> { :left, steps_to_middle, before && :up || :down, :right }
side < 0.75 -> { :top, steps_to_middle, before && :right || :left, :down }
true -> { :right, steps_to_middle, before && :down || :up, :left }
end
steps_to_center = Integer.floor_div( col_height - 1, 2 )
[ col_hight: col_height,
low_right_corner: low_right_corner,
distance: distance,
side: side,
side_pos: side_pos,
side_name: side_name,
ring_length: ring_length,
steps_to_center: steps_to_center,
steps_to_middle: steps_to_middle,
quarter: quarter,
side_length: side_length,
steps_required: abs( steps_to_middle ) + steps_to_center,
]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment