{"id":186,"date":"2022-06-03T09:07:44","date_gmt":"2022-06-03T08:07:44","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=186"},"modified":"2022-06-19T08:01:49","modified_gmt":"2022-06-19T07:01:49","slug":"kata2","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/03\/kata2\/","title":{"rendered":"Deuxi\u00e8me exercice Python \/ JavaScript \/ APL"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"829\" height=\"596\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-1.png\" alt=\"\" class=\"wp-image-187\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-1.png 829w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-1-300x216.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-1-417x300.png 417w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/a><\/figure>\n\n\n\n<p><u>R\u00e9sum\u00e9 en fran\u00e7ais<\/u> : 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&rsquo;est le chiffre 2 qui est entre 1 et 3, son rang dans 2, 3, 1 est 0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Partons d&rsquo;un tri<\/h2>\n\n\n\n<p>Une premi\u00e8re id\u00e9e est de <em>trier les 3 \u00e9l\u00e9ments<\/em> (par ordre croissant ou d\u00e9croissant, peu importe), de chercher quelle valeur est au milieu et enfin de r\u00e9cup\u00e9rer le rang de cette valeur dans le tableau initial. Par exemple avec 2, 3 et 1, le tri donne 1, 2, 3 ce qui permet de r\u00e9cup\u00e9rer la valeur centrale \u00ab\u00a02\u00a0\u00bb et donc son rang 0 dans le tableau initial.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Python<\/td><td>JavaScript<\/td><td>APL<\/td><\/tr><tr><td>sorted et sort<\/td><td>sort<\/td><td>\u234b<\/td><\/tr><\/tbody><\/table><figcaption>Comment trier en&#8230;<\/figcaption><\/figure>\n\n\n\n<p>En Python, la fonction <strong>sorted<\/strong> tri par d\u00e9faut un tableau num\u00e9rique par ordre croissant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; sorted(&#091;21, 3, 1])\n&#091;1, 3, 21]<\/code><\/pre>\n\n\n\n<p>On peut \u00e9galement utiliser la m\u00e9thode <strong>sort<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; a = &#091;21, 3, 1]\n&gt;&gt; a.sort()\n&gt;&gt; a\n&#091;1, 3, 21]<\/code><\/pre>\n\n\n\n<p>En JavaScript, la m\u00e9thode <strong>sort<\/strong> fait un tri <strong>alphab\u00e9tique<\/strong>, si bien que :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; &#091;21, 3, 1].sort()\n&#091;1, 21, 3]<\/code><\/pre>\n\n\n\n<p>En effet, dans un dictionnaire, le \u00ab\u00a0mot\u00a0\u00bb <strong>21<\/strong> est avant le \u00ab\u00a0mot\u00a0\u00bb <strong>3<\/strong>&#8230; C&rsquo;est pourquoi on utilise tr\u00e8s souvent une fonction de comparaison. Voici celle pour obtenir un tri croissant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; &#091;21, 3, 1].sort((a, b) =&gt; a - b)\n&#091;1, 3, 21]<\/code><\/pre>\n\n\n\n<p>Lorsque la diff\u00e9rence <strong>a &#8211; b<\/strong> est n\u00e9gative, <strong>a<\/strong> sera plac\u00e9 avant <strong>b<\/strong>, si la diff\u00e9rence est positive <strong>a<\/strong> sera plac\u00e9 apr\u00e8s <strong>b<\/strong> sinon les 2 \u00e9l\u00e9ments restent inchang\u00e9s.<\/p>\n\n\n\n<p>En APL, autre vision du tri ! <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u234b 21 3 1\n3 2 1<\/code><\/pre>\n\n\n\n<p>La r\u00e9ponse <strong>3 2 1<\/strong> signifie que l&rsquo;\u00e9l\u00e9ment qui doit \u00eatre en <u>premier<\/u> est \u00e0 la <strong>3e<\/strong> position (c&rsquo;est le 1 du vecteur initial) ensuite le <u>second<\/u> est \u00e0 la <strong>2e<\/strong> position (le 3 du vecteur initial) et enfin le <u>dernier<\/u> \u00e9l\u00e9ment est \u00e0 la <strong>1ere<\/strong> position (le 21).<\/p>\n\n\n\n<p>Remarquez que l&rsquo;on a la r\u00e9ponse \u00e0 l&rsquo;exercice, le 2e \u00e9l\u00e9ment de \u234b est la position recherch\u00e9e. On visualise le 0 en 2e position :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 0          \u235d On impose que l'origine des indices soit 0\n      \u234b 2 3 1\n2 0 1<\/code><\/pre>\n\n\n\n<p>Voici des versions Python \/ JavaScript et APL en utilisant les tris :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def milieu(triplet):\n    return triplet.index(sorted(triplet)&#091;1])\n\n&gt;&gt; milieu(&#091;2, 3, 1])\n0\n&gt;&gt; milieu(&#091;5, 10, 14])\n1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Javascript<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>milieu = triplet =&gt; triplet.indexOf(&#091;...triplet].sort((a, b) =&gt; a - b)&#091;1])\n\n&gt;&gt; milieu(&#091;2, 3, 1])\n0\n&gt;&gt; milieu(&#091;5, 10, 14])\n1<\/code><\/pre>\n\n\n\n<p><strong>[&#8230;triplet]<\/strong> permet de faire une copie du tableau initial.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">APL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 0\n      milieu \u2190 {(\u234b\u2375)&#091;1]}\n\n      milieu 2 3 1\n0\n      milieu 5 10 14\n1<\/code><\/pre>\n\n\n\n<p>Autre \u00e9criture possible, le symbole \u2283 (<strong>pick<\/strong>) utilis\u00e9 seul (monadique) permet de r\u00e9cup\u00e9rer le 1er \u00e9l\u00e9ment d&rsquo;un vecteur (ou matrice) et sous sa forme dyadique le n-i\u00e8me terme :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2283 'bonjour'          \u235d Ecriture monadique = 1er \u00e9l\u00e9ment\nb\n      3 \u2283 'bonjour'        \u235d Ecriture dyadique\nn\n      \u2283 4 6 8              \u235d 1er \u00e9l\u00e9ment\n4\n      3 \u2283 4 6 8            \u235d 3e \u00e9l\u00e9ment\n8<\/code><\/pre>\n\n\n\n<p>Ce qui permet d&rsquo;obtenir cette version :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 0\n      milieu \u2190 2 \u2283 \u234b\n\n      milieu 2 3 1\n0<\/code><\/pre>\n\n\n\n<p>Si certain.e.s parmi vous aiment les choses concises, APL ne devrait pas vous d\u00e9plaire de ce point de vue !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Et si on cherchait un invariant ?<\/h2>\n\n\n\n<p>Remarquons que si l&rsquo;on trouve les <strong>positions<\/strong> de la plus grande valeur (<strong>max<\/strong>) et de la plus petite valeur (<strong>min<\/strong>) du triplet, la position <strong>restante<\/strong> sera celle que l&rsquo;on cherche.<\/p>\n\n\n\n<p>Mais l&rsquo;ensemble des positions sera toujours { 0, 1, 2 }. Par exemple si le max est en 2e et le min en 1er, alors le milieu est en position 0. L&rsquo;invariant int\u00e9ressant ici est la somme des positions qui vaut toujours 0+1+2=3. Le rang que l&rsquo;on cherche est donc :<br><strong>rang_cherch\u00e9 =<\/strong> <strong>3 &#8211; rang(max) &#8211; rang(min)<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def milieu(triplet):\n    return 3 - triplet.index(max(triplet)) \\\n             - triplet.index(min(triplet))<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">javascript<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>milieu = triplet =&gt; 3 - triplet.indexOf(Math.max(...triplet))\n                      - triplet.indexOf(Math.min(...triplet))<\/code><\/pre>\n\n\n\n<p>Observez la diff\u00e9rence en JavaScript entre :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; Math.max(2,5,8,1,10,3)\n10\n&gt;&gt; Math.max(&#091;2,5,8,1,10,3])\nNaN\n&gt;&gt; Math.max(...&#091;2,5,8,1,10,3])\n10<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">APL<\/h3>\n\n\n\n<p>En APL, on trouve les sommes, max, min des \u00e9l\u00e9ments d&rsquo;un vecteur (ou matrice) en utilisant une r\u00e9duction :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      +\/ 2 3 1        \u235d Somme des termes\n6\n      \u2308\/ 2 3 1        \u235d maximum\n3\n      \u230a\/ 2 3 1        \u235d minimum\n1<\/code><\/pre>\n\n\n\n<p>Et pour trouver le rang d&rsquo;un \u00e9l\u00e9ment dans un vecteur, on utilise \u2373 (iota) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 1\n      5 7 3 1 \u2373 7     \u235d Position de 7 dans le vecteur 5 7 3 1 ?  \n2<\/code><\/pre>\n\n\n\n<p>Toujours avec le principe de l&rsquo;invariant, <strong>somme &#8211; max &#8211; min<\/strong> donne le nombre qui est au milieu, celui dont on doit chercher le rang. On obtient finalement ce <a href=\"https:\/\/tio.run\/##SyzI0U2pTMzJT9dNzkksLs5M\/g8Ej\/qmevorPGqboGDAlZuZk5laCuY86lqk8Kh3s4K2voKuwqOeDn0FbSDVpQ9TY6RgrGAI45gqGBooGJoAAA\" target=\"_blank\" rel=\"noreferrer noopener\">programme que vous pouvez tester directement ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2395IO \u2190 0\nmilieu \u2190 \u22a2 \u2373 +\/ - \u2308\/ + \u230a\/\n\n      milieu 2 3 1\n0\n      milieu 5 10 14\n1<\/code><\/pre>\n\n\n\n<p>Le \u22a2 permet de r\u00e9cup\u00e9rer le param\u00e8tre qui est \u00e0 droite (\u00e9quivalent de {\u2375}) et je rappelle qu&rsquo;APL fait les calculs de la droite vers la gauche, donc le minimum \u230a\/ puis max + min \u2308\/+\u230a\/ la soustraction va correspondre \u00e0 &#8211; max &#8211; min et on ajoute la somme.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9sum\u00e9 en fran\u00e7ais : 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&rsquo;est le chiffre 2 qui est entre &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/03\/kata2\/\">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":[6],"tags":[],"class_list":["post-186","post","type-post","status-publish","format-standard","hentry","category-twitter"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/186","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=186"}],"version-history":[{"count":15,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/186\/revisions"}],"predecessor-version":[{"id":651,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/186\/revisions\/651"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}