Avatar

Quant

Quant@programming.dev
Joined
1 posts • 26 comments
Direct message

No worries, it does seem a lot less difficult in hindsight now, my mind just blanked at what I expected to be a lot more code :))

That performance improvement is amazing, I’ll definitely take a look at how that works in detail later. Just gotta recover from the mental stretch gymnastics trying to remember the state of the stack at different code positions

permalink
report
parent
reply

Hell yeah!

┻━┻︵ (°□°)/ ︵ ┻━┻

permalink
report
parent
reply

You can actually use (singular) emojis as variable names. According to the documentation, they won’t be be used as glyphs so you don’t even have to worry about breaking changes of that kind :D

permalink
report
parent
reply

A solution in malbolge would be amazing and also kinda terrifying

permalink
report
parent
reply

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
permalink
report
reply

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

permalink
report
reply

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)

permalink
report
parent
reply

Uiua

After finally deciding to put aside Day 9 Part 2 for now, this was really easy actually. The longest was figuring out how many extra dimensions I had to give some arrays and where to remove those again (and how). Then part 2 came along and all I had to do was remove a single character (not removing duplicates when landing on the same field by going different ways from the same starting point). Basically, everything in the parentheses of the Trails! macro was my solution for part 1, just that the ^0 was (deduplicate). Once that was removed, the solution for part 2 was there as well.

Run with example input here

Note: in order to use the code here for the actual input, you have to replace =₈ with =₅₀ because I was too lazy to make it work with variable array sizes this time.

$ 89010123
$ 78121874
$ 87430965
$ 96549874
$ 45678903
$ 32019012
$ 01329801
$ 10456732
.
Adj ← ¤[0_¯1 0_1 ¯1_0 1_0]

Trails! ← (
  ⊚=0.
  ⊙¤
  ≡(□¤)
  1
  ⍥(⊙(≡(□^0/⊂≡(+¤)⊙¤°□)⊙Adj
      ≡(□▽¬≡/++⊃=₋₁=₈.°□))
    +1⟜⊸⍚(▽=⊙(:⟜⊡))
  )9
  ⊙◌◌
  ⧻/◇⊂
)

PartOne ← (
  # &rs ∞ &fo "input-10.txt"
  ⊜∵⋕≠@\n.
  Trails!◴
)

PartTwo ← (
  # &rs ∞ &fo "input-10.txt"
  ⊜∵⋕≠@\n.
  Trails!∘
)

&p "Day 10:"
&pf "Part 1: "
&p PartOne
&pf "Part 2: "
&p PartTwo
permalink
report
reply

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
permalink
report
reply

I found multidimensional markers for partition to work really well for finding the fields: Areas ← ⊜□:⇡△.+1⍜♭⊛ It just groups the other array’s contents according to adjacent markers, horizontally and vertically. Took me quite a bit to figure out what’s actually happening in the example in the documentation ^^’

permalink
report
parent
reply