59 caractèresCode:
1
2
3
4 function pgcd() { for(a=arguments,r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r }
Version imprimable
59 caractèresCode:
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 :ccool:
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:
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: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 :koi:
Haha il est fort, très fort ce Barsy :mrgreen: (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 modifsCode:
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 :cry:Code:
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; }
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èresCode:
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 :cry:
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:
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:
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èresCode:
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:
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 :ccool:
Outch, ça m'a l'air chaud :aie:
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 :mouarf:
Code:
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);
:mrgreen:
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 :aie:Code:
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 :aie:
EDIT : une mini amélioration pour gagner 1 caractère :aie:
125 :
Code:
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 }