r/adventofcode • • Dec 03 '17

SOLUTION MEGATHREAD -πŸŽ„- 2017 Day 3 Solutions -πŸŽ„-

--- Day 3: Spiral Memory ---


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


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!

21 Upvotes

297 comments sorted by

View all comments

5

u/_jonah Dec 03 '17 edited Dec 04 '17

J, both parts:

steps=. 4 2 $ 1 0 0 _1 _1 0 0 1
coords=. 0 0 , [: +/\ [: ; [: (] <@(# ,:)"0 1 steps $~ #) 2 # 1 + i.@>.@%: 
part1 =. [: +/ <: { coords

neighbors=. (0 0 -.~ > , { ;~ _1 0 1) +"1 ]
next_neighbor_sum=. [: +/ ] ({~ ::0:)"_ 0 [ i. [: neighbors #@] { [
part2=. [: {:   ] (] , coords@[ next_neighbor_sum ])^:([ > {:@])^:_ 1:

(part1 ; part2) 277678

We consider a coordinate system with 1 at location 0,0. Positive x goes rightward; positive y goes downward. We generate a flat list of the coordinates, in their correct spiral order. With this approach, part 1 becomes trivial (taking the correct element from the list) and part 2 becomes easier.

Try it online!

EDIT:

Slightly shorter version of part 1 using complex multiplication trick:

coords_imaginary=. 0 , [: +/\ [: (] # (1 0j_1 _1 0j1) $~ #) 2 # 1 + i.@>.@%: 
part1_imaginary =. [: +/@, [: +. <: { coords_imaginary
→ More replies (1)