Le défi
Implémentez la tétration (aka Power Tower ou Hyperexponentiation) avec le moins de caractères.
Les conditions
- Ne pas utiliser l'opérateur « puissance » ou ses équivalents (tels que
pow(x,y)
,x^y
,x**y
, etc.) - Entrée donnée comme:
x y
(séparée par un espace) x
est exponentiellement par lui-mêmey
fois.- Votre méthode doit être capable de calculer au moins
4 3
(4 exponentiées par elle-même 3 fois)
La notation
- Le score le plus bas gagne: (# de caractères)
- Déduction de bonus si vous n'utilisez pas l'opérateur de multiplication (-5 points).
- Aucune exigence de vitesse / mémoire. Prenez aussi longtemps que vous le souhaitez.
Exemples
x, 0 -> 1
2, 2 -> 2^2 = 4
2, 4 -> 2^(2^(2^2)) = 65536
4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Ouvert aux suggestions / modifications / questions
*
c'est la multiplication dans certains contextes, mais c'est aussi l'opérateur de bouclage simple:{block}N*
est équivalent au style Cfor(i=0;i<N;i++){block}
. Le cas délicat est la multiplication chaîne / tableau ('a'3*
donne'aaa'
), mais il est peu probable que ce soit un problème étant donné qu'un tableau d'4***3
éléments débordera de RAM.x 0
=> 1. Ma solution d'origine ne gérait pas ce cas.Réponses:
J, le score est de 7 (12 caractères - 5 points pour éviter la multiplication)
+/@$/@$~/@$~
usage:
Juste quelques plis imbriqués:
*/@$~/@$~
^/@$~
où$~
crée le tableau,/
est une fonction de repli.la source
pad
veut dire ici? Désolé, l'anglais n'est pas ma langue maternelle.@$~
dans la conjonction?/
, mais oui. vous pliez simplement autant de fois que nécessaire sur la fonction de pliage imbriquée.Haskell,
8785 - 5 == 8082N'utilise ni d'exponentiation, ni de multiplication, ni d'addition (!), Il suffit de lister les opérations. Manifestation:
...
ahm ... vous n'avez rien dit sur la performance ou la mémoire, n'est-ce pas? Mais étant donné suffisamment de milliards d'années et quelques pétaoctets de RAM, cela donnerait toujours le résultat correct (genericLength peut utiliser un bigInt pour compter la longueur de la liste).
la source
GolfScript,
1518 caractèresOui, l'un des
*
s est un opérateur de multiplication (exercice: lequel?) Donc je ne me qualifie pas pour le bonus de 5 caractères. Pourtant, c'est à peine plus court que la solution de Peter .Cette version antérieure de 15 caractères est par ailleurs la même, mais ne produit aucune sortie lorsque le deuxième argument est 0. Merci à res d'avoir repéré le bogue.
la source
"2 3" ~])*{[]+*{*}*}*
.;
pour supprimer la chaîne d'entrée réelle que l'interpréteur place sur la pile au démarrage. Ou ajoutez simplement un[
au code: les deux;"2 3" ~])*{[]+*{*}*}*
et"2 3" [~])*{[]+*{*}*}*
fonctionnent très bien pour moi.ruby golfscript.rb my_script.gs
sur la ligne de commande, sans savoir que cela provoque quelque chose ("", apparemment) sur la pile avant l'exécution du script - qui fonctionne parfois, parfois non. ( De plus, avececho 2 3 | ruby golfscript.rb my_script.gs
, votre programme ne travail-donné.)J,
161912 caractèresou comme verbe (17 caractères):
usage:
ou en prenant la saisie du clavier (
242720 caractères):avec mes remerciements à FUZxxl pour avoir souligné ma stupidité. :-)
Explication:
J est lu de droite à gauche, donc en utilisant
2 4
:/
est utilisé pour insérer le verbe$~
entre chaque paire d'éléments dans la liste.$~
prend l'élément de gauche et le façonne en$
utilisant l'élément de droite (l'~
inverse les arguments) - donc ce serait équivalent à4 $ 2
ce qui vous donne une liste de2
s qui est de quatre éléments2 2 2 2
.Maintenant, nous ajoutons 1 à la liste
1,~
et faisons à nouveau la même chose;/
insérez un verbe*/@$~
entre chaque paire d'éléments de la liste. Ce verbe démarre de la même manière$~
mais cette fois il/
insère un*
entre chaque élément de la liste nouvellement générée. Le@
s'assure juste que le*/@$~
fonctionne comme un verbe au lieu de deux. Cela donne2
multiplié par lui-même suffisamment de fois pour être équivalent à2^4
.Page de vocabulaire de J - Je trouve que résoudre des problèmes avec J est amusant simplement à cause de la manière différente dont il fait parfois les choses.
L'ajout d'une autre itération pour supprimer l'
*
opérateur a 2 problèmesIl sort à 17 caractères (+/@$~/,@$~/1,~$~/
) ce qui, même avec le bonus de -5, est trop long4 3
la source
^/]$[
ce qui crée la liste2 2 2 2
et colle l'opérateur d'exponentiation entre eux. Ce que cela fait, c'est d'aller plus loin et de faire l'exponentiation par multiplication répétée.GolfScript (24 caractères - 5 = 19 points)
est incroyablement lent.
(ou 20 caractères)
est beaucoup plus rapide.
la source
Python, 70
Cela utilise des
eval
appels imbriqués , produisant éventuellement une chaîne"a*a*a*a...*a"
qui est évaluée. Près de la moitié du score est gaspillée pour obtenir les arguments ... même si j'ai remarqué que quelques autres solutions ne dérangent pas avec ça.la source
input()
ou utilisereval(raw_input())
Cheersexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
non golfé:
explication:
plus, mul, high (: = pow), tetration fonctionnent tous de la même manière. Le modèle commun peut être extrait en tant que méthode récursive, qui prend deux BigInts et une fonction de base:
Les soulignements sont réservés pour quelque chose qui est appelé dans cette séquence, par exemple l'addition plus (a, b) = (a + b); donc ( + ) est une fonction qui prend deux arguments et les ajoute (a + b).
malheureusement, j'ai des problèmes avec la taille de la pile. Cela fonctionne pour de petites valeurs pour 4 (par exemple: 2) ou si je réduis la profondeur pour une étape:
Le code d'origine est de 112 caractères et marquerait, s'il était valide, 107. Peut-être que je trouverai comment augmenter la pile.
L'algorithme étendu peut être transformé en appels récursifs:
L'appel tailrecursive est plus long que la méthode d'origine, mais n'a pas déclenché de stackoverflow dans la version longue - mais il ne donne pas de résultat dans un délai raisonnable. t (2,4) est bien, mais t (3,3) a déjà été arrêté par moi après 5 min. Mais c'est très élégant, non?
Et maintenant la même chose que ci-dessus: utilisez la multiplication puante (nous profitons même en rejetant le bonus de 5, car nous économisons 7 caractères: win = 4 caractères :)
invocation:
durée d'exécution: 1 ms.
la source
Br ** nfuck, 128-5 = 123 octets
L'entrée se présente sous la forme de caractères avec des points de code des nombres souhaités comme entrées. La sortie est la même.
Une explication
arrive quand j'ai le tempsci-dessous. Est-ce que j'obtiens des points bonus pour ne pas utiliser l'exponentiation, la multiplication OU même l'addition?Pour cette œuvres (testé)
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
et2 4
. J'ai essayé3 3
, mais cela a fonctionné pendant plusieurs heures sans terminer (dans mon implémentation Java — probablement pas optimal) (EDIT: dans @ Timwi's EsotericIDE [C'est génial! Vous devriez tous l'essayer] aussi. Pas de chance.). En théorie, cela fonctionne jusqu'à la taille de cellule de l'implémentation spécifique.la source
Python, 161-5 (pas d'opérateur *) = 156
invoquer:
la source
4***3
?!m
fonction parm=lambda x,y:sum(x for _ in r(y))
Perl, 61 caractères
en voici une bizarre
usage:
la source
Mathematica,
4033Ce n'est pas tout à fait conforme aux règles, mais ce n'est pas de toute façon en lice pour le code le plus court, et j'espère que cela intéressera quelqu'un.
Cela crée une fonction de "tétration" lors de son exécution, mais les arguments doivent être donnés dans l'ordre inverse. Exemple:
la source
Fold[g, 1, #2~Table~{#}] &[3, 4]
will produceg[g[g[1, 4], 4], 4]
for instance.m[Times]
producesFold[Times, 1, Table[#2, {#1}]] &
, which is a power function:m[Times][5, x]
--->x^5
; the same method is used for this new power function to produce a tetration function. Logically one could start withPlus
but that fails almost immediately.t[h_, n_] := Sum[h, {i, n}]
. Then runm[m@t][3, 4]
.Sum[h, n]
.)Haskell:
5851 chars, with or without multiplication.Ungolfed:
Shorter definition comes from inlining “bump”, and defining a custom version of “iterate”. Unfortunately the result is impossibly inefficient, but starting with (*) instead of (+) gives decent speed. In
ghci
:la source
Ruby
6659 charactersla source
1
) when the second input number is0
; rather,e(x,0)
returns the value ofx
.Python, 112 chars
The numbers should be the 1st and 2nd argument:
python this.py 4 3
**
operator not used.*
used. It's quite trivial to implement, exactly like**
, but costs more than 5 chars.la source
*
implementation, I believe the recursion depth would be too large for4 3
.C,
11710599 charsEDIT: Merged the two functions
p
andr
into one, saving some chars.Of 99 chars, 52 do the actual calculation (including variable definitions). The other 47 are for handling input and output.
BUG: Badly handles powers of 0 (e.g.This isn't a bug, I forgot that0 2
). Should find a minimum cost fix.0 2
is undefined.Successfully handles
4 3
, and even gives an exact result. However, can be inaccurate for some smaller numbers.Prints the number with a trailing
.000000
.la source
Factor, 187 characters
Before golf:
I did not remove the multiplication operator
*
. If I did so, then I would need to add some logic expressing that the sum of an empty sequence is 0, not 1. This extra logic would cost more than the -5 bonus.Rule breaker, 124 + 10 = 134 characters
This program has a lower score, but the exponentiation operator
^
breaks the rules. The rules say "(# of characters) + (10 * (# of 'power' operators))", so I applied the +10 penalty. However, the rules also say "Don't use the 'power' operator", so any program taking this penalty does break the rules. Therefore, this program of 134 characters is not a correct answer, and I must present my longer program of 187 characters as my answer.la source
Haskell 110 - 5 = 105
Tetration Peano Style. This is the most insanely slow solution possible, just a warning, but also avoids even addition.
This relies on you having the patience to type out Peano numbers (and won't show the answer, If you actually want to run it, add these few lines (90 chars):
la source
Ruby,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
la source
Lua: 133 chars, multiplication-less
I was originally going to use string repetition hacks to do fake multiplication, but it likes to fail on large values. I could possibly use dynamic compilation and loadstring to make it smaller, but it's getting late here... I need sleep.
Entering "4 3" into stdin outputs:
la source
VBA, 90 Chars
*Perhaps the no multiplication bonus is not good enough. I think the no multiplication answer is much more interesting, but this is code golf, so it's not the best. Here's an answer without
*
, and a better (shorter, and better scoring) answer with it:90 chars, no power operators, uses multiplication = 90
116 chars, no power operators, no multiplication bonus (-5) = 111
NOTE: VBA has issues printing the number when the result is very large (i.e.
4, 3
), but it does calculate correctly, so if, for example, you wanted to USE that number, you would be good to go. Also, even BIGGER numbers overflow (i.e.3, 4
).la source
Perl 6, 32 bytes
Try it online!
(1, { [*] a xx $_ } ... *)
is a lazy sequence that generates the power tower, each element being the a list which consists of the first input parametera
replicated (xx
) a number of times equal to the previous element ($_
), that list then being reduced with multiplication ([*]
). From that sequence we simply pluck out theb
-th element.la source
Lambda calculus, 10-5
(using Church encoding and De Bruijn indeces)
λλ(1λ13)λ1
Explanation
Without De Bruijn indeces:
λa,b.(b λc.ca)λc.c
:If you define
exp_a(x)=a^x
this program definesa↑↑b=exp_a^b(1)
where^b
denotes function itteration.I'm not sure if this is allowed because
ca
is technically equivalent toa^c
how ever it is not a real built-in and only a side effect of the way integers are encoded in lambda calculus.la source
Javascript: 116 chars
t('4 3') Outputs:
la source
Python
(111)(113) no *6***3 - 36k digits))
Upd: Have to add initial value, to fit t(X,0)=1
la source
Haskell: 88-5 chars without multiplication, 59 chars with multiplication
Without multiplication:
There are probably ways that I could golf that down a little.
With multiplication:
And finally, the ungolfed program:
This is probably the simplest way to do this problem, which is defining multiplication as repeated addition, exponentiation as repeated multiplication, and tetration as repeated exponentiation.
la source
Racket 58 (no *)
la source
Common Lisp, 85 chars
I tried doing the multiplications through repeated addition, but it was way more than 5 characters. Same thing with macrolets, the declarations were not worth the gains.
Another solution, inspired by boothby's python solution. It's 1 character less than the above solution.
la source
Python 3 – 68
(including the 10-point penalty for the power operator)
la source
Yabasic, 71 bytes
A function that takes input
a
andb
as a space delimited string.Try it online!
la source
R, 71 - 5 = 66 bytes
Try it online!
-5 for avoiding *, which was harder than I expected. It explodes really fast and won't work (unless it had more memory) but it satisfies all necessary criteria.
la source