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 √⍨ x↔ x √ 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.