⇌+@A×4+5˜⊂0+3⊂0[+1⊸˙×2]
Yes, it felt a little more like I was solving the puzzle-setter rather than the puzzle today.
There’s so many great features hidden behind ‘un’.
I’m sure that part2 could be simplified significantly but I was fed up by then.
Uiua
If it's stupid but it works...
My dirty hack
I broke the maze into SVR>FFT>DAC>OUT and SVR>DAC>FFT>OUT, realised that the latter was taking a suspiciously long time, so submitted just the answer from the former --> success!
link (You'll need to up the execution limit)
# AOC2025day11 - mazes.
# Uncomment for Part 1
D ← "aaa: you hhh\nyou: bbb ccc\nbbb: ddd eee\nccc: ddd eee fff\nddd: ggg\neee: out\nfff: out\nggg: out\nhhh: ccc fff iii\niii: out"
# Uncomment for Part 2
# D ← "svr: aaa bbb\naaa: fft\nfft: ccc\nbbb: tty\ntty: ccc\nccc: ddd eee\nddd: hub\nhub: fff\neee: dac\ndac: fff\nfff: ggg hhh\nggg: out\nhhh: out"
# D ← &fras "randomAOC/AOC2025day11.txt"
Tabs ← ⊜(⊙□°⊂⊜∘¬⊸∊": ")⊸≠@\nD
Nexts ← ⍣(°□⊡˜⨂⊙Tabs|[])
Part₁ ← ⊙◌⧻path(˙≠°⊏Nexts|≍"out")"you"
Part₂ ← (
⊙◌⧻path(˙≠°⊏Nexts|≍"fft")"svr"
⊙◌⧻path(˙≠°⊏Nexts|≍"dac")"fft"
⊙◌⧻path(˙≠°⊏Nexts|≍"out")"dac"
××
)
# Only one will be right for the test data, depending on dataset.
⊃Part₁ Part₂
I'm getting PTSD from today now.
Uiua
(added language tag)
Quiet here, isn't it?
Here's part1 to be going on with.
# AOC 2025 Day 10 - Wiring maze
D ← "[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}\n[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}\n[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}"
# D ← &fras"randomAOC/AOC2025day10.txt"
Digits ← ⊜⋕⊸∊+@0⇡10
Parse ← ⊜(□⊜□⊸≠@\s)⊸≠@\n
Part₁ ← (
≡◇(
=@#↘₁↘₋₁°□°⊂↘¯1 # target
⊙⬚0≡◇(°⊚Digits) # presses
⧻⊢path(≡⌞≠|=0/+) # find shortest path
)
/+-1
)
Part₁ Parse D
I've given up on Part 2. I knew what I needed to do but didn't have the understanding of how to use the matrix elimination method to get beyond the first stages. But I did find this:
How to solve part 2 without libraries
This is a solver written totally from scratch in Dart, so easily readable unlike some other languages :-):
[https://github.com/ayoubzulfiqar/advent-of-code/blob/main/2025/Dart/Day10/part_2.dart](GitHub link)
There's lots of parallelism (that's over the top for this problem), but the core solveSystem method is very clearly written, just long...
Squeezing all spaces out of the grid (and plotting at right-angles to the other visualisation here) gives this evil shape, which will doubtless haunt my dreams tonight.

Uiua
Part 1 was easy, part 2 is ...less so...
a hint that might help you
visualising the data reveals some interesting patterns. Follow link to do so.
Any way, here's my Part 1 while I'm still thinking about this.
# AOC 2025 Day 09
# Experimental!
D ← &fras"AOC2025day09.txt" # Drop your file here and edit name
/↥/×+1⌵⍉/-⍉₂⧅<2⋕°csv D # Part 1
∧⍜⊡⋅1⟜(˜↯0+1/↥)⍜⍉≡⍜⍆⊛⋕°csv D # Visualised data
Part 2
This is basically me thinking out loud, so it's untidy, brutal, repetitive and slow. (20s in the pad) link if you care
# Experimental!
# AOC 2025 Day 09
D ← "7,1\n11,1\n11,7\n9,7\n9,5\n2,5\n2,3\n7,3"
D ← &fras"AOC2025day09.txt" # Drop your file here and edit name
Parse ← ⋕°csv
Part₁ ← /↥/×+1⌵⍉/-⍉₂⧅<2
Squeeze ← ⍜⍉≡⍜⍆⊛ # Squeeze (add a sort to inspect)
Draw ← ∧⍜⊡⋅1⟜(˜↯0+1/↥) # Draw
HLines ← (
Squeeze Parse D
⍆⊕(□⍆)⊛⊸≡⊢
∧◇(⍜⊡˜⍜(⊏|˙=)⊙˜∘⊃(⊢⊢|↘⊙⇡°⊟+0_1⊣⍉))
)
VLines ← (
Squeeze Parse D
⍆⊕(□⍆)⊛⊸≡⊣
∧◇(⍜⊡˜⍜(⊏|˙=)⊙˜∘⊃(⊣⊣|↘⊙⇡°⊟+0_1⊢⍉))
)
DrawBorder ← ⍜⍉VLines HLines ˜↯0↯2+1/↥♭Squeeze Parse D # Draws full border
# DrawBorder Squeeze # running this shows these as key boundary points -> [219 121] [219 123]
# ⊏≡⌟˜⨂[[219 121] [219 123]]⊸Squeeze # which map to -> [[94985 48652][94985 50114]]
# leftmost -> only look left, rightmost-> only look right
# SO, now fill the shape to make this easier.
Fill ← (
⊙⊙1 # fill colour.
Good ← =0⊙◌⊡⊢ # Needs filling. Simple edges-check.
# Take first of list. If needs fill, do so and then add
# its four neighbours into queue. Repeat until queue is empty.
⍢(⨬(↘1|◴⊂+A₂¤°⊂ ⊃(⋅∘|∘|⋅⋅⋅∘)◡(⍜(⊡|⋅∘)⊢))◡Good
| >0⧻)
⋅⊙⋅
)
DrawBorder # Comment out everything below here to view the boundary.
Fill [219_120] # Now fill that boundary ([2_1] for test)
Squeeze Parse D
# ([0 1] for test)
[219 123] # [219 121] gave the wrong answer, so it's this.
≡⌞⊟ # couple this with every other point
# Extract the covered window of the array for each pair of corners.
# (Very probably doing this the hard way:-()
# Only keep those that are all 1.
▽⤚≡⌟(=1/×♭≡⌞⊏⊙⊏˜∘∩(↘⊙⇡°⊟+0_1⍆)°⊟⍉)
# Pick out our squeezed indices
⨂Squeeze Parse D
# Find out what the unsqueezed values were
˜⊏Parse D
# Find areas, return max.
/↥≡/×+1⌵≡/-
Yeah, that's one thing the gurus keep hammering home: anything you can move out of loop constructs (inc rows, partition, etc as well as the obvious do, repeat) and handle pervasively is a big win.
I'm more like the sorcerer's apprentice watching my arrays get increasingly out of my control :-)
spoiler
Stupider than that: I'd just got halfway through writing a complicated divide and conquer algorithm to calculate nearest pairs when I realised that I could just brute-force it. :-)
Obviously very spoilery code, if you dare read it closely. try it here
It feels very anticlimactic to be ending so early in the month, but see you all next year!