• Li chevron_right

      TapTempo contest : un peu moins d'octets en Awk

      Vincent Caron · pubsub.eckmul.net / linuxfr · Thursday, 14 January, 2021 - 21:31 · 3 minutes

    <p>Voici une implémentation de TapTempo encore plus compacte que l'indigeste one-liner Perl précédent (<a href="//linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne">https://linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne</a>), elle vous est offerte par Loïc Cerf qui me l'a soumise et me propose de vous la partager.</p> <p>J'ai donc l'honneur de vous transmettre sa solution en 97 caractères :<br> <code><br> $ awk '{system("date +%s%N")}'|awk '{t[++k]=$0}k&gt;5{r=k-5}k&gt;1{printf"%i",6e10*(k-r-1)/($0-t[r+1])}'<br> </code><br> Le comportement est identique à celui de la ligne Perl de Vincent. Elle considère notamment le temps il y a cinq tapes sur la touche Entrée, moins au début… mais je triche en imprimant <code>%i</code>, le seul tempo (un nombre entier), plutôt que <code>%i bpm</code> qui mènerait à 101 caractères.</p> <p>La solution n'est pas particulièrement cryptique. Le premier programme AWK appelle <code>date +%s%N</code>, comme dans la solution en Bash de superna, à chaque appui sur la touche Entrée, <code>\n</code> séparant par défaut les "enregistrements" ("record" en anglais) en AWK. Le second programme reçoit donc des nombres de millisecondes depuis l'époque. Il les stocke<br> dans <code>t[1]</code>, <code>t[2]</code>, etc., <code>$0</code> étant l'enregistrement entier en AWK, qui initialise <code>k</code> à 0 la première fois que la variable est utilisée (de façon numérique : ici, un incrément). Au premier enregistrement, rien n'est fait : les tests <code>k&gt;5</code> et <code>k&gt;1</code> échouent. Du second au cinquième, seul le test <code>k&gt;1</code> passe et l'entier imprimé est le tempo calculé en considérant le dernier temps (<code>$0</code>), le premier (<code>t[r+1]</code> est <code>t[1]</code> puisque <code>r</code> vaut 0), le nombre d'intervalle (<code>k-1</code>) et le fait que le temps est en millisecondes plutôt qu'en minutes (facteur <code>6e10</code>). À partir du sixième enregistrement<br> (<code>k&gt;5</code>), <code>r</code> est défini comme étant <code>k-5</code> de sorte que le tempo est calculé en considérant le dernier temps (<code>$0</code>), le temps au <code>k-5+1 = k-4</code> ème enregistrement et donc <code>k-r-1 = k-(k-5)-1 = 4</code> intervalles.</p> <p>J'avais au départ une solution similaire en 103 caractères (107 en écrivant " bpm"). J'ai proposé un défi TapTempo après avoir enseigné AWK ( <a href="https://dcc.ufmg.br/%7Elcerf/slides/mda6.pdf">https://dcc.ufmg.br/~lcerf/slides/mda6.pdf</a> ) à mes étudiants (je suis professeur à l'Université Fédérale du Minas Gerais, au Brésil) : réaliser la même chose en moins de caractères. Une étudiante a économisé trois caractères. J'ai ensuite encore gagné trois caractères.</p> <p>Si l'un de vous deux veut participer au renouveau d'intérêt pour TapTempo, je n'ai rien contre un journal qui présente cette solution en moins de 100 caractères. Je suis en fait curieux de découvrir si quelqu'un trouvera une solution encore plus brève.</p> <p>Loïc.</p> <div><a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-contest-un-peu-moins-d-octets-en-awk.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122943/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-contest-un-peu-moins-d-octets-en-awk#comments">ouvrir dans le navigateur</a> </p>
    • wifi_tethering open_in_new

      This post is public

      linuxfr.org /users/zerodeux/journaux/taptempo-contest-un-peu-moins-d-octets-en-awk