{"id":176,"date":"2022-06-01T19:15:19","date_gmt":"2022-06-01T18:15:19","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=176"},"modified":"2022-06-19T08:05:00","modified_gmt":"2022-06-19T07:05:00","slug":"kata1","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/01\/kata1\/","title":{"rendered":"Petits exercices de programmation (niveau Lyc\u00e9e) en Python, JavaScript ou&#8230; APL"},"content":{"rendered":"\n<p><a href=\"https:\/\/twitter.com\/riko_schraf\/status\/1531983694642257920\" target=\"_blank\" rel=\"noreferrer noopener\">Page Twitter<\/a> o\u00f9 j&rsquo;ai mis quelques <strong>challenges<\/strong> que je vous propose de r\u00e9soudre en Python, Javascript ou APL.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<p><strong>Python<\/strong> est le langage officiel enseign\u00e9 dans les lyc\u00e9es fran\u00e7ais, donc pas le choix \ud83d\ude05<br><a href=\"https:\/\/replit.com\/languages\/python3\" target=\"_blank\" rel=\"noreferrer noopener\">Lien pour taper en Python<\/a><\/p>\n\n\n\n<p><strong>JavaScript<\/strong> est un langage permettant de faire des interactions avec une page web. Indispensable si vous voulez devenir d\u00e9veloppeur web \ud83e\udd13<\/p>\n\n\n\n<p><strong>APL<\/strong> n&rsquo;est rien de tout \u00e7a ! Peu ou pas connu des informaticiens, critiqu\u00e9 pour son aspect \u00e9sot\u00e9rique, il existe et r\u00e9siste depuis plus de 50 ans (60 ans de fa\u00e7on th\u00e9orique) ! \ud83c\udfc6<br>Ce langage d\u00e9veloppe une certaine fa\u00e7on de penser et vous donnera souvent des id\u00e9es que vous pourrez ensuite r\u00e9interpr\u00e9ter en Python ou JavaScript. Son apprentissage n&rsquo;est pas ais\u00e9 mais sa beaut\u00e9 compense tous ses vilains d\u00e9fauts \ud83e\udd70<br><a href=\"https:\/\/tryapl.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Lien pour taper en APL<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/19\/notebooks\/\">Les \u00e9nonc\u00e9s et corrig\u00e9s sont aussi disponibles en version Notebook<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Premier exercice (tir\u00e9 de codewars.com)<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"941\" height=\"442\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image.png\" alt=\"\" class=\"wp-image-177\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image.png 941w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-300x141.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-500x235.png 500w\" sizes=\"auto, (max-width: 941px) 100vw, 941px\" \/><\/a><\/figure>\n\n\n\n<p><u>R\u00e9sum\u00e9 en fran\u00e7ais<\/u> : 2 param\u00e8tres entiers vous sont donn\u00e9s, par exemple 1 et 9, le premier \u00e9tant toujours inf\u00e9rieur au second (mais ils peuvent \u00eatre n\u00e9gatifs). Vous devez trouver combien de nombres sont entre les 2 sachant qu&rsquo;ils ne doivent pas contenir de &lsquo;5&rsquo;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Python &amp; Javascript<\/h3>\n\n\n\n<p><a href=\"https:\/\/tio.run\/##ZY5BCsIwFET3OcXsmtAuDCqC0LMENUnNoj\/h@xvo6aN1oYKrgcfjMWWVe6Z9az5E@EziplSDm4OLr9U@XBcZEBOZs8Itz0XCwhixU4iZUZEIfKHpV@3tJiNFdMcOlGWTHsK6vvk304@wChxkYfpQpQonEv1\/5jDYkzGtPQE\" target=\"_blank\" rel=\"noreferrer noopener\">Testez cette version en ligne ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def dont_give_me_five(debut, fin):\n compteur = 0\n for v in range(debut, fin+1):\n  if '5' not in str(v):\n   compteur += 1\n return compteur<\/code><\/pre>\n\n\n\n<p>Cette version a le m\u00e9rite d&rsquo;\u00eatre simple \u00e0 comprendre. On initialise un <strong>compteur<\/strong> \u00e0 z\u00e9ro et on parcourt la liste compl\u00e8te des nombres entre <strong>debut<\/strong> et <strong>fin<\/strong> (avec un +1 pour inclure la valeur <strong>fin<\/strong>).<br>Pour savoir si 5 est ou n&rsquo;est pas dans le nombre, on transforme le nombre <strong>v<\/strong> en chaine de caract\u00e8res (<strong>str<\/strong>) et on teste si le caract\u00e8re &lsquo;5&rsquo; n&rsquo;est pas dans cette chaine. C&rsquo;est beaucoup plus facile que de le faire avec des formules math\u00e9matiques !<br>Si c&rsquo;est vrai que &lsquo;5&rsquo; n&rsquo;est pas dans la chaine, le compteur augmente de 1.<\/p>\n\n\n\n<p>Son \u00e9quivalent en JavaScript <a href=\"https:\/\/tio.run\/##ZU9BCsIwELz3FWtPCalFQVGofYUPKDVNykqblHTTi\/j2mFTUg3PZYXaGYe7t0s7S4UTb5RyC9kYSWgOdNdT0uKhmVI2Ol3Xq5qkAjYbDI4OIQRFIO06kvIMadtWqauuApRdGbQ1VkV7qlIxMCL7aElAD22BJ9koOTc94iUYOvlMzy485\/xkTPk1CvHucIu\/MV66yZ5ZJa2Y7qHKwPftfcCj2J85DeAE\" target=\"_blank\" rel=\"noreferrer noopener\">que vous pouvez tester ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function dont_give_me_five(debut, fin) {\n    let compteur = 0;\n    for (let i = debut; i &lt;= fin; i++)\n        if (!i.toString().includes(\"5\"))\n            compteur++;\n    return compteur;\n}<\/code><\/pre>\n\n\n\n<p>En JavaScript, le \u00ab\u00a0!\u00a0\u00bb signifie \u00ab\u00a0n\u00e9gation\u00a0\u00bb et <strong>includes<\/strong> \u00ab\u00a0contient\u00a0\u00bb. On peut aussi utiliser une expression r\u00e9guli\u00e8re qui testera (<strong>test<\/strong>) s&rsquo;il y a un 5 et qui au passage convertira le param\u00e8tre (ici le nombre <strong>i<\/strong>) en chaine :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function dont_give_me_five(debut, fin) {\n    let compteur = 0;\n    for (let i = debut; i &lt;= fin; i++)\n        if (!\/5\/.test(i))\n            compteur++;\n    return compteur;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">APL<\/h3>\n\n\n\n<p>Vous pourrez tester les commandes ci-dessous en allant sur le site <a href=\"https:\/\/tryapl.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/tryapl.org\/<\/a><\/p>\n\n\n\n<p>Si vous n&rsquo;avez jamais entendu parler d&rsquo;APL, j&rsquo;ai fait 3 petites vid\u00e9os d&rsquo;introduction \u00e0 son sujet, la premi\u00e8re est ici :<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"D\u00e9couvrez le langage APL : Fonctions de base et exercices corrig\u00e9s\" width=\"584\" height=\"329\" src=\"https:\/\/www.youtube.com\/embed\/Nxq1BUUXobM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>APL permet de g\u00e9n\u00e9rer facilement la liste des nombres de 1 \u00e0 N \u2265 0. Par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u23736       \u235d le symbole \u2373 se lit 'iota'\n1 2 3 4 5 6<\/code><\/pre>\n\n\n\n<p>Pour que la liste d\u00e9marre \u00e0 0 (ce qui est le cas des positions dans les tableaux en Python ou JavaScript), on peut l&rsquo;imposer :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 0\n      \u23736\n0 1 2 3 4 5<\/code><\/pre>\n\n\n\n<p>Si maintenant on teste 17+4-1 et 17-1+4, on s&rsquo;attend \u00e0 obtenir la m\u00eame chose&#8230; Et bien non !<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      17+4-1\n20\n      17-1+4\n12<\/code><\/pre>\n\n\n\n<p>La logique d&rsquo;APL est de faire les calculs <em>de la droite vers la gauche<\/em>, donc pour la premi\u00e8re \u00e9criture on aura -1 puis 4-1=3 puis +3=3 et enfin17+3=20.<br>Pour la seconde \u00e9criture, 4 puis 1+4=5 puis -5 puis 17-5=12.<br>Il ne faut donc pas confondre -1+4 et \u00af1+4 (il y a un symbole sp\u00e9cial pour les nombres n\u00e9gatifs)<\/p>\n\n\n\n<p>Pour avoir la liste des nombres entre 4 et 17 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      4 + \u237317+1-4\n4 5 6 7 8 9 10 11 12 13 14 15 16 17\n      4 {\u237a + \u2373\u2375+1-\u237a} 17\n4 5 6 7 8 9 10 11 12 13 14 15 16 17<\/code><\/pre>\n\n\n\n<p>Le symbole \u237a correspond au param\u00e8tre qui est \u00e0 gauche et \u2375 \u00e0 celui de droite.<\/p>\n\n\n\n<p>Transformons chacun de ces nombres en chaines avec \u2355 et \u00a8 (pour chaque)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2355\u00a84 {\u237a + \u2373\u2375+1-\u237a} 17             \u235d Nombres transform\u00e9s en chaines\n\u250c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u2510\n\u25024\u25025\u25026\u25027\u25028\u25029\u250210\u250211\u250212\u250213\u250214\u250215\u250216\u250217\u2502\n\u2514\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2518\n      \u2374\u2218\u2355\u00a84 {\u237a + \u2373\u2375+1-\u237a} 17           \u235d Longueurs des chaines\n\u250c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u252c\u2500\u2510\n\u25021\u25021\u25021\u25021\u25021\u25021\u25022\u25022\u25022\u25022\u25022\u25022\u25022\u25022\u2502\n\u2514\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2518<\/code><\/pre>\n\n\n\n<p>Cherchons maintenant si le caract\u00e8re &lsquo;5&rsquo; est dans ces chaines, pour cela on va composer \u220a (test d&rsquo;appartenance) avec \u2355 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      '5' \u220a\u2218\u2355\u00a8 4 + \u237314\n0 1 0 0 0 0 0 0 0 0 0 1 0 0<\/code><\/pre>\n\n\n\n<p>et en ajoutant la n\u00e9gation ~ :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     ~ '5' \u220a\u2218\u2355\u00a8 4 + \u237314\n1 0 1 1 1 1 1 1 1 1 1 0 1 1<\/code><\/pre>\n\n\n\n<p>Il ne reste plus qu&rsquo;\u00e0 compter le nombre de 1 en utilisant une r\u00e9duction :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    +\/ ~ '5' \u220a\u2218\u2355\u00a8 4 + \u237314\n12<\/code><\/pre>\n\n\n\n<p>Ce qui donne comme <a href=\"https:\/\/tio.run\/##SyzI0U2pTMzJT9dNzkksLs5M\/g8EKfl5JfHpmWWp8bmp8WlAWuFR2wSFam19hToFdVN1hUcdXY86ZjzqnXpohcKj3l0K2kBy86PerdqGukBuLZeJAqYJhuZch9YbmmORObTeBAA\" target=\"_blank\" rel=\"noreferrer noopener\">programme final que vous pouvez lancer directement ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      dont_give_me_five \u2190 {+\/ ~ '5' \u220a\u2218\u2355\u00a8 \u237a + \u2373\u2375+1-\u237a}\n\n      \n      4 dont_give_me_five 17\n12\n      \u00af17 dont_give_me_five \u00af4\n12<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Autres versions en python\/javascript<\/h3>\n\n\n\n<p>Notre version APL propose de cr\u00e9er une liste de bool\u00e9ens suivant que &lsquo;5&rsquo; est o\u00f9 non dans la chaine puis d&rsquo;en faire la r\u00e9duction par la somme. Or en Python :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; True + True        # 1 + 1\n2\n&gt; True + False       # 1 + 0 \n1<\/code><\/pre>\n\n\n\n<p>D&rsquo;o\u00f9 cette seconde version :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def dont_give_me_five(debut, fin):\n    return sum(&#091;'5' not in str(i) for i in range(debut, fin + 1)])\n\n# qui peut m\u00eame s'\u00e9crire sans les crochets :\n\ndef dont_give_me_five(debut, fin):\n    return sum('5' not in str(i) for i in range(debut, fin + 1))<\/code><\/pre>\n\n\n\n<p>Pour terminer, voyons comment utiliser <strong>reduce<\/strong> en JavaScript afin d&rsquo;ajouter +1 (ou + true) \u00e0 chaque fois que le nombre convient. Pour cela il faut partir d&rsquo;un tableau de taille fin &#8211; debut + 1, peut importe son contenu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; &#091;...Array(17 - 4 + 1)]\n(14)&nbsp;&#091;undefined, undefined, ..., undefined]<\/code><\/pre>\n\n\n\n<p><strong>reduce<\/strong> utilise un accumulateur ayant une valeur initiale (pour nous 0) et au fur et \u00e0 mesure cet accumulateur va pouvoir changer. Ci-dessous 3 param\u00e8tres ont \u00eatre ajout\u00e9s, l&rsquo;accumulateur <strong>a<\/strong>, la valeur <strong>v<\/strong> et le rang <strong>r<\/strong>. Ainsi, en parcourant les \u00e9l\u00e9ments d&rsquo;un tableau, on peut r\u00e9cup\u00e9rer leurs valeurs et leurs rangs. Le 0 apr\u00e8s la virgule est pour l&rsquo;initialisation de l&rsquo;accumulateur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;...Array(17 - 4 + 1)].reduce((a,v,r) =&gt;    , 0)<\/code><\/pre>\n\n\n\n<p>Vous devriez comprendre l&rsquo;id\u00e9e de cette version  :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dontGiveMeFive = (debut,fin) =&gt; &#091;...Array(fin - debut + 1)]\n     .reduce(\n       (a, _ ,r) =&gt; a + !\/5\/.test(r + debut)\n     ,0)<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Page Twitter o\u00f9 j&rsquo;ai mis quelques challenges que je vous propose de r\u00e9soudre en Python, Javascript ou APL. Python est le langage officiel enseign\u00e9 dans les lyc\u00e9es fran\u00e7ais, donc pas le choix \ud83d\ude05Lien pour taper en Python JavaScript est un &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/01\/kata1\/\">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-176","post","type-post","status-publish","format-standard","hentry","category-twitter"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/176","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=176"}],"version-history":[{"count":19,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/176\/revisions"}],"predecessor-version":[{"id":664,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/176\/revisions\/664"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}