Нескінченна енергетична вежа


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.
Anders Kaseorg

@AndersKaseorg Я погоджуюся, хоча всі програми мають однакову збіжну відповідь. Чому вони не сходяться?
Гравітон

2
x = −2 приваблює 8-цикл, а x = −0,5 привертає до 6-циклу. (Моя програма все ще дає відповідь у цих випадках, але це один із пунктів циклу, а не фіксований момент; це не вказує на конвергенцію.)
Anders Kaseorg

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

2
Ви можете запускати ітерації так само легко, як я можу, але ось малюнок: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg

Відповіді:



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 Правильно, дякую!
Anders Kaseorg

7

Haskell , 100 63 байти

Для входів, які не конвергуються (напр. -2), Це не припиняється:

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

Дуже дякую @ ØrjanJohansen за те, що ви навчали мене untilта врятували мене на 37байтах!

Спробуйте в Інтернеті!


1
Це можна значно скоротити за допомогою untilфункції. Спробуйте в Інтернеті!
Ørjan Johansen

Акуратно! Не знав until, спасибі велике.
ბიმო

7

Python 3 , 40 39 35 байт

  • Дякую @ Ørjan Johansen за байт: d>99замість d==99: ще 1 ітерація для меншої кількості байтів
  • Дякуємо @Uriel за 4 байти: розумне використання факту, що x**Trueоцінює значення x in 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
Містер Xcoder

1
d>99робить ще одну ітерацію і коротше.
Ørjan Johansen

1
зберегти 4 байти з g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueоцінюєx
Урієль

@Uriel, це справді розумно ..... Дякую !!!
officialaimm

6

Python 3, 37 30 27 байт

-7 байт від @FelipeNardiBatista.
-3 байти від @xnor

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

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

Спробуйте в Інтернеті!


1
FYI, здається, що f-рядки вперше були введені в Python 3.6: див. Python.org/dev/peps/pep-0498 . (Це пояснило б, чому ваш код не працював для мене в 3.5.2.) Я просто подумав, що я згадаю про це, якщо хтось інший заплутався.
mathmandan

1
Вам не потрібно замінювати значення x, eval('x**'*99+'1')працює
xnor

@xnor doh, звичайно, це так :) дякую
daniero

@xnor Neat - те ж саме я застосував у своїй відповіді на Ruby, і це якось виправило :)
daniero

+1, я ляснув себе за те, забувши про існування Eval ....: D
officialaimm

4

Математика, 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 conj, тоді self adverb ~робить це дієслово монадичним, так що при наданні аргументу xйого розширюють на x (^^:_) x. зліва xзгодом "приклеюється", подаючи ((x&^)^:_) xна вашу нотатку, а під час ітерації змінюється лише правий аргумент?
Йона

1
@Jonah Sure, коли надає два аргументи діаді з владою, x u^:n yлівий аргумент пов'язаний з dyad, щоб утворити монаду, яка вкладена в 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}

Відмова : Схоже, що Рубі повертає деякі дивні значення, коли піднімає складне число на потужність. Я припускаю, що це завдання не вдається вирішити весь математичний модуль Рубі, але в іншому випадку результати цієї функції повинні бути правильними. Редагувати : застосовано останні зміни з моєї відповіді Python 3 і раптом це якось дає ті самі, очікувані результати :)

Спробуйте в Інтернеті!


Вийміть простір після eval.
Значення чорнила

Ваша оригінальна версія не вдалася на складному тест , оскільки він evaled рядки "0+1i**0+1i**0+1i**...", яка розбирає в неправильному напрямку , оскільки **має більш високий пріоритет , ніж +.
Ørjan Johansen

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

я думав eval використання заборонено.
В. Куртуа

@ V.Courtois Ok. Але це не так.
daniero


1

R , 36 33 байт

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

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

Читає від stdin. Reduces справа, щоб вказати експоненти, застосовані в правильному порядку.

Спробуйте (функція)

Спробуйте (stdin)


1
scan(,1i)працює. Подібно до того, як scan(,'')працює.
JAD

@JarkoDubbeldam звичайно! іноді мій мозок не працює.
Джузеппе


1

MATL , 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, але мені це дуже подобається.
Cinaski

Радий це чути!
Луїс Мендо

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