{"id":869,"date":"2022-09-04T14:35:49","date_gmt":"2022-09-04T13:35:49","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=869"},"modified":"2022-09-09T10:32:33","modified_gmt":"2022-09-09T09:32:33","slug":"shakti","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/09\/04\/shakti\/","title":{"rendered":"D\u00e9couvrons ensemble le langage K (Shakti)"},"content":{"rendered":"\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/Yann_Le_Du\" target=\"_blank\">Yann Le Du<\/a> m&rsquo;a fait d\u00e9couvrir via Twitter l&rsquo;existence du langage <strong>K<\/strong> (premi\u00e8re version en 1992 !), dont les caract\u00e9ristiques sont proches de <strong>l&rsquo;APL<\/strong>.<\/p>\n\n\n\n<p>Cette page me servira de <strong>m\u00e9mo<\/strong> pour noter mes <strong>d\u00e9couvertes<\/strong> et <strong>compr\u00e9hensions<\/strong> de ce langage (appel\u00e9 \u00e9galement <strong>Shakti<\/strong>). Ce n&rsquo;est donc pas un cours mais juste des <span style=\"text-decoration: underline\">notes personnelles<\/span> que je partage librement avec vous.<\/p>\n\n\n\n<p>\u27a1 <a rel=\"noreferrer noopener\" href=\"https:\/\/kparc.com\/k\/\" target=\"_blank\">Lien pour tester les codes \u00e9crits en K<\/a><\/p>\n\n\n\n<p>\u27a1 <span style=\"text-decoration: underline\">R\u00e9f\u00e9rences que je vais utiliser<\/span> : <a rel=\"noreferrer noopener\" href=\"https:\/\/k.miraheze.org\/wiki\/Primitives\" target=\"_blank\">En ligne<\/a> | <a rel=\"noreferrer noopener\" href=\"https:\/\/estradajke.github.io\/k9-simples\/kbu.pdf\" target=\"_blank\">PDF<\/a> <\/p>\n\n\n\n<p>\ud83d\udcf2 J&rsquo;ai \u00e9galement <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/ok-mobile\/\" target=\"_blank\" rel=\"noreferrer noopener\">une page sp\u00e9ciale<\/a> consacr\u00e9e \u00e0 <strong>oK Mobile<\/strong>, une autre version de <strong>K<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quelques challenges Twitter<\/h2>\n\n\n\n<p>J&rsquo;avais propos\u00e9 sur Twitter (menu Challenges Twitter en haut de ce blog) de r\u00e9soudre quelques petits exercices en <strong>Python<\/strong>, <strong>JavaScript<\/strong> ou <strong>APL<\/strong>. C&rsquo;est \u00e0 cette occasion que Yann Le Du (<strong>YLD<\/strong>) a donn\u00e9 ses propres solutions en <strong>K<\/strong>. <span style=\"text-decoration: underline\">Essayons de d\u00e9crypter ses r\u00e9ponses<\/span> !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Isogrammes (Challenge n\u00b03)<\/h3>\n\n\n\n<p>Un <strong>isogram<\/strong> (En fran\u00e7ais on parle d&rsquo;heterogramme) est un mot qui ne contient aucune lettre r\u00e9p\u00e9t\u00e9e. Ecrire une fonction qui renvoie vrai ou faux suivant que le mot est un heterogramme, sans tenir compte de la casse (majuscule\/minuscule)<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/04\/kata3\/\" target=\"_blank\">Voir les <\/a><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/04\/kata3\/\" target=\"_blank\" rel=\"noreferrer noopener\">s<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/04\/kata3\/\" target=\"_blank\">olutions en Python, JS et APL<\/a><\/p>\n\n\n\n<p><span style=\"text-decoration: underline\">Solution en K propos\u00e9 par YLD<\/span> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>isogram:=\/#'?\\:_<\/code><\/pre>\n\n\n\n<p>Le verbe <strong>_<\/strong> permet dans sa version monadique de calculer la <strong>partie enti\u00e8re<\/strong> d&rsquo;un nombre ou de transformer une chaine en <strong>minuscules<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> _ 1.5 3.99 -2 -2.1\n1 3 -2 -3\n\n _ \"BoNJouR\"\n\"bonjour\"<\/code><\/pre>\n\n\n\n<p>L&rsquo;op\u00e9rateur <strong>?<\/strong>, dans sa forme monadique, correspond \u00e0 l&rsquo;<strong>union<\/strong> (\u00e9l\u00e9ments pris de fa\u00e7on unique)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> ? \"abracadabra\"\n\"abcdr\"<\/code><\/pre>\n\n\n\n<p>Sous sa forme dyadique, il permet de g\u00e9n\u00e9rer des nombres al\u00e9atoires, par exemple tirer 10 nombres al\u00e9atoires entre 0 et 2 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 10 ? 3\n2 1 2 2 2 0 1 1 2 0<\/code><\/pre>\n\n\n\n<p> L&rsquo;adverbe <strong>\\:<\/strong> s&rsquo;appelle \u00ab\u00a0Converge scan\u00a0\u00bb et <strong>\/:<\/strong> \u00ab\u00a0Converge over\u00a0\u00bb. Les 2 vont r\u00e9p\u00e9ter les calculs jusqu&rsquo;\u00e0 arriver \u00e0 une convergence (dans le sens : le terme suivant est \u00e9gal au terme pr\u00e9c\u00e9dent). On peut \u00e9galement imposer le nombre d&rsquo;it\u00e9rations :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> {1+1%x}\/:1       \/ u(n+1) = 1 + 1 \/ u(n) en partant de u(0) = 1\n1.618034          \/ Affichage du r\u00e9sultat final (Nombre d'or)\n\n (5;{1+1%x})\/:1   \/ 5 it\u00e9rations uniquement\n1.625\n\n {1+1%x}\\:1       \/ Affichage des r\u00e9sultats interm\u00e9diaires\n1       \n2.      \n1.5     \n1.666667\n1.6     \n1.625             \/ On retrouve la 5e it\u00e9ration\n1.615385\n1.619048\n1.617647\n1.618182\n...\n1.618034\n\n ?\\:\"abracadabra\"\nabracadabra\nabcdr<\/code><\/pre>\n\n\n\n<p>Par contre <strong>\/<\/strong> (reduce) et scan (<strong>\\<\/strong>) sont similaires \u00e0 l&rsquo;APL :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> +\/ 1 2 3 4       \/ R\u00e9duction par la somme\n10\n\n =\/ 2 2 1      \/ 2 = 2 est Vrai puis Vrai = 1 est Vrai\n1\n\n =\/ 2 3 0      \/ 2 = 3 est Faux puis Faux = 0 est Vrai\n1\n\n +\\ 1 2 3 4       \/ Scan par la somme : 1, 1+2, 1+2+3, 1+2+3+4\n1 3 6 10<\/code><\/pre>\n\n\n\n<p>L&rsquo;adverbe <strong>&lsquo;<\/strong> signifie \u00ab\u00a0pour chaque\u00a0\u00bb, par exemple compter le nombre de lettres de chaque mot :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> #' (\"bonjour\";\"tout\";\"le\";\"monde\")\n7 4 2 5<\/code><\/pre>\n\n\n\n<p>Signification du code de YLD sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> =\/#'?\\:_ \"moOse\"    \/ moOse est-il un isogram ?\n0                    \/ R\u00e9ponse = non\n\nEtapes :\n\n _ \"moOse\"         \/ Mettre le mot en minuscules\n\"moose\"\n\n ?\\:_ \"moOse\"     \/ R\u00e9p\u00e9ter \"Union\" jusqu'\u00e0 valeur stable\nmoose             \/ Il y aura donc le mot du d\u00e9part\nemos              \/ et le mot sans doublon\n\n #'?\\:_ \"moOse\"   \/ Chercher les tailles des 2 mots\n5 4\n\n=\/#'?\\:_ \"moOse\"  \/ Ces tailles sont-elles identiques ?\n0                 \/ si oui c'est un isogram<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Gimme (Challenge n\u00b02)<\/h3>\n\n\n\n<p><span style=\"text-decoration: underline\">R\u00e9sum\u00e9 en fran\u00e7ais<\/span>&nbsp;: On vous donne 3 nombres diff\u00e9rents dans un ordre quelconque. En sortie, donnez le rang du nombre qui est entre les 2 autres. Par exemple avec 2, 3, 1 c\u2019est le chiffre 2 qui est entre 1 et 3, son rang dans 2, 3, 1 est 0.<\/p>\n\n\n\n<p>Solution propos\u00e9e par YLD :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> gimme:*1_&lt;\n\n gimme 5 10 14\n1<\/code><\/pre>\n\n\n\n<p>L&rsquo;op\u00e9rateur de <strong>tri<\/strong> <strong>croissant<\/strong> <strong>&lt;<\/strong> fonctionne comme en <strong>APL<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt; 14 5 10\n1 2 0 \n\n\/ Le plus petit nb est \u00e0 la position 1, c'est le 5\n\/ Le second nb est \u00e0 la position 2, c'est le 10\n\/ Le plus grand est \u00e0 la position 0, c'est le 14<\/code><\/pre>\n\n\n\n<p>En version dyadique, _ permet d&rsquo;enlever des \u00e9l\u00e9ments au d\u00e9but ou \u00e0 la fin d&rsquo;un tableau :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 2_ 4 5 6 7 8        \/ On enl\u00e8ve les 2 premiers \u00e9l\u00e9ments\n6 7 8\n\n -2_ 4 5 6 7 8       \/ On enl\u00e8ve les 2 derniers \u00e9l\u00e9ments\n4 5 6<\/code><\/pre>\n\n\n\n<p>En version monadique, <strong>*<\/strong> r\u00e9cup\u00e8re le premier \u00e9l\u00e9ment d&rsquo;un tableau :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> * 4 5 6 7\n4<\/code><\/pre>\n\n\n\n<p>Signification du code de YLD sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*1_&lt; 8 5 12\n0\n\nEtapes :\n &lt; 8 5 12       \/ Tri du tableau\n1 0 2           \/ L'\u00e9l\u00e9ment du milieu sera \u00e0 la position 0\n\n 1_&lt; 8 5 12     \/ Pour r\u00e9cup\u00e9rer ce nb on supprime le 1er \u00e9l\u00e9ment\n0 2\n\n *1_&lt; 8 5 12    \/ Et on prend le premier \u00e9l\u00e9ment du tableau\n0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Positions des mots (Challenge n\u00b06)<\/h3>\n\n\n\n<p><span style=\"text-decoration: underline\">R\u00e9sum\u00e9 en fran\u00e7ais<\/span>&nbsp;: Vous devez cr\u00e9er un programme qui \u00e0 partir d\u2019une phrase, met tous les mots distincts dans une liste et retourne une chaine donnant les positions des mots de la phrase initiale dans cette liste. On ne tiendra pas compte de la casse.<\/p>\n\n\n\n<p>Solution propos\u00e9e par YLD :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>,\/$'s?s:\" \"\\_\n\ncompress:{,\/$'s?s:\" \"\\_x}<\/code><\/pre>\n\n\n\n<p>En version dyadique, <strong>\\<\/strong> permet de faire un <strong>scan<\/strong>, \u00e9galement de <strong>s\u00e9parer<\/strong> une chaine suivant un caract\u00e8re (<strong>split<\/strong>) mais aussi d&rsquo;\u00e9crire un nombre dans une <strong>base<\/strong> quelconque !<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 2 +\\ 4 5 6\n6 11 17        \/ 2+4, 2+4+5, 2+4+5+6\n\n \",\"\\ \"bonjour,tout,le,monde\"        \/ split avec ','\nbonjour\ntout   \nle     \nmonde  \n\n 10\\ 3574      \/ D\u00e9composition de 3574 en base 10\n3 5 7 4\n\n 2\\ 35         \/ D\u00e9composition de 35 en base 2\n1 0 0 0 1 1<\/code><\/pre>\n\n\n\n<p>Nous avons vu <strong>?<\/strong> en version monadique (Union ou nombres al\u00e9atoires), en version dyadique <strong>x?y<\/strong> permet de trouver l&rsquo;index de <strong>y<\/strong> dans le tableau <strong>x<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 5 7 8 6 ? 7 5  \/ Positions de 7 et de 5 dans le tableau 5 7 8 6\n1 0             \/ 7 est \u00e0 la position 1 et 5 \u00e0 la position 0  \n\n s:\"abcabc\"     \/ affectation de la chaine \"abcabc\" dans s\n s?s\n0 1 2 0 1 2 <\/code><\/pre>\n\n\n\n<p><strong>$<\/strong> transforme, en version monadique, un <strong>nombre<\/strong> en <strong>chaine<\/strong>. L&rsquo;op\u00e9ration <strong>inverse<\/strong> s&rsquo;effectue via l&rsquo;op\u00e9rateur <strong>.<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> $ 123      \/ Transformation d'un nombre en chaine\n\"123\"\n\n .\"123\"     \/ Transformation d'une chaine en nombre\n123\n\n .\"2+5\"     \/ Evaluation\n7<\/code><\/pre>\n\n\n\n<p>Signification du code de YLD sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> ,\/$'s?s:\" \"\\_ \"un deuX un Trois UN deux\"\n\"010301\"\n\nEtapes :\n\n _ \"un deuX un Trois UN deux\"        \/ En minuscules\n\"un deux un trois un deux\"      \n\n \" \"\\_ \"un deuX un Trois UN deux\"   \/ Split avec \" \"\nun   \ndeux \nun   \ntrois\nun   \ndeux \n\n s:\" \"\\_ \"un deuX un Trois UN deux\"    \/ Affectation dans s\n\n s?s:\" \"\\_ \"un deuX un Trois UN deux\"  \/ Positions des \u00e9l\u00e9ments\n0 1 0 3 0 1\n\n $'s?s:\" \"\\_ \"un deuX un Trois UN deux\"  \/ Conversion en chaine\n0\n1\n0\n3  \n0\n1\n\n ,\/ $'s?s:\" \"\\_ \"un deuX un Trois UN deux\"  \/ Concat\u00e9nation\n\"010301\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Paires de gants (Challenge n\u00b010)<\/h3>\n\n\n\n<p><span style=\"text-decoration: underline\">R\u00e9sum\u00e9 en fran\u00e7ais<\/span>&nbsp;: On vous donne une liste contenant des&nbsp;<strong>couleurs<\/strong>&nbsp;de&nbsp;<strong>moufles<\/strong>&nbsp;(donc pas de main gauche ou droite \u00e0 distinguer). On vous demande le&nbsp;<strong>nombre de paires<\/strong>&nbsp;que vous pouvez&nbsp;<strong>constituer<\/strong>, c\u2019est-\u00e0-dire avoir&nbsp;<strong>2 moufles de la m\u00eame couleur<\/strong>.<\/p>\n\n\n\n<p>Solution propos\u00e9e par YLD :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> +\/\\:(0=)_div#'=<\/code><\/pre>\n\n\n\n<p>Pour grouper les indices d&rsquo;un tableau \u00e0 partir des valeurs, on utilise <strong>=<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> = 8 5 8 8 5 3      \/ On groupe les indices \u00e0 partir des valeurs\n3|,5   \n5|1 4  \n8|0 2 3\n\n = \"abracadabra\"\na|0 3 5 7 10\nb|1 8       \nc|,4        \nd|,6        \nr|2 9  <\/code><\/pre>\n\n\n\n<p>Pour obtenir les effectifs de chaque valeur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> #'= 8 5 8 8 5 3\n3|1\n5|2\n8|3\n\n #'= \"abracadabra\"\na|5\nb|2\nc|1\nd|1\nr|2<\/code><\/pre>\n\n\n\n<p>La fonction math\u00e9matique <strong>div<\/strong> permet d&rsquo;effectuer une division enti\u00e8re :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 3 div 17     \/ division enti\u00e8re de 17 par 3\n5\n\n div 17       \/ division enti\u00e8re par 2\n8<\/code><\/pre>\n\n\n\n<p>Pour filtrer un tableau, on utilise <strong>#<\/strong> ou <strong>_<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> notes: 5 12 10 6 19 3     \/ Notes d'\u00e9l\u00e8ves\n\n (10&gt;)_ notes         \/ on supprime les notes inf\u00e9rieures \u00e0 10\n12 10 19<\/code><\/pre>\n\n\n\n<p>Tableau de symboles :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> s:`red`blue`green\n \n s@1     \/ \u00e9l\u00e9ment \u00e0 la position 1 (ou encore s&#091;1])\n`blue<\/code><\/pre>\n\n\n\n<p>Signification du code de YLD sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> +\/\\:(0=)_div#'=`red`red`blue`red`blue`green\n&#091;blue:1;red:1]\n2 \n\nEtapes :\n\n =`red`red`blue`red`blue`green     \/ R\u00e9partition des indices\nblue |2 4  \ngreen|,5   \nred  |0 1 3\n\n #'=`red`red`blue`red`blue`green  \/ Effectifs\nblue |2\ngreen|1\nred  |3\n\n div#'=`red`red`blue`red`blue`green  \/ Division par 2\nblue |1\ngreen|0\nred  |1\n\n\/ On supprime les restes qui sont nuls \n\/ \"green\" ne permet pas de faire au moins une paire\n\n (0=)_div#'=`red`red`blue`red`blue`green \nblue|1\nred |1\n\n\/ On utilise ou non \\: pour avoir le d\u00e9tail puis r\u00e9duction par la somme\n\n +\/(0=)_div#'=`red`red`blue`red`blue`green\n2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explosion (challenge n\u00b012)<\/h3>\n\n\n\n<p>R\u00e9sum\u00e9 en fran\u00e7ais&nbsp;: On vous donne une chaine de caract\u00e8res compos\u00e9e de \u201cchiffres\u201d (\u20180\u2019 \u00e0 \u20189\u2019). Vous devez \u00e9crire une fonction qui renvoie une chaine o\u00f9 chaque chiffre est r\u00e9p\u00e9t\u00e9 le nombre de fois correspondant \u00e0 sa valeur. Par exemple avec la chaine \u201c312\u201d, on doit r\u00e9p\u00e9ter 3 fois le \u201c3\u201d, 1 fois le \u201c1\u201d et 2 fois le \u201c2\u201d, ce qui donne la chaine \u201c333122\u201d.<\/p>\n\n\n\n<p>Solution propos\u00e9e par YLD :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s@&amp;10\\. s:<\/code><\/pre>\n\n\n\n<p>Nous reconnaissons l&rsquo;affectation <strong>s:<\/strong>, la conversion <strong>.<\/strong> d&rsquo;une chaine en num\u00e9rique, la d\u00e9composition d&rsquo;un nombre en base 10. Il reste \u00e0 comprendre <strong>&amp;<\/strong> et <strong>@<\/strong>.<\/p>\n\n\n\n<p><strong>&amp;<\/strong> (where) permet de <strong>r\u00e9pliquer<\/strong> les indices d&rsquo;un tableau <strong>autant de fois<\/strong> que les <strong>valeurs indiqu\u00e9es<\/strong> dans ce tableau. Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> &amp; 4 3 0 2           \/ R\u00e9p\u00e9ter 4 fois l'indice 0, 3 fois l'indice 1...\n0 0 0 0 1 1 1 3 3\n\n notes: 5 10 15 9 13 8    \/ Notes d'\u00e9l\u00e8ves\n\n notes&lt;10        \/ Positions des \u00e9l\u00e8ves n'ayant pas la moyenne\n1 0 0 1 0 1\n\n &amp;notes&lt;10       \/ Indices correspondants\n0 3 5            \/ Les \u00e9l\u00e8ves n\u00b00, 3 et 5 n'ont pas la moyenne\n\n &amp; 1 0 0 1 1     \/ Plus g\u00e9n\u00e9ralement, avec un tableau binaire\n0 3 4            \/ on r\u00e9cup\u00e8re les positions des \"1\"<\/code><\/pre>\n\n\n\n<p><strong>x@y<\/strong> donne la valeur qui est \u00e0 l&rsquo;indice <strong>y<\/strong> du tableau <strong>x<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> \"sujet\"@ 2 1 0 4 3     \/ Lettres aux positions 2,1,0,4 et 3\n\"juste\"<\/code><\/pre>\n\n\n\n<p>Signification du code de YLD sur un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> s@&amp;10\\. s:\"102269\"\n\"12222666666999999999\"\n\n s:\"102269\"         \/ M\u00e9morisation de la chaine dans \"s\"\n \n . s:\"102269\"       \/ Conversion en nombre\n102269\n\n 10\\. s:\"102269\"    \/ D\u00e9composition en base 10\n1 0 2 2 6 9 \n\n &amp;10\\. s:\"102269\"   \/ On r\u00e9plique les indices suivant les valeurs\n0 2 2 3 3 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5\n\n\/ Pour finir on r\u00e9cup\u00e8re \u00e0 partir de \"s\" le caract\u00e8re \u00e0 la position 0\n\/ puis 2 fois celui \u00e0 la position 2, 2 fois celui \u00e0 la position 3\n\/ 6 fois celui \u00e0 la position 4 et 9 fois celui \u00e0 la position 5\n\/ On obtient bien 1,22,22,666666,999999999<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Misez p&rsquo;tit Optimisez en version K<\/h2>\n\n\n\n<p>Sur le <a rel=\"noreferrer noopener\" href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=64&amp;t=45274\" target=\"_blank\">forum de Silicium<\/a>, j&rsquo;avais propos\u00e9 diff\u00e9rentes solutions de challenges (\u00e0 l&rsquo;origine pour des calculatrices de poche programmables) en version APL. Je vais en reprendre quelques uns et voir ce que cela peut donner en K.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MPO 9 : Somme des chiffres<\/h3>\n\n\n\n<p>Calculer la somme des chiffres d&rsquo;un nombre.<br>Par exemple : 352791 doit retourner 27<\/p>\n\n\n\n<p>On a tout ce qu&rsquo;il faut ! <strong>$<\/strong> pour transformer un nombre en chaine, <strong>.<\/strong> pour faire l&rsquo;inverse, la r\u00e9duction <strong>+\/<\/strong> et <strong>&lsquo;<\/strong> qui signifie \u00ab\u00a0pour chaque\u00a0\u00bb :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO9: +\/.'$\n\n MPO9 352791\n27<\/code><\/pre>\n\n\n\n<p>Tout aussi court, on peut utiliser la d\u00e9composition en base 10:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO9: +\/10\\\n\n MPO9 352791\n27<\/code><\/pre>\n\n\n\n<p>Si maintenant on veut continuer le processus jusqu&rsquo;\u00e0 obtenir un chiffre entre 0 et 9, par exemple :<\/p>\n\n\n\n<p>352791 -&gt; 27 -&gt; 9<\/p>\n\n\n\n<p>Il suffit d&rsquo;utiliser <strong>\/:<\/strong> ou <strong>\\:<\/strong> pour cr\u00e9er la boucle :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> (+\/10\\)\\: 352791       \/ Affichage des r\u00e9sultats interm\u00e9diaires\n352791 27 9\n\n (+\/10\\)\/: 352791       \/ Uniquement r\u00e9sultat final\n9<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MPO1 : Evaluation d&rsquo;un polyn\u00f4me<\/h3>\n\n\n\n<p>Il s&rsquo;agit d&rsquo;\u00e9valuer le polyn\u00f4me P(x)=3x^3+4x^2+x+9 en une valeur donn\u00e9e en param\u00e8tre.<\/p>\n\n\n\n<p>Cela revient \u00e0 convertir le tableau 3 4 1 9 en base x, d&rsquo;o\u00f9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> MPO1: {x\/ 3 4 1 9}\n\n MPO1 7\n1241<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ovnis<\/h3>\n\n\n\n<p>J&rsquo;avais <a href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=46&amp;t=47283&amp;p=566312#p566296\" target=\"_blank\" rel=\"noreferrer noopener\">propos\u00e9 ce petit exercice<\/a> pour les <strong>calculatrices HP<\/strong> et <strong>APL<\/strong> :<\/p>\n\n\n\n<p>On vous donne une liste de <strong>hauteurs<\/strong> d&rsquo;immeubles adjacents et on vous demande <strong>combien<\/strong> seront <strong>visibles<\/strong> si vous les <strong>regardez<\/strong> \u00e0 partir de la <strong>gauche<\/strong>. Par exemple, si les hauteurs sont <strong>2 3 5 2 1 6 4<\/strong>, en vert ci-dessous les 4 seuls immeubles qui seront visibles (les autres sont cach\u00e9s par des b\u00e2timents plus hauts)<\/p>\n\n\n\n<p>On supposera dans un premier temps qu&rsquo;il n&rsquo;y a pas de zones vides entre les immeubles, c&rsquo;est-\u00e0-dire que la liste ne contient pas de 0 (immeubles de hauteur nulle).<\/p>\n\n\n\n<p>Dans un second temps, consid\u00e9rez le cas g\u00e9n\u00e9ral.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"851\" height=\"417\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15.png\" alt=\"\" class=\"wp-image-903\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15.png 851w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15-300x147.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15-768x376.png 768w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/09\/image-15-500x245.png 500w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/a><figcaption>L&rsquo;OVNI scannera 4 immeubles<\/figcaption><\/figure>\n\n\n\n<p>Je reprends le corrig\u00e9 que j&rsquo;avais mis sur Silicium mais en version <strong>K<\/strong> :<\/p>\n\n\n\n<p>On va d\u00e9j\u00e0 scanner les immeubles pour r\u00e9cup\u00e9rer les hauteurs maximales atteintes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> |\\ 2 3 5 2 1 6 4    \/ On cherche les max progressivement\n2 3 5 5 5 6 6<\/code><\/pre>\n\n\n\n<p>Il faut maintenant r\u00e9cup\u00e9rer les hauteurs distinctes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> ?|\\ 2 3 5 2 1 6 4\n2 3 5 6<\/code><\/pre>\n\n\n\n<p>Et les compter :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> #?|\\ 2 3 5 2 1 6 4\n4<\/code><\/pre>\n\n\n\n<p>Le programme final&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> scan:#?|\\\n\n scan 2 3 5 2 1 6 4\n4<\/code><\/pre>\n\n\n\n<p>Si la liste commence par un ou plusieurs 0, le calcul sera faux :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> scan 0 2 1\n2<\/code><\/pre>\n\n\n\n<p>Ceci parce que les maximums progressifs sont { 0 2 2 } dont la r\u00e9union comporte 2 termes {0 2}. Il faut donc filtrer la liste des maximums pour enlever les 0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> (0=)_ 0 0 2 3 5 5     \/ Signifie enlever ceux \u00e9gaux \u00e0 0\n2 3 5 5<\/code><\/pre>\n\n\n\n<p>Programme g\u00e9n\u00e9ral :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> scan:#?(0=)_|\\\n\n scan 0 0 2 3 5 2 1 6 4\n4<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Yann Le Du m&rsquo;a fait d\u00e9couvrir via Twitter l&rsquo;existence du langage K (premi\u00e8re version en 1992 !), dont les caract\u00e9ristiques sont proches de l&rsquo;APL. Cette page me servira de m\u00e9mo pour noter mes d\u00e9couvertes et compr\u00e9hensions de ce langage (appel\u00e9 &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/09\/04\/shakti\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4913,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-869","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/post"}],"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=869"}],"version-history":[{"count":32,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/869\/revisions"}],"predecessor-version":[{"id":962,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/869\/revisions\/962"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}