Vấn đề gạo và cờ vua


41

Một truyền thuyết Ấn Độ kể câu chuyện về người được cho là nhà phát minh của trò chơi cờ vua, người đã gây ấn tượng với hoàng đế Ấn Độ với trò chơi của mình đến mức anh ta sẽ nhận được bất cứ điều gì được hỏi.

Người đàn ông nói rằng anh ta muốn được trả tiền bằng gạo. Ông muốn có một hạt gạo cho hình vuông đầu tiên của bàn cờ, hai cho cái thứ hai, bốn cho cái thứ ba, tám cho cái thứ tư, và cứ thế, cho đến cái vuông thứ 64.

Hoàng đế đã rất ngạc nhiên khi người đàn ông yêu cầu một phần thưởng nhỏ như vậy, nhưng khi các nhà toán học của ông bắt đầu đếm, cuối cùng ông đã mất một trong những tỉnh của mình.

Bài tập, nhiệm vụ

Với chiều dài cạnh của bàn cờ giả định (là 8 trên bàn cờ mặc định) và hệ số nhân giữa các ô vuông (là 2 trong truyền thuyết), hãy tính số hạt gạo mà hoàng đế phải trả cho người đàn ông.

Ghi chú

  • Độ dài cạnh sẽ luôn là một số nguyên dương. Số nhân thay vào đó có thể là bất kỳ loại số hữu tỷ nào.

  • Nếu ngôn ngữ bạn chọn không thể hiển thị số lượng lớn, thì miễn là chương trình của bạn có thể xử lý chính xác các đầu vào nhỏ hơn.

  • Ngoài ra, nếu ngôn ngữ bạn chọn làm tròn các giá trị lớn hơn (với các ký hiệu theo cấp số nhân), sẽ ổn nếu các giá trị đó gần đúng.

Tủ thử

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

Xin lưu ý rằng công thức rõ ràng

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

Thực hiện sai trên multiplier = 1, như

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

Chấm điểm

Đây là mã golf. Câu trả lời ngắn nhất trong byte thắng.


4
Bạn có thể muốn một trường hợp thử nghiệm trong đó hệ số nhân là 1 và một trường hợp khác là 0 (giả sử cả hai đều hợp lệ). Ngoài ra "bất cứ điều gì" là khá rộng, căn bậc hai của một số âm? Thế còn "khoai tây"? ;) Tôi muốn giới thiệu "bất kỳ số thực" hoặc một cái gì đó.
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 inputsCẩn thận, điều đó đã gây ra vấn đề trong quá khứ. meta.codegolf.stackexchange.com/a/8245/31716
DJMcMayhem

24
... Đó phải là một tỉnh giàu có, bởi vì ngay cả ngày nay, sản lượng gạo thế giới hàng năm vẫn chưa đến 2 ^ 64 hạt.
vsz

1
@vsz Thật ra, thằng đã bị giết. Số tiền được thêm vào nhà vua trao lại toàn bộ vương quốc cho người đàn ông, do đó, tự nhiên lối thoát dễ dàng hơn đã được thực hiện.
cst1992

1
@ cst1992 phiên bản tôi đọc nói rằng người đàn ông đã từ bỏ yêu cầu của anh ta và lấy một tỉnh làm quà tặng.
dùng6245072

Câu trả lời:



27

MATL , 6 byte

2^:q^s

Hãy thử trực tuyến!

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 byte

⎕⊥1+0×⍳⎕*2

được sử dụng để đọc đầu vào của người dùng hai lần. Nếu chúng ta lưu trữ độ dài cạnh theo s và hệ số nhân tính bằng m , chúng ta sẽ nhận được mã sau.

m⊥1+0×⍳s*2

Và đây là cách APL phân tích mã này:

Giải thích thuật toán


4
Hoặc như một hàm đào tạo: ⊣⊥1⍴⍨⊢×⊢(8 byte) Là một lệnh REPL tương tác, ⎕⊥×⍳⎕*2(7 byte) cũng hoạt động.
Dennis

19

Python, 40 byte

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

Tạo và đánh giá một chuỗi như

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

mã hóa tổng dưới dạng đa thức góc với n*ncác số hạng.

Rất nhiều phương thức khác nhau đã cho số byte rất giống nhau:

#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
À đúng rồi, xấu của tôi. Dù sao, tôi thực sự thích nhìn thấy tất cả các cách tiếp cận khác nhau mà bạn đã thực hiện :)
FryAmTheEggman


11

Haskell, 25 byte

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

Tổng hợp danh sách [m^0, m^1, ..., m^(n*n-1)].


11

JavaScript (ES2016 / ES7), 31 29 28 byte

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

Chỉ là @Bassdrop Cumberwubwubwub và phiên bản ES6 của @ Kaizo, nhưng với toán tử lũy thừa. :) (Tôi không có đủ danh tiếng để bình luận thay thế.)

Chỉnh sửa: /+(b-1)đã đổi thành /--b(cảm ơn @Neil).

Chỉnh sửa: hiện sử dụng currying (cảm ơn @MamaFunRoll).


Chào mừng đến với PPCG! Câu trả lời của bạn là khá tốt!
NoOneIsHãy là

Chào mừng bạn Các +nhà điều hành là một thử nghiệm tôi quên để chỉnh sửa, vì vậy bạn có thể cạo 1 byte bằng cách bỏ qua nó :)
Bassdrop Cumberwubwubwub

Công thức không hoạt động cho m = 1: 3
user6245072

@ user6245072 bạn có trên chrome canary không? Hoặc trên nút? Nếu trên nút, bật cờ hài hòa
NiCk Newman

Sẽ /--btiết kiệm cho bạn một hoặc hai byte?
Neil



8

Javascript ES6, 59 37 35 34 byte

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

Cảm ơn @Kaizo vì đã loại bỏ 19 byte, @Neil để có thêm 2 và @gcampbell để có thêm 1!

Hãy thử nó ở đây

Phiên bản hỏng thay thế

32 byte

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

Nguyên nhân NaNcho b==1.

30 byte

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

Nguyên nhân Infinitycho b==1.5.

28 byte

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

Đầu ra 1cho một số testcase hợp lệ.

Phiên bản cũ cho 59 byte

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


Tại sao bạn chưa xử lý trường hợp b == 1 trong trường hợp 32 byte? 40 byte: (a, b) => b-1? (Math.pow (b, a * a) -1) / (b-1): a * a
Kaizo

@Kaizo bạn nói đúng, tôi là một thằng ngốc: D
Bassdrop Cumberwubwubwub

/~-brõ ràng là không tốt cho phân số b, nhưng /--bnên làm việc, không?
Neil

Nhân tiện, tôi đã đánh golf phiên bản cũ xuống còn 47 byte:(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil

@ Bạn không đúng, dĩ nhiên. Đó là những gì bạn nhận được khi bạn vội vàng trả lời: p Cảm ơn!
Bassdrop Cumberwubwubwub

6

Java, 132 byte

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

Bị đánh cắp

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

Ghi chú

  • Điều này sẽ hoạt động cho các đầu ra lớn tùy ý theo yêu cầu của OP (Quá tệ Java hỗ trợ số lượng lớn, điều này sẽ ngắn hơn nếu không).

Đầu ra

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 byte

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

Giải trình:

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

5

05AB1E , 5 byte

Mã số:

nL<mO

Giải trình:

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

Hãy thử trực tuyến! .


4

Haskell, 30 byte

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

hoặc dài bằng nhau

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

Phiên bản đầu tiên bắt đầu với 1nhiều lần nhân với m. Sau đó, nó tổng hợp các n^2số đầu tiên của chuỗi này. Phiên bản thứ hai là công thức rõ ràng như được thấy trong các câu trả lời khác.


Bạn không thể làm gì n#m=sum$(m^)<$>[0..n*n-1]?
xnor

@xnor: oh, thật tuyệt Tôi nghĩ rằng nó đủ khác nhau cho một câu trả lời riêng biệt. Xin vui lòng gửi nó cho mình.
nimi

4

J, 10 byte

+/@:^i.@*:

Sử dụng

Tôi đánh dấu một số số nguyên với xhậu tố để sử dụng số nguyên mở rộng để có kết quả chính xác.

   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

Giải trình

+/@:^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

6 byte #.*:$*theo APL Dude.
FrownyFrog

4

Mathcad, [tbd] byte (~ 11)

nhập mô tả hình ảnh ở đây

Sử dụng toán tử tổng hợp được xây dựng của Mathcad. Cũng cho thấy đơn giản hóa bộ xử lý tượng trưng để tạo ra công thức chính xác.

Mathcad vận hành song song hai công cụ xử lý song song - một điểm nổi chuẩn 64/80 bit của IEEE và một công cụ xử lý ký hiệu độ dài số tùy ý (MuPad). Đánh giá số tiêu chuẩn được biểu thị bằng dấu bằng (=), trong khi mũi tên phải biểu thị đánh giá tượng trưng.


Sơ đồ đếm Mathcad chưa được xác định để không có số byte được đưa ra.

ctl- $ nhập toán tử tổng (Sigma), bao gồm các phần giữ chỗ trống để đặt biến tổng, giá trị ban đầu, giá trị cuối cùng và biểu thức. Số lượng tương đương byte gần đúng = 11.


mã ở đâu
Abr001am

1
"Mã" cho thử thách thực tế là dấu hiệu tổng kết đầu tiên (vốn Sigma) mà bạn thấy dưới tiêu đề "Giải pháp thách thức". Các bit khác của "mã" được đưa ra dưới tiêu đề "Biến thể giải pháp". Những gì bạn nhìn thấy trong hình ảnh chính xác là những gì được ghi trên bảng tính Mathcad - Mathcad sử dụng các ký hiệu toán học cho các hoạt động khác nhau, chẳng hạn như tổng vectơ hoặc sản phẩm, tích hợp hoặc phân biệt hàm hoặc các phép toán logic. Hầu hết các toán tử có thể được nhập bằng tổ hợp phím (ví dụ: ctl-4 cho tổng vectơ ẩn hoặc ctl- & cho tổng lặp) hoặc thông qua menu hoặc thanh công cụ.
Stuart Bruff

4

PostgreSQL, 67 66 byte

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

SqlFiddleDemo

Đầu vào: VALUES(side, multiplier)


BIÊN TẬP:

Đầu vào được chuyển sang bảng, tất cả các trường hợp cùng một lúc:

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

SqlFiddleDemo

Đầu ra:

╔══════╦══════╦══════════════════════╗
║  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-Basic, 19 byte

Slà chiều dài bên, và Mlà số nhân.

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

3

Python, 40 byte

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

1
lambda l,m:(m**(l*l)-1)/(m-1)
Leaky Nun

Trong các ngôn ngữ thông thường sử dụng công thức sẽ ngắn hơn. Tôi đã sử dụng bản đồ vì trong bản đồ esolang sẽ ngắn hơn.
Nữ tu bị rò rỉ

Đâu là cuộc đình công?
Rò rỉ Nun

@KennyLau Tôi vẫn đang làm việc với câu trả lời của mình, tôi đã đăng bài này trước khi thấy bình luận của bạn.
orlp

Được rồi, (7 ngày nữa để đi ...)
Leaky Nun

3

Ruby: 39 byte

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

Kiểm tra:

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

Khi nào Ruby có được một sumchức năng ??? Đây là trò chơi điện tử
Giá trị mực

Ôi không! Những gì tôi nghĩ là một phương pháp ruby ​​cốt lõi trong thực tế là một phương pháp rails mặt buồn . Tôi đã cập nhật câu trả lời.
br3nt

Bạn có thể thay đổi ngôn ngữ của bạn thành Rails? Tôi không biết về bất kỳ nhập khẩu nào bạn có thể cần cho việc đó
Giá trị mực

3

Python, 41 byte

Hoàn toàn mới ở điều golf này, chỉ trích chào mừng!

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

Nó thực sự khá tốt; )
dùng6245072

Cảm ơn. Tôi đã phải google làm thế nào để làm lambdas trong python một lần nữa, vì tôi đã không chạm vào con trăn trong một thời gian.
Lang Trần

Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một câu trả lời hay, nhưng nó khá giống với câu trả lời này .
Dennis

Ah, tôi không biết có giải pháp nào khác không. Anh ấy đã tiết kiệm một byte bằng cách làm l**lthay vì những gì tôi đã làm?
Lang Trần

l*lTrên thực tế, đó là ngắn hơn l**2.
Dennis

2

Jolf, 18 15 10 byte

Cảm ơn Cᴏɴᴏʀ O'Bʀɪᴇɴ vì đã lưu 3 byte và hướng tôi đến ánh xạ

uΜzQjd^JwH

Hãy thử nó ở đây!

 Μ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

Công việc tốt đẹp! Bạn có thể loại bỏ a trước zeta, vì điều đó được ngầm hiểu. Bạn cũng có thể sử dụng Mu (bản đồ) thay vì cho mỗi và tôi nghĩ bạn có thể thay thế D bằng quảng cáo và xóa kết thúc}.
Conor O'Brien

1
@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Gọn gàng, hãy quên đi những phần ngầm của Jolf, chúng chắc chắn là một trong những cách tốt nhất để cạo sạch một vài byte.
sưng

2

CJam , 9 byte

q~2#,f#:+

Các đầu vào theo thứ tự ngược được phân tách bằng một dòng mới hoặc khoảng trắng.

Hãy thử trực tuyến!

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 byte

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

Điều này chỉ sử dụng công thức tính tổng để hiển thị giá trị, sau khi kiểm tra xem số nhân có phải là 1 không (trả về NAN trong công thức).


2

Toán học, 22 byte

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

Tạo một phạm vi {1, 2, ... s^2}, trừ 1 trên nó để thực hiện {0, 1, ..., s^2-1}. Sau đó nâng từng cái lên sức mạnh của mviệc tạo ra {m^0, m^1, ..., m^(s^2-1)}và trả lại tổng của nó.

Ngoài ra, Mathicala có thể sử dụng công thức rõ ràng bằng cách lấy giới hạn của nó. Điều này đòi hỏi 29 byte.

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

Bạn có thể viết phiên bản đầu tiên của mình dưới dạngTr[#^Range[#2^2]/#]&
Simon Woods

1

PARI / GP , 25 byte

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

Dài hơn nhưng nhanh hơn (35 byte):

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

Dễ thương (30 byte):

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

1

C #, 56 byte

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

Testcase 256, 1?
dùng6245072

Có phải là 256 ^ 2 không?
downrep_nation

1
(Math.Pow(1, 256 * 256) - 1) / --1= 0/0.
dùng6245072

1
Bạn cần sử dụng Hệ thống; hoặc System.Math.Pow. Và mã của bạn không hoạt động, khi q = 1, như được nêu bởi @ user6245072.
Horváth Dávid

1

Lua, 54 47 byte

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

Chạy từ dòng lệnh với độ dài cạnh bảng làm đối số thứ nhất và cấp số nhân là thứ hai.

Cảm ơn user6245072 vì đã lưu 6 byte và Katenkyo vì đã lưu thêm 1 byte.


Phiên bản 54 byte gốc:

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

Xin chào, và chào mừng đến với PPCG! Câu trả lời chính xác!
NoOneIsĐây là

l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
dùng6245072

Điều này sẽ tiết kiệm một số byte.
dùng6245072

đổi tên d lưu một byte vì nó cho phép bỏ qua khoảng trắng trong c=1 d=1=> a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g). nếu đề xuất của @ user6245072 hoạt động, bạn có thể lưu một byte theo cùng một nguyên tắc =>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
Katenkyo

Khoảng trắng giữa r=0l,m=...dù sao cũng là bắt buộc, vì vậy nó không thay đổi. Ngoài ra các vòng lặp nên được for i=0,l^2-1nhưng đây là lỗi của tôi lol.
dùng6245072

1

, 11 ký tự / 14 byte

⨭⩥ î²)ⓜⁿ⁽í$

Try it here (Firefox/WebKit Nightly only).

Có, hiện đang hoạt động trong WebKit Nightly! Hỗ trợ Chrome là tiếp theo.

Giải trình

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

1

TRẢ LẠI , 32 byte

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

Try it here.

Lambda ẩn danh mà kết quả trên Stack2. Sử dụng:

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

Giải trình

[                              ]!  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.