@ace@lemmy.ananace.dev avatar

ace

@ace@lemmy.ananace.dev

Just another Swedish programming sysadmin person.
Coffee is always the answer.

And beware my spaghet.

This profile is from a federated server and may be incomplete. Browse more on the original instance.

ace,
@ace@lemmy.ananace.dev avatar

Amusingly enough, one of the HP laptops I used in that era actually worked better with ndiswrapper somehow.

It was the only one to do so though.

ace,
@ace@lemmy.ananace.dev avatar

“It’s a ndiswrapper miracle!” - a statement only uttered by the completely deranged.

ace,
@ace@lemmy.ananace.dev avatar

Valve did purchase the for-profit MoltenVK layer and had it open-sourced under the Khronos umbrella, so they’ve already been happy to provide people a Vulkan-on-Metal solution for those who want to support Apple without an entirely separate rendering engine.

ace,
@ace@lemmy.ananace.dev avatar

Have a snippet of Ruby, something I hacked together as part of a solution during the WFH morning meeting;


<span style="font-weight:bold;color:#a71d5d;">class </span><span style="color:#0086b3;">String
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">to_numberstring</span><span style="color:#323232;">(digits_only: </span><span style="color:#0086b3;">false</span><span style="color:#323232;">)
</span><span style="color:#323232;">    tokens </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">{ 
</span><span style="color:#323232;">      </span><span style="color:#0086b3;">one: 1</span><span style="color:#323232;">, </span><span style="color:#0086b3;">two: 2</span><span style="color:#323232;">, </span><span style="color:#0086b3;">three: 3</span><span style="color:#323232;">,
</span><span style="color:#323232;">      </span><span style="color:#0086b3;">four: 4</span><span style="color:#323232;">, </span><span style="color:#0086b3;">five: 5</span><span style="color:#323232;">, </span><span style="color:#0086b3;">six: 6</span><span style="color:#323232;">,
</span><span style="color:#323232;">      </span><span style="color:#0086b3;">seven: 7</span><span style="color:#323232;">, </span><span style="color:#0086b3;">eight: 8</span><span style="color:#323232;">, </span><span style="color:#0086b3;">nine: 9
</span><span style="color:#323232;">    }.</span><span style="color:#62a35c;">freeze
</span><span style="color:#323232;">    ret </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">""
</span><span style="color:#323232;">
</span><span style="color:#323232;">    i </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">loop do
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#ed6a43;">self</span><span style="color:#323232;">[i] </span><span style="font-weight:bold;color:#a71d5d;">=~ </span><span style="color:#183691;">/</span><span style="color:#0086b3;">d</span><span style="color:#183691;">/
</span><span style="color:#323232;">        ret </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#ed6a43;">self</span><span style="color:#323232;">[i]
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">elsif !</span><span style="color:#323232;">digits_only
</span><span style="color:#323232;">        tok </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> tokens.find { |k, _| </span><span style="color:#ed6a43;">self</span><span style="color:#323232;">[i, k.size] </span><span style="font-weight:bold;color:#a71d5d;">==</span><span style="color:#323232;"> k.</span><span style="color:#62a35c;">to_s </span><span style="color:#323232;">}
</span><span style="color:#323232;">        ret </span><span style="font-weight:bold;color:#a71d5d;">+=</span><span style="color:#323232;"> tok.last.</span><span style="color:#62a35c;">to_s </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;"> tok
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">      
</span><span style="color:#323232;">      i </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#0086b3;">1
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">break if</span><span style="color:#323232;"> i </span><span style="font-weight:bold;color:#a71d5d;">>=</span><span style="color:#323232;"> size
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">    ret
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="font-weight:bold;color:#a71d5d;">end
</span>
ace,
@ace@lemmy.ananace.dev avatar

With the fully expanded map for the actual input it ends up working a 420x420 tile grid, and it has to do both value lookups as well as mutations into that, alongside inclusion testing for the search array (which could probably be made cheaper by building it as a set). It ends up somewhat expensive simply on the number of tests.

The sample I posted the picture of runs in 0.07s wall time though.

ace, (edited )
@ace@lemmy.ananace.dev avatar

There’s a next if […] to_visit.include?(off_p), and I also only visit points that haven’t been flood filled yet (next unless %w[. I].include? val), so there shouldn’t be any superfluous testing going on.

Went back and did a quick test of thing, and yep, converting the to_visit array to a set pulls execution time down to ~600ms. But the code becomes much messier.
Going to move the mutation of the map down to the point where I pick a point for visitation instead, so I can re-use the check for already flooded tiles instead.

ace,
@ace@lemmy.ananace.dev avatar

The squeezing component in part 2 made this really interesting.

I had a thought on a naïve solution consisting of expanding the input grid, painting all the walked pipes, and then doing a flood fill from the outside of the expanded map. There are a lot cleverer ways to do it, but the idea stuck with me and so…

The code’s a bit of a mess, but I actually kind of like the result. It visualizes really well and still runs both parts in under 8 seconds, so it’s not even particularly slow considering how it does it.

E.g;
Picture of solution output

:::spoiler Ruby A snippet from the expansion/flood fill;


<span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">flood_fill</span><span style="color:#323232;">(used: [])
</span><span style="color:#323232;">  new_dim </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@dim </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#0086b3;">3
</span><span style="color:#323232;">  new_map </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#62a35c;">Array</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(new_dim.size, </span><span style="color:#183691;">'.'</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="color:#62a35c;">puts </span><span style="color:#183691;">"Expanding #{</span><span style="color:#323232;">@dim</span><span style="color:#183691;">} to #{new_dim}, with #{used.size} visited pipes." </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">$args.verbose
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-style:italic;color:#969896;"># Mark all real points as inside on the expanded map
</span><span style="color:#323232;">  (</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">(@dim.y </span><span style="font-weight:bold;color:#a71d5d;">- </span><span style="color:#0086b3;">1</span><span style="color:#323232;">)).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|y|
</span><span style="color:#323232;">    (</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">(@dim.x </span><span style="font-weight:bold;color:#a71d5d;">- </span><span style="color:#0086b3;">1</span><span style="color:#323232;">)).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|x|
</span><span style="color:#323232;">      expanded_point </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;"> x </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#0086b3;">3 </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#0086b3;">1</span><span style="color:#323232;">, y </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#0086b3;">3 </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#0086b3;">1
</span><span style="color:#323232;">      new_map[expanded_point.y </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> expanded_point.x] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">'I'
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-style:italic;color:#969896;"># Paint all used pipes onto the expanded map
</span><span style="color:#323232;">  used.each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|used_p|
</span><span style="color:#323232;">    expanded_point </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;"> used_p.x </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#0086b3;">3 </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#0086b3;">1</span><span style="color:#323232;">, used_p.y </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#0086b3;">3 </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#0086b3;">1
</span><span style="color:#323232;">
</span><span style="color:#323232;">    new_map[expanded_point.y </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> expanded_point.x] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">'#'
</span><span style="color:#323232;">    offsets </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@links[used_p].connections
</span><span style="color:#323232;">    offsets.shift
</span><span style="color:#323232;">
</span><span style="color:#323232;">    offsets.each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|offs|
</span><span style="color:#323232;">      diff </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> offs </span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#323232;"> used_p
</span><span style="color:#323232;">      new_map[(expanded_point.y </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> diff.y) </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#323232;">(expanded_point.x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> diff.x)] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">'#'
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="color:#62a35c;">puts </span><span style="color:#183691;">"Flooding expanded map..." </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">$args.verbose
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-style:italic;color:#969896;"># Flood fill the expanded map from the top-left corner
</span><span style="color:#323232;">  to_visit </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[</span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="color:#323232;">, </span><span style="color:#0086b3;">0</span><span style="color:#323232;">)]
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">until</span><span style="color:#323232;"> to_visit.empty?
</span><span style="color:#323232;">    at </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> to_visit.shift
</span><span style="color:#323232;">    new_map[at.y </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> at.x] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">' '
</span><span style="color:#323232;">
</span><span style="color:#323232;">    (</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|off_y|
</span><span style="color:#323232;">      (</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|off_x|
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">next if </span><span style="color:#323232;">(off_x.zero? </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp; off_y.zero?) </span><span style="font-weight:bold;color:#a71d5d;">|| !</span><span style="color:#323232;">(off_x.zero? </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> off_y.zero?)
</span><span style="color:#323232;">
</span><span style="color:#323232;">        off_p </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> at </span><span style="font-weight:bold;color:#a71d5d;">+ </span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(off_x, off_y)
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">next if</span><span style="color:#323232;"> off_p.x </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">0 </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> off_p.y </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">0</span><span style="color:#323232;"> 
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> off_p.x </span><span style="font-weight:bold;color:#a71d5d;">>=</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> off_p.y </span><span style="font-weight:bold;color:#a71d5d;">>=</span><span style="color:#323232;"> new_dim.y 
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> to_visit.</span><span style="color:#62a35c;">include?</span><span style="color:#323232;">(off_p)
</span><span style="color:#323232;">
</span><span style="color:#323232;">        val </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> new_map[off_p.y </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;"> new_dim.x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> off_p.x]
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">next unless </span><span style="color:#183691;">%w[. I]</span><span style="color:#323232;">.</span><span style="color:#62a35c;">include?</span><span style="color:#323232;"> val
</span><span style="color:#323232;">
</span><span style="color:#323232;">        to_visit </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; off_p
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> new_map, new_dim
</span><span style="font-weight:bold;color:#a71d5d;">end
</span>

:::

ace,
@ace@lemmy.ananace.dev avatar

Let me tell you about Bumblebee and their issue , though that one’s even worse seeing as installing system packages are done as root.

(Their install/update commands included rm -rf /usr /lib/nvidia-current/xorg/xorg)

ace,
@ace@lemmy.ananace.dev avatar

I’ve been personally using KDEs Itinerary app, but it might not be what you’re looking for

ace,
@ace@lemmy.ananace.dev avatar

Well, this one ended up being a really nice and terse solution when done naïvely, here with a trimmed snippet from my simple solution;

:::spoiler Ruby


<span style="color:#62a35c;">puts </span><span style="color:#183691;">"Part 1:"</span><span style="color:#323232;">, @races.map </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|race|
</span><span style="color:#323232;">  (</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">race[</span><span style="color:#0086b3;">:time</span><span style="color:#323232;">]).count { |press_dur| press_dur </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#323232;">(race[</span><span style="color:#0086b3;">:time</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#323232;"> press_dur) </span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> race[</span><span style="color:#0086b3;">:distance</span><span style="color:#323232;">] }
</span><span style="font-weight:bold;color:#a71d5d;">end</span><span style="color:#323232;">.inject(</span><span style="color:#0086b3;">:*</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">full_race_time </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@races.map { |r| r[</span><span style="color:#0086b3;">:time</span><span style="color:#323232;">].</span><span style="color:#62a35c;">to_s </span><span style="color:#323232;">}.join.</span><span style="color:#62a35c;">to_i
</span><span style="color:#323232;">full_race_dist </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@races.map { |r| r[</span><span style="color:#0086b3;">:distance</span><span style="color:#323232;">].</span><span style="color:#62a35c;">to_s </span><span style="color:#323232;">}.join.</span><span style="color:#62a35c;">to_i
</span><span style="color:#323232;">
</span><span style="color:#62a35c;">puts </span><span style="color:#183691;">"Part 2:"</span><span style="color:#323232;">, (</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">full_race_time).count { |press_dur| press_dur </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#323232;">(full_race_time </span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#323232;"> press_dur) </span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> full_race_dist }
</span>

:::

ace,
@ace@lemmy.ananace.dev avatar

The naïve and unoptimized version ran in under 4 seconds for me, that’s nowhere near “Time to knuckle down and actually optimize this” territory.

ace,
@ace@lemmy.ananace.dev avatar

I get the feeling that I should include some default types for handling 2D maps in my boilerplate, it’s a very recurring problem in AoC after all.

My solution is reasonably simplistic - and therefore also a bit slow, but the design meant I could do part 2 with just a few extra lines of code on the already processed data, here’s the functional part of it; (I push the previous days solution as part of my workflow for starting with the current day so the full code won’t be up until tomorrow) :::spoiler Ruby The code has been compressed for brevity.


<span style="color:#323232;">Point </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">Struct</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(</span><span style="color:#183691;">'Point'</span><span style="color:#323232;">, </span><span style="color:#0086b3;">:x</span><span style="color:#323232;">, </span><span style="color:#0086b3;">:y</span><span style="color:#323232;">)
</span><span style="color:#323232;">PartNumber </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">Struct</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(</span><span style="color:#183691;">'PartNumber'</span><span style="color:#323232;">, </span><span style="color:#0086b3;">:number</span><span style="color:#323232;">, </span><span style="color:#0086b3;">:adjacent</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">do
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">adjacent?</span><span style="color:#323232;">(to); adjacent.</span><span style="color:#62a35c;">include?</span><span style="color:#323232;">(to); </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">irrelevant?</span><span style="color:#323232;">; adjacent.empty?; </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">to_i</span><span style="color:#323232;">; number; </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">class </span><span style="color:#0086b3;">Implementation
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">initialize
</span><span style="color:#323232;">    @map </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]; @dim </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">{ </span><span style="color:#0086b3;">width: 0</span><span style="color:#323232;">, </span><span style="color:#0086b3;">height: 0 </span><span style="color:#323232;">}; @symbols </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]; @numbers </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">input</span><span style="color:#323232;">(line)
</span><span style="color:#323232;">    @dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> line.size; @dim[</span><span style="color:#0086b3;">:height</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#0086b3;">1
</span><span style="color:#323232;">    @map </span><span style="font-weight:bold;color:#a71d5d;">+=</span><span style="color:#323232;"> line.chars
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">calc
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;"> y </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:height</span><span style="color:#323232;">]</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">do
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;"> x </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">]</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">do
</span><span style="color:#323232;">        chr </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> get(x, y); </span><span style="font-weight:bold;color:#a71d5d;">next if</span><span style="color:#323232;"> chr </span><span style="font-weight:bold;color:#a71d5d;">=~ </span><span style="color:#183691;">/</span><span style="color:#0086b3;">d</span><span style="color:#183691;">/ </span><span style="font-weight:bold;color:#a71d5d;">||</span><span style="color:#323232;"> chr </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'.'
</span><span style="color:#323232;">        @symbols </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(x, y)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;"> y </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:height</span><span style="color:#323232;">]</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">do
</span><span style="color:#323232;">      buf </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">""</span><span style="color:#323232;">; adj </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;"> x </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">]) </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="font-style:italic;color:#969896;"># Going one over, to fake a non-number as an end char on all lines
</span><span style="color:#323232;">        chr </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> get(x, y)
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;"> chr </span><span style="font-weight:bold;color:#a71d5d;">=~ </span><span style="color:#183691;">/</span><span style="color:#0086b3;">d</span><span style="color:#183691;">/
</span><span style="color:#323232;">          buf </span><span style="font-weight:bold;color:#a71d5d;">+=</span><span style="color:#323232;"> chr
</span><span style="color:#323232;">          (</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|adj_x|
</span><span style="color:#323232;">            (</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).each </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|adj_y|
</span><span style="color:#323232;">              </span><span style="font-weight:bold;color:#a71d5d;">next if</span><span style="color:#323232;"> adj_x </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#0086b3;">0 </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp; adj_y </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#0086b3;">0 </span><span style="font-weight:bold;color:#a71d5d;">||
</span><span style="color:#323232;">                (x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_x </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">0</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">|| </span><span style="color:#323232;">(x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_x </span><span style="font-weight:bold;color:#a71d5d;">>= </span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">]) </span><span style="font-weight:bold;color:#a71d5d;">||
</span><span style="color:#323232;">                (y </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_y </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">0</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">|| </span><span style="color:#323232;">(y </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_y </span><span style="font-weight:bold;color:#a71d5d;">>= </span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:height</span><span style="color:#323232;">])
</span><span style="color:#323232;">              sym </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">Point</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(x </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_x, y </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> adj_y)
</span><span style="color:#323232;">              adj </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; sym </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">@symbols.any? sym
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">elsif !</span><span style="color:#323232;">buf.empty?
</span><span style="color:#323232;">          @numbers </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">PartNumber</span><span style="color:#323232;">.</span><span style="font-weight:bold;color:#a71d5d;">new</span><span style="color:#323232;">(buf.</span><span style="color:#62a35c;">to_i</span><span style="color:#323232;">, adj)
</span><span style="color:#323232;">          buf </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">""</span><span style="color:#323232;">; adj </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">output
</span><span style="color:#323232;">    part1 </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@numbers.reject(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="color:#0086b3;">:irrelevant?</span><span style="color:#323232;">).map(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="color:#0086b3;">:to_i</span><span style="color:#323232;">).sum
</span><span style="color:#323232;">    </span><span style="color:#62a35c;">puts </span><span style="color:#183691;">"Part 1:"</span><span style="color:#323232;">, part1
</span><span style="color:#323232;">
</span><span style="color:#323232;">    gears </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">@symbols.</span><span style="color:#62a35c;">select </span><span style="font-weight:bold;color:#a71d5d;">do </span><span style="color:#323232;">|sym|
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">next unless</span><span style="color:#323232;"> get(sym) </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'*'
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">next unless </span><span style="color:#323232;">@numbers.</span><span style="color:#62a35c;">select </span><span style="color:#323232;">{ |num| num.adjacent? sym }.size </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#0086b3;">2
</span><span style="color:#323232;">      </span><span style="color:#0086b3;">true
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">    part2 </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> gears.sum { |gear| @numbers.</span><span style="color:#62a35c;">select </span><span style="color:#323232;">{ |num| num.adjacent? gear }.map(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="color:#0086b3;">:to_i</span><span style="color:#323232;">).inject(</span><span style="color:#0086b3;">:*</span><span style="color:#323232;">) }
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="color:#62a35c;">puts </span><span style="color:#183691;">"Part 2:"</span><span style="color:#323232;">, part2
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">private
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">get</span><span style="color:#323232;">(x, y </span><span style="font-weight:bold;color:#a71d5d;">= -</span><span style="color:#0086b3;">1</span><span style="color:#323232;">)
</span><span style="color:#323232;">    y </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> x.y </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;"> x.</span><span style="color:#62a35c;">is_a?</span><span style="color:#323232;">(</span><span style="color:#0086b3;">Point</span><span style="color:#323232;">)
</span><span style="color:#323232;">    x </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> x.x </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;"> x.</span><span style="color:#62a35c;">is_a?</span><span style="color:#323232;">(</span><span style="color:#0086b3;">Point</span><span style="color:#323232;">)
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return unless </span><span style="color:#323232;">(</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">]</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).</span><span style="color:#62a35c;">include?</span><span style="color:#323232;">(x) </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp; (</span><span style="color:#0086b3;">0</span><span style="font-weight:bold;color:#a71d5d;">..</span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:height</span><span style="color:#323232;">]</span><span style="font-weight:bold;color:#a71d5d;">-</span><span style="color:#0086b3;">1</span><span style="color:#323232;">).</span><span style="color:#62a35c;">include?</span><span style="color:#323232;">(y)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    @map[y </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#323232;"> x </span><span style="font-weight:bold;color:#a71d5d;">% </span><span style="color:#323232;">@dim[</span><span style="color:#0086b3;">:width</span><span style="color:#323232;">]]
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">end
</span><span style="font-weight:bold;color:#a71d5d;">end
</span>

:::

ace,
@ace@lemmy.ananace.dev avatar

Definitely the third / middle left, but the bottom right definitely gets second place to me.
Not a major fan of too abstract art, and those are just both so serene.

ace,
@ace@lemmy.ananace.dev avatar

Yep, funge has been used to describe any kind of multi-dimensional programming language - often with self-modifying code, I’ve personally found both 3D and 4D funge languages.

There’s just something with the whole concept that amuses me, I’ve been trying to build some kind of funge-style programming puzzle game for a while now, but haven’t figured out a good hook to take it past being just a PoC yet.

ace,
@ace@lemmy.ananace.dev avatar

Writing and debugging 4D code is… interesting.

When your code can’t just run forwards and backwards, but also left and right, up and down, and even inwards and outwards.

ace,
@ace@lemmy.ananace.dev avatar

2D grids and parsing data from them in all manner of interesting ways is a real AoC staple.

I’m still hoping to be met with a problem at some point which can be solved by handling it as a type of funge program.

ace,
@ace@lemmy.ananace.dev avatar

Not really, WSL seems like it was mainly supposed to stop people leaping ship to be able to develop Node without the horribly painful Windows JS experience. And wouldn’t you know it, Microsoft has been making their own JavaScript language in Typescript.

ace,
@ace@lemmy.ananace.dev avatar

People love to complain about CMake, often with valid complaints as well. But it - to this day - remains the only build system where I’ll actually trust a project when they say they are cross-platform.

Being the Windows maintainer for OpenMW, it used to be absolute hell back a decade and half ago when an indirect dependency changed - and used something like SCons or Premake while claiming to be “cross-platform”, used to be that I had to write my own build solutions for Windows since it was all hardcoded against Linux paths and libraries.

CMake might not be the coolest, most hip, build system, but it delivers on actually letting you build your software regardless of platform. So it remains my go-to for whenever I need to actually build something that’s supposed to be used.
For personal things I still often hack together a couple of Makefiles though, it’s just a lot faster to do.

ace,
@ace@lemmy.ananace.dev avatar

It’s basically just a copy of the main leaderboard, but the scores are given based on the size of the group.

ace,
@ace@lemmy.ananace.dev avatar

My favourite advent calendar.
Got a private leaderboard with the other sysadmins from work - as well as a few people from our application/development team.

ace,
@ace@lemmy.ananace.dev avatar

It could be interesting with something like the old Pharaoh game and its receding riverbed farming, but you’d have to balance that compared to costs of resourcing in Factorio - or offer some reasonably simple way for the player to protect their resourcing operations against the rising lava.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • provamag3
  • ngwrru68w68
  • InstantRegret
  • ethstaker
  • magazineikmin
  • osvaldo12
  • rosin
  • mdbf
  • Youngstown
  • khanakhh
  • slotface
  • Durango
  • kavyap
  • DreamBathrooms
  • JUstTest
  • thenastyranch
  • tacticalgear
  • cisconetworking
  • GTA5RPClips
  • modclub
  • cubers
  • normalnudes
  • everett
  • tester
  • megavids
  • Leos
  • anitta
  • lostlight
  • All magazines