Pirinç ve satranç sorunu


41

Hintli bir efsane, Hindistan imparatorunu oyunuyla o kadar çok etkilemiş olduğu iddia edilen satranç oyununun mucidi hikayesini anlattı.

Adam pirinçle ödeme yapmak istediğini söyledi. Satranç tahtasının ilk karesi için iki tane, ikincisi iki, üçüncüsü dördüncü, dördüncü ve dördüncü ve sonraki 64. kareye kadar pirinç tanesi istedi.

İmparator, bu kadar küçük bir ödül istediği için şaşırdı, ama matematikçileri saymaya başladıkça, illerinden birini kaybetti.

Görev

Varsayımcı bir satranç tahtasının (varsayılan satranç tahtasında 8 olan) ve kareler arasındaki çarpan (efsanede 2 olan) tarafının uzunluğu göz önüne alındığında, imparatorun adama ödemesi gereken pirinç tanelerinin sayısını hesaplayın.

notlar

  • Yan uzunluk her zaman pozitif bir tamsayı olacaktır. Çarpan bunun yerine herhangi bir rasyonel sayı olabilir.

  • Seçim diliniz çok büyük sayılar gösteremiyorsa, programınız daha küçük girdileri doğru şekilde işleyebildiği sürece sorun olmaz.

  • Ayrıca, seçtiğiniz diliniz daha büyük değerleri (üstel işaretlerle birlikte) yuvarlarsa, bu değerlerin yaklaşık olarak doğru olup olmaması sorun değildir.

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

Lütfen açık bir formül olduğunu unutmayın.

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

multiplier = 1Gibi yanlış gerçekleştirir

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

puanlama

Bu kod golfü. Bayt cinsinden en kısa cevap kazanır.


4
Muhtemelen çarpanın 1, diğeri ise 0 olan bir sınama durumu istiyorsunuz (her ikisinin de geçerli olduğu varsayılarak). Ayrıca "her şey" oldukça geniştir, negatif olanın karekökü sayılır mı? "Patates" nasıl? ;) "Herhangi bir gerçek sayı" veya başka bir şey öneririm.
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 inputsDikkat et, bu geçmişte sorunlara neden oldu. meta.codegolf.stackexchange.com/a/8245/31716
DJMcMayhem

24
... zengin bir il olmalı, çünkü bugün bile, yıllık dünya pirinç üretimi hala 2 ^ 64 tahıldan daha az.
vsz

1
@vsz Aslında, adam öldürüldü. Bütün krallığı adama veren krala eklenen miktar, bu nedenle doğal olarak daha kolay bir yoldan çekildi.
cst1992

1
@ cst1992 Okuduğum sürüm, adamın isteğinden vazgeçtiğini ve hediye olarak bir il aldığını söylüyor.
user6245072

Yanıtlar:



27

MATL , 6 bayt

2^:q^s

Çevrimiçi deneyin!

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 bayt

⎕⊥1+0×⍳⎕*2

kullanıcı girişini iki kez okumak için kullanılır. Yan uzunluğu s olarak ve çarpanı m olarak kaydedersek, aşağıdaki kodu alırız.

m⊥1+0×⍳s*2

İşte APL bu kodu nasıl ayrıştırıyor:

Algoritmanın açıklaması


4
Veya bir fonksiyon treni olarak: ⊣⊥1⍴⍨⊢×⊢(8 bayt) Etkileşimli bir REPL komutu olarak, ⎕⊥×⍳⎕*2(7 bayt) da çalışır.
Dennis,

19

Python, 40 bayt

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

Gibi bir dize oluşturur ve değerlendirir

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

Bu, toplamı , terimleri olan bir Hornerized polinomu olarak kodlar n*n.

Çok sayıda farklı yöntem çok benzer bayt sayısı verdi:

#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
Ah doğru, benim hatam. Her neyse,
uyguladığın


11

Haskell, 25 bayt

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

Listeyi toplar [m^0, m^1, ..., m^(n*n-1)].


11

JavaScript (ES2016 / ES7), 31 29 28 bayt

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

Sadece @Bassdrop Cumberwubwubwub ve @ Kaizo's ES6 sürümü, ancak üsteleme operatörü ile. :) (Yorum yapmak yerine yeterince itibarım yoktu.)

Düzenleme: olarak /+(b-1)değiştirildi /--b(teşekkürler @Neil).

Düzenleme: şimdi currying kullanır (teşekkürler @MamaFunRoll).


PPCG'ye Hoşgeldiniz! Cevabınız oldukça iyi!
NoOneIsHere

Hoşgeldiniz! +Bunu atlanması ile 1 byte traş böylece operatör :) ben dışarı düzenlemek için unuttum bir testti
Bassdrop Cumberwubwubwub

Formül m = 1: 3 için kullanılamaz
user6245072

@ user6245072 krom kanaryada mısınız? Veya düğümde?
Düğümdeyseniz

Misiniz /--bsana bir bayt veya iki kaydetmek?
Neil



8

Javascript ES6, 59 37 35 34 bayt

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

Bir kuyruklu 19 baytı tıraş eden @Kaizo'ya, başka bir 2 @Neil ve 1 tane daha @ gcampbell'e teşekkürler!

Burada dene

Alternatif kırık versiyonlar

32 bayt

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

Nedenler NaNiçin b==1.

30 bayt

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

Nedenler Infinityiçin b==1.5.

28 bayt

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

1Bazı geçerli test senaryoları için çıktılar .

59 bayt için eski sürüm

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


Neden 32 baytlık davada b == 1 vakasını henüz tedavi etmediniz? 40 bayt: (a, b) => b-1? (Math.pow (b, a * a) -1) / (b-1): a * a
Kaizo

@Kaizo haklısın, ben bir aptalım: D
Bassdrop Cumberwubwubwub

/~-baçıkça kesirsel için iyi bdeğil, ama /--bçalışması gerekir, hayır?
Neil

Bu arada eski sürümü 47 byte'a düşürdüm:(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil

@Sen haklısın, elbette. Cevaplarınızı acele ederken elde ettiğiniz budur: p Teşekkürler!
Bassdrop Cumberwubwubwub

6

Java, 132 bayt

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

Ungolfed

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

notlar

  • Bu OP'nin gerektirdiği gibi keyfi olarak büyük çıktılar için işe yarayacaktır (Çok kötü Java büyük sayıları desteklemektedir, aksi takdirde daha kısa olacaktır).

çıktılar

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 bayt

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

Açıklama:

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

5

05AB1E , 5 bayt

Kod:

nL<mO

Açıklama:

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

Çevrimiçi deneyin! .


4

Haskell, 30 bayt

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

veya eşit derecede uzun

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

İlk sürüm ile 1tekrar tekrar ile başlar m. Sonra n^2bu dizinin ilk numaralarını toplar. İkinci versiyon, diğer cevaplarda görüldüğü gibi açık formül.


Yapamaz n#m=sum$(m^)<$>[0..n*n-1]mısın
xnor

@ xnor: oh, bu çok hoş. Ayrı bir cevap için yeterince farklı olduğunu düşünüyorum. Lütfen kendin gönder.
nimi

4

J, 10 bayt

+/@:^i.@*:

kullanım

xKesin sonuçları elde etmek için genişletilmiş tamsayıları kullanma ekiyle bazı tamsayıları işaretlerim

   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

açıklama

+/@:^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'ye göre 6 bayt .
FrownyFrog

4

Mathcad, [tbd] bayt (~ 11)

görüntü tanımını buraya girin

Mathcad'in toplama toplama işlecini kullanır. Ayrıca, kesin formülü oluşturmak için sembolik işlemci basitleştirmesini gösterir.

Mathcad paralel olarak iki işlem motorunu etkili bir şekilde çalıştırır - biri standart bir IEEE 64/80 bit kayan nokta, diğeri ise isteğe bağlı bir sayı uzunluğu sembolik işlemdir (MuPad). Standart sayısal değerlendirme eşittir işareti (=) ile gösterilirken, sağ ok sembolik değerlendirmeyi gösterir.


Mathcad sayım şeması henüz belirlenmedi, bu nedenle hiçbir bayt sayısı verilmedi.

ctl- $, toplama değişkenini, başlangıç ​​değerini, nihai değeri ve ifadeyi koymak için boş yer tutucuları içeren toplama operatörüne (Sigma) girer. Yaklaşık bayt eşdeğeri sayısı = 11.


kod nerede
Abr001,

1
Gerçek meydan okuma için "kod", "Challeng Çözümü" başlığı altında gördüğünüz ilk toplama işaretidir (büyük harf Sigma). "Kod" un diğer bitleri "Çözüm Değişkenleri" başlığı altında verilmiştir. Resimde gördüğünüz tam olarak bir Mathcad çalışma sayfasına yazılan şeydir - Mathcad, vektör toplamı veya ürünü, fonksiyon entegrasyonu veya farklılaşması veya mantıksal işlemler gibi çeşitli işlemler için matematiksel semboller kullanır. Çoğu operatör, bir tuş kombinasyonuyla (örneğin, örtük bir vektör toplamı için ctl-4 veya yinelenen bir toplam için ctl-4) veya bir menü veya araç çubuğu aracılığıyla girilebilir.
Stuart Bruff,

4

PostgreSQL, 67 66 bayt

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

SqlFiddleDemo

Giriş: VALUES(side, multiplier)


DÜZENLE:

Giriş tabloya taşındı, tüm durumlar aynı anda:

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

SqlFiddleDemo

Çıktı:

╔══════╦══════╦══════════════════════╗
║  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 bayt

Syan uzunluk ve Mçarpan.

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

3

Python, 40 bayt

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

1
lambda l,m:(m**(l*l)-1)/(m-1)
Sızdıran Rahibe,

Normal dillerde formül kullanarak daha kısa olur. Harita kullandım çünkü haritalarda haritalar daha kısa olacaktı.
Sızdıran Rahibe,

Grev nerede?
Sızdıran Rahibe,

@KennyLau Hala cevabım üzerinde çalışıyordum, yorumunuzu görmeden önce bunu yayınladım.
orlp

Tamam, (gitmek için 7 tane daha ...)
Leaky Nun

3

Yakut: 39 bayt

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

Ölçek:

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 ne zaman bir sumfonksiyon aldı ??? Bu gamechanging
Değer Mürekkebi

Oh hayır! Yakut çekirdekli bir yöntem olduğunu düşündüğüm şey aslında bir ray yöntemi olan üzgün bir yüz . Cevabı güncelledim.
br3nt

Dilini Rails olarak değiştirebilir misin? Bunun için ihtiyaç duyabileceğiniz herhangi bir ithalat bilmiyorum
Value Ink

3

Python, 41 Bayt

Bu golf olayında tamamen yeni, eleştiriye hoş geldiniz!

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

Aslında oldukça iyi; )
user6245072

Haha teşekkürler. Bir süredir python'a dokunmadığım için python'da lambda yapmayı tekrar yapmak zorunda kaldım.
Lang Tran

Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Bu güzel bir cevaptır, ancak oldukça benzer bu bir .
Dennis,

Ah, başka çözümler olup olmadığını görmedim. Yaptığım şey l**lyerine yaparak bir bayt kurtardı mı?
Lang Tran

l*laslında, hangisi daha kısa l**2.
Dennis,

2

Jolf, 18 15 10 bayt

3 bayt'ı kurtardığı ve haritaya yönlendirdiğim için Cᴏɴᴏʀ O'Bʀɪᴇɴ 'a teşekkürler

uΜzQjd^JwH

Burada dene!

 Μ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

İyi iş! A'dan önce zeta'yı çıkarabilirsiniz, zira dolaylı olarak açıklanmıştır. Her biri yerine Mu (harita) da kullanabilirsiniz, ve D'yi reklamla değiştirip sonunu kaldırabilir}.
Conor O'Brien,

1
@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Düzgün, Jolf'un örtük kısımlarını unutmaya devam edin, kesinlikle birkaç byte'ı tıraş etmenin en iyi yollarından bazıları.
şişen

2

CJam , 9 bayt

q~2#,f#:+

Girişler, yeni satır veya boşlukla ayrılmış olarak ters sıradadır.

Çevrimiçi deneyin!

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 bayt

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

Bu sadece değeri göstermek için toplama formülünü kullanır, çarpanın 1 olup olmadığını kontrol ettikten sonra (formülde NAN değerini döndürür).


2

Mathematica, 22 bayt

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

Bir dizi oluşturur {1, 2, ... s^2}, üzerinden 1 çıkarır {0, 1, ..., s^2-1}. Sonra her birini myapma gücüne yükseltin {m^0, m^1, ..., m^(s^2-1)}ve toplamını geri getirin.

Alternatif olarak, Mathematica açık formülünü sınırlarını alarak kullanabilir. Bu 29 bayt gerektirir .

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

Sen olarak ilk versiyonunu yazabilirizTr[#^Range[#2^2]/#]&
Simon Woods

1

PARI / GP , 25 bayt

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

Daha uzun ancak daha hızlı (35 bayt):

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

Sevimli (30 bayt):

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


1

Lua, 54 47 bayt

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

Komut satırından tahta yan uzunluğu ilk argüman, çarpan ikinci olur.

6 byte tasarruf için user6245072 ve ek 1 kaydetme için Katenkyo sayesinde.


Orijinal 54 bayt sürümü:

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

Merhaba, PPCG'ye hoş geldiniz! Mükemmel cevap!
NoOneIsHere

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

Bu, bazı baytları kurtarmalıdır.
user6245072

d yeniden adlandırma bir bayttan tasarruf eder, çünkü c=1 d=1=> içindeki boşluğu atlamaya izin verir a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g). @ user6245072 'nin önerisi işe yarıyorsa, aynı r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
byte'de

Aradaki boşluk zaten r=0ve l,m=...zorunludur, yani değişmez. Ayrıca döngü olmalı for i=0,l^2-1ama bu benim hatam lol.
user6245072

1

11, 11 karakter / 14 bayt

⨭⩥ î²)ⓜⁿ⁽í$

Try it here (Firefox/WebKit Nightly only).

Evet, 𝔼𝕊𝕄𝕚𝕟 şimdi WebKit Nightly'de çalışıyor! Sırada Chrome desteği var.

açıklama

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

1

DÖNÜŞ , 32 bayt

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

Try it here.

Stack2'de sonuçlanan isimsiz lambda sonucu. Kullanımı:

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

açıklama

[                              ]!  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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.