Башня бесконечной силы


22

Соревнование

Очень просто, учитывая вход x, рассчитать его бесконечную башню власти!

x^x^x^x^x^x...

Для вас, любящих математику, это xбесконечная тетрация .

Имейте в виду следующее:

x^x^x^x^x^x... = x^(x^(x^(x^(x...)))) != (((((x)^x)^x)^x)^x...)

Удивлен, у нас не было «простого» математического задания, связанного с этим! *

Предположения

  • xвсегда будет сходиться
  • Отрицательные и комплексные числа должны быть в состоянии обрабатываться
  • Это , поэтому побеждают младшие байты !
  • Ваши ответы должны быть правильными, по крайней мере, до 5 десятичных знаков

Примеры

Input >> Output

1.4 >> 1.8866633062463325
1.414 >> 1.9980364085457847
[Square root of 2] >> 2
-1 >> -1
i >> 0.4382829367270323 + 0.3605924718713857i
1 >> 1
0.5 >> 0.641185744504986
0.333... >> 0.5478086216540975
1 + i >> 0.6410264788204891 + 0.5236284612571633i
-i >> 0.4382829367270323 -0.3605924718713857i
[4th root of 2] >> 1.239627729522762

* (Кроме более сложной задачи здесь )


1
Я не думаю, что эта башня сходится при x = −2 или x = −0.5.
Андерс Касеорг

@AndersKaseorg Я согласен, хотя все программы, кажется, имеют один и тот же сходящийся ответ. Почему они не сходятся?
Гравитон

2
x = −2 притягивается к 8-циклу, а x = −0.5 притягивается к 6-циклу. (Моя программа все еще дает ответ в этих случаях, но это одна из точек в цикле, а не фиксированная точка; это не указывает на сходимость.)
Андерс Касеорг

@AndersKaseorg Ага, очень интересно. Вы случайно не знаете, почему «8» для -2 и «6» для -0,5? Просто из любопытства конечно.
Гравитон

2
Вы можете запускать итерации так же легко, как и я, но вот картинка: commons.wikimedia.org/wiki/File:Tetration_period.png
Андерс Касеорг

Ответы:



10

Pyth,  4  3 байта

вычеркнуто 4 все еще регулярно 4; (

u^Q

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

Как это работает

u       first repeated value under repeated application of G ↦
 ^QG        input ** G
    Q   starting at input

2
Вам не нужно последнее G, оно будет заполнено автоматически.
FryAmTheEggman

@FryAmTheEggman Правильно, спасибо!
Андерс Касеорг

7

Haskell , 100 63 байта

Для входов, которые не сходятся (например, -2), это не прекратится:

import Data.Complex
f x=until(\a->magnitude(a-x**a)<1e-6)(x**)x

Большое спасибо @OrjanJohansen за то, что научили меня untilи спасли мне 37байты!

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


1
Вы можете сократить это с помощью untilфункции. Попробуйте онлайн!
Орджан Йохансен

Ухоженная! Не знал until, спасибо большое.
მოიმო

7

Python 3 , 40 39 35 байт

  • Спасибо @ Örjan Йохансену за байт: d>99вместо d==99: еще 1 итерация за меньшее количество байт
  • Спасибо @Uriel за 4 байта: мудрое использование факта, который x**Trueоценивает x в x**(d>99or g(x,d+1)). Выражение в терминах оценивается как True для глубины, превышающей 99, и, таким образом, возвращает переданное значение.

Рекурсивная лямбда с максимальной глубиной 100, т.е. для глубины 100 возвращает одно и то же значение. На самом деле не зависит от конвергенции, поэтому ожидайте неожиданного для чисел с не сходящимися значениями для функции.

g=lambda x,d=0:x**(d>99or g(x,d+1))

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


1
По ссылке tio вы можете заменить complex('j')на1j
Mr. Xcoder

1
d>99делает еще одну итерацию и короче.
Орджан Йохансен

1
сохранить 4 байта с g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueоцениваетx
Uriel

@ Uriel, это действительно умно ..... Спасибо !!!
officialaimm

6

Python 3, 37 30 27 байт

-7 байт от @FelipeNardiBatista.
-3 байта от @xnor

Я больше не помню Python, но мне удалось перенести мой ответ Ruby и побить другой ответ Python 3: D

lambda x:eval('x**'*99+'1')

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


1
К вашему сведению, кажется, что f-строки были впервые введены в Python 3.6: см. Python.org/dev/peps/pep-0498 . (Это объясняет, почему ваш код не работал для меня в 3.5.2.) Просто подумал, что я упомяну об этом на случай, если кто-то еще будет сбит с толку.
математика

1
Вам не нужно подставлять в значение x, eval('x**'*99+'1')работает
xnor

@xnor doh, конечно, это так :) спасибо
Даниеро

@xnor Neat - я применил то же самое в своем ответе на Ruby, и это как-то исправило это :)
daniero

+1, я хлопаю себя за то, что забыл о существовании eval ....: D
officialaimm

4

Mathematica, 12 байт

#//.x_:>#^x&

Принимает число с плавающей точкой в ​​качестве ввода.


4

J , 5 байт

^^:_~

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

объяснение

Сначала я покажу, какая команда выполняется после синтаксического анализа ~в конце, и пошаговое руководство будет для нового глагола.

(^^:_~) x = ((x&^)^:_) x

((x&^)^:_) x  |  Input: x
      ^:_     |  Execute starting with y = x until the result converges
  x&^         |    Compute y = x^y

Решение J здесь действительно хорошо. Чтобы разбить вашу первую строку на более мелкое зерно, правильно ли сказать, что происходит следующее: (^^:_) создает новый двоичный глагол с помощью выражения power, затем наречие self ~делает этот глагол монадическим, так что при задании аргумента xон расширяется до x (^^:_) x. левый xвпоследствии «залипает», давая ((x&^)^:_) xна вашу заметку, и только правый аргумент изменяется во время итерации?
Иона

1
@Jonah Конечно, давая два аргумента в диаду с силой, x u^:n y, левый аргумент связан с диадой с образованием монады, которая вложенный nраз на y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
миль

4

C # (.NET Core) , 79 78 байт

x=>{var a=x;for(int i=0;i++<999;)a=System.Numerics.Complex.Pow(x,a);return a;}

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

Я выбрал итерацию до i= 999, потому что, если я повторял до 99, некоторые примеры не достигли требуемой точности. Пример:

Input:                      (0, 1)
Expected output:            (0.4382829367270323, 0.3605924718713857)
Output after 99 iterations: (0.438288569331222,  0.360588154553794)
Output after 999 iter.:     (0.438282936727032,  0.360592471871385)

Как видите, после 99 итераций мнимая часть вышла из строя с 5-го знака после запятой.

Input:                      (1, 1)
Expected output:            (0.6410264788204891, 0.5236284612571633)
Output after 99 iterations: (0.64102647882049,   0.523628461257164)
Output after 999 iter.:     (0.641026478820489,  0.523628461257163)

В этом случае после 99 итераций мы получаем ожидаемую точность. На самом деле, я мог бы повторять до i= 1e9 с тем же количеством байтов, но это сделало бы код значительно медленнее

  • 1 байт сохранен благодаря анонимному пользователю.

1
+1 Для сложного класса я даже не знала, что существует.
TheLethalCoder

1
@TheLethalCoder, как и я, пока я не погуглил. :-)
Чарли


2

Рубин, 21 20 байт

->n{eval'n**'*99+?1}

Отказ от ответственности : кажется, что Ruby возвращает некоторые странные значения при возведении комплексного числа в степень. Я предполагаю, что для этой задачи нецелесообразно исправить весь математический модуль Руби, но в противном случае результаты этой функции должны быть правильными. редактировать : применил последние изменения из моего ответа Python 3, и вдруг он как-то дает те же, ожидаемые результаты :)

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


Выньте место после eval.
Value Ink

Ваша исходная версия завершилась неудачно в сложном тестовом примере, потому что она уклонялась от строки "0+1i**0+1i**0+1i**...", которая неправильно обрабатывается, поскольку **имеет более высокий приоритет, чем +.
Орджан Йохансен

@ ØrjanJohansen да, ты прав. Наверное, меня обманул тот факт, что #inspectи #to_sвозвращают разные значения. Перед отправкой первоначального ответа я провел некоторое тестирование в irb и увидел, что, например, ввод Complex(1,2)в REPL даст (1+2i), включая скобки. Однако при строковом значении скобки не включаются, поэтому приоритет, как вы указали, испортил его.
Даниеро

Я думал, что evalиспользование было запрещено.
В. Куртуа

@ V.Courtois Хорошо. Но это не так.
Даниеро

2

TI-BASIC, 16 байтов

Вход и выход хранятся в Ans.

Ans→X
While Ans≠X^Ans
X^Ans
End

1

R , 36 33 байта

- 3 байта благодаря Ярко Дуббелдаму

Reduce(`^`,rep(scan(,1i),999),,T)

Читает со стандартного ввода. Reduces справа, чтобы получить показатели в правильном порядке.

Попробуй это (функция)

Попробуй это (стандартный)


1
scan(,1i)работает. Похоже на то, как scan(,'')работает.
JAD

@JarkoDubbeldam, конечно! иногда мой мозг не работает.
Джузеппе


1

МАТЛ , 20 10 байт

сократить до половины благодаря @LuisMendo

t^`Gw^t5M-

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

Это мой первый и мой первый раз, когда я использую MATL, так что я уверен, что его можно легко переиграть.


Добро пожаловать на сайт и приятного первого ответа! Несколько предложений: XIIэквивалентно t. Вы также можете избавиться XHи Hс помощью автоматического буфера обмена M, то есть ttt^`yw^t5M-]bb-x. И в последней части, вместо удаления ненужных значений, которые вы можете использовать &, что говорит неявной функции отображения показывать только верхнюю часть. Таким образом, вы можете использовать ttt^`yw^t5M-]&и сохранить несколько байтов.
Луис Мендо

Кроме того , первый tне нужен, и используя Gвместо другого , tвы можете избежать &и , таким образом , оставить ]неявной: t^`Gw^t5M-. Эй, мы сократили количество байтов вдвое!
Луис Мендо

@LuisMendo Спасибо за отличные советы! Мне нужно многое узнать о MATL, но мне это очень нравится.
Чинаски

Рад слышать!
Луис Мендо

0

Perl 6 , 17 байт

{[R**] $_ xx 999}

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

R**является оператором обратного возведения в степень; x R** yравно y ** x. [R**]сокращает список из 999 копий входного аргумента с обратным возведением в степень.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.