• 1 Post
  • 17 Comments
Joined 3 months ago
cake
Cake day: December 6th, 2024

help-circle

  • Welp, got frustrated again with part one because there kept being something wrong with my totally-not-ugly loop and so came here again. I did have to change IsInt (and thus also Cost to account for different handling) for part two though because I kept getting wrong results for my input.
    I’m guessing it’s because uiua didn’t see the difference between rounded and non-rounded number anymore.

    Here’s the updated, slightly messier version of the two functions that worked out for me in the end :D

    IsInt ← ≍°⊟⍉⍜(⊙(⍉≡↙₂))(/+×)⊙⍉⁅
    Cost  ← /+×3_1×⟜IsInt⊸AB
    

    Could have been done better but I’m lacking the patience for that now




  • Uiua

    I spent a while thinking about how to best do a flood fill in Uiua when I saw that (partition) works beautifully with multidimensional markers: “Groups are formed from markers that are adjacent along any axis.”, meaning I just had to convert all letters into numbers and I’d get all indices belonging to a field into an array.
    For part 2, I cheated a bit by coming here and reading that you only need to count the edges. To my surprise, the second part is actually a bit faster than part 1. Takes less than 0.2 seconds each though :D

    Run with example input here

    $ RRRRIICCFF
    $ RRRRIICCCF
    $ VVRRRCCFFF
    $ VVRCCCJFFF
    $ VVVVCJJCFE
    $ VVIVCCJJEE
    $ VVIIICJJEE
    $ MIIIIIJJEE
    $ MIIISIJEEE
    $ MMMISSJEEE
    .
    N     ← +[0_¯1 0_1 ¯1_0 1_0]
    Areas ← ⊜□:⇡△.+1⍜♭⊛
    Peri  ← -/+≡(/+∊N¤)⟜¤⟜(×4⧻)
    Sides ← (
      ⊙(-¤)↯:▽⊙0×°⊟.+2⌵⊸-+1⊃⊣⊢⊸⍜⍉≡⍆
      ⧻⊚⊸∊1_3⧈(/+/+)2_2.⍜⊡=₀+1:
      +⊙(×2/+/+⧈(∊[[1_0 0_1][0_1 1_0]])2_2◌)
    )
    Cost! ← /+≡◇(×^0⟜⧻)
    
    PartOne ← (
      # &rs ∞ &fo "input-12.txt"
      ⊜∘≠@\n.
      Cost!Peri Areas
    )
    
    PartTwo ← (
      # &rs ∞ &fo "input-12.txt"
      ⊜∘≠@\n.
      Cost!Sides Areas
    )
    
    &p "Day 12:"
    &pf "Part 1: "
    &p PartOne
    &pf "Part 2: "
    &p PartTwo
    

  • That’s also possible, though I’ve had cases where putting a ? before a function changed the output to what I expected instead of doing something else.
    This only happened in the online pad and seems to have been fixed by reloading the tab but I’ve taken to call any such behavior a bug now :D
    Especially in this case because "1019" should at least not throw a “invalid float literal” error.

    Though if you ever find another explanation I’d be happy to read it ^^

    (I’m going to ‘investigate’ some more because I had this error a few times but I don’t remember the circumstances and solution anymore)


  • Great explanation :D
    I understand what I called black magic before now. I did wonder what something other than a concatenation would do in that place but didn’t consider that it might be just that because it looked so complicated.

    I wasn’t able to get it running with ⋕$"__" either, though I’d assume it’s a bug caused by how the numbers get passed around or something. The day uiua has a stable release will be glorious


  • Uiua

    Adapting the part one solution for part two took me longer than part one did today, but I didn’t want to change much anymore.

    I even got scolded by the interpreter to split the evaluating line onto multiple ones because it got too long.
    Can’t say it’s pretty but it does it’s job ^^’

    Run with example input here

    PartOne ← (
      &rs ∞ &fo "input-8.txt"
      ⟜(▽¬∈".\n".◴)
      ⊜∘≠@\n.
      :¤⟜(:¤-1△)
      ≡(□⊚⌕)
      ◴/◇⊂⍚(≡(-:⟜-°⊟)⧅≠2)
      ⧻▽¬:⊙(/+⍉+)⟜⊓><,0
    )
    
    PartTwo ← (
      &rs ∞ &fo "input-8.txt"
      ⟜(▽¬∈".\n".◴⟜¤
        ▽:⟜≡(>1⧻⊚⌕)
      )
      ⊜∘≠@\n.
      :¤⟜(:¤-1△)
      ≡(□⊚⌕)
      ⊸⍚(
        ⧅≠2⊙¤
        ≡(:¤⟜-°⊟
          ⍢(⊙⊂⟜-⊙⊸⊢
          | ⋅(=0/++⊓><,0⊢))
          □⊙◌◌
        )
      )
      ◴/◇⊂/◇⊂
      ⧻▽¬:⊙(/+⍉+)⟜⊓><,0
    )
    
    &p "Day 8:"
    &pf "Part 1: "
    &p PartOne
    &pf "Part 2: "
    &p PartTwo
    








  • Thanks to your solution I learned more about how to use reduce :D

    My solution did work for the example input but not for the actual one. When I went here and saw this tiny code block and you saying

    This turned out to be reasonably easy

    I was quite taken aback. And it’s so much better performance-wise too :D (well, until part 2 comes along in my case. Whatever this black magic is you used there is too high for my fried brain atm)


  • Uiua

    Credits to @[email protected] for the approach of using reduce and also how to split the input by multiple characters.
    I can happily say that I learned quite a bit today, even though the first part made me frustrated enough that I went searching for other approaches ^^

    Part two just needed a simple modification. Changing how the input is parsed and passed to the adapted function took longer than changing the function itself actually.

    Run with example input here

    PartOne ← (
      &rs ∞ &fo "input-7.txt"
      ⊜□≠@\n.
      ≡◇(⊜□≠@:.)
      ≡⍜⊡⋕0
      ≡⍜(°□⊡1)(⊜⋕≠@ .)
      ⟜(⊡0⍉)
    
      # own attempt, produces a too low number
      # ≡(:∩°□°⊟
      #   ⍣(⍤.◡⍣(1⍤.(≤/×)⍤.(≥/+),,)0
      #     ⊙¤⋯⇡ⁿ:2-1⊸⧻
      #     ⊞(⍥(⟜⍜(⊙(↙2))(⨬+×⊙°⊟⊡0)
      #         ↘1
      #       )⧻.
      #       ⍤.=0⧻.
      #     )
      #     ∈♭◌
      #   )0)
    
      # reduce approach found on the programming.dev AoC community by [email protected]
      ≡(◇(∈/(◴♭[⊃(+|×)]))⊡0:°⊂)
      °□/+▽
    )
    
    PartTwo ← (
      &rs ∞ &fo "input-7.txt"
      ⊜(□⊜⋕¬∈": ".)≠@\n.
      ⟜≡◇⊢
      ≡◇(∈/(◴♭[≡⊃⊃(+|×|⋕$"__")]):°⊂)
      °□/+▽
    )
    
    &p "Day 7:"
    &pf "Part 1: "
    &p PartOne
    &pf "Part 2: "
    &p PartTwo
    

  • Uiua

    This one was nice. The second part seemed quite daunting at first but wasn’t actually that hard in the end.

    Run with example input here

    Row    ← ⌕ "XMAS"
    RevRow ← ⌕"SAMX"
    Sum    ← /+/+
    Count  ← +∩Sum⊃Row RevRow
    
    PartOne ← (
      &rs ∞ &fo "input-4.txt"
      ⊜∘≠@\n.
      ⊙+⟜∩Count⟜⍉ # horizontal and vertical search
      ⟜(/+⧈(Count⍉≡⬚@ ↻⇡⧻.)4)
      /+⧈(Count⍉≡⬚@ ↻¯⇡⧻.)4
      ++
    )
    
    Mask ← °⊚×2⇡5
    # Create variations of X-MAS
    Vars ← (
      ["M S"
       " A "
       "M S"]
      ≡♭[∩⟜⍉]≡⇌.
      Mask
      ⊏0⊞▽¤
    )
    
    PartTwo ← (
      &rs ∞ &fo "input-4.txt"
      ⊜∘≠@\n.
      ⧈(/+♭⊞≍⊙¤Vars▽Mask♭)3_3
      Sum
    )
    
    &p "Day 4:"
    &pf "Part 1: "
    &p PartOne
    &pf "Part 2: "
    &p PartTwo