Соревнование
Реализовать тетрация (ака Power Tower или Hyperexponentiation) с наименьшим количеством символов.
Условия
- Не используйте «власть» оператор или его эквиваленты (такие как
pow(x,y)
,x^y
,x**y
и т.д.) - Ввод дан как:
x y
(разделенный пробелом) x
возведено в порядок само по себеy
.- Ваш метод должен быть в состоянии вычислить как минимум
4 3
(4 возведено в степень 3 раза)
Скоринг
- Победа с наименьшим количеством очков: (количество символов)
- Бонусный вычет, если вы не используете оператор умножения (-5 баллов).
- Нет требований к скорости / памяти. Бери сколько хочешь.
Примеры
x, 0 -> 1
2, 2 -> 2^2 = 4
2, 4 -> 2^(2^(2^2)) = 65536
4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Открыт для предложений / изменений / вопросов
*
есть умножение в некоторых контекстах, но это также простой оператор зацикливания:{block}N*
эквивалентно C-стилюfor(i=0;i<N;i++){block}
. Сложный случай - умножение строк / массивов ('a'3*
дает'aaa'
), но это вряд ли будет проблемой, учитывая, что массив4***3
элементов будет переполнять ОЗУ.x 0
=> 1. Мое оригинальное решение не обрабатывало этот случай.Ответы:
J, оценка 7 (12 символов - 5 баллов за избежание умножения)
+/@$/@$~/@$~
использование:
Всего несколько вложенных складок:
*/@$~/@$~
^/@$~
где$~
создает массив,/
является функцией сгиба.источник
pad
что здесь значит? Извините, английский не мой родной язык.@$~
в соединении?/
, но да. Вы просто складываете столько раз, сколько необходимо для использования вложенной функции складывания.Haskell,
8785 - 5 == 8082Не использует ни возведения в степень, ни умножения, ни сложения (!), Просто перечисляет операции. Демонстрация:
...
хм ... ты ничего не сказал о производительности или памяти, не так ли? Но, учитывая достаточно миллиардов лет и несколько петабайт ОЗУ, это все равно даст правильный результат (genericLength может использовать bigInt для подсчета длины списка).
источник
GolfScript,
1518 символовДа, один из
*
операторов s является оператором умножения (упражнение: какое?), Поэтому я не могу претендовать на бонус в 5 символов. Тем не менее, он чуть короче, чем решение Питера .Эта более ранняя версия с 15 символами в остальном такая же, но не выдает никаких выходных данных, когда второй аргумент равен 0. Спасибо res за обнаружение ошибки.
источник
"2 3" ~])*{[]+*{*}*}*
.;
для удаления фактическую входную строку, которую интерпретатор помещает в стек при запуске. Или просто добавьте[
к коду: и то,;"2 3" ~])*{[]+*{*}*}*
и другое"2 3" [~])*{[]+*{*}*}*
хорошо для меня.ruby golfscript.rb my_script.gs
в командной строке, не зная, что это приводит к тому, что что-то («», по-видимому) находится в стеке до запуска скрипта - что иногда работает, иногда нет. (Кроме того , сecho 2 3 | ruby golfscript.rb my_script.gs
, ваша программа делает работу как данные.)J,
161912 символовили как глагол (17 символов):
использование:
или принимая ввод с клавиатуры (
242720 символов):спасибо FUZxxl за указание на мою глупость. :-)
Объяснение:
J читается справа налево, поэтому используется
2 4
:/
используется для вставки глагола$~
между каждой парой элементов в списке.$~
берет левый элемент и формирует его,$
используя правый элемент (~
переворачивает аргументы) - так что это будет эквивалентно тому,4 $ 2
что даст вам список2
s длиной четыре элемента2 2 2 2
.Теперь мы добавляем 1 к списку
1,~
и затем делаем то же самое снова;/
вставьте глагол*/@$~
между каждой парой элементов в списке. Этот глагол начинается таким же образом,$~
но на этот раз он/
вставляет*
между каждым элементом вновь сгенерированного списка.@
Просто убеждается , что*/@$~
работает как один глагол вместо двух. Это дает2
умноженное на себя достаточно времени, чтобы быть эквивалентным2^4
.Страница словарного запаса J - я нахожу решение проблем с J забавным только из-за того, как это иногда делает вещи.
Добавление еще одной итерации для удаления
*
оператора имеет 2 проблемыОн имеет 17 символов (+/@$~/,@$~/1,~$~/
), что, даже с бонусом -5, слишком длинное4 3
источник
^/]$[
который создает список2 2 2 2
и вставляет между ними оператор возведения в степень. То, что это делает, - это шаг вперед и возведение в степень путем многократного умножения.GolfScript (24 символа - 5 = 19 баллов)
безумно медленно
(или 20 символов)
намного быстрее
источник
Python, 70
При этом используются вложенные
eval
вызовы, в итоге получая строку,"a*a*a*a...*a"
которая оценивается. Почти половина баллов тратится на получение аргументов ... хотя я заметил, что некоторые другие решения не беспокоятся об этом.источник
input()
или использоватьeval(raw_input())
Cheersexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
ungolfed:
объяснение:
plus, mul, high (: = pow), тетрация - все работает одинаково. Общий шаблон может быть извлечен как рекурсивный метод, который принимает два BigInts и базовую функцию:
Подчеркивания являются заполнителями для чего-то, что вызывается в этой последовательности, например, сложение plus (a, b) = (a + b); поэтому ( + ) - это функция, которая принимает два аргумента и добавляет их (a + b).
к сожалению, у меня возникают проблемы с размером стека. Это работает для небольших значений для 4 (например: 2) или если я уменьшу глубину на один шаг:
Исходный код состоит из 112 символов, и если он действителен, то получится 107. Возможно, я узнаю, как увеличить стек
Расширенный алгоритм может быть преобразован в хвостовые рекурсивные вызовы:
Хвостовой рекурсивный вызов длиннее исходного метода, но в длинной версии не вызвал переполнение стека - однако он не дает результата в разумные сроки. t (2,4) в порядке, но t (3,3) уже был остановлен мной через 5 минут. Тем не менее, это очень элегантно, не так ли?
А теперь то же самое, что и выше: используйте вонючее умножение (мы даже получаем прибыль, отказываясь от бонуса в 5, потому что мы экономим 7 символов: win = 4 символа)
вызов:
время выполнения: 1 мс.
источник
Br ** nfuck, 128-5 = 123 байта
Ввод осуществляется в форме символов с кодовыми точками чисел, желаемых в качестве входных данных. Выход такой же.
Объяснение
придет, когда у меня будет времяниже. Получу ли я бонусные баллы за то, что не использовал возведение в степень, умножение или даже сложение?Это работает (проверено) для
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
, и2 4
. Я пытался3 3
, но он работал в течение нескольких часов без завершения (в моей реализации Java - возможно, не оптимально) (РЕДАКТИРОВАТЬ: в EsotericIDE @ Timwi [Это здорово! Вы все должны попробовать]. Не повезло.). Теоретически это работает до размера ячейки конкретной реализации.источник
Python, 161 - 5 (без оператора *) = 156
взывать:
источник
4***3
?!m
функцию наm=lambda x,y:sum(x for _ in r(y))
Perl, 61 символ
вот странный
использование:
источник
Mathematica ,
4033Это не совсем соответствует правилам, но в любом случае это не оспаривает самый короткий код, и я надеюсь, что он будет кому-то интересен.
Это создает функцию «тетрации» при запуске, но аргументы должны быть заданы в обратном порядке. Пример:
источник
Fold[g, 1, #2~Table~{#}] &[3, 4]
будет производить,g[g[g[1, 4], 4], 4]
например.m[Times]
производитFold[Times, 1, Table[#2, {#1}]] &
, что является степенной функцией:m[Times][5, x]
--->x^5
; этот же метод используется для этой новой степенной функции для получения функции тетратации. По логике можно начать с этого,Plus
но это почти сразу не получается.t[h_, n_] := Sum[h, {i, n}]
. Тогда бегиm[m@t][3, 4]
.Sum[h, n]
.)Haskell:
5851 символ с умножением или без него.Ungolfed:
Более короткое определение происходит от вставки «bump» и определения пользовательской версии «iterate». К сожалению, результат невозможен, но начинание с (*) вместо (+) дает приличную скорость. В
ghci
:источник
Руби
6659 символовисточник
1
), когда второй входной номер равен0
; скорее,e(x,0)
возвращает значениеx
.Питон, 112 символов
Числа должны быть первым и вторым аргументом:
python this.py 4 3
**
оператор не используется.*
используемый. Это довольно просто реализовать, точно так же**
, но стоит более 5 символов.источник
*
реализацию, я считаю, что глубина рекурсии была бы слишком большой4 3
.C
11710599 символовEDIT: Объединять две функции
p
иr
в одну, сэкономив несколько символов.Из 99 символов 52 выполняют фактические вычисления (включая определения переменных). Остальные 47 предназначены для обработки ввода и вывода.
BUG: плохо обрабатывает полномочия 0 (напримерЭто не ошибка, я забыл, что0 2
). Должен найти минимальную стоимость исправления.0 2
не определено.Успешно обрабатывает
4 3
, и даже дает точный результат. Тем не менее, может быть неточным для некоторых меньших чисел.Печатает номер с трейлингом
.000000
.источник
Фактор, 187 символов
Перед гольфом:
Я не удалил оператор умножения
*
. Если бы я это сделал, то мне нужно было бы добавить некоторую логику, выражающую, что сумма пустой последовательности равна 0, а не 1. Эта дополнительная логика будет стоить больше, чем бонус -5.Нарушитель правил, 124 + 10 = 134 символа
Эта программа имеет более низкий балл, но оператор возведения в степень
^
нарушает правила. В правилах написано «(количество символов) + (10 * (количество операторов power))», поэтому я применил штраф +10. Тем не менее, правила также гласят: «Не используйте оператор« power »», поэтому любая программа, использующая этот штраф, нарушает правила. Поэтому эта программа из 134 символов не является правильным ответом, и я должен представить свою более длинную программу из 187 символов в качестве ответа.источник
Haskell 110 - 5 = 105
Тетрация Пеано Стиль. Это самое безумно медленное из возможных решений, просто предупреждение, но оно также избегает даже сложения.
Это зависит от того, хватит ли у вас терпения набрать числа Пеано (и не покажет ответ. Если вы действительно хотите запустить его, добавьте несколько строк (90 символов):
источник
Рубин,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
источник
Луа: 133 символа, без умножения
Первоначально я собирался использовать хаки с повторением строк для ложного умножения, но ему нравится терпеть неудачу при больших значениях. Я мог бы использовать динамическую компиляцию и loadstring, чтобы уменьшить его, но здесь уже поздно ... Мне нужен сон.
Ввод «4 3» в выводы стандартного ввода:
источник
VBA, 90 символов
* Возможно, бонус без умножения не достаточно хорош. Я думаю, что ответ без умножения намного интереснее, но это кодовый гольф, так что он не самый лучший. Вот ответ без
*
, и лучший (более короткий и лучший результат) ответ с этим:90 символов, без степенных операторов, использует умножение = 90
116 символов, без силовых операторов, без бонуса умножения (-5) = 111
ПРИМЕЧАНИЕ: VBA имеет проблемы с печатью числа, когда результат очень большой (то есть
4, 3
), но он вычисляет правильно, поэтому, если, например, вы хотите ИСПОЛЬЗОВАТЬ это число, вам будет хорошо. Кроме того, даже БОЛЬШИЕ числа переполнены (то есть3, 4
).источник
Perl 6 , 32 байта
Попробуйте онлайн!
(1, { [*] a xx $_ } ... *)
это ленивая последовательность, которая генерирует Power Tower, каждый элемент представляет собой список, который состоит из первого входного параметраa
replicated (xx
), количество раз равное предыдущему элементу ($_
), этот список затем сокращается с помощью умножения ([*]
). Из этой последовательности мы просто вынимаемb
-ый элемент.источник
Лямбда-исчисление, 10-5
(с использованием церковного кодирования и De Bruijn Indeces )
λλ(1λ13)λ1
объяснение
Без Де Брейны индексы:
λa,b.(b λc.ca)λc.c
:Если вы определите,
exp_a(x)=a^x
эта программа определяет,a↑↑b=exp_a^b(1)
где^b
обозначается ее изменение.Я не уверен, разрешено ли это, потому что
ca
технически это эквивалентно тому,a^c
что оно не является действительно встроенным, и только побочный эффект от того, как целые числа кодируются в лямбда-исчислении.источник
Javascript: 116 символов
t ('4 3') Выходы:
источник
Питон
(111)(113) нет *6 *** 3 - 36 тыс. Цифр))
Upd: нужно добавить начальное значение, чтобы соответствовать t (X, 0) = 1
источник
Haskell: 88-5 символов без умножения, 59 символов с умножением
Без умножения:
Есть, вероятно, способы, которыми я мог бы немного поиграть в гольф.
С умножением:
И, наконец, не разглаженная программа:
Вероятно, это самый простой способ решить эту проблему: определить умножение как повторное сложение, возведение в степень как повторное умножение и тетрацию как повторное возведение в степень.
источник
Ракетка 58 (нет *)
источник
Common Lisp, 85 символов
Я пытался делать умножения путем повторного сложения, но это было больше, чем 5 символов. То же самое с макролетами, декларации не стоили завоеваний.
Другое решение, вдохновленное решением Python от Boothby. Это на 1 символ меньше, чем в приведенном выше решении.
источник
Питон 3 - 68
(включая штраф в 10 баллов для оператора)
источник
Ябасич , 71 байт
Функция , которая принимает входной сигнал
a
иb
как пространство разделителей строки.Попробуйте онлайн!
источник
р 71 - 5 = 66 байт
Попробуйте онлайн!
-5 за уклонение *, что оказалось сложнее, чем я ожидал. Он взрывается очень быстро и не будет работать (если у него не было больше памяти), но он удовлетворяет всем необходимым критериям.
источник