xのxᵗʰルートをゴルフする


24

高校に開けられますが(私は半分私の現在の年齢...だったとき)、私はその見つかったFX)= X xは-1最大ことなどを含む、いくつかの興味深い性質、持っていたfは 0≤ xがあるfはe)、および同位体の核子あたり結合エネルギーfx ÷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、複素数値(または同様の複素関数)の「ブランチ」の選択に依存する関数値の負の値を含めます。
ジェッペスティグニールセン

小数のべき乗を処理しない言語についてはどうですか?
リーキー修道女

1
@KennyLauは、特にそのアルゴリズムが機能する場合、言語でサポートされていれば、その旨を記したメモを投稿してください。
アダム

回答:


38

TI-BASIC、3バイト

Ans×√Ans

TI-BASICはトークンを使用するためAns×√両方とも1バイトです。

説明

Ans入力を提供する最も簡単な方法です。それは最後の式の結果です。×√はxのx番目のルートの関数なので、たとえば5×√322です。


8
私の知る限り、ans変数への入力をハードコーディングするものとみなされ、code-golfの入力メソッドとして受け入れられているようには見えません。その場合は、完全なプログラムまたは機能を作成してください。
-flawr

4
@flawrあなたが言っていることはわかりますが、いつもこのように行われているようです。多分それはメタ投稿を保証しますか?
NinjaBearMonkey

3
AnsTI-Basicの場合はSTDIN / STDOUTです。
ティムテック

5
stdinそしてstdoutテキストは通常、インタラクティブなテキスト入力と出力のために、ストリームされています。AnsインタラクティブなTI-BASICの他の機能とは異なり、インタラクティブではありません。
オレーセ

7
@flawrその理由Ansは通常、その値が任意の式によって設定されるためです(式はで区切られます:)。したがって1337:prgmXTHROOT、入力1337のようなものは、通常の言語のCLAを介した入力によく似ています。
リルトシアスト

23

ゼリー、2バイト

オンラインでお試しください!

使い方

*İ    Main link. Input: n

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

Jellyにはスタックがありません。モナドチェーンのモナドが続くダイアドは、APLのフォークのように動作します。
デニス

3
いいえ、J ^%はフックではなく(Dyalog APLには存在しません)、フォークではありません。Jellyは左から右であるため、JellyとAPLコードを比較するのは困難です。最も近い等価物は÷*⊢(フォークでもあります)、(1/x)**x異なる方向のために計算します。Jellyのアトムはオーバーロードされていないため(モナドまたはダイアディックのいずれかですが、両方ではありません)、モナド1,2,1-および2,1-フォークが存在する可能性があります。
デニス

説明をありがとう。当然のことながら、私はかなりゼリーに興味をそそられています(私はまだȷまたは似たような名前を付ける必要がありだと思います。)
アダム

17

Javascript(ES2016)、11バイト

x=>x**(1/x)

私はめったにES6でES7を使用することはありません。


2
x=>x**x**-1また、11バイトで動作します。
ニール

7
すべてが新しいべき乗演算子を歓迎します!
mbomb007

15

Python 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つの引数、2つの関数fgおよび1つの引数を取りますx。それは次のように定義され(<*>) f g x = f x (g x)、それが適用される。すなわちfxg x。ここでは、部分的に適用されていますfし、g除外xf = (**)およびg = (1/)(それの引数の逆数を算出し、他の部分的に適用された機能(セクション))。そう( (**)<*>(1/) ) x(**) x ((1/) x):中置で書かれたかx ** ((1/) x)、解決セクションで:x ** (1/x)。-注:<*>ここでは関数コンテキストで使用され、他のコンテキストでは異なる動作をします。
nimi

@nimiそれで、Sコンビネータと同等、つまりS(**)(1 /)?
ニール


9

Pyth、3バイト

@QQ

些細な挑戦、些細な解決策...

(非競合、1バイト)

@

これは、Pythのバージョンに存在する暗黙的な入力機能を使用して、この課題を先送りします。


このソリューションは、暗黙的な入力の機能よりも前のものですか?
リーキー修道女

@KennyLauはい、久しぶりです。しかし、とにかく1バイトソリューションを編集しました。
ドアノブ


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へようこそ!この関数の戻り値の型が欠落している可能性があると思います。
spaghetto

おっと、ずさんになりました。AのJava 8の答えすでに...もちろん、これを破った
ダレル・ホフマン


6

Mathematica、8 7 4 7バイト

#^#^-1&

組み込みのみの回答が増え、さらに短くなりました!いや。 定義では、次の回答は13バイトでなければなりません。(フィボナッチ!)パターンはまだ壊れています。:(


1
#^#^-1&は1バイトを節約します。
njpipeorgan

今ではゴルフです。
アダム

1
今ではゴルフです。
電卓

1
Mthmtcaがリリースされたら、このボードを支配します。
マイケルスターン

1
確かSurdに、2つの引数を必要とするだけで有効ではありませんか?
LLlAMnYP


5

R、19 17バイト

function(x)x^x^-1

@Floundererのおかげで-2バイト


どうしてx^(1/x)?編集:も動作するx^x^-1ようです。
ヒラメ

それはスニペットであり、明らかに人々はスニペットが好きではありません。
CalculatorFeline

@CatsAreFluffy関数の定義です。
mnel

5

ルビー、15バイト

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

ゴルフをしていない:

->あるstabbyラムダ演算子a=->nに相当しますa = lambda {|n|}


5

NARS APL、2バイト

√⍨

NARSは、theの⍺番目のルートを与える関数をサポートします。通勤(⍨)を適用すると、単項で使用されたときに、指定された関数の両側に引数を適用する関数が得られます。したがって、√⍨ xx √ x

その他のAPL、3バイト

⊢*÷

これはすなわち、関数列車です(F G H) x(F x) G H x。モナドはアイデンティティであり、ダイアディック*は力であり、モナド÷は逆です。したがって、⊢*÷あるX 1 /に上げX


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

2行目は、匿名のラムダ関数を定義しています。関数ポインターに割り当てて呼び出すか、直接呼び出すだけで使用できます。

オンラインで試す


^CのようにC ++では機能しませんか?
タクラ

2
@ minerguy31:^C(およびC ++)のビット単位のxor。
マリヌス

4

天の川1.6.5、5バイト

'1'/h

説明

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


使用法

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

4

O、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

Pyke(コミット29)、6バイト

D1_R^^

説明:

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

hazはplsをリンクできますか?

ああ、利用可能な実装がないことを意味すると思った。はい、インタープリターをホストする必要はありません。レポ/ソース(またはドキュメント)へのリンクで十分です

4

C#-18 43 41バイト

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

-2 Byes、@ VoteToCloseに感謝

やってみて

注意:

ゴルフの最初の実際の試み-私はこれをもっとうまくできると知っています。


群衆へようこそ!私がこのような些細な挑戦をするのは、まさに新参者のためです。
アダム

一定。このことについて私に知らせてくれてありがとう
-EnragedTanker

@crayzeedude問題ありません。よろしくお願いします。PPCGへようこそ。
アレックスA.

C#にはありfloatますか?
アディソンクランプ

確かにそうです。
-EnragedTanker

4

C、23バイト

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

これは、path番目のルートに評価されるマクロ関数を定義しaます。

含めるgcc必要がないことを思い出させてくれたデニスに感謝しmath.hます。

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀに、最初のスペース)が必要ないことを思い出させてくれてありがとう。

オンラインで試す


GCCでは、math.hを含める必要はありません。
デニス

-1バイト:#define p(a)pow(a,1./a)
エリックアウトゴルファー

4

dc、125バイト

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

他のDCの答えとは異なり、これは xは1(1 ≤ x)以上のすべての実数に対してます。小数点以下4〜5桁まで正確です。

ここにTIOリンクを含めますが、何らかの理由で、そこにバージョンのセグメンテーションエラーがスローされます(dc 1.3)でれますが、ローカルバージョン()ではありませdc 1.3.95

説明

dc計算に非整数の指数に数字を上げサポートしていませんx^(1/x)、これはその事実を利用しています:

利点

したがって、計算するためにln(x)、これは次の事実も利用します。

Advantage2

の定積分1 to (b = x)10^-5、次の加算式を使用して増分で数値的に近似されます。

加算式

次に、結果の合計に乗算し1/xてgetを取得しln(x)/xます。e^(ln(x)/x)その後、最終的にe^xMaclaurin Seriesを使用して次のように100項に計算されます。

e ^ x Maclaurinシリーズ

これにより、比較的正確なの出力が得られますx^(1/x)


1
+1これは、最高のDC回答の1つでなければなりません。これをブックマークしています!
クリチキシリトス

@KritixiLithosありがとうございます!優しい言葉に感謝します。:)
R.カップ

3

PHP 5.6、32の 30 29バイト

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

または

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

30-> 29、デニスありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.