Гольф xᵗʰ корінь x


24

Поки нудьгував у середній школі (коли я був у половині свого теперішнього віку ...), я виявив, що f ( x ) = x ( x -1 ) має деякі цікаві властивості, зокрема, наприклад, що максимальний f для 0 ≤ x - f ( е ), і що енергія зв’язку на нуклон ізотопу може бути приблизна як 6 × f ( x ÷ 21) ...

У будь-якому випадку, напишіть найкоротшу функцію або програму, яка обчислює x- й корінь x для будь-якого числа у домені вашої мови.

Приклади справ

Для всіх мов

     -1   >       -1
   ¯0.2   >    -3125
   ¯0.5   >        4
    0.5   >     0.25
      1   >        1
      2   >    1.414
      e   >    1.444 
      3   >    1.442
    100   >    1.047
  10000   >    1.001

Для мов, які обробляють складні числа

   -2   >        -0.7071i
    i   >            4.81         
   2i   >    2.063-0.745i
 1+2i   >   1.820-0.1834i
 2+2i   >   1.575-0.1003i

Для мов, які обробляють нескінченності

-1/∞   >   0    (or ∞ or ̃∞)
   0   >   0    (or 1 or ∞)
 1/∞   >   0
   ∞   >   1
  -∞   >   1

Для мов, які обробляють як нескінченності, так і складні числа

 -∞-2i   >   1      (or ̃∞)

̃∞позначає спрямовану нескінченність .


1
Ось сюжет Wolfram Alpha для позитивного реального x. Якщо опустити xобмеження у запиті, Wolfram Alpha включить негативні значення, xде значення функції залежить від вибору "гілки" для складного логарифму (або для подібної складної функції).
Джеппе Стіг Нільсен

Що з мовами, які не обробляють потужність десяткових знаків?
Leaky Nun

1
@KennyLau Не соромтеся розміщувати повідомлення з приміткою, яка говорить про це, особливо якщо алгоритм працював, якби мова підтримувала його.
Adám

Відповіді:


38

TI-BASIC, 3 байти

Ans×√Ans

TI-BASIC використовує маркери, так Ansі ×√обидва один байт.

Пояснення

Ansце найпростіший спосіб дати вклад; це результат останнього виразу. ×√є функцією для x'th кореня x, наприклад 5×√32, 2.


8
Наскільки я знаю, ansце вважатиметься жорстким кодуванням вхідних змінних і не здається прийнятим методом введення для коду-гольфу . У цьому випадку, будь ласка, складіть повну програму чи функцію.
недолік

4
@flawr Я бачу, що ти говориш, але, здається, це завжди робилося так. Можливо, це вимагає метапосту?
NinjaBearMonkey

3
Ansє STDIN / STDOUT для TI-Basic.
Timtech

5
stdinі stdoutє текстовими потоками, як правило, для інтерактивного введення та виводу тексту. Ansне є інтерактивним, на відміну від деяких інших функцій TI-BASIC, які є інтерактивними.
Олате

7
@flawr Причина Ansзазвичай приймається через те, що її значення встановлюється будь-яким виразом (вирази розділені між собою :). Тому щось на зразок 1337:prgmXTHROOTбуде вводити 1337, що дуже схоже на введення через CLA на звичайній мові.
lirtosiast

23

Желе, 2 байти

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

Як це працює

*İ    Main link. Input: n

 İ    Inverse; yield 1÷n.
*     Power (fork); compute n ** (1÷n).

У желе немає стопки. Діада, що йде за монадою в монадійному ланцюжку, поводиться як вилки APL.
Денніс

3
Ні, J's ^%- це гачок (якого не існує в Dyalog APL), а не виделка. Jelly та APL-код важко порівняти, оскільки Jelly зліва направо. Найближчим еквівалентом буде ÷*⊢(також вилка), яка обчислюється (1/x)**xчерез різний напрямок. Оскільки атоми Джеллі не перевантажені (вони або монадіальні, або діадичні, але ніколи і те й інше), можуть бути монадні 1,2,1- та 2,1-вилки.
Денніс

Дякуємо за роз’яснення. Природно, мене дуже заінтригує Jelly (яку я все-таки думаю, що слід назвати ȷ чи щось подібне.)
Adám

17

Javascript (ES2016), 11 байт

x=>x**(1/x)

Я рідко коли-небудь використовую ES7 над ES6.


2
x=>x**x**-1також працює, знову на 11 байт.
Ніл

7
Усі вітайте нового оператора експоненції!
mbomb007

15

Пітон 3, 17 байт

lambda x:x**(1/x)

Самопояснення


7
Мені дуже подобається lambda x:x**x**-1, але це не коротше.
seequ

1
@Seeq Вираз має однакову довжину, але він має перевагу працювати в Python 2 і 3.
mathmandan

1
Python 2 найкоротший lambda x:x**x**-1, тому він такий самий у 2 та 3.
mbomb007

Я не міг знайти цю відповідь протягом століть і був дуже роздратований, коли це зробив.

12

Haskell, 12 11 байт

Дякуємо @LambdaFairy за те, що зробили якусь магію:

(**)<*>(1/) 

Моя стара версія:

\x->x**(1/x)

4
(**)<*>(1/)становить 11 байт.
Фея лямбда

@LambdaFairy Дякую! Ви не проти пояснити? Схоже, ви робите якісь чари з частково застосованими функціями, але, оскільки я зовсім новачок у Haskell, я не дуже розумію, як це працює =)
flawr

Для цього використовується той факт, що функцію з 1 аргументом можна вважати функціональним функтором ("монада читача"). <*>Оператор приймає аплікативного , який виробляє функцію, і аплікативного , який виробляє значення, і застосовує функцію до значення. Отже, у цьому випадку розумний спосіб застосувати 2-аргументаційну функцію до функції 1-аргументу.
MathematicalOrchid

2
Функція <*>бере 3 аргументи, дві функції fі gта аргумент x. Він визначається як (<*>) f g x = f x (g x), тобто застосовується fдо xі g x. Тут він частково застосований fі gвиходить з нього x, де f = (**)і g = (1/)(інша частково застосована функція (розділ), яка обчислює взаємне значення його аргументу). Так ( (**)<*>(1/) ) xце (**) x ((1/) x)чи написано в ІНФІКС: x ** ((1/) x)і з секцією вирішено: x ** (1/x). - Примітка: <*>тут використовується функціональний контекст і по-різному поводиться в інших контекстах.
німі

@nimi Отже, це еквівалент Sкомбінатора, тобто S (**) (1 /)?
Ніл

10

J, 2 байти

^%

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

Як це працює

^%  Monadic verb. Argument: y

 %  Inverse; yield 1÷y.
^   Power (hook); compute y ** (1÷y).

Я збирався написати цю відповідь. Я занадто повільний у цьому.
Біджан

1
@Bijan Більше року занадто повільно, здається. : P
Денніс

Я бачу, я вже тиждень займаюся гольфом.
Біджан

9

Pyth, 3 байти

@QQ

Тривіальний виклик, тривіальне рішення ...

(неконкурентоспроможний, 1 байт)

@

Для цього використовується функція неявного введення, наявна у версії Pyth, яка ставить після цього завдання.


Чи є це рішення раніше особливістю неявного введення?
Leaky Nun

@KennyLau Так, давно. Але я все-таки відредагував однобайтове рішення.
Дверна ручка


8

Java 8, 18 байт

n->Math.pow(n,1/n)

Java не на останньому місці?!?!

Тест із наступним:

import java.lang.Math;

public class Main {
  public static void main (String[] args) {
    Test test = n->Math.pow(n,1/n);
    System.out.println(test.xthRoot(6.0));
  }
}

interface Test {
  double xthRoot(double x);
}

Справа в тому, що це функція
CalculatorFeline

6

Java, 41 байт

float f(float n){return Math.pow(n,1/n);}

Не зовсім конкурентоспроможний тому, що Java, але чому б і ні?


1
Ласкаво просимо до PPCG! Думаю, вам може не вистачити тип повернення для цієї функції.
спагето

На жаль, неохайно. Відповідь Java 8 вже обіграла цю, звичайно, ...
Даррел Гофман


6

Математика, 8 7 4 7 байт

#^#^-1&

Більше вбудованих відповідей, а тепер ще коротших!Ні. За визначенням наступною відповіддю має бути 13 байт. (Фібоначчі!) Шаблон все ще порушений. :(


1
# ^ # ^ - 1 і зберігає 1 байт.
njpipeorgan

ЗАРАЗ це гольф.
Адам

1
ЗАРАЗ це гольф.
CalculatorFeline

1
Коли Mthmtca буде звільнений, ми будемо керувати цією радою.
Майкл Стерн

1
Напевно просто Surdне вірно, оскільки для цього потрібні два аргументи?
LLlAMnYP


5

R, 19 17 байт

function(x)x^x^-1

-2 байти завдяки @Flounderer


Чому ні x^(1/x)? Редагувати: x^x^-1здається, теж працює.
Флонджер

Це фрагмент, і, мабуть, люди не люблять фрагменти.
CalculatorFeline

@CatsAreFluffy - це визначення функції.
мнель

5

Рубін, 15 байт

a=->n{n**n**-1}

Безголівки:

->- стабільний лямбда-оператор, a=->nякий еквівалентнийa = lambda {|n|}


5

NARS APL, 2 байти

√⍨

NARS підтримує функцію, яка дає ⍺-й корінь ⍵. Застосування комуту (⍨) дає функцію, яка при використанні монадично застосовує свій аргумент до обох сторін даної функції. Тому √⍨ xx √ x .

Інші APL, 3 байти

⊢*÷

Це функціональний потяг, тобто (F G H) x(F x) G H x. Монадика - це ідентичність, діадична *сила, а монадична ÷- зворотна. Тому, ⊢*÷як х підвищували до 1 / х .


5

Python 2 - 56 байт

Перша реальна відповідь, якщо я прав. Використовує метод Ньютона.

n=x=input();exec"x-=(x**n-n)/(1.*n*x**-~n);"*999;print x

Функції нормально.
CalculatorFeline



4

Пілони , 5 байт.

ideAe

Як це працює.

i # Get command line input.
d # Duplicate the top of the stack.
e # Raise the top of the stack to the power of the  second to the top element of the stack.
A # Push -1 to the stack (pre initialized variable).
e # Raise the top of the stack to the power of the second to the top element of the stack.
  # Implicitly print the stack.


4

C ++, 48 байт

#include<math.h>
[](auto x){return pow(x,1./x);}

Другий рядок визначає функцію анонімної лямбда. Його можна використовувати, призначивши його вказівнику функції та викликавши його, або просто викликавши його безпосередньо.

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


Хто ^не працює в C ++ , як це робить в C?
такра

2
@ minerguy31: ^порозрядний xor в C (і C ++).
Марін


4

О , 6 байт

j.1\/^

Немає онлайн-посилання, оскільки інтернет-IDE не працює (конкретно, експоненція порушена)

Пояснення:

j.1\/^
j.      push two copies of input
  1\/   push 1/input (always float division)
     ^  push pow(input, 1/input)

агов ви зробили це яй
фаза


4

Пайк ( ввести 29), 6 байт

D1_R^^

Пояснення:

D      - duplicate top
 1_    - load -1
   R   - rotate
    ^  - ^**^
     ^ - ^**^

Може хаз посилання PLS?
кіт

О, я думав, ти маєш на увазі, що немає доступної реалізації. Так, перекладача не потрібно розміщувати , достатньо буде лише посилання на репо / джерело (або документи)
кіт

4

C # - 18 43 41 байт

float a(float x){return Math.Pow(x,1/x);}

-2 баї завдяки @VoteToClose

Спробуй

Примітка:

Перша реальна спроба гольфу - я знаю, що міг би зробити це краще.


Ласкаво просимо до натовпу! Саме завдяки новачкам я роблю подібні дрібниці.
Adám

Fixed. Thanks for informing me about this
EnragedTanker

@crayzeedude No problem at all. Nice job and again, welcome to PPCG!
Alex A.

Does C# have float?
Addison Crump

Indeed it does.
EnragedTanker

4

C, 23 bytes

#define p(a)pow(a,1./a)

This defines a macro function p which evaluates to the ath root of a.

Thanks to Dennis for reminding me that gcc doesn't require math.h to be included.

Thanks to @EʀɪᴋᴛʜᴇGᴏʟғᴇʀ for reminding me that the space after the first ) is not needed.

Try it online


With GCC, you don't need to include math.h.
Dennis

-1 byte: #define p(a)pow(a,1./a)
Erik the Outgolfer

4

dc, 125 bytes

15k?ddsk1-A 5^*sw1sn0[A 5^ln+_1^+ln1+dsnlw!<y]syr1<y1lk/*sz[si1[li*li1-dsi0<p]spli0<p]so0dsw[lzlw^lwlox/+lw1+dswA 2^!<b]dsbxp

Unlike the other dc answer, this works for all real x greater than or equal to 1 (1 ≤ x). Accurate to 4-5 places after the decimal.

I would have included a TIO link here, but for some reason this throws a segmentation fault with the version there (dc 1.3) whereas it does not with my local version (dc 1.3.95).

Explanation

As dc does not support raising numbers to non-integer exponents to calculate x^(1/x), this takes advantage of the fact that:

Advantage

So, to calculate ln(x), this also takes advantage of the fact that:

Advantage2

whose definite integral from 1 to (b = x) is numerically-approximated in increments of 10^-5 using the following summation formula:

Summation Formula.

The resulting sum is then multiplied by 1/x to get ln(x)/x. e^(ln(x)/x) is then finally calculated using the e^x Maclaurin Series to 100 terms as follows:

e^x Maclaurin Series.

This results in our relatively accurate output of x^(1/x).


1
+1 This has got to be one of the best dc answers out there. I'm bookmarking this!
Kritixi Lithos

@KritixiLithos Thank you! I appreciate the kind words. :)
R. Kap

3

PHP 5.6, 32 30 29 bytes

function($x){echo$x**(1/$x);}

or

function($x){echo$x**$x**-1;}

30->29, thank you Dennis!

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