Wydrukuj tetrację

16

Tetracja, reprezentowana jako a^^b, jest powtarzanym potęgowaniem. Na przykład 2^^3to 2^2^2, co jest 16.

Biorąc pod uwagę dwa numery i b , druk .a^^b

Przypadki testowe

1 2 -> 1
2 2 -> 4
5 2 -> 3125
3 3 -> 7625597484987
etc.

Notacja naukowa jest dopuszczalna.

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
2
Jakie liczby? Liczby naturalne?
xnor
Powiązane
acrolith
9
Potęgowanie jest niepowiązane. Powinieneś dołączyć co najmniej jeden test testowy z b> 2 .
Dennis
@Dennis3 3 -> 7625597484987
Gabriel Benamy
1
@RosLuP Nie, 3^3^3automatycznie oznacza 3^(3^(3)). Zobacz en.wikipedia.org/wiki/Order_of_operations , gdzie napisano: „Ułożone wykładniki są stosowane od góry do dołu, tj. Od prawej do lewej”.
Oliver Ni

Odpowiedzi:

14

Dyalog APL, 3 bajty

*/⍴

TryAPL.

Wyjaśnienie

*/⍴  Input: b (LHS), a (RHS)
  ⍴  Create b copies of a
*/   Reduce from right-to-left using exponentation
mile
źródło
1
Hej, ktoś, kto bije @Dennis! To rzadkie! (;: P
HyperNeutrino
10

J, 5 4 bajtów

^/@#

Jest to dosłownie definicja tetracji.

Stosowanie

   f =: ^/@#
   3 f 2
16
   2 f 1
1
   2 f 2
4
   2 f 5
3125
   4 f 2
65536

Wyjaśnienie

^/@#  Input: b (LHS), a (RHS)
   #  Make b copies of a
^/@   Reduce from right-to-left using exponentation
mile
źródło
Ok a ^^ b jest powyżej odwróconego b ^^ a ...
RosLuP
@RosLuP Tak, J i APL oceniają od prawej do lewej, więc 2 ^ 2 ^ 2są oceniane podobnie 2 ^ (2 ^ 2)i tak dalej
mile
9

Haskell, 19 bajtów

a%b=iterate(a^)1!!b

Iteruje wykładnik potęgowy, zaczynając 1od utworzenia listy [1,a,a^a,a^a^a,...], a następnie weź ten belement.

Ta sama długość bezpośrednio:

a%0=1;a%b=a^a%(b-1)

Bez punktów jest dłuższy:

(!!).(`iterate`1).(^)
xnor
źródło
9

Mathematica, 16 bajtów

Power@@Table@##&

Wyjaśnienie

Table@##

Wykonaj b kopie a.

Power@@...

Potęgowanie.

JungHwan Min
źródło
8

Python, 30 bajtów

f=lambda a,b:b<1or a**f(a,b-1)

Używa definicji rekurencyjnej.

xnor
źródło
5

Python, 33 bajty

lambda a,b:eval('**'.join([a]*b))

To daje w wyniku funkcję nienazwaną, która przyjmuje ciąg reprezentujący liczbę i liczbę. Na przykład:

>>> f=lambda a,b:eval('**'.join([a]*b))
>>> f('5',2)
3125
>>>

Jeśli mieszanie takich formatów wejściowych się nie liczy, istnieje również ta 38-bajtowa wersja:

lambda a,b:eval('**'.join([str(a)]*b))
DJMcMayhem
źródło
2
Co za fajna metoda!
xnor
3

Perl, 19 bajtów

Obejmuje +1 dla -p

Podaj liczby w osobnych wierszach na STDIN

tetration.pl
2
3
^D

tetration.pl

#!/usr/bin/perl -p
$_=eval"$_**"x<>.1
Ton Hospel
źródło
3

R, 39 bajtów

Funkcja rekurencyjna:

f=function(a,b)ifelse(b>0,a^f(a,b-1),1)
Billywob
źródło
2

Element , 11 bajtów

__2:':1[^]`

Wypróbuj online!

To jest po prostu „proste” potęgowanie w pętli.

__2:':1[^]`
__              take two values as input (x and y)
  2:'           duplicate y and send one copy to the control stack
     :          make y copies of x
      1         push 1 as the initial value
       [ ]      loop y times
        ^       exponentiate
          `     print result
PhiNotPi
źródło
2

JavaScript (ES7), 24 bajty

f=(a,b)=>b?a**f(a,b-1):1

Wersja ES6 ma 33 bajty:

f=(a,b)=>b?Math.pow(a,f(a,b-1)):1
ETHprodukcje
źródło
Zaoszczędź 1 bajt:f=a=>b=>b?a**f(a,b-1):1
programista
2

dc, 35 29 bajtów:

?dsdsa?[ldla^sa1-d1<b]dsbxlap

Oto mój pierwszy pełny program w dc.

R. Kap
źródło
1

Perl, 40 bajtów

map{$a=$ARGV[0]**$a}0..$ARGV[1];print$a;

Akceptuje dwie liczby całkowite jako dane wejściowe do funkcji i wyświetla wynik

Gabriel Benamy
źródło
1
Użyj, popaby uzyskać $ARGV[1], a następnie użyj, "@ARGV"aby uzyskać $ARGV[0]. Użyj sayzamiast print(opcja -M5.010lub -Ejest darmowa). Ale wciąż ARGVjest strasznie długi. -pProgram prawie zawsze wygrywa
Ton Hospel
1

Właściwie 6 bajtów

n`ⁿ)`Y

Wypróbuj online!

Dane wejściowe są przyjmowane jako b\na( \njest nowym wierszem)

Wyjaśnienie:

n`ⁿ)`Y
n       a copies of b
 `ⁿ)`Y  while stack changes between each call (fixed-point combinator):
  ⁿ       pow
   )      move top of stack to bottom (for right-associativity)
Mego
źródło
1

CJam , 9 bajtów

q~)*{\#}*

Wypróbuj online!

Wyjaśnienie

q~          e# Take input (array) and evaluate
  )         e# Pull off last element
   *        e# Array with the first element repeated as many times as the second
    {  }*   e# Reduce array by this function
     \#     e# Swap, power
Luis Mendo
źródło
1

PHP, 51 bajtów

for($b=$p=$argv[1];++$i<$argv[2];)$p=$b**$p;echo$p;
Jörg Hülsermann
źródło
1

GameMaker Language, 52 50 bajtów

d=a=argument0;for(c=1;c<b;c++)d=power(a,d)return d
Timtech
źródło
Oto moja 300. odpowiedź: o
Timtech
GameMaker wtf? lol
Simply Beautiful Art
@SimplyBeautifulArt Tak, a kiedy już to zrobię, zdejmę dla ciebie 2 bajty.
Timtech
Lol ładne. =) Miej moją +1, wydaje się dość prosta i rozumiem ją.
Po prostu piękna sztuka,
@SimplyBeautifulArt Appreciated
Timtech
0

Pyth, 6 bajtów

u^QGE1

Wypróbuj online.

Wyjaśnienie

          (implicit: input a to Q)
     1    Start from 1.
u   E     b times,
 ^GQ      raise the previous number to power a.
PurkkaKoodari
źródło
0

Minkolang 0,15 , 12 11 bajtów

nnDI1-[;]N.

Wypróbuj tutaj!

Wyjaśnienie

nn             Read two integers from input
  D            Pop top of stack and duplicate next element that many times
   I1-         Push length of stack, minus 1
      [        Pop top of stack and repeat for loop that many times
       ;       Pop b, a and push a^b
        ]      Close for loop
         N.    Output as number and stop.
El'endia Starman
źródło
0

Rakieta 51 bajtów

(define ans 1)(for((i b))(set! ans(expt a ans)))ans

Nie golfowany:

(define (f a b)
  (define ans 1)
  (for((i b))
    (set! ans
          (expt a ans)))
  ans)

Testowanie:

(f 1 2)
(f 2 2)
(f 5 2)
(f 3 3)

Wynik:

1
4
3125
7625597484987
rnso
źródło
0

Scala, 45 bajtów

Seq.fill(_:Int)(_:Double)reduceRight math.pow

Nie golfowany:

(a:Int,b:Double)=>Seq.fill(a)(b).reduceRight(math.pow)

Zbuduj sekwencję as z belementami i zastosuj math.powod prawej do lewej.

corvus_192
źródło
0

TI-Basic, 19 bajtów

Prompt A,B
A
For(C,2,B
A^Ans
End
Timtech
źródło
0

Java 7, 71 57 bajtów

double c(int a,int b){return b>0?Math.pow(a,c(a,b-1)):1;}

Kod niepoznany i testowy:

Wypróbuj tutaj.

class M{
  static double c(int a, int b){
    return b > 0
            ? Math.pow(a, c(a, b-1))
            :1;
  }

  public static void main(String[] a){
    System.out.println(c(1, 2));
    System.out.println(c(2, 2));
    System.out.println(c(5, 2));
    System.out.println(c(3, 3));
  }
}

Wynik:

1.0
4.0
3125.0
7.625597484987E12
Kevin Cruijssen
źródło
0

C, 50 bajtów

double t(int x,int n){return n?pow(x,t(x,n-1)):1;}

Prosto z definicji Tetration .

Karl Napf
źródło
0

05AB1E , 4 bajty

sF¹m

Wypróbuj online!

s     # Swap input arguments.
 F    # N times...
  ¹m  # Top of the stack ^ the first argument.

3 bajty, jeśli można zamienić argumenty:

F¹m
Urna Magicznej Ośmiornicy
źródło
2 2 wynik 16 nie 4 = 2 ^ 2
RosLuP
a=5, b=2powinien wyjść 3125. Nie jestem pewien, w jakiej kolejności przyjmujesz dane wejściowe, ale jednak ustawiam 5 i 2, ale otrzymuję zły wynik.
FlipTack,
0

Bash, 50 bajtów

(w granicach typu danych całkowitych bash)

Grał w golfa

E() { echo $(($(printf "$1**%.0s" `seq 1 $2`)1));}

Wyjaśnienie

Buduj wyrażenie za pomocą printf, np. E 2 5:

  2**2**2**2**2**1

następnie użyj wbudowanego rozszerzenia arytmetycznego bash, aby obliczyć wynik

Test

E 1 2
1

E 2 2
4

E 5 2
3125

E 3 3
7625597484987
zepelin
źródło
0

PowerShell, 68 bajtów

filter p ($a){[math]::Pow($a,$_)};iex (,$args[0]*$args[1]-join"|p ")

To jest najkrótsze z trzech podejść, które wypróbowałem, ale ogólnie nie tak świetne, jestem w 100% pewien, że istnieje krótsze podejście, ale kilka rzeczy, które próbowałem, skończyło się na nieco większej liczbie bajtów.

PS C:\++\golf> (1,2),(2,2),(5,2),(3,3) | % {.\sqsq $_[0] $_[1]}
1
4
3125
7625597484987

Niestety Powershell nie ma wbudowanego ^ani **operatora, albo byłaby czystą odpowiedzią 32/33 bajtów, tj

iex (,$args[0]*$args[1]-join"^")

colsw
źródło
0

Axiom 70 bajtów

l(a,b)==(local i;i:=1;r:=a;repeat(if i>=b then break;r:=a^r;i:=i+1);r)

to mniej golfa

l(a,b)==
  local i
  i:=1;r:=a;repeat(if i>=b then break;r:=a^r;i:=i+1)
  r


(3) ->  [l(1,2),l(2,2),l(5,2),l(3,3),l(4,3)]

     (3)
     [1, 4, 3125, 7625597484987,
      13407807929942597099574024998205846127479365820592393377723561443721764030_
       0735469768018742981669034276900318581864860508537538828119465699464336490_
       06084096
       ]
                                                   Type: List PositiveInteger
RosLuP
źródło
0

Cud , 21 bajtów

f\@@[#0?^#1f#1-#0 1?1

Stosuje podejście rekurencyjne. Stosowanie:

f\@@[#0?^#1f#1-#0 1?1];f 2 3

Rozwiązanie premiowe, 22 bajty

@@:^ -#0 1(genc ^#1)#1

Niekonwencjonalne podejście. Stosowanie:

t\@@+>#[^;#1]tk -#0 1rpt#1;t 2 3

Bardziej czytelny:

@@
  iget
    - #0 1
    (genc ^#1) #1

Zakładając a^^b:

Generuje nieskończoną listę tetrated a; bo a=2ta lista wyglądałaby mniej więcej tak [2 4 16 65536...]. Następnie indeksuje, b-1ponieważ Wonder jest zerowany.

Mama Fun Roll
źródło
0

Clojure, 56 bajtów

(fn[a b](last(take a(iterate #(apply *(repeat % b))b))))

Może istnieje krótsza droga przez apply comp?

NikoNyrh
źródło