Masalah beras dan catur

41

Legenda India menceritakan kisah dugaan penemu permainan catur, yang sangat mengesankan kaisar India dengan permainannya sehingga ia akan mendapatkan imbalan dengan apa pun yang diminta.

Pria itu berkata dia ingin dibayar dengan beras. Dia menginginkan sebutir beras untuk kotak pertama dari papan catur, dua untuk yang kedua, empat untuk yang ketiga, delapan untuk yang keempat, dan seterusnya, sampai kotak ke-64.

Kaisar kagum bahwa orang itu meminta hadiah kecil, tetapi ketika matematikawannya mulai menghitung, dia akhirnya kehilangan salah satu provinsi.

Tugas

Mengingat panjang sisi papan catur hipotetis (yaitu 8 pada papan catur default) dan pengganda antara kotak (yang 2 dalam legenda), hitung jumlah butir beras yang harus dibayar oleh kaisar kepada lelaki itu.

Catatan

  • Panjang sisi akan selalu menjadi bilangan bulat positif. Pengganda bukan bisa berupa bilangan rasional apa pun.

  • Jika bahasa pilihan Anda tidak dapat menampilkan angka yang sangat besar, tidak masalah selama program Anda dapat memproses input yang lebih kecil dengan benar.

  • Juga jika bahasa pilihan Anda membulatkan nilai yang lebih besar (dengan notasi eksponensial), tidak apa-apa jika nilai-nilai itu kira-kira benar.

Testcases

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

Harap perhatikan bahwa rumus eksplisit

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

Melakukan salah pada multiplier = 1, seperti

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

Mencetak gol

Ini adalah kode-golf. Jawaban terpendek dalam byte menang.

pengguna6245072
sumber
4
Anda mungkin ingin test case di mana pengali adalah 1 dan yang lain di mana itu adalah 0 (dengan asumsi keduanya valid). Juga "apa saja" cukup luas, apakah akar kuadrat dari satu negatif dihitung? Bagaimana dengan "kentang"? ;) Saya akan merekomendasikan "bilangan real" atau sesuatu.
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 inputsHati-hati, itu telah menyebabkan masalah di masa lalu. meta.codegolf.stackexchange.com/a/8245/31716
DJMcMayhem
24
... pasti provinsi yang kaya, karena bahkan hari ini, produksi beras dunia tahunan masih kurang dari 2 ^ 64 butir.
vsz
1
@vsz Sebenarnya, pria itu terbunuh. Jumlah yang ditambahkan kepada raja memberikan seluruh kerajaan kepada pria itu, jadi tentu saja jalan keluar yang lebih mudah diambil.
cst1992
1
@ cst1992 versi yang saya baca mengatakan pria itu menyerah pada permintaannya dan mendapat provinsi sebagai hadiah.
user6245072

Jawaban:

27

MATL , 6 byte

2^:q^s

Cobalah online!

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
Luis Mendo
sumber
23

APL, 10 byte

⎕⊥1+0×⍳⎕*2

digunakan untuk membaca input pengguna dua kali. Jika kami menyimpan panjang sisi dalam s dan pengali dalam m , kami mendapatkan kode berikut.

m⊥1+0×⍳s*2

Dan inilah cara APL mem-parsing kode ini:

Penjelasan algoritma

APL Bung
sumber
4
Atau sebagai function train: ⊣⊥1⍴⍨⊢×⊢(8 byte) Sebagai perintah REPL interaktif, ⎕⊥×⍳⎕*2(7 byte) juga berfungsi.
Dennis
19

Python, 40 byte

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

Menghasilkan dan mengevaluasi string seperti

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

yang mengkodekan jumlah sebagai polinomial Hornerized dengan n*nistilah.

Banyak metode yang berbeda memberikan jumlah byte yang sangat mirip:

#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*
Tidak
sumber
2
Ah benar, salahku. Bagaimanapun, saya sangat suka melihat semua pendekatan berbeda yang Anda lakukan :)
FryAmTheEggman
11

Haskell, 25 byte

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

Jumlahkan daftar [m^0, m^1, ..., m^(n*n-1)].

Tidak
sumber
11

JavaScript (ES2016 / ES7), 31 29 28 byte

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

Hanya @Bassdrop Cumberwubwubwub dan @ Kaizo versi ES6, tetapi dengan operator eksponensial. :) (Saya tidak punya cukup reputasi untuk berkomentar.)

Sunting: /+(b-1)diubah menjadi /--b(terima kasih @Neil).

Sunting: sekarang menggunakan currying (terima kasih @MamaFunRoll).

gcampbell
sumber
Selamat datang di PPCG! Jawaban Anda cukup bagus!
NoOneIsHere
Selamat datang! The +operator adalah tes saya lupa untuk mengedit, sehingga Anda dapat mencukur 1 byte dengan menghilangkan itu :)
Bassdrop Cumberwubwubwub
Formula tidak berfungsi untuk m = 1: 3
user6245072
@ user6245072 apakah Anda menggunakan kenari krom? Atau pada simpul? Jika pada node, aktifkan flag harmoni
NiCk Newman
Apakah /--bAnda akan menghemat satu atau dua byte?
Neil
10

Jelly, 6 byte

²R’*@S

Cobalah online!

Biarawati Bocor
sumber
8

MATLAB, 23 byte

@(n,k)sum(k.^(0:n^2-1))

Uji di sini !

Stewie Griffin
sumber
8

Javascript ES6, 59 37 35 34 byte

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

Terima kasih kepada @Kaizo karena telah mengurangi 19 byte, @Neil untuk 2 lainnya dan @gcampbell untuk 1 lagi!

Coba di sini

Versi rusak alternatif

32 byte

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

Penyebab NaNuntuk b==1.

30 byte

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

Penyebab Infinityuntuk b==1.5.

28 byte

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

Output 1untuk beberapa testcases yang valid.

Versi lama untuk 59 byte

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

Bassdrop Cumberwubwubwub
sumber
Mengapa Anda tidak memperlakukan b == 1 case dalam case 32 byte? 40 byte: (a, b) => b-1? (Math.pow (b, a * a) -1) / (b-1): a * a
Kaizo
@ Kaizo kau benar, aku idiot: D
Bassdrop Cumberwubwubwub
/~-bjelas tidak baik untuk pecahan b, tetapi /--bharusnya berhasil, bukan?
Neil
By the way, saya pindahkan versi lama ke 47 byte:(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil
@Neil Anda benar, tentu saja. Itulah yang Anda dapatkan ketika Anda terburu-buru menjawab: p Terima kasih!
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;}

Tidak disatukan

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

Catatan

  • Ini akan bekerja untuk output besar yang sewenang-wenang seperti yang disyaratkan oleh OP (Java yang terlalu buruk mendukung angka besar, ini akan lebih pendek jika tidak).

Keluaran

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
Marv
sumber
6

R, 18 byte

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

Penjelasan:

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

05AB1E , 5 byte

Kode:

nL<mO

Penjelasan:

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

Cobalah online! .

Adnan
sumber
4

Haskell, 30 byte

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

atau sama panjangnya

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

Versi pertama dimulai dengan 1berulang kali dikalikan m. Kemudian jumlah n^2angka pertama dari urutan ini. Versi kedua adalah rumus eksplisit seperti yang terlihat pada jawaban lain.

nimi
sumber
Tidak bisakah kamu melakukannya n#m=sum$(m^)<$>[0..n*n-1]?
xnor 16
@ xnor: oh, itu bagus. Saya pikir itu cukup berbeda untuk jawaban yang terpisah. Silakan posting sendiri.
nimi
4

J, 10 byte

+/@:^i.@*:

Pemakaian

Saya menandai beberapa bilangan bulat dengan xakhiran untuk menggunakan bilangan bulat diperluas untuk mendapatkan hasil yang tepat.

   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

Penjelasan

+/@:^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
mil
sumber
6 byte #.*:$*sesuai APL Bung.
FrownyFrog
4

Mathcad, [tbd] byte (~ 11)

masukkan deskripsi gambar di sini

Menggunakan operator penjumlahan bawaan Mathcad. Juga menunjukkan penyederhanaan prosesor simbolik untuk menghasilkan formula yang tepat.

Mathcad secara efektif menjalankan dua mesin pengolah secara paralel - satu standar IEEE 64/80 bit floating point, dan yang lainnya merupakan proses simbolic length length (MuPad). Evaluasi numerik standar ditunjukkan dengan tanda sama dengan (=), sedangkan panah kanan menunjukkan evaluasi simbolik.


Skema penghitungan MathCad belum ditentukan sehingga tidak ada byte yang dihitung.

ctl- memasuki operator penjumlahan (Sigma), termasuk placeholder kosong untuk meletakkan variabel penjumlahan, nilai awal, nilai akhir, dan ekspresi. Perkiraan byte-equivalence count = 11.

Stuart Bruff
sumber
dimana kodenya?
Abr001am
1
"Kode" untuk tantangan aktual adalah tanda penjumlahan pertama (ibukota Sigma) yang Anda lihat di bawah judul "Solusi Tantangan". Bit-bit lain dari "kode" diberikan di bawah judul "Varian Solusi". Apa yang Anda lihat dalam gambar adalah persis apa yang akan ditulis pada lembar kerja Mathcad - Mathcad menggunakan simbol matematika untuk berbagai operasi, seperti jumlah vektor atau produk, integrasi atau diferensiasi fungsi, atau operasi logis. Sebagian besar operator dapat input dengan kombinasi tombol (misalnya, ctl-4 untuk jumlah vektor implisit atau ctl- & untuk jumlah yang diulang), atau melalui menu atau bilah alat.
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

Memasukkan: VALUES(side, multiplier)


EDIT:

Masukan dipindahkan ke tabel, semuanya sekaligus:

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

SqlFiddleDemo

Keluaran:

╔══════╦══════╦══════════════════════╗
║  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              ║
╚══════╩══════╩══════════════════════╝
Lad2025
sumber
3

TI-Basic, 19 byte

Sadalah panjang sisi, dan Mmerupakan pengali.

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

Python, 40 byte

lambda l,m:sum(m**i for i in range(l*l))
orlp
sumber
1
lambda l,m:(m**(l*l)-1)/(m-1)
Leaky Nun
Dalam bahasa reguler menggunakan rumus akan lebih pendek. Saya menggunakan peta karena di esolangs peta akan lebih pendek.
Leaky Nun
Di mana dicoret?
Leaky Nun
@ KennyLau Saya masih mengerjakan jawaban saya, saya memposting ini sebelum melihat komentar Anda.
orlp
Baiklah, (7 lebih lanjut ...)
Leaky Nun
3

Ruby: 39 byte

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

Uji:

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
br3nt
sumber
Kapan Ruby mendapatkan sumfungsi ??? Ini adalah gamechanging
Value Ink
Oh tidak! Apa yang saya pikir adalah metode inti ruby ​​sebenarnya adalah metode rel wajah sedih . Saya sudah memperbarui jawabannya.
br3nt
Bisakah Anda mengubah bahasa Anda menjadi Rails? Saya tidak tahu tentang impor apa pun yang mungkin Anda perlukan untuk itu
Value Ink
3

Python, 41 Bytes

Sama sekali baru dalam hal golf ini, selamat datang kritik!

lambda n,m:sum(m**i for i in range(n**2))
Lang Tran
sumber
Sebenarnya cukup bagus; )
user6245072
Haha terima kasih. Saya harus google cara melakukan lambdas dengan python lagi, karena saya belum pernah menyentuh python.
Lang Tran
Selamat Datang di Programming Puzzles & Code Golf! Ini adalah jawaban yang bagus, tetapi agak mirip dengan yang ini .
Dennis
Ah, saya tidak melihat apakah ada solusi lain. Apakah dia menyimpan byte dengan melakukan l**lalih - alih apa yang saya lakukan?
Lang Tran
l*lsebenarnya, yang lebih pendek dari l**2.
Dennis
2

Jolf, 18 15 10 byte

Terima kasih kepada Cᴏɴᴏʀ O'Bʀɪᴇɴ karena telah menghemat 3 byte dan mengarahkan saya ke pemetaan

uΜzQjd^JwH

Coba di sini!

 Μ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
membengkak
sumber
Kerja bagus! Anda dapat menghapus a sebelum zeta, karena itu secara implisit habis. Anda juga dapat menggunakan Mu (peta) alih-alih untuk masing-masing, dan saya pikir Anda dapat mengganti D dengan iklan dan menghapus akhirannya}.
Conor O'Brien
1
@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Rapi, terus lupa tentang bagian implisit Jolf, mereka pasti beberapa cara terbaik untuk mencukur beberapa byte.
Mengembang
2

CJam , 9 byte

q~2#,f#:+

Input dalam urutan terbalik dipisahkan oleh baris baru atau spasi.

Cobalah online!

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)]
Luis Mendo
sumber
2

PHP, 58 54 byte

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

Ini hanya menggunakan rumus penjumlahan untuk menunjukkan nilainya, setelah memeriksa apakah pengali adalah 1 (yang mengembalikan NAN dalam rumus).

Xanderhall
sumber
2

Mathematica, 22 byte

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

Buat kisaran {1, 2, ... s^2}, kurangi 1 untuk membuatnya {0, 1, ..., s^2-1}. Kemudian naikkan masing-masing ke kekuatan mmembuat {m^0, m^1, ..., m^(s^2-1)}dan mengembalikan jumlah itu.

Atau, Mathematica dapat menggunakan rumus eksplisit dengan mengambil batasnya. Ini membutuhkan 29 byte.

Limit[(s^#^2-1)/(s-1),s->#2]&
mil
sumber
Anda dapat menulis versi pertama Anda sebagaiTr[#^Range[#2^2]/#]&
Simon Woods
1

PARI / GP , 25 byte

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

Lebih lama tetapi lebih cepat (35 byte):

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

Lucu (30 byte):

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

C #, 56 byte

double f(int n,double q){return(Math.Pow(q,n*n)-1)/--q;}
downrep_nation
sumber
Testcase 256, 1?
user6245072
Bukankah 256 ^ 2?
downrep_nation
1
(Math.Pow(1, 256 * 256) - 1) / --1= 0/0.
user6245072
1
Anda perlu menggunakan Sistem; atau System.Math.Pow. Dan kode Anda tidak berfungsi, ketika q = 1, seperti yang dinyatakan oleh @ 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)

Jalankan dari baris perintah dengan panjang sisi papan sebagai argumen pertama dan pengganda sebagai yang kedua.

Terima kasih kepada user6245072 untuk menghemat 6 byte, dan Katenkyo karena menyimpan 1 tambahan.


Versi 54 byte asli:

a,b=...c=1 d=1 for i=2,a^2 do c=c*b d=d+c end print(d)
kidfrommars
sumber
Halo, dan selamat datang di PPCG! Jawaban bagus!
NoOneIsHere
l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
user6245072
Ini akan menghemat beberapa byte.
user6245072
mengganti nama d menghemat satu byte karena memungkinkan untuk melewatkan spasi di c=1 d=1=> a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g). jika saran @ user6245072 berfungsi, Anda dapat menyimpan byte pada prinsip yang sama =>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
Katenkyo
Ruang putih antara r=0dan l,m=...wajib, jadi itu tidak berubah. Juga loop seharusnya for i=0,l^2-1tetapi ini adalah kesalahan saya lol.
user6245072
1

𝔼𝕊𝕄𝕚𝕟, 11 karakter / 14 byte

⨭⩥ î²)ⓜⁿ⁽í$

Try it here (Firefox/WebKit Nightly only).

Ya, 𝔼𝕊𝕄𝕚𝕟 sekarang berfungsi di WebKit Nightly! Dukungan Chrome berikutnya.

Penjelasan

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

KEMBALI , 32 byte

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

Try it here.

Lambda anonim yang meninggalkan hasil di Stack2. Pemakaian:

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

Penjelasan

[                              ]!  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
Mama Fun Roll
sumber