쌀과 체스 문제


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

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

사용자 입력을 두 번 읽는 데 사용됩니다. 측면 길이를 s 에, 배율을 m 에 저장 하면 다음 코드를 얻습니다.

m⊥1+0×⍳s*2

APL이이 코드를 구문 분석하는 방법은 다음과 같습니다.

알고리즘 설명


4
또는 함수 트레인으로 : ⊣⊥1⍴⍨⊢×⊢(8 바이트) 대화식 REPL 명령으로 ⎕⊥×⍳⎕*2(7 바이트)도 작동합니다.
Dennis

19

파이썬, 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

하스켈, 25 바이트

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

목록을 합산합니다 [m^0, m^1, ..., m^(n*n-1)].


11

자바 스크립트 (ES2016 / ES7), 31 29 28 바이트

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

@Bassdrop Cumberwubwubwub와 @Kaizo의 ES6 버전이지만 지수 연산자가 있습니다. :) (대신 의견을 말할만큼 충분한 평판이 없었습니다.)

편집 : (감사합니다 @ @)로 /+(b-1)변경되었습니다 /--b.

편집 : 이제 카레를 사용합니다 (@MamaFunRoll 덕분에).


PPCG에 오신 것을 환영합니다! 당신의 대답은 꽤 좋습니다!
NoOneIsHere 여기

어서 오십시오! +당신이 그것을 생략하여 1 바이트를 면도 할 수 있도록 운영자는 :) 내가 편집 해 잊었 테스트했다
Bassdrop Cumberwubwubwub

m = 1 : 3
user6245072

@ user6245072 크롬 카나리아에 있습니까? 아니면 노드에서? 노드에있는 경우 조화 플래그를 활성화하십시오.
NiCk Newman

/--b한두 바이트를 절약 하시겠습니까 ?
Neil



8

자바 스크립트 ES6, 59 37 35 34 바이트

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

무려 19 바이트를 줄인 @Kaizo, 또 다른 2는 @Neil, 1은 더 @gcampbell에게 감사드립니다!

여기 사용해보십시오

대체 깨진 버전

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작동해야합니다.
Neil

그건 그렇고, 나는 구 버전을 47 바이트로 내렸다.(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil

@Neil 당신 말이 맞아요. 그것은 당신이 당신의 답변을 서두를 때 얻는 것입니다 : p 감사합니다!
Bassdrop Cumberwubwubwub

6

자바, 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

하스켈, 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

4

Mathcad, [tbd] 바이트 (~ 11)

여기에 이미지 설명을 입력하십시오

Mathcad의 내장 합계 연산자를 사용합니다. 또한 정확한 공식을 생성하기 위해 상징적 프로세서 단순화를 보여줍니다.

Mathcad는 표준 IEEE 64/80 비트 부동 소수점과 임의의 숫자 길이 기호 프로세스 (MuPad)와 같은 두 개의 처리 엔진을 병렬로 효과적으로 실행합니다. 표준 수치 평가는 등호 (=)로 표시되며 오른쪽 화살표는 기호 평가를 나타냅니다.


Mathcad 계산 체계는 아직 결정되지 않았으므로 바이트 수는 제공되지 않습니다.

ctl- $는 빈 자리 표시자를 포함하여 합계 변수, 초기 값, 최종 값 및 식을 넣는 합계 연산자 (Sigma)를 입력합니다. 대략적인 바이트 등가 수 = 11


코드는 어디에 있습니까?
Abr001am

1
실제 챌린지의 "코드"는 "Challeng Solution"이라는 제목 아래에 표시되는 첫 번째 요약 부호 (자본 시그마)입니다. "코드"의 다른 비트는 "솔루션 변형"이라는 제목으로 제공됩니다. 이미지에 표시되는 내용은 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

파이썬, 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에서 맵이 더 짧기 때문에 map을 사용했습니다.
Leaky Nun

취소 선은 어디에 있습니까?
Leaky Nun

@ KennyLau 나는 여전히 내 대답을 연구하고 있었고, 나는 당신의 의견을보기 전에 이것을 게시했습니다.
orlp

좋아, (7 더 갈 것이다 ...)
Leaky Nun

3

루비 : 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

루비는 언제 sum기능을 얻었 습니까 ??? 이것은
가치를 변경합니다

아뇨! 내가 루비 핵심 방법이라고 생각한 것은 사실 레일 방식 슬픈 얼굴 입니다. 답변을 업데이트했습니다.
br3nt

언어를 Rails로 변경할 수 있습니까? 수입품에 대해 잘 모르겠습니다
Value Ink

3

파이썬, 41 바이트

이 골프에 완전히 새로운 비판을 환영합니다!

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

실제로 꽤 좋습니다. )
user6245072 2016 년

하하, 고마워 파이썬을 한 번도 만지지 않았기 때문에 파이썬에서 람다를 다시 수행하는 방법을 Google에 알려야했습니다.
Lang Tran

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이것은 좋은 대답이지만 이것 과 비슷합니다 .
Dennis

아, 다른 해결책이 있는지 보지 못했습니다. 내가 한 일 l**l대신에 바이트를 저장 했습니까 ?
Lang Tran

l*l실제로는보다 짧습니다 l**2.
Dennis

2

줄프, 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를 광고로 바꾸고 끝을 제거 할 수 있다고 생각합니다}.
코너 오브라이언

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

매스 매 티카, 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

루아, 54 47 바이트

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

보드 쪽 길이를 첫 번째 인수로, 승수를 두 번째로 사용하여 명령 행에서 실행하십시오.

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에 오신 것을 환영합니다! 좋은 답변입니다!
NoOneIsHere5

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.