累乗組み込みなしで整数xを累乗xにします


16

タスク-タイトルはほぼそれを要約しています。整数xxの累乗にし0<xます。

制限事項:

  • 累乗の使用、exp()ln()、およびその他の権限に関連する言語組み込み関数は、のようなpow()x^xx**x禁止されています。
  • 指定された整数が、選択したプログラミング言語の制限に適合すると仮定できます。

テストケース:

Input | Output
---------------
2     | 4
3     | 27
5     | 3125
6     | 46656
10    | 10000000000

これはであるため、バイト単位の最短プログラムが優先されます。


入力を文字列として受け入れることはできますか?
シャギー

これが再び開かれることを期待して、私はこれを編集しました。私は、ルール3を削除し、代わりにそれがOPはおそらく意図したように、完全なプログラムであることを述べた
氏Xcoder

@ Mr.Xcoderの方がはるかに優れていますが、2番目の制限を削除(言い換え)することをお勧めします。「関数ではありません」はJSを参加から除外しますか?また、チャレンジの目的のために、処理する必要が0あり、予想される出力を指定する(0または1その両方)ことをお勧めします。最後に、負の整数を処理しなければならないことは、このチャレンジに追加するのに適しています。
シャギー

@Shaggyはjsを追加し直しました... Apple Calculatorで0 ^ 0を計算し、1を返しました。Pythonもを返すため、1が選択された値であるはず1です0^0。しかし、Foundation+スウィフトは0を返します
氏Xcoder

1
@ Mr.Xcoder、処理する必要のない「制限」を削除し、0代わり0<xにリードインで指定しました。また、コードがエラーをスローしてはならないという制限を削除しました。言うまでもありません。必要に応じて気軽にロールバックしてください。
シャギー

回答:


15

APL(Dyalog)、4バイト

以下のためのx のx、取るのxを左引数としてX右引数として。

×/⍴⍨

すべてのケースをオンラインで試してください!

×/ の製品

⍴⍨ argはargをコピーします

そしてここに負の整数も処理するものがあります:

×/|⍴|*×

すべてのケースを試してください!

×/ の製品

| 絶対値

rの繰り返し

| 絶対値

* の力に

× サイン

組み込みのPowerプリミティブは次のとおりです。

x*y


9

Mathematica、16バイト

このバイト数で2つのソリューションがあります。

1##&@@#~Table~#&

ここで、#~Table~#nコピーのリストを作成しますn。次に、すべての引数を一緒に乗算するListヘッドが置き換えられ1##&ます。

Nest[n#&,1,n=#]&

これは、単純に入力を保存n乗算し、その後1nn回。


1
#~Product~{#}&
-alephalpha

1
@alephalphaああ、良い点。別の回答として投稿できます。
マーティンエンダー

5

JavaScript(ES6)、33 28 25 24バイト

n=>g=(x=n)=>--x?n*g(x):n

それを試してみてください

f=
n=>g=(x=n)=>--x?n*g(x):n
o.innerText=f(i.value=3)()
i.oninput=_=>o.innerText=f(+i.value)()
<input id=i min=1 type=number><pre id=o>


歴史

25バイト

f=(n,x=n)=>--x?n*f(n,x):n

28バイト

n=>eval(1+("*"+n).repeat(n))

33バイト

n=>eval(Array(n).fill(n).join`*`)

4

純粋なbash、43

echo $[$1<2?1:$[$1<2?2:$1]#`printf 1%0$1d`]

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

これがルールを過度に曲げているかどうかはわかりません-リストされている禁止されているビルトインは使用していませんが、ベース変換を使用しています。

  • printf 1%0$1d出力1nは、続いて0
  • $[b#a]a基数として扱う算術展開bであり、必要な結果が得られます。残念ながら、ベース<2は機能しないため、追加?:ビットは入力n = 1を処理します。

bashは符号付き64ビット整数(最大2 31 -1)を使用するため、最大入力は15 です。


私が抱えていたのと同じ問題、これはx = 1では機能しません。それにもかかわらず、非常に興味深いアプローチ。
マキシムミハイロフ

@MaxLawnboyそれを指摘してくれてありがとう-悲しいことに私の答えは肥大化した。おそらく、私は別の短いバージョン...把握することができます
デジタルトラウマ

クール。常にbashを学びたいと思っていましたが、常に怠慢でした=)

4

アリス、13バイト

/o
\i@/.&.t&*

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

説明

/o
\i@/...

これは、10進整数の読み取りと書き込みを行い、完全にCardinalモードで動作するプログラム(ほとんどの算術問題のプログラム)のフレームワークです。

.    Duplicate n.
&.   Make n copies of n.
t    Decrement the top copy to n-1.
&*   Multiply the top two values on the stack n-1 times, computing n^n.

4

標準ML、42バイト

fn x=>foldl op*1(List.tabulate(x,fn y=>x))

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

説明:

fn y => x                 (* An anonymous function that always returns the inputted value *)
List.tabulate(x, fn y=>x) (* Create a list of size x where each item is x *)
foldl op* 1               (* Compute the product of the entire list *)    

1
PPCGへようこそ!
マーティンエンダー

1
TIOには現在MLtonがあります。tio.run/nexus/…–
デニス

すごいね!ありがとう!
musicman523

3

ゼリー、3 バイト

ẋ⁸P

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

どうやって?

ẋ⁸P - Main link: x             e.g. 4
 ⁸  - link's left argument, x       4
ẋ   - repeat left right times       [4,4,4,4]
  P - product                       256

くそー、私はこれをやりたかった。:P
ハイパーニュートリノ

@Jonathan Allanは3バイトですか、それとも3つのワイド文字ですか?実際のコードのバイトサイズを正しく判断するために、ソースコードの16進ダンプを表示してください。;-)修正します

1
@ xakepp35 JellyはSBCSを使用し、ヘッダー内のバイトリンクはそれを指します。hexdumpを使用したプログラムはF7 88 50、意図したとおりに機能します。
デニス

@Dennis返信ありがとう!私は今までにそのような言語を想像することはできませんでした=)

3

Cubix、19バイト

..@OI:1*s;pu!vqW|($

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

ステップバイステップ

辺の長さが2の立方体に展開する

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 入力を受け取り、複製して1をプッシュします。これにより、カウンター、乗算器、および結果を含むスタックが設定されます。
  • *s; TOSを倍数にし、結果を以前のものと交換し、以前のものを削除します。
  • puカウンターアイテムをTOSに持ち込みます。Uターン。これはレーンの変更でしたが、バイトを削る必要がありました。
  • |($これは、バイトを節約するために行われました。ヒットすると、デクリメントがスキップされます。を反映し、カウンターをデクリメントし、キューブの周りの操作なしのラッピングをスキップします。
  • !vqWカウンターをテストします。本当にリダイレクトがスキップされる場合、カウンターをBOSに置き、車線を乗数に戻します。それ以外の場合はリダイレクトします。
  • |sO@これは、カウンターテストからリダイレクトされる終了シーケンスです。水平リフレクトを通過し、TOSをスワップして、結果をTOSに出力し、出力および停止します。

3

R、22バイト

xstdinから読み取ります。

prod(rep(x<-scan(),x))

xコピーのリストを生成し、xそのリストの要素の積を計算します。の場合x=0、はをrep返しますnumeric(0)。これはlengthの数値ベクトルです0が、prodその値は1です。0^0=1このメソッドでは、Rの組み込み累乗法と一致するため、非常にきれいです。

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


3

Linux用のx86_64マシン言語、14 11 10バイト

0:   6a 01                   pushq  $0x1
2:   58                      pop    %rax
3:   89 f9                   mov    %edi,%ecx
5:   f7 ef                   imul   %edi
7:   e2 fc                   loop   5
9:   c3                      retq

するには、オンラインでそれを試してみてください!、次のCプログラムをコンパイルして実行します。

const char h[]="\x6a\1\x58\x89\xf9\xf7\xef\xe2\xfc\xc3";

int main(){
  for( int i = 1; i < 4; i++ ) {
    printf( "%d %d\n", i, ((int(*)())h)(i) );
  }
}




2

05AB1E、3バイト

.DP

オンラインでお試しください!またはすべての例を試す

.D  # pop a,b    push b copies of a 
    # 05AB1E implicitly takes from input if there aren't enough values on the stack
    # For input 5, this gives us the array: [5,5,5,5,5]
  P # Take the product of that array
    # Implicit print

楽しそうですね.D。初めて使用したのを見ました。
魔法のタコUr

ああ、私はここで何が起こっているのかわかりません。=(

@ xakepp35それは役立ちますか?
ライリー



2

x86マシンコード(Linux)、18バイト

31 c0 ff c0 31 db 39 df 74 07 0f af c7 ff c3 eb f5 c3

次のようなC宣言が必要です。 extern int XpowX(int)です。

分解

XpowX:
  # edi : input register
  # ebx : counter
  # eax : result register
  xor  %eax, %eax    # result  = 0
  inc  %eax          # result += 1
  xor  %ebx, %ebx    # counter = 0
  loop:
    cmp  %ebx, %edi  # if (counter == input)
    je   done        #   return result
    imul %edi, %eax  # result  *= input
    inc        %ebx  # counter += 1
    jmp   loop
  done:
    ret



1

Perl 6、13バイト

{[*] $_ xx$_}

$_ xx $_(無名関数の引数である)の$_コピーのリストを評価し、そのリストを乗算で縮小します。$_$_[*]




1

ローダ、17バイト

{product([_]*_1)}

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

これは、ストリームからの入力を受け取る匿名関数です。

説明:

{product([_]*_1)}
{               } /* An anonymous function */
         [_]      /* An array containing the input value */
            *_1   /* repeated times the input value */
 product(      )  /* Product of all values in the array */

1

dc24 23 26 22バイト

これは、dcで再帰マクロを作成する最初の試みです。私はそれが次善策であり、多くを改善できると確信しています。

dsr1+[lrr1-d1<F*]dsFxp

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

編集:ありがとうeush77!-4バイト。


1
では機能しませんx=1
eush77

lr末尾のシーケンスをd先頭の2で置き換えることにより、2バイトを削減できます。
eush77

実際、それは必要ありません。初めて呼び出す前に、スタックの一番上をインクリメントするだけです。このようにすると、スタック上の(そしてもちろん)のxコピーx1xその後の乗算になります。ですから結末は単純になりえますdsFxp
eush77

@ eush77 2番目を削除してもlrここでは機能しないと言っていました。スタックベースの言語でゴルフをするのは初めてなので、非常に珍しい感じがします。ご協力いただきありがとうございます!
マキシムミハイロフ

1

バッチ、58バイト

@set n=1
@for /l %%i in (1,1,%1)do @set/an*=%1
@echo %n%

32ビット演算のため、1桁の入力に対してのみ機能します。


1

brainf * ck、148バイト

,[->+>+<<]>>[-<<+>>]++++++++[<------<------>>-]<[->>+>>+<<<<]>>[-<<+>>]>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>[-<<+>>]>>>]<<<++++++++[-<<++++++>>]<<.

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

組み込みなし;)

使い方

,                                       - get ascii input
[->+>+<<]                               - duplicate input
>>[-<<+>>]                              - shift inputs left to start
++++++++[<------<------>>-]             - convert ascii into input numbers
<[->>+>>+<<<<]                          - get loop intervals (same as input #)
>>[-<<+>>]                              - shift input back again
>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>  - iterated addition (multiplication)
[-<<+>>]>>>                             - Shift output back into input
]<<<++++++++[-<<++++++>>]<<.            - convert final output to ascii

一言で言えば、これはx(入力)自体を乗算することで機能しますx。(別名反復反復追加)。最終結果はx ^ xです。

I / O

プログラムは、単一のASCII入力を受け取り、ASCIIインデックスから48を引いたものとして処理します。マイナス48は、実際の数値の入力を正規化することである(4となります52- > 52-48- > 4)。9より大きい数字を入力するには、次に対応するASCII文字を使用します(:-> 58-48->10)。プログラムは同様の方法で出力します。

I / Oをテストする

INPUT > PROCESSED INPUT >> OUTPUT > TRANSLATED OUTPUT
1 > 1 >> 1 > 1
2 > 2 >> 4 > 4
3 > 3 >> K > 27

3を入力すると印刷可能なASCII文字がなくなるため、理論的には数字のみを印刷できます。ただし、実際にこのようなビジュアライザーで動作するすべての入力を確認できます。



1

Python、32バイト

f=lambda g,z=1:z>g or g*f(g,z+1)

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


PPCGへようこそ!f=部品を数える必要はないので、提出を30バイトに短縮できます
Steadybox

@Steadybox f=それが命名されている機能に依存しているので、それは、再帰的だから一部は、カウントされる必要がないf、正しく動作するために
musicman523

@ musicman523はい、あなたは正しいです。
-Steadybox

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