米とチェスの問題


41

インドの伝説によると、チェスゲームの発明者とされる人物が、彼のゲームでインドの皇帝に感銘を与えたので、尋ねられたものは何でも報われます。

男は彼が米で支払われたいと言った。彼は、チェス盤の最初の正方形に1粒、2枚目に2枚、3枚目に4枚、4枚目に8枚、というように64枚目まで米粒が欲しいと思っていました。

皇帝はその男がそのような小さな報酬を求めたことに驚いたが、彼の数学者が数え始めたとき、彼は彼の州の一つを失ってしまった。

仕事

仮定のチェス盤の辺の長さ(デフォルトのチェス盤では8)と平方間の乗数(凡例では2)を考慮して、皇帝が男性に支払う必要がある米の粒数を計算します。

ノート

  • 辺の長さは常に正の整数になります。乗数は、代わりに任意の種類の有理数にすることができます。

  • 選択した言語で非常に大きな数値を表示できない場合、プログラムが小さな入力を正しく処理できる限り問題ありません。

  • また、選択する言語が(指数表記で)大きな値を丸める場合、それらの値がほぼ正しい場合でも問題ありません。

テストケース

Input (side length, multiplier) => Output
8, 2                            => 18446744073709551615
3, 6                            => 2015539
7, 1.5                          => 850161998.2854
5, -3                           => 211822152361
256, 1                          => 65536
2, 2                            => 15
2, -2                           => -5

明示的な式

result = (multiplier ^ (side ^ 2) - 1) / (multiplier - 1)

上の間違った行いmultiplier = 1として、

1 ^ (side ^ 2) - 1 = 0
1 - 1 = 0
0 / 0 != side ^ 2 (as it should be)

得点

これはコードゴルフです。バイト単位の最短回答が優先されます。


4
おそらく、乗数が1のテストケースと0のテストケースが必要です(両方が有効であると仮定)。また、「何か」はかなり広いのですが、負の1の平方根は重要ですか?「じゃがいも」はいかがですか?;)「任意の実数」または何かをお勧めします。
FryAmTheEggman

4
If your language of choose can't display too large numbers, it's ok as long as your program can correctly process smaller inputs注意してください、それは過去に問題を引き起こしました。meta.codegolf.stackexchange.com/a/8245/31716
DJMcMayhem

24
...豊かな州だったに違いありません。今日でも、世界の米の年間生産量はまだ2 ^ 64粒未満です。
-vsz

1
@vsz実際、この男は殺されました。王に追加された金額は、王国全体を人間に与えるので、当然、より簡単な方法が採用されました。
cst1992

1
@ cst1992私が読んだバージョンでは、男は彼の要求をあきらめ、贈り物として領地を得たと言っています。
user6245072

回答:




23

APL、10バイト

⎕⊥1+0×⍳⎕*2

ユーザー入力を2回読み取るために使用されます。辺の長さをsに、乗数をmに保存すると、次のコードが得られます。

m⊥1+0×⍳s*2

そして、APLがこのコードを解析する方法は次のとおりです。

アルゴリズムの説明


4
または、関数トレインとして:⊣⊥1⍴⍨⊢×⊢(8バイト)インタラクティブREPLコマンドとして、⎕⊥×⍳⎕*2(7バイト)も機能します。
デニス

19

Python、40バイト

lambda n,m:eval('1+m*('*n*n+'0'+')'*n*n)

次のような文字列を生成および評価します

1+m*(1+m*(1+m*(1+m*(0))))

これは、項を含むホーナー化多項式として合計をエンコードしn*nます。

多くの異なる方法で、非常によく似たバイトカウントが得られました。

#String evaluation
lambda n,m:eval('1+m*('*n*n+'0'+')'*n*n)   #40

#Direct summation
lambda n,m:sum(m**i for i in range(n*n))   #40
lambda n,m:sum(map(m.__pow__,range(n*n)))  #41

#Direct formula
lambda n,m:n*n*(1==m)or(m**n**2-1)/(m-1)   #40

#Iterative sequence
f=lambda n,m,j=0:j<n*n and 1+m*f(n,m,j+1)  #41
def f(n,m):s=0;exec"s=s*m+1;"*n*n;print s  #41

#Recursive expression
#Fails due to float imprecision of square root
f=lambda n,m:n and 1+m*f((n*n-1)**.5,m)    #39*

2
ああ、私の悪い。とにかく、私はあなたが取ったすべての異なるアプローチを見るのが本当に好きです:)
FryAmTheEggman


11

Haskell、25バイト

n%m=sum$(m^)<$>[0..n*n-1]

リストを合計します[m^0, m^1, ..., m^(n*n-1)]


11

JavaScript(ES2016 / ES7)、31 29 28バイト

a=>b=>(b**(a*a)-1)/--b||a*a

@Bassdrop Cumberwubwubwubと@KaizoのES6バージョンだけですが、指数演算子を使用します。:)(代わりにコメントするのに十分な評判がありませんでした。)

編集:に/+(b-1)変更/--b(ありがとう@Neil)。

編集:カレーを使用するようになりました(@MamaFunRollに感謝)。


PPCGへようこそ!あなたの答えはかなり良いです!
-NoOneIsHere

ようこそ!+あなたはそれを省略して1つのバイトをオフに剃ることができるようにオペレータは:)、私は編集するのを忘れテストだった
Bassdrop Cumberwubwubwub

数式はm = 1で機能しません:3
user6245072

@ user6245072クロムカナリアを使用していますか?またはノード上で?ノードの場合は、調和フラグを有効にする
ニック・ニューマン

/--bあなたはバイトまたは2を救いますか?
ニール



8

ジャバスクリプトES6、59 37 35 34バイト

a=>b=>(Math.pow(b,a*a)-1)/--b||a*a` 

なんと19バイトを削り取ってくれた@Kaizoに感謝し、@ Neilはさらに2バイト、@ gcampbellはさらに1バイト削りました!

ここで試してみてください

別の壊れたバージョン

32バイト

(a,b)=>(Math.pow(b,a*a)-1)/(b-1)

原因となるNaNためb==1

30バイト

(a,b)=>(Math.pow(b,a*a)-1)/~-b

原因となるInfinityためb==1.5

28バイト

(a,b)=>~-Math.pow(b,a*a)/~-b

1いくつかの有効なテストケースの出力。

59バイトの古いバージョン

(a,b)=>Array(a*a).fill``.reduce((c,d,i)=>c+Math.pow(b,i),0)


32バイトのケースでb == 1のケースを処理しなかったのはなぜですか?40バイト:(a、b)=> b-1?(Math.pow(b、a * a)-1)/(b-1):a * a
Kaizo

あなたは正しい@Kaizo、私は馬鹿だ:D
Bassdrop Cumberwubwubwub

/~-b明らかに分数には良くありませんbが、動作する/--bはずです、いいえ?
ニール

ちなみに、私は古いバージョンを47バイトまでゴルフしました。– (a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
ニール

@Neilあなたは正しい、もちろん。それはあなたの答えを急ぐときにあなたが得るものです:pありがとう!
バスドロップCumberwubwubwub 16年

6

Java、132バイト

import java.math.*;Object e(int n,BigDecimal m){BigDecimal r=BigDecimal.ONE,a=r;for(n*=n;n>1;n--)r=r.add(a=a.multiply(m));return r;}

非ゴルフ

import java.math.*;

Object e(int n, BigDecimal m) {
    BigDecimal r = BigDecimal.ONE, a = r;
    for (n *= n; n > 1; n--)
        r = r.add(a = a.multiply(m));
    return r;
}

ノート

  • これは、OPが必要とする任意の大きな出力に対して機能します(Javaが大きな数をサポートしていると、それが短くなります)。

出力

Input:      8 2.0
Expected:   18446744073709551615
Actual:     18446744073709551615

Input:      3 6.0
Expected:   2015539
Actual:     2015539

Input:      7 1.5
Expected:   850161998.2854
Actual:     850161998.285399449204543742553141782991588115692138671875

Input:      5 -3.0
Expected:   211822152361
Actual:     211822152361

Input:      256 1.0
Expected:   65536
Actual:     65536

Input:      2 2.0
Expected:   15
Actual:     15

Input:      2 -2.0
Expected:   -5
Actual:     -5

Input:      263 359.9
Expected:   ?
Actual:     9709...[176798 digits]...7344.7184...[69160 digits]...6291

6

R、18バイト

sum(m^(1:s^2-1))

説明:

sum(               # Calculate sum
    m              # Multiplier
     ^             # Exponentiate
      (1:s^2-1))   # Generate sequence from 1 to s(ide)^2-1


4

Haskell、30バイト

n#m=sum$take(n^2)$iterate(*m)1

または同等に長い

n%1=n^2
n%m=(m**(n*n)-1)/(m-1)

最初のバージョンは、で1繰り返し乗算を開始しmます。次にn^2、このシーケンスの最初の数を合計します。2番目のバージョンは、他の回答に見られる明示的な式です。


できませんn#m=sum$(m^)<$>[0..n*n-1]か?
xnor

@xnor:ああ、いいね。別の答えを出すには十分に違うと思います。自分で投稿してください。
-nimi

4

J、10バイト

+/@:^i.@*:

使用法

私はいくつかの整数をマークしx、正確な結果を得るために拡張された整数を使用するサフィックス。

   f =: +/@:^i.@*:
   2x f 8
18446744073709551615
   3x f 6
75047317648499560
   6x f 3
2015539
   1.5 f 7
8.50162e8
   _3x f 5
211822152361
   1 f 256
65536
   2 f 2
15
   _2 f 2
_5

説明

+/@:^i.@*:
        *:  Square the value s to get s^2
     i.@    Make a range from 0 to s^2 exclusive, [0, 1, ..., s^2-1]
    ^       Using m as the base, calculate the power with the range
            [m^0, m^1, ..., m^(s^2-1)]
+/@:        Sum the entire list and return it

#.*:$*APL Dudeによる6バイト。
FrownyFrog

4

Mathcad、[tbd]バイト(〜11)

ここに画像の説明を入力してください

Mathcadの組み込みの加算演算子を使用します。また、正確な式を生成するためのシンボリックプロセッサの簡略化も示します。

Mathcadは、2つの処理エンジンを効果的に並列実行します。1つは標準IEEE 64/80ビット浮動小数点で、もう1つは任意の長さのシンボリックプロセス(MuPad)です。標準の数値評価は等号(=)で示され、右矢印は記号評価を示します。


Mathcadのカウント方式はまだ決定されていないため、バイトカウントは指定されていません。

ctl- $は、加算変数、初期値、最終値、および式を配置する空のプレースホルダーを含む、加算演算子(Sigma)に入ります。およそのバイト相当数= 11。


コードはどこにありますか?
-Abr001am

1
実際のチャレンジの「コード」は、「チャレンジソリューション」という見出しの下に表示される最初の合計記号(大文字のシグマ)です。「コード」の他のビットは、「ソリューションバリアント」という見出しの下にあります。画像に表示されているのは、Mathcadワークシートに正確に記載されているものです。Mathcadは、ベクトル和や積、関数の統合や微分、論理演算などのさまざまな演算に数学記号を使用します。ほとんどの演算子は、キーの組み合わせ(たとえば、暗黙的なベクトル和の場合はctl-4、反復和の場合はctl-&)、またはメニューまたはツールバーを使用して入力できます。
スチュアートブラフ

4

PostgreSQL、67 66バイト

SELECT SUM(m^v)FROM(VALUES(3,6))t(s,m),generate_series(0,s*s-1)s(v)

SqlFiddleDemo

入力: VALUES(side, multiplier)


編集:

入力がテーブルに移動され、すべてのケースが一度に:

SELECT s,m,SUM(m^v)FROM i,generate_series(0,s*s-1)s(v)GROUP BY s,m

SqlFiddleDemo

出力:

╔══════╦══════╦══════════════════════╗
║  s   ║  m   ║         sum          ║
╠══════╬══════╬══════════════════════╣
║   7  ║ 1.5  ║ 850161998.2853994    ║
║   2  ║ 2    ║ 15                   ║
║   2  ║ -2   ║ -5                   ║
║ 256  ║ 1    ║ 65536                ║
║   5  ║ -3   ║ 211822152361         ║
║   8  ║ 2    ║ 18446744073709552000 ║
║   3  ║ 6    ║ 2015539              ║
╚══════╩══════╩══════════════════════╝


3

Python、40バイト

lambda l,m:sum(m**i for i in range(l*l))

1
lambda l,m:(m**(l*l)-1)/(m-1)
リーキー修道女

通常の言語では、式を使用すると短くなります。エソランでは地図が短くなるため、地図を使用しました。
漏れの修道女

取り消し線はどこにありますか?
漏れの修道女

@KennyLau私はまだ答えに取り組んでいました。あなたのコメントを見る前にこれを投稿しました。
orlp

申し分なく(あと7つ...)
リーキー修道女

3

Ruby:39バイト

->s,m{(0...s*s).reduce(0){|a,b|a+m**b}}

テスト:

f = ->s,m{(0...s*s).reduce(0){|a,b|a+m**b}}

f[8,2]   # 18446744073709551615
f[3,6]   # 2015539
f[7,1.5] # 850161998.2853994
f[5,-3]  # 211822152361
f[256,1] # 65536
f[2,2]   # 15
f[2,-2]  # -5
f[1,1]   # 1

Ruby sumはいつ関数を取得しましたか?これはgamechangingある
バリューインク

大野!ルビーコアメソッドと思ったのは実際にはRailsメソッドの 悲しい顔です。答えを更新しました。
br3nt

言語をRailsに変更することはできますか?私はあなたがそのために必要な場合があります任意の輸入については知らない
バリューインク

3

Python、41バイト

このゴルフのことでまったく新しい、批判歓迎!

lambda n,m:sum(m**i for i in range(n**2))

それは実際にはかなり良いです。)
user6245072

ハハ、ありがとう。しばらくPythonに触れていないので、再度Pythonでラムダを実行する方法をGoogleで検索する必要がありました。
ラングトラン

プログラミングパズルとコードゴルフへようこそ!これはいい答えですが、これとかなり似てます。
デニス

ああ、他の解決策があるかどうかはわかりませんでした。彼l**lは私がやったことの代わりにやることによってバイトを節約しましたか?
ラングトラン

l*l実際には、これよりも短いですl**2
デニス

2

Jolf、18 15 10バイト

3バイトの保存とマッピングの指示をしてくれたCᴏɴᴏʀO'Bʀɪᴇɴに感謝

uΜzQjd^JwH

ここで試してみてください!

 ΜzQj       Map over an array of 1 -> square(side length)
     d^JwH  Set the current array value to multiplier^(current value - 1)
u           Sum the array

よくやった!ゼータの前にあるaは、暗黙的に外されるので、削除できます。それぞれの代わりにMu(マップ)を使用することもできます。Dをadに置き換えて、末尾の}を削除できると思います。
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴニート、Jolfの暗黙の部分を忘れずに、それらは確かにいくつかのバイトを削る最良の方法のいくつかです。
盛り上がる

2

CJam、9バイト

q~2#,f#:+

入力は、改行またはスペースで区切られた逆順です。

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

q~    e# Read input. Evaluate: pushes the two numbers, M and N, onto the stack
2#    e# Square: compute N^2
,     e# Range: generates array [0 1 ... N^2-1]
f#    e# Compute M raised to each element of the array [0 1 ... N^2-1]
:+    e# Fold addition: compute sum of the array [M^0 M^1 ... M^(N^2-1)]

2

PHP、58 54バイト

<?function a($n,$m){$n*=$n;echo(1-$m**$n)/(1-$m)?:$n;}

これは、乗数が1(式でNANを返す)かどうかをチェックした後、合計式を使用して値を表示するだけです。


2

Mathematica、22バイト

Tr[#^(Range[#2^2]-1)]&

範囲を作成し{1, 2, ... s^2}、その上に作るために1を減算し、{0, 1, ..., s^2-1}。次に、それぞれをm作る力に上げて、{m^0, m^1, ..., m^(s^2-1)}その合計を返します。

あるいは、Mathematicaはその制限をとることにより明示的な式を使用できます。これには29バイトが必要です。

Limit[(s^#^2-1)/(s-1),s->#2]&

最初のバージョンは次のように書くことができますTr[#^Range[#2^2]/#]&
サイモンウッズ

1

PARI / GP、25バイト

f(s,m)=sum(i=0,s^2-1,m^s)

より長いがより速い(35バイト):

f(s,m)=if(m==1,s^2,(m^s^2-1)/(m-1))

かわいい(30バイト):

f(s,m)=vecsum(powers(m,s^2-1))

1

C#、56バイト

double f(int n,double q){return(Math.Pow(q,n*n)-1)/--q;}

テストケース256, 1
user6245072

256 ^ 2ではありませんか?
downrep_nation

1
(Math.Pow(1, 256 * 256) - 1) / --1= 0/0。
user6245072

1
Systemを使用する必要があります。またはSystem.Math.Pow。また、@ user6245072で述べられているように、q = 1の場合、コードは機能しません。
Horvathのデビッド・

1

Lua、54 47バイト

r=0l,m=...for i=0,l^2-1 do r=r+m^i end print(r)

ボード側の長さを最初の引数として、乗数を2番目としてコマンドラインから実行します。

6バイトを保存してくださったuser6245072と、さらに1を保存していただいたKatenkyoに感謝します。


元の54バイトバージョン:

a,b=...c=1 d=1 for i=2,a^2 do c=c*b d=d+c end print(d)

こんにちは、PPCGへようこそ!素晴らしい答えです!
-NoOneIsHere

l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
-user6245072

これにより、数バイト節約できます。
-user6245072

dの名前を変更すると、c=1 d=1=>のスペースをスキップできるため、1バイト節約されますa,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g)。@ user6245072の提案が機能する場合は、同じ原則でバイトを保存できます=>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
Katenkyo

間の空白r=0とは、l,m=...それが変更されないので、とにかく義務です。また、ループする必要があります for i=0,l^2-1が、これは私のせいです笑
user6245072

1

𝔼𝕊𝕄𝕚𝕟、11文字/ 14バイト

⨭⩥ î²)ⓜⁿ⁽í$

Try it here (Firefox/WebKit Nightly only).

はい、𝔼𝕊𝕄𝕚𝕟はWebKit Nightlyで動作するようになりました!次はChromeのサポートです。

説明

⨭⩥ î²)ⓜⁿ⁽í$ // implicit: î = input1, í = input2
   ⩥ î²)       // generate a range [0..î^2)
                     ⓜ      // map over range ($ is mapitem):
        ⁿ⁽í$  //   í^$
⨭            // sum resulting range
              // implicit output

1

RETURN、32バイト

[a:2^0\
{[$¥][a;\^]#[¤¥][+]#]!

Try it here.

Stack2に結果を残す匿名ラムダ。使用法:

8 2[a:2^0\
{[$¥][a;\^]#[¤¥][+]#]!

説明

[                              ]!  lambda
 a:                                store multiplier to a
   2^                              square side-length
     0\␊                           create range [0..result)
        {                          set current stack to range
         [  ][     ]#              while loop
          $¥                         check if TOS is truthy
              a;\^␌                  if so, push a^TOS to Stack2
                     ␁            set current stack to Stack2
                       [¤¥][+]#    sum Stack2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.