Advent of code 2024mais c’est l’advent of unix code - jour 2


Jour 2

Introduction et jour 1
Jour 1 - Jour 3

Intitulé résumé

Première partie

7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9

This example data contains six reports each containing five levels.

The engineers are trying to figure out which reports are safe. The Red-Nosed reactor safety systems can only tolerate levels that are either gradually increasing or gradually decreasing. So, a report only counts as safe if both of the following are true:

Deuxième partie

The Problem Dampener is a reactor-mounted module that lets the reactor safety systems tolerate a single bad level in what would otherwise be a safe report. It’s like the bad level never happened!

Now, the same rules apply as before, except if removing a single level from an unsafe report would make it safe, the report instead counts as safe.

Commentaire de ma solution

Première partie

A mon avis nous sommes ici face à un problème qui rempli bien les critères des problèmes pour lequel le shell est mal adapté. Quand c’est le cas l’unixien·ne old school vous dira de dégaîner awk. Ca tombe bien, je dois le pratiquer pour m’améliorer.

La solution n’a rien de bien particulier. On se retrouve avec un algo qui ressemble beaucoup à ce que l’on ferait en C ou en python pas très idiomatique. J’imagine que c’est de l’awk vraiment médiocre. Il se peut que je n’ai pas décelé le pattern caché magique qui permet d’exprimer le problème d’une façon permettant d’avoir un bel algo.

< 2.input awk '{
    split($0,a," ")
    if (a[2]-a[1] > 0) { upordown="up" } else { upordown="down" }
    for(i=1;i<length(a);i++) {
        diff=a[i+1]-a[i]
        if ( diff > 3 || diff < -3 || diff==0 ) {
            print $0" not safe to large of a diff or 0"
            next
        }
        if ( upordown=="up" && a[i+1]-a[i]<0 || upordown=="down" && a[i+1]-a[i]>0 ) {
            print $0" not safe wrong way"
            next
        }
    }
    print $0" safe"
}' | grep 'safe$' | wc -l

Deuxième partie

Je n’y suis pas encore arrivé et suis passé à la journée d’après 😀