Golf a raiz xᵗʰ de x


24

Enquanto estava entediado no ensino médio (quando eu tinha metade da minha idade atual ...), descobri que f ( x ) = x ( x -1 ) tinha algumas propriedades interessantes, incluindo, por exemplo, que o máximo de f para 0 ≤ x é f ( e ), e que a energia de ligação por núcleo de um isótopo pode ser aproximada como 6 × f ( x ÷ 21) ...

De qualquer forma, escreva a função ou programa mais curto que calcula a xésima raiz de x para qualquer número no domínio do seu idioma.

Exemplos de casos

Para todos os idiomas

     -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

Para idiomas que lidam com números complexos

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

Para idiomas que lidam com infinitos

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

Para idiomas que lidam com infinitos e números complexos

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

̃∞denota infinito direcionado .


11
Aqui está um gráfico Wolfram Alpha para real positivo x. Se você omitir os xlimites na consulta, o Wolfram Alpha incluirá valores negativos de xonde o valor da função depende de uma opção de "ramificação" para o logaritmo complexo (ou para uma função complexa semelhante).
Jeppe Stig Nielsen

E os idiomas que não lidam com o poder dos decimais?
Leaky Nun

11
@KennyLau Sinta-se à vontade para postar uma nota que diz isso, especialmente se o algoritmo funcionar, se a linguagem o suportar.
Adám 31/03/16

Respostas:


38

TI-BASIC, 3 bytes

Ans×√Ans

TI-BASIC utiliza fichas, de modo Anse ×√são ambos um byte.

Explicação

Ansé a maneira mais fácil de fornecer informações; é o resultado da última expressão. ×√é uma função para a x'a raiz de x, por exemplo, 5×√32é 2.


8
Tanto quanto sei ans, contaria como entradas codificadas em variáveis ​​e não parece ser um método de entrada aceito para código-golfe . Nesse caso, faça um programa completo ou uma função.
flawr

4
Flawr @ Eu posso ver o que você está dizendo, mas parece que sempre foi feito assim. Talvez justifique uma meta post?
NinjaBearMonkey 24/02

3
Ansé STDIN / STDOUT para TI-Basic.
Timtech

5
stdine stdoutsão fluxos de texto, geralmente para entrada e saída de texto interativa. Ansnão é interativo, ao contrário de outras funções no TI-BASIC, que são interativas.
Olathe

7
@flawr Geralmente, o motivo Ansé aceito porque seu valor é definido por qualquer expressão (as expressões são separadas por :). Portanto, algo como a 1337:prgmXTHROOTentrada 1337, que se parece muito com a entrada via CLAs em um idioma normal.
precisa saber é o seguinte

23

Gelatina, 2 bytes

Experimente online!

Como funciona

*İ    Main link. Input: n

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

Jelly não tem uma pilha. Uma díade seguida por uma mônada em uma cadeia monádica se comporta como os garfos da APL.
Dennis

3
Não, J ^%é um gancho (que não existe no Dyalog APL), não um garfo. O código Jelly e APL é difícil de comparar, pois o Jelly é da esquerda para a direita. O equivalente mais próximo seria ÷*⊢(também um garfo), que calcula (1/x)**xdevido à direção diferente. Como os átomos de Jelly não estão sobrecarregados (eles são monádicos ou diádicos, mas nunca os dois), pode haver garfos monádicos de 1,2,1 e 2,1.
Dennis

Obrigado pelo esclarecimento. Naturalmente, estou muito intrigado com Jelly (que eu ainda acho que deve ser nomeado ȷ ou algo similar.)
Adám

17

Javascript (ES2016), 11 bytes

x=>x**(1/x)

Eu raramente uso ES7 sobre ES6.


2
x=>x**x**-1também funciona, novamente para 11 bytes.
Neil

7
Todos saudam o novo operador de exponenciação!
mbomb007

15

Python 3, 17 bytes

lambda x:x**(1/x)

Auto-explicativo


7
Eu gosto bastante lambda x:x**x**-1, mas não é mais curto.
see

11
@Seeq Sua expressão é o mesmo comprimento, mas tem a vantagem de trabalhar tanto em Python 2 e 3.
mathmandan

11
Python 2 de mais curto é lambda x:x**x**-1, por isso, é a mesma em 2 e 3.
mbomb007

Eu não consegui encontrar essa resposta por muito tempo e fiquei realmente irritado quando o fiz.

12

Haskell, 12 11 bytes

Obrigado @LambdaFairy por fazer um pouco de mágica:

(**)<*>(1/) 

Minha versão antiga:

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

4
(**)<*>(1/)é de 11 bytes.
fada Lambda

@LambdaFairy Thanks! Você se importa de explicar? Parece que você está fazendo alguma mágica com funções parcialmente aplicadas, mas como eu sou muito novo para Haskell Eu realmente não entendo como isso funciona =)
flawr

Isso usa o fato de que uma função de 1 argumento pode ser considerada um functor aplicativo (a "mônada do leitor"). O <*>operador pega um aplicativo que produz uma função e um aplicativo que produz um valor e aplica a função ao valor. Portanto, nesse caso, uma maneira alucinante de aplicar uma função de 2 argumentos a uma função de 1 argumento.
MatemáticoOrchid

2
A função <*>leva 3 argumentos, duas funções fe ge um argumento x. É definido como (<*>) f g x = f x (g x), isto é, aplica-se fa xe g x. Aqui é parcialmente aplicado fe gdeixado de fora x, onde f = (**)e g = (1/)(outra função parcialmente aplicada (uma seção) que calcula o valor recíproco de seu argumento). Então ( (**)<*>(1/) ) xé (**) x ((1/) x)ou escrito em infix: x ** ((1/) x)e com a seção resolvido: x ** (1/x). - Nota: <*>é usado no contexto da função aqui e se comporta de maneira diferente em outros contextos.
nimi 24/02

@nimi Então é o equivalente do Scombinador, ou seja, S (**) (1 /)?
Neil

10

J, 2 bytes

^%

Experimente online! .

Como funciona

^%  Monadic verb. Argument: y

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

Eu ia escrever esta resposta. Eu sou muito lento nisso.
21717 Bijan

11
@Bijan Mais de um ano muito lento, ao que parece. : P
Dennis

Entendo, só jogo golfe há uma semana.
precisa

9

Pitão, 3 bytes

@QQ

Desafio trivial, solução trivial ...

(não competitivo, 1 byte)

@

Isso usa o recurso de entrada implícita presente em uma versão do Pyth que pós-data deste desafio.


Esta solução é anterior ao recurso de entrada implícita?
gotejante Nun

@KennyLau Sim, há muito tempo. Mas eu editei a solução de um byte de qualquer maneira.
Maçaneta da porta


8

Java 8, 18 bytes

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

Java não está em último lugar?!?!

Teste com o seguinte:

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);
}

É o fato de que é uma função
CalculatorFeline

6

Java, 41 bytes

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

Não é exatamente competitivo porque Java, mas por que não?


11
Bem-vindo ao PPCG! Eu acho que você pode estar perdendo um tipo de retorno nesta função.
a spaghetto

Opa, ficou desleixado. A Java 8 resposta já venceu este claro ...
Darrel Hoffman


6

Mathematica, 8 7 4 7 bytes

#^#^-1&

Mais respostas internas , e agora ainda mais curtas! Não. Por definição, a próxima resposta deve ser 13 bytes. (Fibonacci!) O padrão ainda está quebrado. :(


11
# ^ # ^ - 1 e economiza 1 byte.
Njpipeorgan

Agora é jogado.
Adám 23/02/16

11
Agora é jogado.
CalculatorFeline

11
Quando o Mthmtca for lançado, governaremos este fórum.
Michael Stern

11
Certamente Surdnão é válido, pois requer dois argumentos?
LLlAMnYP

5

Perl 5, 10 bytes

9 bytes mais 1 para -p

$_**=1/$_

5

R, 19 17 bytes

function(x)x^x^-1

-2 bytes graças a @Flounderer


Por que não x^(1/x)? Edit: x^x^-1parece funcionar também.
Solha

É um trecho e, aparentemente, as pessoas não gostam de trechos.
CalculatorFeline

@CatsAreFluffy é a definição de uma função.
mnel

5

Ruby, 15 bytes

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

Ungolfed:

->é o operador lambda stabby em que a=->né equivalente aa = lambda {|n|}


5

NARS APL, 2 bytes

√⍨

O NARS suporta a função, que fornece a ésima-raiz de ⍵. A aplicação de comutação (⍨) fornece uma função que, quando usada monadicamente, aplica seu argumento aos dois lados da função especificada. Portanto √⍨ xx √ x.

Outros APLs, 3 bytes

⊢*÷

Este é um trem funcional, ou seja, (F G H) x(F x) G H x. Monádico é identidade, diádico *é poder e monádico ÷é inverso. Portanto, ⊢*÷é x elevado a 1 / x .


5

Python 2 - 56 bytes

A primeira resposta real, se eu estiver correto. Usa o método de Newton.

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

Funções estão bem.
CalculatorFeline

5

CJam, 6 bytes

rd_W##

Experimente online!

Como funciona

rd     e# Read a double D from STDIN and push it on the stack.
  _    e# Push a copy of D.
   W   e# Push -1.
    #  e# Compute D ** -1.
     # e# Compute D ** (D ** -1).


4

Postes , 5 bytes.

ideAe

Como funciona.

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 bytes

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

A segunda linha define uma função lambda anônima. Ele pode ser usado atribuindo-o a um ponteiro de função e chamando-o ou apenas chamando-o diretamente.

Experimente online


Não ^funciona em C ++ como em C?
takra 23/02

2
@ minerguy31: ^é bit a bit xor em C (e C ++).
marinus

4

Via Láctea 1.6.5 , 5 bytes

'1'/h

Explicação

'      ` Push input
 1     ` Push the integer literal
  '    ` Push input
   /   ` Divide the STOS by the TOS
    h  ` Push the STOS to the power of the TOS

x ** (1 / x)


Uso

$ ./mw <path-to-code> -i <input-integer>

4

O, 6 bytes

j.1\/^

No online link because the online IDE doesn't work (specifically, exponentiation is broken)

Explanation:

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

oh hey you did it yay
phase


4

Pyke (commit 29), 6 bytes

D1_R^^

Explanation:

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

Can haz link pls?
cat

Oh, I thought you meant there's no implementation available. Yes, the interpreter doesn't have to be hosted, just a link to the repo / source (or docs) will suffice
cat

4

C# - 18 43 41 bytes

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

-2 byes thanks to @VoteToClose

Try it out

Note:

First actual attempt at golfing - I know I could do this better.


Welcome to the crowd! It is exactly because of newcomers that I make trivial challenges like this.
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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.