{"id":906,"date":"2022-09-08T07:45:40","date_gmt":"2022-09-08T06:45:40","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?page_id=906"},"modified":"2022-09-09T18:40:47","modified_gmt":"2022-09-09T17:40:47","slug":"ok-mobile","status":"publish","type":"page","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/ok-mobile\/","title":{"rendered":"oK Mobile &#8211; Le langage K version mobile"},"content":{"rendered":"\n<p>J&rsquo;ai une passion pour les <strong>calculatrices<\/strong> et les langages <strong>minimalistes<\/strong> (\u00e9crire peu, faire beaucoup). C&rsquo;est le cas du langage <strong>RPL<\/strong> sur les calculateurs <strong>HP<\/strong>, du langage <strong>APL<\/strong>, des machines n&rsquo;ayant que quelques octets  (Ti 57 = 50 pas de programme), etc.<\/p>\n\n\n\n<p>Suite \u00e0 mes prospections autour du langage <strong>K<\/strong>, que je trouve infiniment plus attractif que le langage <strong>J<\/strong> d&rsquo;Iverson, <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/JohnEarnest\/ok\" target=\"_blank\">j&rsquo;ai d\u00e9couvert <strong>oK<\/strong><\/a> (correspondant \u00e0 la version <strong>K6<\/strong>, le langage <strong>K<\/strong> ayant des num\u00e9ros avec plusieurs sp\u00e9cifications) et qui existe en <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/johnearnest.github.io\/ok\/mobile.html\" target=\"_blank\">version mobile<\/a><\/strong> :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/scontent.fcdg3-1.fna.fbcdn.net\/v\/t1.15752-9\/305650831_5674697509259386_5782068976243617953_n.jpg?_nc_cat=110&amp;ccb=1-7&amp;_nc_sid=ae9488&amp;_nc_ohc=KYvtdp6uxS4AX-yclMk&amp;_nc_oc=AQn-zNSxzqlQAdmJSdXUfZdBo3Gmdka6JcwvEYYIr757YBbH5ckmwkrqtyOqQWGcTIcJfGrBIQfwLtyilHdIgHdp&amp;_nc_ht=scontent.fcdg3-1.fna&amp;oh=03_AVI1TsErsAGyg29DJILr2bv__jQFZHDqHbTDC5eEF2hlnA&amp;oe=6340253D\" alt=\"Aucune description disponible.\" width=\"221\" height=\"463\" \/><figcaption>Mode Portrait<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/scontent.fcdg3-1.fna.fbcdn.net\/v\/t1.15752-9\/305336313_782877722853873_4519668806362153279_n.jpg?_nc_cat=108&amp;ccb=1-7&amp;_nc_sid=ae9488&amp;_nc_ohc=zRXb-xJTSIMAX8oy29l&amp;_nc_ht=scontent.fcdg3-1.fna&amp;oh=03_AVKLQjrSZJY9zyjqT_z-UHJSlmFdmJHi9Lk41ReHakqxbw&amp;oe=633EB6A6\" alt=\"Aucune description disponible.\" width=\"463\" height=\"222\" \/><figcaption>Mode <strong>Paysage<\/strong> (les touches du clavier changent)<\/figcaption><\/figure><\/div>\n\n\n\n<p>La version propos\u00e9e sur le site officiel n\u00e9cessite d&rsquo;avoir un t\u00e9l\u00e9phone (ou une tablette) connect\u00e9 \u00e0 Internet (\u00e0 cause de 2 fichiers : <strong>base-min.css<\/strong> et <strong>Chart.min.js<\/strong>), ce qui est dommage. C&rsquo;est pourquoi <a href=\"https:\/\/uabox.univ-angers.fr\/index.php\/s\/vszUTXaUOrSKtW4\" target=\"_blank\" rel=\"noreferrer noopener\">vous trouverez ici une version avec ces 2 fichiers d\u00e9j\u00e0 t\u00e9l\u00e9charg\u00e9s<\/a>. L&rsquo;ensemble ne fait que 200 ko dont 144 ko juste pour <strong>Chart.min.js<\/strong> dont on peut se passer si on ne veut pas de graphique !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Petit survol de oK Mobile<\/h2>\n\n\n\n<p>Si vous testez <strong>oK Mobile<\/strong> sur ordinateur, il faudra <strong>diminuer<\/strong> la <strong>largeur<\/strong> de la fen\u00eatre jusqu&rsquo;\u00e0 obtenir l&rsquo;interface en mode <strong>Portrait<\/strong> (comme sur un t\u00e9l\u00e9phone). Vous pourrez bien entendu utiliser les touches de votre clavier. Vous pouvez aussi rester en mode paysage mais utilisez la touche <strong>MAJ<\/strong> (<strong>SHIFT<\/strong>) pour voir des caract\u00e8res suppl\u00e9mentaires.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/ On a les r\u00e9ductions :\n\n +\/ !10     \/ !10 correspond \u00e0 0 1 2 ... 10\n45\n\n\/ \":\" pour imposer l'utilisation monadique de #\n\/ Nb de caract\u00e8res de chaque mot\n\n #:'(\"bonjour\";\"tout\";\"le\";\"monde\")\n7 4 2 5\n\n |\/ 3 5 4 2         \/ Maximum\n5\n\n &amp;\/ 3 5 4 2         \/ Minimum\n2\n\n\/ Convergence vers le nombre d'or\n\n {1+1%x}\/1\n1.618\n\n\/ Aucun changement pour l'exercice \"gimme\" que j'avais propos\u00e9\n\n *1_&lt; 8 5 12     \/ Tri + suppr 1er \u00e9l\u00e9ment + R\u00e9cup 1er\n0\n\n\/ But : Ne pas garder les notes inf\u00e9rieures \u00e0 10\n\n {x&lt;10}_ 5 6 10 18 1 17\n10 18 17\n\n\/ Reste de la division de 27 par 5\n\n 5!27\n2\n \n\/ But : Garder les multiples de 5\n\/ la n\u00e9gation ~ permet d'avoir des 1...\n\/ ...lorsque x est divisible par 5 et 0 sinon \n\n {~5!x}# 3 15 21 20 17\n15 20\n\n\/ autre version\n\/ on enl\u00e8ve les \"non multiple de 5\"\n\n (5!)_ 3 15 21 20 17\n15 20\n\n\/ Fonction carr\u00e9e\n\nc:{x*x}\nc 8 9\n64 81\n\n\/ Fonction de 2 variables\n\/ 13 = 1 + 3 * 4 ; 17 = 2 + 3 * 5 et 21 = 3 + 3 * 6\n\n f:{x+3*y}\n f&#091;1 2 3; 4 5 6]\n13 17 21\n\n\/ Combien y-a-t-il d'\u00e9l\u00e9ments dans t et quelle est la valeur max ?\n\n t: 5 3 8 1 2\n {(#x),|\/x} t\n5 8                  \/ 5 \u00e9l\u00e9ments et max = 8\n\n\/ R\u00e9partition des indices suivant les valeurs\n\n = \"abracadabra\"\n\"abrcd\"!(0 3 5 7 10\n 1 8\n 2 9\n ,4\n ,6)\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">En route pour Syracuse<\/h2>\n\n\n\n<p>Dans la plupart des vid\u00e9os consacr\u00e9es aux calculatrices, je propose la conjecture de <strong>Syracuse<\/strong>, \u00e0 savoir partir d&rsquo;un nombre entier, s&rsquo;il est pair le diviser par 2 sinon le multiplier par 3 et ajouter 1. La conjecture pr\u00e9tend que l&rsquo;on arrivera toujours \u00e0 un moment \u00e0 la valeur 1.<\/p>\n\n\n\n<p>Commen\u00e7ons par une version simple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> syr:{$&#091;2!x;1+3*x;x%2]}\n\n\/ 2!27 vaut 1 (reste division de 27 par 2) qui correspond \u00e0 VRAI\n\/ donc le nombre est multipli\u00e9 par 3 plus 1\n\n syr 27\n82\n\n\/ 2!82 vaut 0 qui correspond \u00e0 FAUX\n\/ donc le nombre est divis\u00e9 par 2\n\n syr 82\n41<\/code><\/pre>\n\n\n\n<p>O\u00f9 <strong>$<\/strong> correspond au test SI ALORS SINON : <strong>$[test ; valeur_si_Vrai ; valeur_si_Faux]<\/strong><\/p>\n\n\n\n<p>Cumulons les conditions, par exemple, si x&lt;2 renvoyer 1 sinon, si impair alors&#8230; etc.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> syr:{$&#091;x&lt;2;1;2!x;1+3*x;x%2]}\n\n syr 27\n82\n\n syr 1\n1           \/ et non pas 4<\/code><\/pre>\n\n\n\n<p>On peut alors faire un <strong>scan-fixedpoint<\/strong> <strong>\\<\/strong> (scanner tant que l&rsquo;on n&rsquo;a pas obtenu une valeur fixe). La valeur fixe est ici 1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> syr:{$&#091;2&gt;x;1;2!x;1+3*x;x%2]}\\\n\n syr 5\n5 16 8 4 2 1<\/code><\/pre>\n\n\n\n<p>Mais on peut \u00e9crire cela de fa\u00e7on encore plus conviviale avec <strong>scan-while<\/strong> (scanner tant que). L&rsquo;\u00e9criture ci-dessous signifie : r\u00e9p\u00e9ter <strong>{$&#8230;}<\/strong> tant que <strong>x&gt;1<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> syr:{x&gt;1}{$&#091;2!x;1+3*x;x%2]}\\\n\n syr 5\n5 16 8 4 2 1<\/code><\/pre>\n\n\n\n<p>On peut alors chercher le <strong>temps de vol<\/strong> et le <strong>maximum<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> stats:{(#1_x),|\/x}\n\n stats syr 5\n5 16              \/ temps de vol = 5 et max = 16\n\n stats syr 27\n111 9232<\/code><\/pre>\n\n\n\n<p>On peut m\u00eame faire un graphique :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>r:syr 27\npl&#091;#r;r]      \/ Plot<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"708\" height=\"276\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-17.png\" alt=\"\" class=\"wp-image-916\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-17.png 708w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-17-300x117.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-17-500x195.png 500w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Autres exemples tir\u00e9s de mes vid\u00e9os sur l&rsquo;APL ou du forum Silicium<\/h2>\n\n\n\n<p>Vous trouverez mes <a href=\"https:\/\/youtube.com\/playlist?list=PLIz4PfDd5D29oOW61VkB4MHxGurtSCmhh\" target=\"_blank\" rel=\"noreferrer noopener\">3 vid\u00e9os sur APL<\/a> ici et les <a rel=\"noreferrer noopener\" href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=64&amp;t=45274\" target=\"_blank\">MPO APL sur Silicium<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sushis (vid\u00e9o n\u00b01 sur APL)<\/h3>\n\n\n\n<p>2 EUR le sushis (repr\u00e9sent\u00e9s par \u00ab\u00a0s\u00a0\u00bb), combien va-t-on payer si on en a mang\u00e9 \u00a0\u00bb  s sss ss\u00a0\u00bb ?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> sushis:2*+\/\"s\"=\n\n sushis \" s sss ss\"\n12<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Brin d&rsquo;ADN (vid\u00e9o n\u00b01 sur APL)<\/h3>\n\n\n\n<p>Est-ce qu&rsquo;une chaine est un brin d&rsquo;ADN, c&rsquo;est-\u00e0-dire qu&rsquo;elle ne contient que les lettres A, C, T et G.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> adn:~|\/^\"actg\"?_       \/ Version n\u00b01\n\n adn \"acccxtg\"\n0\n\n adn \"atttCgTgtA\"\n1\n\n\/ Explications :\n\n \"actg\"?_ \"tgcaxa\"\n2 3 1 0 0N 0                \/ 0N signifie Not a Number (NaN)\n\n ^ 2 3 1 0 0N 0             \/ ^ teste si l'\u00e9l\u00e9ment est NaN\n0 0 0 0 1 0\n\n\/ On prend la plus grande valeur et n\u00e9gation\n\/ donc s'il y a un \"1\" ce n'est pas un brin d'ADN\n\n adn:{&amp;\/(_x) in \"actg\"}     \/ Version n\u00b02\n\n\/ La r\u00e9duction &amp;\/ correspond \u00e0 la recherche du minimum\n\/ \"x in y\" renvoie Vrai ou Faux suivant que x est dans y ou non\n\n \"a\" in \"actg\"\n1                  \/ \"a\" est bien dans \"actg\"\n\n \"abc\" in \"actg\"\n1 0 1             \/ \"a\" et \"c\" sont dans \"actg\", pas \"b\"<\/code><\/pre>\n\n\n\n<p>R\u00e9cup\u00e9rer les lettres qui sont diff\u00e9rentes de A,C,T,G :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> adn:{(_x) in \"actg\"}_   \/ Version 1\n\n adn \"auccfCCWG\"\n\"ufW\"\n\n adn:{(_x)^\"actg\"}       \/ Version 2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Nettoyage des chiffres (vid\u00e9o n\u00b01 sur APL)<\/h3>\n\n\n\n<p>Enlever les chiffres qui sont dans une chaine \u00ab\u00a0s4402a25l8u9t005\u00a0\u00bb -&gt; \u00ab\u00a0salut\u00a0\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> net:{x in ,\/$:'!10}_\n\nnet \"s4402a25l8u9t005\"\n\"salut\"\n\n\/ !10 pour avoir la liste 0 1 2 ... 9\n\/ $:' pour transformer chaque chiffre en chaine\n\/ ,\/ pour concat\u00e9ner ces chaines -&gt; \"0123456789\"\n\/ pour finir on enl\u00e8ve (_) ceux qui ne sont pas dans cette chaine<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Autant de \u00ab\u00a0X\u00a0\u00bb que de \u00ab\u00a0o\u00a0\u00bb ? (vid\u00e9o n\u00b01 sur APL)<\/h3>\n\n\n\n<p>Y a-t-il autant de \u00ab\u00a0x\u00a0\u00bb que de \u00ab\u00a0o\u00a0\u00bb dans une chaine donn\u00e9e ?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> xo:{0=+\/(x=\"x\")-x=\"o\"\n\n xo \"xoox\"\n1\n \n xo \"xoxoo\"\n0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">RATP (vid\u00e9o n\u00b02 sur APL)<\/h3>\n\n\n\n<p>R\u00e9cup\u00e9rer les initiales des mots d&rsquo;une phrase :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> s:*:'\" \"\\\n\n s \"rentre avec tes pieds\"\n\"ratp\"\n\n\/ Ou encore, si on entre les mots dans une liste\n\n s:*:'\n s (\"rentre\";\"avec\";\"tes\";\"pieds\")\n\"ratp\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Meilleur score de chaque \u00e9quipe (vid\u00e9o n\u00b02 sur APL)<\/h3>\n\n\n\n<p>R\u00e9cup\u00e9rer le meilleur score de chacune de ses trois \u00e9quipes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/ Equipe n\u00b01 : 4, 8 et 9\n\/ Equipe n\u00b02 : 5, 10 et 3\n\/ Equipe n\u00b03 : 7 et 12\n\n scores:((4;8;9);(5;10;3);(7;12))\n\n best:|\/'\n\n best scores\n9 10 12<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Lettre la plus \u00e9loign\u00e9e dans l&rsquo;alphabet (vid\u00e9o n\u00b02 sur APL)<\/h3>\n\n\n\n<p>Dans une chaine, trouver la lettre la plus \u00e9loign\u00e9e dans l&rsquo;alphabet<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> max:{*x&#091;&gt;x]}\n\n txt:\"LA MODE SE DEMODE, LE STYLE JAMAIS\"\n\n max txt\n\"Y\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Misez p&rsquo;tit, Optimisez &#8211; N\u00b010 (hommage \u00e0 J. McCarthy)<\/h3>\n\n\n\n<p>Enonc\u00e9 : <a href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=46&amp;t=30336#p379059\">Misez p&rsquo;tit, Optimisez &#8211; N\u00b010 (hommage \u00e0 J. McCarthy)<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO10:{$&#091;x&gt;100;x-10;o(o(x+11))]}\n\n MPO10 5\n91\n MPO10 0\n91\n\n\/ \"o\" permet de faire un appel r\u00e9cursif<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Misez p&rsquo;tit, Optimisez &#8211; N\u00b015 (le jour des fourmis)<\/h3>\n\n\n\n<p>Enonc\u00e9 : <a href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=46&amp;t=31318\">Misez p&rsquo;tit, Optimisez &#8211; N\u00b015 (le jour des fourmis)<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO15:{,\/(#:'.s),'!s:=x@&gt;x}\\,\n\n MPO15 0\n(,0\n 1 0\n 1 1 1 0\n 3 1 1 0\n 1 3 2 1 1 0\n 1 3 1 2 3 1 1 0\n 2 3 1 2 4 1 1 0\n 1 4 1 3 2 2 3 1 1 0\n 1 4 2 3 2 2 4 1 1 0\n 2 4 1 3 3 2 3 1 1 0\n 1 4 3 3 2 2 3 1 1 0)<\/code><\/pre>\n\n\n\n<p>Quelques explications :<\/p>\n\n\n\n<p>&#8211; <strong>x@&gt;x<\/strong> permet de trier les valeurs de la liste, par exemple <strong>1 0 3 1<\/strong> devient <strong>3 1 1 0<\/strong><br>&#8211; Le <strong>=<\/strong> fait les statistiques (compte le nombre d&rsquo;occurrences de chaque valeur)<br>&#8211; On m\u00e9morise dans <strong>s<\/strong> le r\u00e9sultat qui se trouve \u00eatre un dictionnaire donnant les positions, par exemple <strong>1 0 3 1<\/strong> donnera <strong>3\u00a01\u00a00!(,0 ; \u00a01\u00a02 ; \u00a0,3)<\/strong>. En effet, une fois tri\u00e9, <strong>1 0 3 1<\/strong> donne <strong>3 1 1 0<\/strong>, le \u00ab\u00a03\u00a0\u00bb est \u00e0 la position 0, le \u00ab\u00a01\u00a0\u00bb aux positions 1 et 2 et le \u00ab\u00a00\u00a0\u00bb \u00e0 la position 3<br>&#8211; Les caract\u00e8res <strong>!<\/strong> et <strong>.<\/strong> permettent de r\u00e9cup\u00e9rer les <strong>cl\u00e9s<\/strong> et les <strong>valeurs<\/strong> d&rsquo;un dictionnaire<br>&#8211; La <strong>virgule<\/strong> pour la concat\u00e9nation, <strong>l&rsquo;apostrophe<\/strong> pour dire \u00ab\u00a0pour chaque\u00a0\u00bb et le <strong>#<\/strong> pour compter<br>&#8211; Le symbole <strong>\\ <\/strong>\u00e0 droite permet de boucler la fonction entre accolades tant que le r\u00e9sultat n&rsquo;est pas stable.<\/p>\n\n\n\n<p>En fran\u00e7ais, on pourrait donc dire : Tant que le r\u00e9sultat n&rsquo;est pas stable, trier les \u00e9l\u00e9ments par ordre croissant, compter les occurrences des chiffres distincts puis concat\u00e9ner l&rsquo;effectif avec la valeur.<\/p>\n\n\n\n<p>Pas \u00e0 pas sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO15 1 0 3 1\n\n {x@&gt;x} 1 0 3 1        \/ Tri\n3 1 1 0\n\n {=x@&lt;x} 1 0 3 1       \/ Stats\n3 1 0!(,0              \/ une seule position pour \"trois\"\n 1 2                   \/ deux positions pour \"un\"\n ,3)                   \/ une position pour \"z\u00e9ro\"\n\n {!s:=x@&gt;x} 1 0 3 1   \/ On m\u00e9morise dans s et r\u00e9cup\u00e9ration cl\u00e9s\n3 1 0                 \/ Ceux sont les valeurs distinctes\n\n {#:'.s:=x@&lt;x} 1 0 3 1    \/ On compte le nombre de valeurs\n1 2 1\n\n1 2 1 ,' 3 1 0       \/ Concat\u00e9nation \u00e9l\u00e9ment par \u00e9l\u00e9ment\n(1 3                 \/ il y a un \"trois\"\n 2 1                 \/ il y a deux \"un\"\n 1 0)                \/ il y a un \"z\u00e9ro\"\n\n,\/ 1 2 1 ,' 3 1 0    \/ Concat\u00e9nation de l'ensemble\n1 3 2 1 1 0      <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Misez p&rsquo;tit Optimisez n\u00b096 : Combien de bits \u00e0 un dans cet entier ?<\/h3>\n\n\n\n<p>Enonc\u00e9 : <a href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=46&amp;t=45636\">Misez p&rsquo;tit Optimisez n\u00b096 : Combien de bits \u00e0 un dans cet entier ?<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO96:{$&#091;1&gt;x;0;(2!x)+o(_x%2)]}\n\nMPO96 1279\n9<\/code><\/pre>\n\n\n\n<p>J&rsquo;ai repris l&rsquo;id\u00e9e de <strong>@C.Ret<\/strong> d&rsquo;utiliser un algorithme r\u00e9cursif. Tant que le nombre <strong>x<\/strong> est plus grand que 0, on cherche son reste en le divisant par 2 (donc 1 s&rsquo;il est impair) et on a ajoute la valeur obtenue par le m\u00eame algorithme \u00e0 la moiti\u00e9 de x (<strong>_x%2<\/strong> : partie enti\u00e8re de x divis\u00e9 par 2)<\/p>\n\n\n\n<p>L&rsquo;inconv\u00e9nient est que l&rsquo;on d\u00e9passe assez vite le nombre d&rsquo;appels \u00e0 la pile :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO96 31415926\nMaximum call stack size exceeded<\/code><\/pre>\n\n\n\n<p>On peut aussi r\u00e9pondre \u00e0 la question en utilisant <strong>decode<\/strong> (\\). Le probl\u00e8me est qu&rsquo;il faut connaitre le nombre de bits \u00e0 afficher :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 2 2 2 2 \\ 7\n0 1 1 1           \/ Affichage de 7 sur 4 bits\n\n 2 2 2 2 \\ 16\n0 0 0 0           \/ 16 sur 4 bits donne 0 !\n\n 2 2 2 2 2 \\ 16\n1 0 0 0 0         \/ et r\u00e9sultat correct sur 5 bits<\/code><\/pre>\n\n\n\n<p>Le nombre de bits \u00e0 utiliser est 1 + ln(x) \/ ln(2). Comme 1 \/ ln(2) vaut environ 1,44, on a cette autre version :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO96:{+\/((1+1.5*log x)#2)\\x}\n\n MPO96 31415926\n18\n MPO96 314159265358979323846\n30\n\n\/ Pour dupliquer une valeur on utilise #\n\n 6 # 2\n2 2 2 2 2 2\n\n 3.14 # 2\n2 2 2 2<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Produits int\u00e9rieur et ext\u00e9rieur<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">produit int\u00e9rieur<\/h3>\n\n\n\n<p>L&rsquo;exemple le plus commun est la somme des produits (SOMMEPROD avec Excel) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> +\/*&#091;4 2 3;1 5 6]     \/ 4*1 + 2*5 + 3*6 = 32\n32\n\n\/ que l'on pourrait \u00e9galement \u00e9crire :\n\n {+\/x*y}&#091;4 2 3;1 5 6]\n32\n\n\/ Le plus petit des plus grands entre (4,1), (2,5), (3,6)\n\n &amp;\/|&#091;4 2 3;1 5 6]\n4\n\n\/ En effet, les plus grands 2 \u00e0 2 sont : 4 5 6\n\/ et le plus petit des 3 est 4\n\n\/ Tous les nombres sont-ils plus petits que 10 ? \n\/ Il fait les comparaisons 4&lt;10, 5&lt;10 et 6&lt;10 (soit 1 1 1)\n\/ puis cherche le minimum des r\u00e9sultats (ici 1)\n\n &amp;\/&lt;&#091;4 5 6;10]\n1\n\n &amp;\/&lt;&#091;4 5 16;10]\n0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">produit ext\u00e9rieur<\/h3>\n\n\n\n<p>Commen\u00e7ons par la classique table de multiplication :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> *\\:&#091;n;n:1+!5]\n(1 2 3 4 5\n 2 4 6 8 10\n 3 6 9 12 15\n 4 8 12 16 20\n 5 10 15 20 25)\n\n\/ Explications :\n\n 1+!5\n1 2 3 4 5\n\n\/ que l'on m\u00e9morise dans \"n\"\n\/ On effectue les produits de tous les \u00e9l\u00e9ments de n...\n\/ ... par tous les \u00e9l\u00e9ments de n soit n*n r\u00e9sultats\n\n =\\:&#091;\"xo\";\"xxooxo\"]\n(1 1 0 0 1 0\n 0 0 1 1 0 1)\n\n\/ Explications :\n\/ On compare un par un les \u00e9l\u00e9ments de \"xo\" avec ceux de \"xxooxo\"<\/code><\/pre>\n\n\n\n<p>L&rsquo;exemple classique en APL de la cr\u00e9ation d&rsquo;un histogramme :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> v:2 7 1 8 2\n\n \".0\"&#091;&gt;\\:&#091;v;!|\/v]]\n(\"00......\"\n \"0000000.\"\n \"0.......\"\n \"00000000\"\n \"00......\")\n\n\/ Explications :\n\/ On cherche la plus grande valeur de v\n\n |\/v\n8\n\n\/ ce qui permet de cr\u00e9er la liste \n\n !|\/v\n0 1 2 3 4 5 6 7\n\n\/ Ensuite, on compare (&gt;) chaque valeur de v avec cette liste\n\n &gt;\\:&#091;v;!|\/v]\n(1 1 0 0 0 0 0 0\n 1 1 1 1 1 1 1 0\n 1 0 0 0 0 0 0 0\n 1 1 1 1 1 1 1 1\n 1 1 0 0 0 0 0 0)\n\n\/ et finalement on remplace les 0 par des \".\" et les 1 par des \"0\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">combien sont plus grands que moi (vid\u00e9o n\u00b03 sur APL)<\/h3>\n\n\n\n<p>A partir d&rsquo;une liste de nombres, dire pour chacun combien sont plus grands qu&rsquo;eux. Par exemple avec <strong>1&nbsp;30&nbsp;4&nbsp;16&nbsp;5&nbsp;1&nbsp;8<\/strong>, il y a 5 nombres plus grands que <strong>1<\/strong>, 0 plus grands que <strong>30<\/strong>, 4 plus grands que <strong>4<\/strong> etc. On doit donc obtenir 5&nbsp;0&nbsp;4&nbsp;1&nbsp;3&nbsp;5&nbsp;2.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> v:1 30 4 16 5 1 8\n1 30 4 16 5 1 8\n\n taille:{+\/'&lt;\\:&#091;x;x]}\n\n taille v\n5 0 4 1 3 5 2\n\n\/ Explications\n\/ On compare chaque \u00e9l\u00e9ment de v avec chaque \u00e9l\u00e9ment de v\n\n &lt;\\:&#091;v;v]\n(0 1 1 1 1 0 1\n 0 0 0 0 0 0 0\n 0 1 0 1 1 0 1\n 0 1 0 0 0 0 0\n 0 1 0 1 0 0 1\n 0 1 1 1 1 0 1\n 0 1 0 1 0 0 0)\n\n\/ Et on fait la r\u00e9duction par la somme (+\/) pour chaque (') ligne<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ann\u00e9es bissextiles (vid\u00e9o n\u00b03 sur APL)<\/h3>\n\n\n\n<p>Les explications de la formule <a href=\"https:\/\/youtu.be\/csx2Z-GEGPw?t=1099\" target=\"_blank\" rel=\"noreferrer noopener\">sont dans la vid\u00e9o<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> annees:1900 2020 2024 1901 2023    \/ Ann\u00e9es \u00e0 tester\n\n biss:(=\/~400 100 4 !\\:)#\n\n biss annees\n2020 2024\n\n\/ Explications\n\/ Calcul des restes des divisions par 400, 100 et 4\n\n 400 100 4 !\\:annees\n(300 20 24 301 23\n 0 20 24 1 23\n 0 0 0 1 3)\n\n\/ On cherche o\u00f9 sont les \"0\"\n\n ~400 100 4 !\\:annees\n(0 0 0 0 0\n 1 0 0 0 0\n 1 1 1 0 0)\n\n\/ R\u00e9duction par colonne en testant si \u00e9galit\u00e9 (=\/) \n\n =\/~400 100 4 !\\:annees\n0 1 1 0 0\n\n\/ et finalement on garde (#) les ann\u00e9es o\u00f9 il y a \"1\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tableau r\u00e9sum\u00e9<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>+\/.:&rsquo;$ N<\/td><td>Somme des chiffres de l&rsquo;entier N<\/td><\/tr><tr><td>{1+1%x}\/1<\/td><td>Convergence vers le nombre d&rsquo;or<\/td><\/tr><tr><td>{x&lt;N}_ V<\/td><td>Supprime du vecteur V les \u00e9l\u00e9ments &lt; \u00e0 N<\/td><\/tr><tr><td>(N!)_ V<\/td><td>Garde du vecteur V uniquement les multiples de N<\/td><\/tr><tr><td>~|\/^\u00a0\u00bbactg\u00a0\u00bb?_ S<\/td><td>Teste si la chaine S est un brin d&rsquo;ADN<\/td><\/tr><tr><td>*:'\u00a0\u00bb \u00ab\u00a0\\ S<\/td><td>Initiales des mots s\u00e9par\u00e9s par espace dans une chaine S<\/td><\/tr><tr><td>{*x[&gt;x]} S<\/td><td>Lettre la plus \u00e9loign\u00e9e dans l&rsquo;alphabet d&rsquo;une chaine S<\/td><\/tr><tr><td>&amp;\/&lt;[V;N]<\/td><td>Tous les \u00e9l\u00e9ments de V sont-ils &lt; \u00e0 N ?<\/td><\/tr><tr><td>*\\:[n;n:1+!N]<\/td><td>Table de multiplication des entiers de 1 \u00e0 N par eux-m\u00eames<\/td><\/tr><tr><td>=\\:[S1;S2]<\/td><td>Comparaisons de toutes les lettres de S1 avec celles de S2<\/td><\/tr><tr><td>{+\/'&lt;\\:[x;x]} V<\/td><td>Pour chaque \u00e9l\u00e9ment de V, compte combien sont plus grands<\/td><\/tr><tr><td>(=\/~400 100 4 !\\:)# V<\/td><td>Filtre les ann\u00e9es bissextiles qui sont dans V<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai une passion pour les calculatrices et les langages minimalistes (\u00e9crire peu, faire beaucoup). C&rsquo;est le cas du langage RPL sur les calculateurs HP, du langage APL, des machines n&rsquo;ayant que quelques octets (Ti 57 = 50 pas de programme), &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/ok-mobile\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4913,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-906","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/users\/4913"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/comments?post=906"}],"version-history":[{"count":69,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/906\/revisions"}],"predecessor-version":[{"id":969,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/906\/revisions\/969"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}