arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

2.sh (2546B)


      1 #! page
      2 title: Advent of code 2024^\(mais c\'est l\'advent of *unix* code\) - jour 2
      3 author: Arthur Pons
      4 description: L\'advent of code 2024 version Unix
      5 publication: 2024-12-04
      6 
      7 sectionmd: main
      8 
      9 ## Jour 2
     10 
     11 [Introduction et jour 1](/aoc2024)\
     12 [Jour 1](1.html) - [Jour 3](3.html)
     13 
     14 ### Intitulé résumé
     15 
     16 #### Première partie
     17 
     18 	7 6 4 2 1
     19 	1 2 7 8 9
     20 	9 7 6 2 1
     21 	1 3 2 4 5
     22 	8 6 4 4 1
     23 	1 3 6 7 9
     24 
     25 This example data contains six reports each containing five levels.
     26 
     27 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:
     28 
     29   * The levels are either all increasing or all decreasing.
     30   * Any two adjacent levels differ by at least one and at most three.
     31 
     32 #### Deuxième partie
     33 
     34 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!
     35 
     36 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.
     37 
     38 ### Commentaire de ma solution
     39 
     40 #### Première partie
     41 
     42 A mon avis nous sommes ici face à un problème qui rempli bien les critères des
     43 problèmes pour lequel le shell est mal adapté. Quand c'est le cas l'unixien·ne
     44 old school vous dira de dégaîner `awk`. Ca tombe bien, je dois le pratiquer
     45 pour m'améliorer.
     46 
     47 La solution n'a rien de bien particulier. On se retrouve avec un algo qui
     48 ressemble beaucoup à ce que l'on ferait en C ou en python pas très idiomatique.
     49 J'imagine que c'est de l'awk vraiment médiocre. Il se peut que je n'ai pas décelé
     50 le pattern caché magique qui permet d'exprimer le problème d'une façon permettant
     51 d'avoir un bel algo.
     52 
     53     < 2.input awk '{
     54         split($0,a," ")
     55         if (a[2]-a[1] > 0) { upordown="up" } else { upordown="down" }
     56         for(i=1;i<length(a);i++) {
     57             diff=a[i+1]-a[i]
     58             if ( diff > 3 || diff < -3 || diff==0 ) {
     59                 print $0" not safe to large of a diff or 0"
     60                 next
     61             }
     62             if ( upordown=="up" && a[i+1]-a[i]<0 || upordown=="down" && a[i+1]-a[i]>0 ) {
     63                 print $0" not safe wrong way"
     64                 next
     65             }
     66         }
     67         print $0" safe"
     68     }' | grep 'safe$' | wc -l
     69 
     70 #### Deuxième partie
     71 
     72 Je n'y suis pas encore arrivé et suis passé à la journée d'après 😀