Распечатать тетрацию

16

Тетрация, представленная как a^^b, является повторным возведением в степень. Например, 2^^3есть 2^2^2, что 16.

Учитывая два числа a и b , выведите a^^b.

Контрольные примеры

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

Научная запись приемлема.

Помните, это , поэтому выигрывает код с наименьшим количеством байтов.

Оливер Ни
источник
2
Что за цифры? Положительные целые числа?
xnor
Связанный
акролит
9
Возведение в степень неассоциативно. Вы должны включить хотя бы один тестовый код с b> 2 .
Деннис
@Dennis3 3 -> 7625597484987
Габриэль Бенами
1
@RosLuP Нет, 3^3^3автоматически означает 3^(3^(3)). См. En.wikipedia.org/wiki/Order_of_operations , где написано: «Сложенные экспоненты применяются сверху вниз, то есть справа налево».
Оливер Ни

Ответы:

14

Дьялог АПЛ, 3 байта

*/⍴

TryAPL.

объяснение

*/⍴  Input: b (LHS), a (RHS)
  ⍴  Create b copies of a
*/   Reduce from right-to-left using exponentation
миль
источник
1
Эй, кто-то, кто избивает @Dennis! Теперь это редкость! (;: P
HyperNeutrino
10

J, 5 4 байта

^/@#

Это буквально определение тетрации.

использование

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

объяснение

^/@#  Input: b (LHS), a (RHS)
   #  Make b copies of a
^/@   Reduce from right-to-left using exponentation
миль
источник
Хорошо a ^^ b выше перевернутого b ^^ a ...
RosLuP
@RosLuP Да, J и APL оценивают справа налево, поэтому 2 ^ 2 ^ 2оценивается как 2 ^ (2 ^ 2)и так далее
мили
9

Haskell, 19 байтов

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

Итерирует возведение в степень, начиная 1с создания списка [1,a,a^a,a^a^a,...], а затем принимает bэлемент 'th'.

Той же длины напрямую:

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

Без очков дольше:

(!!).(`iterate`1).(^)
XNOR
источник
9

Mathematica, 16 байт

Power@@Table@##&

объяснение

Table@##

Сделайте б копии а.

Power@@...

Возведение.

Юнг Хван Мин
источник
8

Python, 30 байт

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

Использует рекурсивное определение.

XNOR
источник
5

Python, 33 байта

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

Это оценивает безымянную функцию, которая принимает строковое представление числа и числа. Например:

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

Если смешивание входных форматов, подобных этому, не учитывается, существует также 38-байтовая версия:

lambda a,b:eval('**'.join([str(a)]*b))
DJMcMayhem
источник
2
Какой классный метод!
xnor
3

Perl, 19 байт

Включает +1 для -p

Дайте номера на отдельных строках на STDIN

tetration.pl
2
3
^D

tetration.pl

#!/usr/bin/perl -p
$_=eval"$_**"x<>.1
Тон Хоспел
источник
3

R, 39 байт

Рекурсивная функция:

f=function(a,b)ifelse(b>0,a^f(a,b-1),1)
Billywob
источник
2

Элемент , 11 байт

__2:':1[^]`

Попробуйте онлайн!

Это просто "простое" возведение в степень в цикле.

__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
источник
2

JavaScript (ES7), 24 байта

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

Версия ES6 составляет 33 байта:

f=(a,b)=>b?Math.pow(a,f(a,b-1)):1
ETHproductions
источник
Сохранить 1 байт:f=a=>b=>b?a**f(a,b-1):1
programmer5000
2

dc, 35 29 байтов:

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

Вот моя первая полная программа в dc.

Р. Кап
источник
1

Perl, 40 байт

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

Принимает два целых числа в качестве входных данных для функции и выводит результат

Габриэль Бенами
источник
1
Используйте, popчтобы получить $ARGV[1], затем используйте, "@ARGV"чтобы получить $ARGV[0]. Используйте sayвместо print(опция -M5.010или -Eбесплатно). Но все равно, ARGVэто ужасно долго. -pПрограмма почти всегда побеждает
ТОН Hospel
1

На самом деле , 6 байтов

n`ⁿ)`Y

Попробуйте онлайн!

Ввод принимается как b\na( \nперевод строки)

Объяснение:

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
источник
1

CJam , 9 байт

q~)*{\#}*

Попробуйте онлайн!

объяснение

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
Луис Мендо
источник
1

PHP, 51 байт

for($b=$p=$argv[1];++$i<$argv[2];)$p=$b**$p;echo$p;
Йорг Хюльсерманн
источник
1

GameMaker Language, 52 50 байт

d=a=argument0;for(c=1;c<b;c++)d=power(a,d)return d
Timtech
источник
Это мой 300-й ответ: o
Timtech
GameMaker WTF? LOL
Просто Красивое Искусство
@SimplyBeautifulArt Да, и пока я на этом, я уберу 2 байта для тебя.
Timtech
Лол, мило =) У меня +1, кажется достаточно просто и я это понимаю.
Просто Красивое Искусство
@SimplyBeautifulArt приветствуется
Timtech
0

Минколанг 0,15 , 12 11 байт

nnDI1-[;]N.

Попробуй это здесь!

объяснение

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'ndia Starman
источник
0

Ракетка 51 байт

(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)

Тестирование:

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

Выход:

1
4
3125
7625597484987
rnso
источник
0

Скала, 45 байт

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

Ungolfed:

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

Построить последовательность as с bэлементами и применить math.powсправа налево.

corvus_192
источник
0

TI-Basic, 19 байтов

Prompt A,B
A
For(C,2,B
A^Ans
End
Timtech
источник
0

Java 7, 71 57 байт

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

Ungolfed & тестовый код:

Попробуй это здесь.

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

Выход:

1.0
4.0
3125.0
7.625597484987E12
Кевин Круйссен
источник
0

C, 50 байтов

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

Непосредственно из определения тетрации .

Карл Напф
источник
0

05AB1E , 4 байта

sF¹m

Попробуйте онлайн!

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

3 байта, если аргументы можно поменять местами:

F¹m
Урна волшебного осьминога
источник
2 2 результат 16 не 4 = 2 ^ 2
РосЛюП
a=5, b=2должен выводить 3125. Я не уверен, в каком порядке вы принимаете входные данные, но, тем не менее, я положил 5 и 2, я получаю неправильный результат.
FlipTack
0

Баш, 50 байт

(в пределах целого типа данных bash)

Golfed

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

объяснение

Создайте выражение с помощью printf, например, E 2 5:

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

затем используйте встроенное арифметическое расширение bash для вычисления результата

Тестовое задание

E 1 2
1

E 2 2
4

E 5 2
3125

E 3 3
7625597484987
дирижабль
источник
0

Powershell, 68 байт

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

Это самый короткий из трех подходов, которые я пробовал, но не так уж и много, но я уверен на 100%, что есть более короткий подход, но несколько вещей, которые я попробовал, каким-то образом закончились с немного большим количеством байтов.

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

К сожалению, у Powershell нет встроенного оператора ^или **оператора, иначе это будет чистый ответ 32/33 байта, т.е.

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

colsw
источник
0

Аксиома 70 байт

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

это менее гольф

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
источник
0

Чудо , 21 байт

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

Использует рекурсивный подход. Использование:

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

Бонусное решение, 22 байта

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

Немного нетрадиционный подход. Использование:

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

Более читабельно:

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

Если предположить, a^^b :

Создает бесконечный список тетратов a; ибо a=2этот список будет выглядеть примерно так [2 4 16 65536...]. Затем индексирует, b-1потому что Wonder индексируется нулем.

Mama Fun Roll
источник
0

Clojure, 56 байт

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

Может быть, есть более короткий путь через apply comp?

NikoNyrh
источник