Zut, je pars en week-end ... j'aurai pas le temps de chercher avant lundi !
SpaceFrog : C'est marrant, j'ai justement commencé un truc de ce genre y'a deux jours. Une sorte de Flappy Bird en 140bytes
Zut, je pars en week-end ... j'aurai pas le temps de chercher avant lundi !
SpaceFrog : C'est marrant, j'ai justement commencé un truc de ce genre y'a deux jours. Une sorte de Flappy Bird en 140bytes
Bon allez, ma première intervention sur ce topic
J'ai pris ces cas de test, je préfère préciser :
J'ai mis un moment à comprendre qu'on a bien un fonctionnement en pile mais que les opérandes sont prises « à rebrousse-poil » par rapport au sens de la pile
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 console.assert(npi("1 2 + 4 * 3 +") === 15); console.assert(npi("99 27 - 4 /") === 18); console.assert(npi("23 7 4 - -") === 20);
Donc voilà, 116 caractères à gros coups d'arrow functions !
Avec un peu d'aération ça donne ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part p=[],o=_=>p.pop(),u=x=>p.push(x);s.split(/\s+/).forEach(t=>/\d+/.test(t)?u(t):(z=o(),u(eval(o()+t+z))));return p[0];
J'ai un peu mal à mon honneur d'avoir utilisé eval mais il faut avouer que ça simplifie beaucoup le travail
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 function npi(s){ p = [], // la pile o = _ => p.pop(), u = x => p.push(x); s.split(/\s+/).forEach( // découpe la chaîne en tokens t => /\d+/.test(t) ? // si c'est un nombre u(t) : (z = o(), u( eval(o() + t + z) )) // dépile deux fois, inverse, calcule et rempile ); return p[0]; }
Hmm je ne sais pas si on peut autoriser ES6, dans les règles il est précisé qu'il faut que ça tourne sur Chrome et Firefox et sans aller bricoler dans les réglages expérimentaux pour un support anticipé des arrow functions
Ceci dit mon code est très semblable au tien mais n'utilise pas les arrow functions tout en étant plus court. Une boucle for fait souvent plus court qu'un forEach, et la déclaration des pop et push ne fait pas économiser de caractères ici.
Ce topic a l'avantage de m'apprendre beaucoup de chose premièrement j'ai pas le niveau deuxièmement beaucoup de méthode, notation qui m'était inconnues.
Je vais me pencher sur les arrow function aujourd'hui
Par contre juste une question... peux tu donner une solution sans eval( ) ?
ça m'intéresse fortement ce genre de code
Ceci dit mon code est très semblable
Le dernier que tu aies posté, c'est
Alors je veux bien admettre qu'il soit plus court, mais son efficacité me semble douteuse...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function npi(s){ //votre code ici }
Ok alors si j'enlève mes déclarations de pop et push, ainsi que… le point-virgule final (sans blague, je l'avais oublié celui-là) j'arrive à 105, et si je retire la fonction arrow qui reste et que je remplace mon forEach par une boucle for, je remonte à 109.
Et j'ai réussi à gratter un caractère sur mon expression régulière, ce qui fait 108
Code : Sélectionner tout - Visualiser dans une fenêtre à part p=[];for(i=0;t=s.split(/\s+/)[i++];)/\D/.test(t)?(z=p.pop(),p.push(eval(p.pop()+t+z))):p.push(t);return p[0]Je réfléchis encore pour une solution sans eval.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function npi(s){ p = []; for (i = 0; t = s.split(/\s+/)[i++];) /\D/.test(t) ? (z = p.pop(), p.push( eval(p.pop() + t + z) )) : p.push(t); return p[0]; }
watilin => avec window ?
@Bovino : je n'ai pas dit que je l'avais posté. Il est sur mon autre poste, je le posterais ce soir. De mémoire il fait 89 caractères et c'est quasiment le même que Watilin, à part que les deux p.push sont combinés en un et que mon test d'entier est plus court
Sans eval, le code explose vite en taille. Il n'y a pas vraiment 36 solutions pour passer de caractères à opérateurs mathématiques.
131 sans eval !
Code : Sélectionner tout - Visualiser dans une fenêtre à part p=[];s.replace(/(\d+)|(\+)|(-)|(\*)|\//g,function(_,n,a,b,c){p.push(n*1||(y=p.pop(),x=p.pop(),a?x+y:b?x-y:c?x*y:x/y))});return p[0]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 function npi(s){ p = []; s.replace(/(\d+)|(\+)|(-)|(\*)|\//g, function( _, n, a, b, c ){ p.push(n * 1 || ( y = p.pop(), x = p.pop(), a ? x + y : b ? x - y : c ? x * y : x / y)) }); return p[0] }
Voici ma réponse :
107 caractères.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=n=[];x=s.split(" ")[i++];)if(isNaN(+x)){a=n.pop();n.push(r=eval(n.pop()+x+a))}else n.push(x);return r
Bon, je retourne déchiffrer les solutions de Watilin, c'est un joli cours de Javascript, grâce à ces défis j'en apprends de plus en plus. Merci !!
Attention Watlin ton test n*1|| ne marche pas pour les valeurs zéro. Mais bien joué pour la version sans eval en moins de 140
Salut les fous furieux des neurones en folie!
et pour quelques caractères de moins
à partir de l'offre de Watilin en 108
remplacement de z=p.pop() par t+=p.pop() d'où eval(p.pop()+t).
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=0,p=[];t=s.split(/\s+/)[i++];)/\D/.test(t)?(z=p.pop(),p.push(eval(p.pop()+t+z))):p.push(t);return p[0]
puis si l'on considère un espace unique consécutif
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=0,p=[];t=s.split(/\s+/)[i++];)/\D/.test(t)?(t+=p.pop(),p.push(eval(p.pop()+t))):p.push(t);return p[0]
et l'utilisation de Barsy concernant l'affectation du résultat de eval
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=0,p=[];t=s.split(' ')[i++];)/\D/.test(t)?(t+=p.pop(),p.push(eval(p.pop()+t))):p.push(t);return p[0]
on peut gagner encore 2 en utilisant l’initialisation de Barsy, je dois admettre que je ne l'aurait pas tenté
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=0,p=[];t=s.split(' ')[i++];)/\D/.test(t)?(t+=p.pop(),p.push(r=eval(p.pop()+t))):p.push(t);return r
on arrive à 101
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=p=[];t=s.split(' ')[i++];)/\D/.test(t)?(t+=p.pop(),p.push(r=eval(p.pop()+t))):p.push(t);return r
à partir de l'offre de Barsy en 107, le isNan est bien vu
on peut remplacer le if{}else.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=n=[];x=s.split(" ")[i++];)if(isNaN(+x)){a=n.pop();n.push(r=eval(n.pop()+x+a))}else n.push(x);return r
remplacement de a=p.pop() par x+=p.pop() d'où eval(p.pop()+x).
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=n=[];x=s.split(" ")[i++];)isNaN(+x)?(a=n.pop(),n.push(r=eval(n.pop()+x+a))):n.push(x);return r
là on arrive à 99.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(i=n=[];x=s.split(" ")[i++];)isNaN(+x)?(x+=n.pop(),n.push(r=eval(n.pop()+x))):n.push(x);return r
Mais c'est avec eval
Ma solution à 89 caractères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 function npi(s){ for(n=i=[];e=s.split(' ')[i++];)n.push(+e==e?e:(x=n.pop(),eval(n.pop()+e+x)));return n[0] } console.assert(npi("1 2 + 4 * 3 +") === 15); console.assert(npi("99 27 - 4 /") === 18); console.assert(npi("23 7 4 - -") === 20);
bien vu l'optimisation autour du push, tu peux même encore en gagner 2.
Je continue avec ma proposition sans eval. J'ai corrigé ce problème de zéro que m'a fait remarquer Sylvain et j'ai piqué le coup du return r de Barsy.
Résultat : 130 caractères. -1 bug, -1 octet
Code : Sélectionner tout - Visualiser dans une fenêtre à part p=[];s.replace(/(\d+)|(\+)|(-)|(\*)|\//g,function(_,n,a,b,c){p.push(r=n?+n:(y=p.pop(),x=p.pop(),a?x+y:b?x-y:c?x*y:x/y))});return r
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 function npi(s){ p = []; s.replace(/(\d+)|(\+)|(-)|(\*)|\//g, function( _, n, a, b, c ){ p.push(r = n ? +n : ( y = p.pop(), x = p.pop(), a ? x + y : b ? x - y : c ? x * y : x / y)) }); return r }
[HS mais je peux pas m'en empêcher et j'assume]Je donne ma langue au chat
Ah... toi tu ne sais pas (encore) pourquoi les chats n'utilisent pas de papier toilette...
[/HS mais je peux pas m'en empêcher et j'assume]
M'est avis que ça tourne encore autour du trou de balle cette histoire
Non sérieusement j'ai essayé plusieurs pistes, je ne vois pas comment descendre sous les 89.
En optimisant ta solution SylvainPV, je suis tombé à 85 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(n=i=[];e=s.split(' ')[i++];)n.push(+e?e:(x=n.pop(),r=eval(n.pop()+e+x)));return r
Mince pas vu celle là, mais on peut encore en gagner 1 pour arriver à 84
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(n=i=[];e=s.split(' ')[i++];)n.push(+e?e:(e+=n.pop(),r=eval(n.pop()+e)));return r
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager