Day 6: Guard Gallivant

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • Quant@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    15 days ago

    Uiua

    Part one was simple enough. Part two nearly made me give up.
    Part two has the most ugly and least performant code I’ve made in uiua so far but it gets the job done and that’s all I care about for now.

    Run with example input here

    RotateClock ← (
      ⊙⊙(⍉⇌)
      ⊙(⇌⍜(⊡0)(-⊙(⧻⊡0.)+1))
      ↻¯1
    )
    
    RotateCounter ← (
      ⊙⊙(⇌⍉)
      ⊙(⍜(⊡0)(-⊙(⧻.)+1)⇌)
      ↻1
    )
    
    NewPos ← (
      ⊙⍜(⊙⊡:)(-1+⊙(⊗@#)⟜↘⊙.)⟜°⊟
      ⍜(⊡1)⋅
    )
    
    MarkPath ← (
      RotateClock
      ⍢( # replace characters up til next '#'
        ⊙(⊙⍜(↘⊙⊡:)(⍜(↙)(▽:@^⧻)⊗@#.)⟜°⊟
          NewPos
        )
        RotateCounter
      | ⋅(≠0⊡0))
      ◌◌
    )
    
    PartOne ← (
      &rs ∞ &fo "input-6.txt"
      ⊜∘≠@\n.
      # maybe make compatible with
      # non-up facing inputs
      ♭⊚=@^.
      [0 1 2 3]
      MarkPath
      &fwa "test.txt" json.
      /+/+=@^
    )
    
    PartTwo ← (
      &rs ∞ &fo "input-6.txt"
      ⊜∘≠@\n.
      # maybe make compatible with
      # non-up facing inputs
      ♭⊚=@^.
      [0 1 2 3]
      ◡MarkPath
      ⊙::
      # rotate the field to match the intital state
      ⊙⊙(
        ⊙(⊚=@#)
        ⍢(⇌⍉|¬≍⊚=@#)
        ⊙◌
      )
      ⊙⊙(⊚=@^.)
      ⊙⊙⊙¤∩¤
      ⊞(⊙⊙(⍜⊡⋅@#)
        RotateClock
        ⊙NewPos
        ¤¯1_¯1_¯1
        ⍢(⊙◡(⊂⊢)
          ⊂
          ⊙(RotateCounter
            ⊙NewPos
          )
        | =1+⊙(∈↘1⇌)◡⋅(≠129⊡2)⊙(⊂⊢))
        # 129 = length of input array. Hardcoded because
        # the condition block doesn't seem to get the
        # input array passed to it so the length can't
        # be read dynamically
        ⊙(⊂⊢)
        ∈
        ⊙◌
      )
      /+♭
    )
    
    &p "Day 6:"
    &pf "Part 1: "
    &p PartOne
    &pf "Part 2: "
    &p PartTwo