Golf la radice xᵗʰ di x


24

Mentre mi annoiavo al liceo (quando avevo la metà della mia età attuale ...), ho scoperto che f ( x ) = x ( x -1 ) aveva alcune proprietà interessanti, incluso ad esempio che il massimo f per 0 ≤ x è f ( e ) e che l' energia di legame per nucleo di un isotopo può essere approssimata come 6 × f ( x ÷ 21) ...

In ogni caso, scrivere la funzione più breve o il programma che calcola la x esima radice di x per qualsiasi numero nel dominio della tua lingua.

Esempi di casi

Per tutte le lingue

     -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

Per le lingue che gestiscono numeri complessi

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

Per le lingue che gestiscono gli infiniti

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

Per le lingue che gestiscono sia infiniti che numeri complessi

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

̃∞indica l' infinito diretto .


1
Ecco una trama Wolfram Alpha per il real positivo x. Se si omettono i xlimiti nella query, Wolfram Alpha includerà valori negativi di xdove il valore della funzione dipende da una scelta di "ramo" per il logaritmo complesso (o per una funzione complessa simile).
Jeppe Stig Nielsen,

Che dire delle lingue che non gestiscono il potere dei decimali?
Leaky Nun,

1
@KennyLau Sentiti libero di postare con una nota che lo dice, specialmente se l'algoritmo funzionerebbe, se la lingua lo supportasse.
Adám

Risposte:


38

TI-BASIC, 3 byte

Ans×√Ans

TI-BASIC utilizza i token, quindi Anse ×√sono entrambi a un byte.

Spiegazione

Ansè il modo più semplice per fornire input; è il risultato dell'ultima espressione. ×√è una funzione per la x'th radice di x, quindi ad esempio 5×√32è 2.


8
Per quanto ne so ans, conterebbe come input di hardcoding in variabili e non sembra essere un metodo di input accettato per il code-golf . In tal caso, creare un programma completo o una funzione.
Flawr

4
@flawr Posso vedere quello che stai dicendo, ma sembra che sia sempre stato fatto così. Forse merita un meta post?
NinjaBearMonkey,

3
Ansè STDIN / STDOUT per TI-Basic.
Timtech,

5
stdine stdoutsono flussi di testo, generalmente per input e output di testo interattivi. Ansnon è interattivo, a differenza di altre funzioni in TI-BASIC, che sono interattive.
Olathe,

7
@flawr Il motivo Ansè generalmente accettato perché il suo valore è impostato da qualsiasi espressione (le espressioni sono separate da :). Pertanto qualcosa di simile 1337:prgmXTHROOTinserirà 1337, che assomiglia molto all'input tramite CLA in un linguaggio normale.
lirtosiast

23

Gelatina, 2 byte

Provalo online!

Come funziona

*İ    Main link. Input: n

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

Jelly non ha una pila. Una diade seguita da una monade in una catena monadica si comporta come le forcelle di APL.
Dennis,

3
No, J's ^%è un hook (che non esiste in Dyalog APL), non un fork. Il codice Jelly e APL è difficile da confrontare poiché Jelly è da sinistra a destra. L'equivalente più vicino sarebbe ÷*⊢(anche una forcella), che calcola a (1/x)**xcausa della diversa direzione. Poiché gli atomi di Jelly non sono sovraccarichi (sono monadici o diadici, ma mai entrambi), possono esserci forcelle monadiche da 1,2,1 e 2,1.
Dennis,

Grazie per il chiarimento. Naturalmente, sono abbastanza incuriosito da Jelly (che penso ancora dovrebbe essere chiamato ȷ o qualcosa di simile).
Adám,

17

Javascript (ES2016), 11 byte

x=>x**(1/x)

Raramente uso ES7 su ES6.


2
x=>x**x**-1funziona anche di nuovo per 11 byte.
Neil,

7
Tutti salutano il nuovo operatore esponenziale!
mbomb007,

15

Python 3, 17 byte

lambda x:x**(1/x)

Spiega da sé


7
Mi piace abbastanza lambda x:x**x**-1, ma non è più breve.
Seequ

1
@Seeq La tua espressione ha la stessa lunghezza, ma ha il vantaggio di lavorare sia in Python 2 che in 3.
mathmandan,

1
Il più breve di Python 2 è lambda x:x**x**-1, quindi è lo stesso in 2 e 3.
mbomb007,

Non sono riuscito a trovare questa risposta per anni ed ero davvero seccato quando l'ho fatto.

12

Haskell, 12 11 byte

Grazie @LambdaFairy per aver fatto un po 'di magia:

(**)<*>(1/) 

La mia vecchia versione:

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

4
(**)<*>(1/)è di 11 byte.
Lambda Fairy,

@LambdaFairy Grazie! Ti dispiace spiegare? Sembra che tu stia facendo un po 'di magia con funzioni parzialmente applicate ma dato che sono abbastanza nuovo in Haskell, non capisco davvero come
funzioni

Questo utilizza il fatto che una funzione a 1 argomento può essere considerata un funzione applicativa (la "monade del lettore"). L' <*>operatore prende un applicativo che produce una funzione e un applicativo che produce un valore e applica la funzione al valore. Quindi, in questo caso, un modo strabiliante per applicare una funzione a 2 argomenti a una funzione a 1 argomento.
MathematicalOrchid,

2
La funzione <*>prende 3 argomenti, due funzioni fe ged un argomento x. È definito come (<*>) f g x = f x (g x), vale a dire si applica fa xe g x. Qui viene parzialmente applicato fe gtralasciato x, dove f = (**)e g = (1/)(un'altra funzione parzialmente applicata (una sezione) che calcola il valore reciproco del suo argomento). Così ( (**)<*>(1/) ) xè (**) x ((1/) x)o scritta in infisso: x ** ((1/) x)e con la sezione risolto: x ** (1/x). - Nota: qui <*>viene utilizzato nel contesto della funzione e si comporta diversamente in altri contesti.
nimi,

@nimi Quindi è l'equivalente del Scombinatore cioè S (**) (1 /)?
Neil

10

J, 2 byte

^%

Provalo online! .

Come funziona

^%  Monadic verb. Argument: y

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

Stavo per scrivere questa risposta. Sono troppo lento in questo.
Bijan

1
@Bijan Sembra che oltre un anno sia troppo lento. : P
Dennis

Vedo, gioco a golf da una settimana ormai.
Bijan

9

Pyth, 3 byte

@QQ

Sfida fondamentale, soluzione banale ...

(non competitivo, 1 byte)

@

Questo utilizza la funzione di input implicito presente in una versione di Pyth che ha postdatato questa sfida.


Questa soluzione è precedente alla caratteristica dell'input implicito?
Leaky Nun,

@KennyLau Sì, da molto tempo. Ma ho comunque modificato la soluzione a un byte.
Maniglia della porta


8

Java 8, 18 byte

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

Java non è all'ultimo posto?!?!

Prova con quanto segue:

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

È il fatto che è una funzione
CalculatorFeline,

6

Java, 41 byte

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

Non esattamente competitivo perché Java, ma perché no?


1
Benvenuti in PPCG! Penso che potresti perdere un tipo di ritorno su questa funzione.
uno spaghetto il

Oops, sono diventato sciatto. Una risposta Java 8 ha già battuto questa ovviamente ...
Darrel Hoffman,

6

MATL , 5 byte

t-1^^

Provalo online!

t       % implicit input x, duplicate
 -1     % push -1
   ^    % power (raise x to -1): gives 1/x
    ^   % power (raise x to 1/x). Implicit display

6

Mathematica, 8 7 4 7 byte

#^#^-1&

Più risposte solo integrate e ora anche più brevi! No. Per definizione, la risposta successiva dovrebbe essere di 13 byte. (Fibonacci!) Il modello è ancora rotto. :(


1
# ^ # ^ - 1 e salva 1 byte.
njpipeorgan,

ORA è golf.
Adám,

1
ORA è golf.
Calcolatrice

1
Quando verrà rilasciato Mthmtca, governeremo questo consiglio.
Michael Stern,

1
Sicuramente Surdnon è valido in quanto richiede due argomenti?
LLlAMnYP,

5

Perl 5, 10 byte

9 byte più 1 per -p

$_**=1/$_

5

R, 19 17 byte

function(x)x^x^-1

-2 byte grazie a @Flounderer


Perché no x^(1/x)? Modifica: x^x^-1sembra funzionare anche.
Flounderer,

È uno snippet, e apparentemente alla gente non piacciono gli snippet.
Calcolatrice

@CatsAreFluffy è la definizione di una funzione.
Mnel

5

Rubino, 15 byte

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

Ungolfed:

->è l' operatore stabby lambda dove a=->nequivale aa = lambda {|n|}


5

NARS APL, 2 byte

√⍨

NARS supporta la funzione, che fornisce la th-esima radice di ⍵. L'applicazione del pendolarismo (⍨) fornisce una funzione che, se usata in modo monadico, applica il suo argomento ad entrambi i lati di una determinata funzione. Pertanto √⍨ xx √ x.

Altri APL, 3 byte

⊢*÷

Questo è un treno di funzioni, ovvero (F G H) x(F x) G H x. La monade è identità, la diade *è potere e la monade ÷è inversa. Pertanto, ⊢*÷è x elevato a 1 / x .


5

Python 2 - 56 byte

La prima risposta effettiva, se ho ragione. Usa il metodo di Newton.

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

Le funzioni sono a posto.
Calcolatrice

5

CJam, 6 byte

rd_W##

Provalo online!

Come funziona

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

Piloni , 5 byte.

ideAe

Come funziona.

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 byte

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

La seconda riga definisce una funzione lambda anonima. Può essere utilizzato assegnandolo a un puntatore a funzione e chiamandolo, o semplicemente chiamandolo direttamente.

Provalo online


Non ^funziona in C ++ come in C?
Takra,

2
@ minerguy31: ^è bit per bit o in C (e C ++).
Marin

4

Via Lattea 1.6.5 , 5 byte

'1'/h

Spiegazione

'      ` 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 byte

j.1\/^

Nessun collegamento online perché l'IDE online non funziona (in particolare, l'espiazione è interrotta)

Spiegazione:

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

oh hey l'hai fatto yay
fase


4

Pyke (commit 29), 6 byte

D1_R^^

Spiegazione:

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

Haz link pls?
gatto

Oh, pensavo volessi dire che non c'è implementazione disponibile. Sì, l'interprete non deve essere ospitato , basterà un link al repository / fonte (o documenti)
cat

4

C # - 18 43 41 byte

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

-2 ciao grazie a @VoteToClose

Provalo

Nota:

Primo vero tentativo di golf - So che potrei farlo meglio.


Benvenuti nella folla! È proprio grazie ai nuovi arrivati ​​che faccio sfide banali come questa.
Adám,

Fisso. Grazie per avermi informato di questo
EnragedTanker,

@crayzeedude Nessun problema. Bel lavoro e ancora, benvenuto in PPCG!
Alex A.

C # ha float?
Addison Crump,

Anzi lo fa.
EnragedTanker,

4

C, 23 byte

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

Questo definisce una funzione macro pche valutaa radice di a.

Grazie a Dennis per avermi ricordato che gccnon è necessariomath.h essere inclusi.

Grazie a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ per avermi ricordato che lo spazio dopo il primo )non è necessario.

Provalo online


Con GCC, non è necessario includere math.h.
Dennis,

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

4

dc , 125 byte

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

A differenza dell'altra risposta in cc, questo funziona per tutto verox maggiori o uguali a 1 (1 ≤ x ). Preciso a 4-5 posizioni dopo il decimale.

Avrei incluso un link TIO qui, ma per qualche motivo questo genera un errore di segmentazione con la versione lì ( dc 1.3) mentre lo fa non con la mia versione locale ( dc 1.3.95).

Spiegazione

Dato dcche non supporta l'innalzamento dei numeri in esponenti non interi da calcolare x^(1/x), questo sfrutta il fatto che:

Vantaggio

Quindi, per calcolare ln(x), questo sfrutta anche il fatto che:

Advantage2

il cui integrale definito da 1 to (b = x)è approssimato numericamente in incrementi di10^-5 dell'uso della seguente formula di somma:

Formula di somma.

La somma risultante viene quindi moltiplicata 1/xper ottenere ln(x)/x. e^(ln(x)/x)viene infine calcolato utilizzando la e^xserie Maclaurin a 100 termini come segue:

e ^ x Serie Maclaurin.

Ciò si traduce in un output relativamente accurato di x^(1/x).


1
+1 Questa deve essere una delle migliori risposte in cc. Lo sto aggiungendo ai segnalibri!
Kritixi Lithos,

@KritixiLithos Grazie! Apprezzo le parole gentili. :)
R. Kap

3

PHP 5.6, 32 30 29 byte

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

o

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

30-> 29, grazie Dennis!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.