59 caractères
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function pgcd() { for(a=arguments,r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r }
59 caractères
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function pgcd() { for(a=arguments,r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r }
Outch, la barre est haute ! Joli
97 pour moi, pas mieux donc. J'ai tenté par la récursivité
ps : tu peux même virer le dernier ; pour faire 60
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function pgcd(){ x=function(a,b){return!b?a:x(b,a%b)};return[].reduce.call(arguments,function(a,b){return x(a,b)}) } console.log( pgcd(27,36) === 9 ); console.log( pgcd(128,8,32) === 8 ); console.log( pgcd(7,14,7,35,707) === 7 ); console.log( pgcd(13,17) === 1 ); console.log( pgcd(7,7) === 7 );![]()
c'est fait, je tombe donc à 60. J'essaie encore d'enlever ce que je peux. J'édite mon post au fur et à mesure que j'y arrive.
C'est pas vrai, à l'exercice précédent, je me suis fait exploser par Kaamo alors que j'étais persuadé qu'il était impossible de mieux faire.
Ici, je pensais qu'il était possible de réduire encore le code en écrivant quelque chose dans le genre
Mais il semblerait qu'en Javascript, tous les éléments d'un OU sont joués même si le premier retourne vrai. Ce n'est pas le cas dans d'autre langages.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(a=arguments,(b=n%r)||(r=a[i=0]);n=a[i++];)r=b
il y a quand même un truc qui me chagrine dans ton code : tu ne vérifies pas si a<b avant de faire la division![]()
Non ce n'est pas le cas, il doit y avoir un soucis dans ton expression :
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 function first(){ console.log('first called'); return true; } function second(){ console.log('second called'); return true; } (function(){ first()||second(); })();
Haha il est fort, très fort ce Barsy(normal pour un Sylvain)
Ben en fait, pas si fort que ça. Auteur vient de mettre le doigt sur un problème. Si on fait pgcd(27,36), ça passe, mais pgcd(36,27) ça retourne 27.
Je vais corriger ça
95 avec la fonction d'Auteur simplifiée simplement.
les modifs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function pgcd(){ for(x=arguments,i=x.length-1;i;i--){r=a=x[i];b=x[i-1];for(;r;){a=b;b=r;r=a%b}x[i-1]=b}return b; }
Je doute que cela tienne face au 59 de Barsy plus la modif
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 pgcd(){ for(x=arguments, i=x.length-1;i;i--){ r=a=x[i]; b=x[i-1]; // while(r!=0){ for(;r;){ // if(r!=0){ a=b; b=r; // } r=a%b } x[i-1]=b } return b; }![]()
Les joies du CSS | Réponses sur forum | Simple comme JS | Essais libres autour de l'API G$$gle Maps
✂ ---------------------------------------------
developpez.net c'est aussi :
✔ Les meilleurs cours et tutoriels pour apprendre le CSS
✔ Les meilleurs cours et tutoriels pour apprendre le (X)HTML
✔ Les meilleurs cours et tutoriels pour apprendre le JavaScript
Si ça peut donner des idées à certains :
PGCD des nombres 96 et 36
96-36=60
60-36=24
36-24=12
24-12=12
12-12=0
PGCD(96;36)=12
![]()
La correction me ramène à 73 caractères
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function pgcd() { for(a=[].sort.call(arguments),r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r }
EDIT : Et ça ne marche pas avec 96 et 36... et crotte![]()
Cette fois, c'est la bonne, enfin j'espère... j'ai essayé avec beaucoup de nombres différents et je n'ai pas eu d'erreurs.
Ce qui me ramène au final à 65 caractères.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function pgcd() { for(a=arguments,r=a[i=0];n=a[++i];)while(b=n%r){n=r;r=b};return r }
J'ai essayé avec la méthode des soustractions:
83 caractères. Mais ça marche pour tous les cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function pgcd(){ for(a=arguments,n=a[i=0];m=a[++i];){do{if(m<n){t=n;n=m;m=t}m-=n}while(m>0)}return n }
Sinon 2 caractères économisés sur le code de Barsy:
63 caractères
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function pgcd(){ for(a=arguments,r=a[i=0];n=a[++i];)while(b=n%r)n=r,r=b;return r }
La méthode de la division euclidienne est plus courte car le tri croissant est réalisé par la même boucle.
Bon je crois qu'on ira pas plus bas pour ce problème-ci
Numéro 6 : convertir un nombre quelconque entre 1 et 3999 en chiffres romains
proposé par Barsy
Les unités à intégrer sont :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 function romain(n){ //votre code ici } console.assert( romain(12) === "XII" ); console.assert( romain(49) === "XLIX" ); console.assert( romain(74) === "LXXIV" ); console.assert( romain(383) === "CCCLXXXIII");
I 1
V 5
X 10
L 50
C 100
D 500
M 1 000
Celui-là n'est pas facile, bon courage![]()
Outch, ça m'a l'air chaud
Une question, après avoir lu quelques articles ici ou là :
- On ne peut aller que jusqu'à 3999. En effet, 4000 === MMMM. Or, quatre caractères identiques est une exception et ça fait un paramètre de plus à gérer. ça risque de faire un peu trop
5000 c'est V surmonté d'un trait horizontal, mais 4999 === MMMMCMXCIX.
Faut il gérer cette histoire de quatre "M" donc ?
A la Bovino
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 var print=function(msg){console.log(msg)}; (function rtoa(A,R,n,p){ // pour n entre 1 et 3999 s="",L=A.length;for(i=0;++i<L;){while(n>=A[i]){n-=A[i];s+=R[i];}if(n==0)p(s)} })([1000,900,500,400,100,90,50,40,10,9,5,4,1],["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],383,print);
Blog
Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
(Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)
Basé sur le même raisonnement que Daniel :
En 126 caractères donc. Mais à mon avis, y'a plus court, la table de correspondance doit pouvoir se simplifier ... mais avant, j'ai besoin de manger
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function romain(n){ a={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},r='';for(x in a)for(i=a[x];n>=i;n-=i)r+=x;return r } console.log( romain(12) + ' / ' + (romain(12) === "XII") ); console.log( romain(49) + ' / ' + (romain(49) === "XLIX") ); console.log( romain(74) + ' / ' + (romain(74) === "LXXIV") ); console.log( romain(383) + ' / ' + (romain(383) === "CCCLXXXIII")); console.log( romain(1000) + ' / ' + (romain(1000) === "M")); console.log( romain(3888) + ' / ' + (romain(3888) === "MMMDCCCLXXXVIII")); // le plus long possible !
ça ne marche pas pour "0" et pour les nombres plus grands que 4000, les "M" s'affichent par quatre. Pour 5000, par 5 etc, je ne crois pas que ça soit bon
ps : n'essayez pas 1'000'000
EDIT : une mini amélioration pour gagner 1 caractère
125 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function romain(n){ a={M:100,CM:90,D:50,CD:40,C:10,XC:9,L:5,XL:4,X:1,IX:.9,V:.5,IV:.4,I:.1},r='';for(x in a)for(i=a[x]*10;n>=i;n-=i)r+=x;return r }
Partager