Роздрукуйте тетрацію


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

Діалог APL, 3 байти

*/⍴

СпробуйтеAPL.

Пояснення

*/⍴  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

Хаскелл, 19 байт

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

Ітератує експоненцію, починаючи 1з створення списку [1,a,a^a,a^a^a,...], а потім приймає b'й елемент.

Однакова довжина безпосередньо:

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

Без точок довше:

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

9

Математика, 16 байт

Power@@Table@##&

Пояснення

Table@##

Зробіть b копії.

Power@@...

Експоненція.


8

Пітон, 30 байт

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

Використовується рекурсивне визначення.


5

Пітон, 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))

2
Який класний метод!
xnor


3

Perl, 19 байт

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

Наведіть числа в окремих рядках на STDIN

tetration.pl
2
3
^D

tetration.pl

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




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

GameMaker Мова, 52 50 байт

d=a=argument0;for(c=1;c<b;c++)d=power(a,d)return d

Це моя 300-я відповідь: o
Timtech


@SimplyBeautifulArt Так, і поки я на ньому, я зніму 2 байти для вас.
Timtech

Лол, приємно. =) Мені +1, здається досить простим, і я це розумію.
Просто красиве мистецтво

@SimplyBeautifulArt Цінується
Timtech



0

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

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

Безголівки:

(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

0

Скала, 45 байт

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

Безголівки:

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

Побудуйте послідовність as з bелементами та застосуйте math.powсправа наліво.



0

Java 7, 71 57 байт

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

Невикористаний і тестовий код:

Спробуйте тут.

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

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 цілих чисел)

Гольф

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"^")


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

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 нульово індексується.


0

Clojure, 56 байт

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

Можливо, існує коротший шлях через apply comp?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.