More effort needed in parsing and initialising for the fft convolution approach - all this is setup in the "Init" function - but the core logic is pretty dense (and I think could be denser as I get better at using subscripted on/by instead of forks with different selectors to preserve values - Convolve can probably be shorter before the first fft).

If you remove one of the "gaps" at the left of the final line and replace it with an &ims you get a nice b/w image of the final state. (and you can modify the internal loop with a suitabley surrounded ⟜&ims to display the intermediate states if you want).

(This is pt2 - for pt1 most of the same logic applies, but you can just do the bits inside the loop without needing the loop [and the handling is simpler because you don't need to accumulate after the functions])

Parse ← ≡₀°□=@@⊜□⊸≠@\n &fras
Kernel ← [1_1_1 1_0_1 1_1_1]
Pad ← ↻⊙∩⌞(⬚0↙)∩(˙⊂)◡(⌊÷₂⟜(-₁+)∩⧻)

Init ← 1 Pad Kernel Parse⟜(0)

Convolve ← ⌵⁅×°fft×∩fft⊃(⊙⋅)(⟜⧻⋅∘)
Mask ← ⊸₂(×⊙⋅∘)<4
Apply ← /+/+⟜₂(⍜⊡(×0)⊚ ⊙◌)
Accum ← ⟜₃(+⊙⋅⋅∘)

⋅⋅⋅∘⍢(Accum Apply Mask ◡Convolve◌|≠0) Init "input"

#uiua #adventOfCode

(Obvious optimisations: we could just take the fft of the kernel once, since its constant. We could also avoid calculating the scaling factor for the unfft each time, since it's also constant - but at the time I didn't want too many things in the stack so I could think about the core algorithm)
And, thanks to #uiua 's built in gif support, it just needed a small edit to keep the history of the grid and a &fwa "out.gif" gif 24 to output this animation of the sequence of barrels being removed: