水稻和象棋问题


41

一位印度传奇人物讲述了所谓的国际象棋发明者的故事,他用他的棋子给印度皇帝留下了深刻的印象,以至于他得到的任何要求都会得到回报。

该男子说他想用大米付钱。他想在棋盘的第一个正方形上放一粒米,第二个想要两个,第三个四个,第四个八个,依此类推,直到第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的测试用例(假设两者均有效)。另外“任何东西”都相当广泛,负一的平方根是否算在内?土豆呢?;)我建议使用“任何实数”或其他形式。
FryAmTheEggman'5

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

Answers:



27

MATL,6个字节

2^:q^s

在线尝试!

2^   % Take implicit input, say N, and square it: N^2
:q   % Generate array [0 1 ... N^2-1]
^    % Take implicit input, M, and compute [M^0 M^1 ... M^(N^2-1)]
s    % Sum of the array. Implicit display

23

APL,10个字节

⎕⊥1+0×⍳⎕*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))))

将总和编码为带有项的Hornerized多项式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 '16


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)。

编辑:现在使用currying(感谢@MamaFunRoll)。


欢迎来到PPCG!您的回答很好!
NoOneIsHere

欢迎!该+运营商是一个测试,我忘了编辑出,这样你就可以忽略它剃掉1个字节:)
Bassdrop Cumberwubwubwub

该公式不适用于m = 1:3
user6245072 '16

@ user6245072您在使用Chrome Canary吗?还是在节点上?如果在节点上,则启用和声标记
NiCk Newman'5

会为您/--b节省一两个字节吗?
尼尔



8

的Javascript ES6,59 37 35 34字节

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

感谢@Kaizo节省了多达19个字节,@ Neil节省了2个字节,@ gcampbell节省了1个字节!

在这里尝试

备用损坏版本

32字节

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

原因NaNb==1

30字节

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

原因Infinityb==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应该起作用,不是吗?
尼尔,2016年

顺便说一下,我将旧版本压缩为47字节:(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil

@尼尔,你是对的,当然。这就是当您急于回答时所得到的:p谢谢!
Bassdrop Cumberwubwubwub

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

5

05AB1E,5个字节

码:

nL<mO

说明:

n      # Compute i ** 2
 L     # Push the list [1, ..., i ** 2]
  <    # Decrement by 1, [0, ..., i ** 2 - 1]
   m   # Power function with implicit input, [0 ** j, ..., (i ** 2 - 1) ** j]
    O  # Sum that all up

在线尝试!


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该序列的前几个数字。第二个版本是显式,如其他答案所示。


你不能做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 '18

4

Mathcad,[tbd]字节(〜11)

在此处输入图片说明

使用Mathcad的内置求和运算符。还演示了简化符号处理器以生成精确公式的过程。

Mathcad有效地并行运行两个处理引擎-一个是标准IEEE 64/80位浮点,另一个是任意数字长度的符号处理(MuPad)。标准数字评估用等号(=)表示,而右箭头则表示符号评估。


Mathcad计数方案尚未确定,因此未提供字节计数。

ctl- $输入求和运算符(Sigma),其中包括空的占位符以放入求和变量,初始值,最终值和表达式。近似字节等效计数= 11。


代码在哪里?
2016年

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

TI基本(19字节)

S是边长,M是乘数。

Prompt S,M:Σ(M^I,I,0,S²-1

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)
Leaky Nun

在常规语言中,使用公式会更短。我使用地图是因为在esolangs中,地图会更短。
Leaky Nun

删除线在哪里?
Leaky Nun

@KennyLau我仍在研究答案,我在看到您的评论之前就发布了此内容。
orlp

好吧,(还有7个要去...)
Leaky Nun

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函数???这正在改变游戏规则
价值油墨

不好了!我以为是红宝石核心方法,实际上是一张rails方法的 悲伤面孔。我已经更新了答案。
br3nt

您可以仅将语言更改为Rails吗?我不知道您可能需要这样做的任何进口
价值油墨

3

Python,41字节

此高尔夫运动全新,欢迎批评!

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

实际上是相当不错的。)
user6245072

哈哈谢谢。我不得不谷歌再次在python中做lambdas,因为我有一段时间没有接触过python了。
郎陈德良

欢迎来到编程难题和代码高尔夫球!这是一个不错的答案,但与答案非常相似。
丹尼斯

啊,我没有看到其他解决方案。他是l**l不是通过做而不是我做来节省了一个字节?
朗特兰

l*l实际上比短l**2
丹尼斯

2

Jolf,18 15 10字节

感谢CᴏɴᴏʀO'Bʀɪᴇɴ节省了3个字节并将我指向映射

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

干得好!您可以删除zeta之前的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]/#]&
Simon Woods

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

Lua,54 47字节

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

从命令行开始,以板边长度为第一个参数,乘数为第二个参数。

感谢user6245072保存了6个字节,而Katenkyo又节省了1个字节。


原始的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 '16

这应该节省一些字节。
user6245072 '16

重命名d可以节省一个字节,因为它可以跳过c=1 d=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,2016年

r=0和之间的空格l,m=...始终是必填项,因此它不会改变。也应该是循环, for i=0,l^2-1但这是我的错。
user6245072's

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

返回 32字节

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

Try it here.

留下的匿名lambda结果出现在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.