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 😀