• # un bout de AWK

    Posté par . En réponse au message Avent du Code, jour 7. Évalué à 3. Dernière modification le 07 décembre 2022 à 11:12.

    Comme le FS est parcourus "en profondeur d'abord" et dans l'ordre, pas besoin d'une structure de données trop compliquée type arbre, une simple liste suffit.

    partie 1

    BEGIN { LIMIT=100*1000 }
    $2 == "ls" || $1 == "dir" { next}
    $2 == "cd" && $3 == ".." { # on monte
     if (S[depth]<=LIMIT) { # <= "at most" !!!!!!!!!
     R+=S[depth]
     }
     S[depth]=0 # ne pas oublier le reset du précédent cousin
     depth -= 1
    }
    $2 == "cd" && $3 != ".." { depth += 1; P[depth]=$3; } # on descend
    NF == 2 { # fichier
     for (i=1;i<=depth;i++) {
     S[i]+=$1
     }
    }
    END { print R }

    J'ai perdu au moins une demie heure sur le fait que j'ai interprété "at most" en "au moins" car j'imaginais chercher des trucs gros (on veut libérer de la place). Alors que c'est "au plus" ; GRRR ; Bien lire l'énoncée sans faire d'hypothèse !

    partie 2

    Pour cette partie où il faut trouver le dossier qui permet de libérer l'espace juste nécessaire pour dl la mise à jour, j'ai utilise un script de debug qui me liste les tailles de tous les répertoires. J'ai calculé à la main l'espace qu'il me faillait, et j'ai regardé dans la liste triée des tailles (| sort -n) celle qui était juste au dessus. Oui on a le droit de bidouiller pour l'AoC si ça permet d'aller plus vite à la solution.