Le gagnant (assez évidemment) est Dennis ♦, qui a utilisé Jelly avec 10 octets!
Ce défi sera toujours là, mais les résultats ne seront plus pris.
Le groupe motopropulseur d'un numéro est un concept de John Conway (qui est également connu pour avoir créé Game of Life de Conway, mais ce n'est pas le but). Il est défini comme suit:
Pour tout nombre ..., le groupe motopropulseur du nombre est ... (c'est-à-dire que chaque deuxième chiffre, de gauche à droite, est une puissance du chiffre avant cela). Ce processus est répété jusqu'à ce que le résultat soit un seul chiffre.
EXEMPLES:
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Votre défi est, pour n'importe quel nombre n
dans l'entrée, de retourner powertrain(n)
(c'est- n
à- dire une fois la décomposition du groupe motopropulseur terminée) en sortie.
C'est le golf de code, donc le plus petit nombre d'octets gagne.
AVIS DE NON-RESPONSABILITÉ:
- Vous pouvez avoir un nombre impair de chiffres dans l'entrée, le dernier chiffre n'aura tout simplement pas de puissance.
- 0 ^ 0 est 1, car s'il était égal à 0, alors beaucoup de nombres s'effondreraient instantanément à 0 ou 1.
- Si le nombre est indestructible dans n'importe quelle partie du processus de calcul (par exemple s'il se termine par
2592
), alors vous pouvez simplement sortir le nombre. - Si l'entrée est
< 10
(c'est-à-dire tous les nombres à un chiffre et les négatifs), sortez l'entrée.
J'annoncerai probablement un gagnant au bout de quelques heures .
Classement actuel:
- Gelée ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Muesli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- Javascript ES6 ( edc65 ): 71
- Mathématiques ( murphy ): 74
- Mathematica ( LegionMammal978 ) et Haskell ( Renzeee ): 77
- Python 2 ( mathmandan ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( bleu ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
et-42
Il est facile d'ignorer les règles concernant les cas de bord s'ils n'apparaissent pas dans les cas de test.Réponses:
Gelée,
15141210 octetsEssayez-le en ligne!
Comment ça marche
la source
n
temps, mais je n'ai pas de preuve que cela fonctionne pour toutes les entrées possibles.D*2/Pµ¡
Haskell,
6764 octets(>> = (==)) >> = jusqu'à ce que $ p.show soit une fonction sans nom prenant un entier en entrée et renvoyant son groupe motopropulseur.
Enregistré 3 octets grâce à Zgarb
la source
((==)=<<g)
enregistre deux octets de plus(\n->g n==n)
.(>>=(==))>>=
ressemble vraiment à un train!Perl, 42
48octetsInclure +2 pour
-lp
(vous pouvez aussi laisser tomber-l
mais j'aime les nouvelles lignes)Exécuter avec entrée sur STDIN, par exemple
powertrain.pl
:(sur les anciennes perles, vous pouvez également supprimer l'espace entre l'expression régulière et jusqu'à)
Cela ne sera pas en mesure de gérer le point fixe
24547284284866560000000000
mais cette grande valeur ne fonctionnera pas de toute façon car à ce moment-là, perl est passé à la notation exponentielle.La version ci-dessus fonctionnera en fait rapidement (au plus les
2592
boucles) pour tous les nombres que perl peut représenter sans utiliser de notation exponentielle car il est prouvé qu'il n'y a pas de points fixes entre2592
et24547284284866560000000000
( https://oeis.org/A135385 )Cela suppose cependant quelque chose qui n'a pas encore été prouvé. En principe, il pourrait y avoir une réduction qui prend plus de
X=10^7
pas (on suppose qu'aucun point non fixe ne prend plus de 16 pas, https://oeis.org/A133503 ) dont la valeur descend en dessousX
(mais au-dessus10^7
) puis monte encore. Si tel est le cas, je dois me rabattre sur:Explication
Le code fonctionne en mettant
**
et*
(en alternance) entre les chiffres2592
devient ainsi2**5*9**2
et12345
devient1**2*3**4*5
. Ce sont des expressions perl valides qui peuvent être évaluées avec(
0**0
est1
en perl). Ensuite, mettez simplement une boucle autour de cela avec un compteur qui le fait expirer. Étant donné que, sauf pour les points fixes, les valeurs diminuent extrêmement rapidement, la série de groupes motopropulseurs converge avant que le compteur n'ait vraiment la possibilité de démarrer.la source
Pyth,
25181116 octetsEssayez-le ici!
714 octets enregistrés avec l'aide de @JakubeExplication
la source
Python 2, 111 octets
L'idée est de faire une chaîne où les chiffres de
n
sont séparés par des opérations qui alternent entre*
et**
, puiseval
cette chaîne. (D'autres solutions utilisent cette même idée; voir par exemple la réponse Perl de Ton Hospel .)Ainsi, l'opération bascule entre
'**'[0:]
ce qui est**
et'**'[-1:]
ce qui est juste*
.Cependant, à la fin de la
for
boucle, la chaîne se termine par une opération (l'une ou l'autre), nous devons donc soit supprimer la dernière opération, soit ajouter un autre chiffre, pour que la chaîne ait du sens.Heureusement, l'ajout d'un
1
à la fin fonctionnera quelle que soit la dernière opération. (Si vous voulez,1
c'est une identité unilatérale de droite, à la fois pour la multiplication et l'exponentiation. Une autre façon de le dire est cellepowertrain(n) == powertrain(10*n + 1)
pour tousn>0
.)Enfin, si le résultat de la
eval
se trouve être le même que l'entrée (comme dans un1
cycle de longueur ), la fonction se termine. Sinon, la fonction s'appelle sur le résultat. (Il restera à jamais suspendu sur n'importe quel cycle de longueur> 1
, mais selon les commentaires du PO, je suis autorisé à supposer qu'il n'y a pas de tels cycles.)(Remarque: l'explication ci-dessus fonctionne pour les entiers positifs à un chiffre, car une entrée à un chiffre
n
sera complétée,n**1
ce qui entraînera un1
cycle. Cependant, nous devons également accepter une entrée non positive, il y a donc une condition à la en commençant ces courts-circuits si l'entrée est inférieure à1
. Nous pourrions éliminer cette ligne et économiser 17 octets si l'entrée était garantie non négative.)la source
Java 8,
265244229 octetsCeci est ma première réponse, mais je lis ce site depuis un certain temps et je pense savoir ce que je fais. Au moins, il bat befunge et SQL ...
Malheureusement, comme d'autres réponses, celle-ci ne fonctionne pas pour 24547284284866560000000000 en raison des restrictions intégrées de java'a sur la taille des entiers.
36 octets enregistrés grâce à @JackAmmo
Explication non golfée
la source
if(n<10)return n;else{...}
the else est inutile car logiquement tout dans ce bloc else ne fonctionnerait de toute façon que lorsque n <10 est faux. La suppression du reste et des 2 accolades correspondantes vous fera économiser 6 octets. Il y a une situation similaire avec votre dernier si ... sinonif(n==t)return n;else return p(t);
supprimez le reste et l'espace après pour économiser encore 5 octets. En fait, vous pouvez le raccourcir encore plus si vous utilisez l'opérateur triadique au lieu du if ... sinon comme çareturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Une fonction récursive, s'arrêtant lorsqu'une répétition est trouvée. Cela ne pourrait pas fonctionner pour des boucles plus longues (2 ou plusieurs valeurs répétées) mais il semble que cela ne puisse pas se produire, au moins dans la plage limitée de précision du nombre javascript (17 chiffres)
Tester
la source
+'1'
tuer deux oiseaux avec une pierre!replace
était de 1 octet de plus:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 octets
Fonction anonyme. Pas trop compliqué.
la source
Befunge
720490 octetsJe n'ai pas pu résister à en faire un de plus après la chose Never tell me the odds . J'ai donc optimisé le "ASCII-fier" du précédent. Dans ce cas, je n'ai vu aucun besoin de laisser le pointeur d'instruction parcourir les chiffres pour les lire, donc je n'ai pas pris l'effort de les rendre lisibles par l'homme. C'est donc plus un numériseur, maintenant.
Encore une fois, si vous voulez des explications, faites-le moi savoir dans les commentaires, je vais essayer de créer des descriptions utiles. Vous pouvez copier coller le code dans l'interpréteur . J'ai trouvé que l'exemple 24547284284866560000000000 génère 0, mais cela semble être un problème pour obtenir une valeur aussi élevée à partir d'un point de la grille, car vous pouvez clairement voir la valeur correcte stockée dans les étapes finales.
Cette version prend également en charge l'entrée négative. C'est une grande amélioration par rapport à la version précédente, si je le dis moi-même. Au moins 1 bug a été corrigé et la taille a été considérablement réduite.
la source
Haskell,
1007977 octetsNon golfé:
Cette fonction divise l'entrée en chiffres et fait l'affaire via
i
.EDIT: Merci à nimi pour quelques conseils.
la source
i(a:[])=a
esti[a]=a
, b) inutilemax 1
, car0^0 = 1
dans Haskell, c) remplacez(:[])
parpure
, d) déplacez l'let
intérieurg
dans une fonction distincte et remplacez-leif ... then ... else
par des gardes:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
n'est pas dans Prelude, mais le reste des conseils fonctionne, merci. J'essayais de le faire avec des gardes, mais j'ai fini par utiliser;
avant le gardien et cela n'a pas fonctionné, mais maintenant je sais comment cela devrait fonctionner.pure
est dans le Prélude fourni avec la base-4.8.2.0. Je ne sais pas quand il a été introduit. Vous n'avez pas besoin de l'( )
entréei([a])=a
.Mathematica, 74 octets
Explication
Cette solution utilise une fonction d'assistance
f
, qui prend les chiffres du nombre comme arguments et applique une itération de l'opération du groupe motopropulseur. La dernière ligne est une fonction pure conçue pour exploiter laReplaceRepeated
fonction (ou//.
pour faire court), qui applique une règle à une expression (dans ce cas l'argument#
de la fonction pure) jusqu'à ce qu'elle ne change plus. La règlei_/;i>0:>f@@IntegerDigits@i
remplace tout ce qui n'est pas négatif par la fonctionf
appliquée à ses chiffres décimaux.la source
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
La deuxième erreur disparaît quand je l' utilise:=
vs=
.;
s au lieu des sauts de ligne:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 octets
La production de la sortie peut prendre quelques secondes.
EDIT (30 juillet 2016): le code lié remplace
9L
par1L
pour s'adapter aux évolutions récentes de la langue.Essayez-le en ligne!
Cela utilise les deux astuces suivantes pour réduire le nombre d'octets au détriment de l'efficacité du code:
n
temps au lieu d'attendre qu'un cycle soit trouvé. Ceci est acceptable selon les commentaires du PO.1
devrait être ajoutée pour terminer l'opération d'alimentation finale. Au lieu de cela, le nombre ajouté1
est le nombre de chiffres. Cela garantit un nombre pair, de sorte que toutes les opérations d'alimentation peuvent être effectuées (même si les dernières sont des1^1
opérations inutiles ).Code:
la source
a, b, a, b
infini (plus d'un terme). Si un terme est répété, vous devez sortir ce nombre. Désolé si ce n'était pas vraiment clair.2592
dans l'entrée, il ne semble rien produire pendant un bon moment.Python 3,
169161 octetsUngoldfed
Résultats
la source
;
Cette façon vous permet d'économiser les espaces blancs d'intention. Vous pouvez également mettre le corps de la boucle for sur cette même ligne.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
dans l'argument par défaut ne fonctionne pas pour moi, il déclenche une erreur `non définie`Oracle SQL 11.2, 456 octets
Non golfé
v est une vue récursive, les paramètres sont
n: nombre à diviser en 2 chiffres
c: nombre de parties à 2 chiffres
i: partie actuelle à 2 chiffres à calculer
f: chaîne concaténant les puissances avec * comme séparateur
t: évaluation de f
Les DECODE passent au numéro suivant pour se diviser et calculer lorsque toutes les parties du numéro actuel sont terminées.
XMLTABLE (f) prend une expression et l'évalue, en plaçant le résultat dans la pseudo-colonne "valeur_colonne". C'est la version golfée de http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE est la construction oracle de la détection de cycle et est utilisée comme condition de sortie.
Comme le résultat pour: 1 <10 est: 1 et v ne renvoie aucune ligne pour ces cas, SUM force une ligne avec NULL comme valeur. NVL renvoie: 1 comme résultat si la ligne est nulle.
la source