Tetrasyonu yazdırın


16

Olarak temsil edilen tetrasyon, a^^btekrarlanan üs almadır. Örneğin, 2^^3bir 2^2^216 olan.

İki sayı a ve b verildiğinde yazdırın a^^b.

Test senaryoları

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

Bilimsel gösterim kabul edilebilir.

Unutmayın, bu , bu nedenle en az bayt içeren kod kazanır.


2
Ne tür rakamlar? Pozitif tam sayılar?
xnor


9
Üstelleştirme ilişkisizdir. B> 2 ile en az bir test cade'i eklemelisiniz .
Dennis

@Dennis3 3 -> 7625597484987
Gabriel Benamy

1
@RosLuP Hayır, 3^3^3otomatik olarak anlamına gelir 3^(3^(3)). Bkz. En.wikipedia.org/wiki/Order_of_operations , "Yığılmış üsler yukarıdan aşağıya, yani sağdan sola uygulanır."
Oliver Ni

Yanıtlar:


14

Dyalog APL, 3 bayt

*/⍴

TryAPL.

açıklama

*/⍴  Input: b (LHS), a (RHS)
  ⍴  Create b copies of a
*/   Reduce from right-to-left using exponentation

1
Hey, @Dennis'i döven biri! Şimdi bu nadir! (;: P
HyperNeutrino

10

J, 5 4 bayt

^/@#

Bu kelimenin tam anlamıyla tetrasyonun tanımıdır.

kullanım

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

açıklama

^/@#  Input: b (LHS), a (RHS)
   #  Make b copies of a
^/@   Reduce from right-to-left using exponentation

Tamam bir ^^ b ters b ^ ^ yukarıda olduğunu ...
RosLuP

@RosLuP Evet, J ve APL böylece, sağdan soldan değerlendirmek 2 ^ 2 ^ 2olarak değerlendirilir 2 ^ (2 ^ 2)ve benzeri
mil

9

Haskell, 19 bayt

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

1Listeyi üretmeye başlayarak üssü yineliyor [1,a,a^a,a^a^a,...], sonra b'element'i alıyor.

Aynı uzunluk doğrudan:

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

Point-free daha uzun:

(!!).(`iterate`1).(^)

9

Mathematica, 16 bayt

Power@@Table@##&

açıklama

Table@##

A'nın b kopyalarını alın.

Power@@...

Üs.


8

Python, 30 bayt

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

Özyinelemeli tanımı kullanır.


5

Python, 33 bayt

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

Bu, bir sayının ve bir sayının dize olarak temsilini alan adsız bir işlev olarak değerlendirilir. Örneğin:

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

Bunun gibi giriş biçimlerinin karıştırılması sayılmazsa, bu 38 baytlık sürüm de vardır:

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

2
Ne güzel bir yöntem!
xnor


3

Perl, 19 bayt

İçin +1 içerir -p

STDIN üzerinde ayrı satırlarda numaralar verin

tetration.pl
2
3
^D

tetration.pl

#!/usr/bin/perl -p
$_=eval"$_**"x<>.1

3

R, 39 bayt

Özyinelemeli işlev:

f=function(a,b)ifelse(b>0,a^f(a,b-1),1)

2

Öğe , 11 bayt

__2:':1[^]`

Çevrimiçi deneyin!

Bu bir döngü içinde sadece "basit" bir üstür.

__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

2

JavaScript (ES7), 24 bayt

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

ES6 sürümü 33 bayttır:

f=(a,b)=>b?Math.pow(a,f(a,b-1)):1

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

2

dc, 35 29 bayt:

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

İşte ilk tam programım dc.


1

Perl, 40 bayt

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

İki tamsayıyı işleve girdi olarak kabul eder ve sonucu çıktılar


1
Almak popiçin kullanın $ARGV[1], sonra "@ARGV"almak için kullanın $ARGV[0]. (Seçenek veya ücretsiz) sayyerine kullanın . Ama yine de , çok uzun. Bir program neredeyse her zaman kazanırprint-M5.010-EARGV-p
Ton Hospel

1

Aslında , 6 bayt

n`ⁿ)`Y

Çevrimiçi deneyin!

Girdi şu şekilde alınır b\na( \nyeni satırdır)

Açıklama:

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)

1

CJam , 9 bayt

q~)*{\#}*

Çevrimiçi deneyin!

açıklama

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




0

Minkolang 0.15 , 12 11 bayt

nnDI1-[;]N.

Burada deneyin!

açıklama

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.

0

Raket 51 bayt

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

Ungolfed:

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

Test yapmak:

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

Çıktı:

1
4
3125
7625597484987

0

Scala, 45 bayt

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

Ungolfed:

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

Elemanları içeren bir as sırası oluşturun bve math.powsağdan sola uygulayın.



0

Java 7, 71 57 bayt

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

Test edilmemiş ve test kodu:

Burada deneyin.

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));
  }
}

Çıktı:

1.0
4.0
3125.0
7.625597484987E12


0

05AB1E , 4 bayt

sF¹m

Çevrimiçi deneyin!

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

Bağımsız değişkenler değiştirilebiliyorsa 3 bayt:

F¹m

2 2 sonuç 16 not 4 = 2 ^ 2
RosLuP

a=5, b=2çıktı vermelidir 3125. Hangi sırayı aldığınızdan emin değilim, ancak 5 ve 2'yi girerim, yanlış sonuç alıyorum.
FlipTack

0

Bash, 50 bayt

(bash tamsayı veri türü sınırları dahilinde)

golfed

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

açıklama

Printf ile ifade oluşturun, örneğin E 2 5:

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

sonra sonucu hesaplamak için bash yerleşik aritmetik genişletmeyi kullanın

Ölçek

E 1 2
1

E 2 2
4

E 5 2
3125

E 3 3
7625597484987

0

Powershell, 68 Bayt

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

Bu denediğim üç yaklaşımdan en kısa olanı, genel olarak o kadar da iyi değil, daha kısa bir yaklaşım olduğundan% 100 eminim ama denediğim birkaç şey biraz daha fazla bayt ile sonuçlandı.

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

Ne yazık ki Powershell'in yerleşik ^veya **operatörü yoktur veya 32/33 baytlık temiz bir cevap olacaktır, yani

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


0

Axiom 70 bayt

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

bu daha az golf

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

0

Harika , 21 bayt

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

Özyinelemeli yaklaşımı kullanır. Kullanımı:

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

Bonus çözümü, 22 bayt

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

Biraz alışılmadık bir yaklaşım. Kullanımı:

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

Daha okunabilir:

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

Varsayım a^^b:

Sonsuz tetratlı bir liste oluşturur a; çünkü a=2bu liste şuna benzer [2 4 16 65536...]. Sonra dizini endeksler b-1çünkü Wonder sıfır indekslenir.


0

Clojure, 56 bayt

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

Belki daha kısa bir yol var apply comp?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.