En voici l'équivalent :
c'est tordu, n'est-ce pas ? :mouarf:Code:
1
2
3
4
5 x="949077509090757009390757074090759"; // x chaine de caractères for(j=0;j<x.length;j++) // parcours de cette chaine { alert(x[j]); }
Version imprimable
En voici l'équivalent :
c'est tordu, n'est-ce pas ? :mouarf:Code:
1
2
3
4
5 x="949077509090757009390757074090759"; // x chaine de caractères for(j=0;j<x.length;j++) // parcours de cette chaine { alert(x[j]); }
J'ai cessé la recherche de l'équation qui correspond aux pattern, c'est trop compliqué. Ça doit exister, mais faudrait faire un programme pour la trouver.
Je suis parti sur l'idée d'une équation avec un modulo parce que, comme les patterns ne sont pas linéaires, il faut une fonction qui vienne casser cette linéarité.
en fait, dans l'équation suivante, il faudrait trouver la combinaison a, b, c, d et e qui corresponde (si une telle solution existe).
a * ((b + x) * (c + i)) % d < e
Voilà, bon courage. Sinon, j'avais une idée pour un prochain défi, mais je l'ai oubliée. Si ça me revient, je la soumettrai.
Oui l'écriture modulo est très courte, je miserais aussi dessus en combinaison avec l'addition. Autre idée, passer l'incrémentation de j au milieu du calcul procédural pour avoir un facteur (j+1) pouvant s'avérer utile. Plein de voies possibles, mais laquelle prendre ! Vu que ça nous fera gagner au mieux 10 caractères, je pense qu'on peut passer à un autre défi :)
Bah ce qui me choquait et en même temps ce que j'apprends c'est pas tellement la déclaration dans l'instruction c'était surtout le [j++] :)
si je suit le raisonnement on pourrait déclarer comme suit non ? for([j=0][x="949077509090757009390757074090759"][j++]) je pense que c'est certainement faux mais c'est comme ça que je prends la chose :)
N'hésite pas à mettre un autre défi si ça te revient, Barsy.
En effet, l'algo commence à être alambiqué et on a bien fait le tour de la question. Néanmoins, je garde ça dans un coin, ça a un goût de non-fini :mrgreen:
@Darkaurora :
C'est l'écriture de la condition de la boucle qui te gêne ? Si oui, en effet auteur a décortiqué la chose. C'est un raccourci pour dire "tant que ma chaîne a des caractères en stock, je parcours".
Pour ce qui est de la chaîne en elle même, chaque caractère (qui est ensuite casté en Number) correspond à une colonne à dessiner.
9 => que des "dièses". 0 => que des blancs. Ensuite, pour ce qui est des autres nombres, c'est en fonction de la ligne et du nombre parcouru qu'est déterminé le dessin du "dièse" ou non.
Un peu alambiqué je l'admets :mrgreen:
Ha non ! les ; sont obligatoires. On distingue bien les quatre zones :Citation:
si je suit le raisonnement on pourrait déclarer comme suit non ? for([j=0][x="949077509090757009390757074090759"][j++])
Code:
1
2
3 for(/* zone 1*/ j=0 ; /* zone 2 */ [x="949077509090757009390757074090759"][j++];/* zone 3 */) { /* zone 4 */ }
- zone 1 : initialisation de(s) variable(s). Ceci est fait avant le premier tour de la boucle
- zone 2 : condition de la boucle. Tant que la condition est évaluée à true (ou vide, sans condition), la boucle continue.
- zone 3 : opération à réaliser à chaque fin de tour de boucle
- zone 4 : opération à réaliser à chaque début de tour de boucle (est exécuté avant la zone 3)
Chaque zone est facultative ! for(;;); est donc tout à fait valide, c'est une boucle infini qui ne fait rien si ce n'est consommer de la ressource pour rien :)
Donc pour illustrer :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 var i = 0; // 1 < 2 => pour sortir au bout de 2 tours for(console.log('début de boucle'); i<2 ;console.log('fin de tour de boucle')){ console.log('début de tour de boucle'); i++; } //* Va afficher : début de boucle début de tour de boucle fin de tour de boucle début de tour de boucle fin de tour de boucle*/
Ok merci des explications
Mais il faut reconnaitre que le javascript permet d'écrire des choses qui ne sont pas accepté par tous les langages. C'est d'ailleurs l'intérêt de ces défis, de profiter des raccourcis du javascript pour écrire nos algo.
Bien évidemment, en programmation classique, il est interdit d'écrire une boucle for sans remplir les 4 zones, même si le langage le permet.
Oui c'est bien comme ça qu'on m'a appris :)
On remet ça ?
Une calculatrice en notation polonaise inverse
A gérer : les nombres entiers et les signes + - * /
Code:
1
2
3
4
5
6
7 function npi(s){ //votre code ici } console.assert(npi("1 2 + 4 * 3 +") === 15); console.assert(npi("99 27 - 4 /") === 18); console.assert(npi("23 7 4 - -") === 20);
Il manque pas un truc là ? J'ai beau chercher, je vois pas comment on arrive à 18… :weird:Code:console.assert(npi("4 27 99 - /") === 18);
ça me rappelle les Texas Instruments au lycée :cry:
Oui il y a plusieurs écritures possibles avec la notation polonaise
4 27 99 - /
27 99 - 4 /
J'ai corrigé une des assertions, le signe pour la multiplication est bien '*' et non 'x'
Ah Texas Instruments gérait la RPN ? J'ai pas souvenir, personnellement j'étais raide dingue de ma Hewlett-Packard 48S qui fonctionnait nativement en RPN. Les calculatrices HP étaient vraiment au top surtout la série des HP48xx. En terme de vitesse de calcul avec la gestion de la pile à l'écran y avait pas mieux.
Pour les nostalgiques, sur le Play Store de Google, il y a le clone des HP48 : Droid48.
Pour en revenir à la RPN : "4 27 99 - /" avec une pile de type calculatrice reviendrait à faire : 4 / (27 - 99) = 5.55555E-2 et pas 18, et pour arriver à 18 = 99 27 - 4 /
Effectivement, c'est bien les HP qui utilisaient la RPN ! Et je suis bien d'accord avec Martin : la HP48 était vraiment un bijou et j'aurais eu du mal à m'en passer à l'époque.
Sinon en RPN, les chiffres sont gérés en pile, avec le principe Last In First Out, mais les opérateurs sont eux traités au moment où ils sont rencontrés, il n'y a pas de notion de pile pour eux. ;)
Ah oui d'accord, c'est une pile d'après le Wiki. À la fac j'avais appris une version à base de file, d'où mon erreur…
Une idée de réalisation: le fameux jeu de l'helicopère dans la grotte http://www.play-helicopter-game.com/
J'imagine une version simpliste avec un simple défilement de caractères ...