Das Reis- und Schachproblem

41

Eine indische Legende erzählt die Geschichte des angeblichen Erfinders des Schachspiels, der den Kaiser von Indien mit seinem Spiel so sehr beeindruckte, dass er mit allem belohnt wurde, was gefragt wurde.

Der Mann sagte, er wolle mit Reis bezahlt werden. Er wollte ein Reiskorn für das erste Feld des Schachbretts, zwei für das zweite, vier für das dritte, acht für das vierte und so weiter bis zum 64. Feld.

Der Kaiser war erstaunt, dass der Mann um eine so kleine Belohnung bat, aber als seine Mathematiker zu zählen begannen, verlor er schließlich eine seiner Provinzen.

Aufgabe

Berechnen Sie anhand der Seitenlänge eines hypothetischen Schachbretts (8 auf einem Standardschachbrett) und des Multiplikators zwischen den Quadraten (2 in der Legende) die Anzahl der Reiskörner, die der Kaiser dem Mann zahlen muss.

Anmerkungen

  • Die Seitenlänge ist immer eine positive ganze Zahl. Der Multiplikator kann stattdessen eine beliebige rationale Zahl sein.

  • Wenn Ihre bevorzugte Sprache keine sehr großen Zahlen anzeigen kann, ist dies in Ordnung, solange Ihr Programm kleinere Eingaben korrekt verarbeiten kann.

  • Auch wenn Ihre bevorzugte Sprache größere Werte (mit Exponentialnotationen) rundet, ist es in Ordnung, wenn diese Werte ungefähr korrekt sind.

Testfälle

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

Bitte beachten Sie die explizite Formel

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

Führt falsch auf multiplier = 1, als

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

Wertung

Das ist Code-Golf. Kürzeste Antwort in Bytes gewinnt.

user6245072
quelle
4
Sie möchten wahrscheinlich einen Testfall, in dem der Multiplikator 1 und ein anderer 0 ist (vorausgesetzt, beide sind gültig). Auch "irgendetwas" ist ziemlich breit, zählt die Quadratwurzel des Negativen? Wie wäre es mit "Kartoffel"? ;) Ich würde "jede reelle Zahl" oder so empfehlen.
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 inputsVorsicht, das hat in der Vergangenheit zu Problemen geführt. meta.codegolf.stackexchange.com/a/8245/31716
DJMcMayhem
24
... es muss eine reiche Provinz gewesen sein, denn die jährliche Weltreisproduktion beträgt auch heute noch weniger als 2 ^ 64 Körner.
vsz
1
@vsz Eigentlich wurde der Kerl getötet. Die Summe, die dem König hinzugefügt wurde, um das gesamte Königreich an den Mann zu verschenken, war natürlich der einfachere Ausweg.
cst1992
1
@ cst1992 die version, die ich gelesen habe, besagt, dass der mann seine anfrage aufgegeben und eine provinz als geschenk bekommen hat.
user6245072

Antworten:

27

MATL , 6 Bytes

2^:q^s

Probieren Sie es 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
quelle
23

APL, 10 Bytes

⎕⊥1+0×⍳⎕*2

wird verwendet, um Benutzereingaben zweimal zu lesen. Wenn wir die Seitenlänge in s und den Multiplikator in m speichern , erhalten wir den folgenden Code.

m⊥1+0×⍳s*2

Und so analysiert APL diesen Code:

Erklärung des Algorithmus

APL-Typ
quelle
4
Oder als Funktionszug: ⊣⊥1⍴⍨⊢×⊢(8 Bytes) Als interaktiver REPL-Befehl ⎕⊥×⍳⎕*2funktioniert auch (7 Bytes).
Dennis
19

Python, 40 Bytes

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

Erzeugt und wertet einen String wie

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

das kodiert die Summe als Hornerisiertes Polynom mit n*nTermen.

Viele verschiedene Methoden ergaben sehr ähnliche Bytezahlen:

#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*
xnor
quelle
2
Ah richtig, mein schlechtes. Wie auch immer, ich mag es wirklich, all die verschiedenen Ansätze zu sehen, die Sie gewählt haben :)
FryAmTheEggman
11

Haskell, 25 Bytes

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

Summiert die Liste [m^0, m^1, ..., m^(n*n-1)].

xnor
quelle
11

JavaScript (ES2016 / ES7), 31 29 28 Byte

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

Nur @Bassdrop Cumberwubwubwub und @ Kaizos ES6-Version, aber mit Potenzierungsoperator. :) (Ich hatte nicht genug Ruf, um stattdessen zu kommentieren.)

Bearbeiten: /+(b-1)geändert in /--b(danke @Neil).

Bearbeiten: Verwendet jetzt Curry (danke @MamaFunRoll).

Campbell
quelle
Willkommen bei PPCG! Deine Antwort ist ziemlich gut!
NoOneIsHere
Herzlich willkommen! Der +Operator war ein Test, den ich vergessen habe, zu bearbeiten, so dass Sie 1 Byte weglassen können :)
Bassdrop Cumberwubwubwub
Die Formel funktioniert nicht für m = 1: 3
user6245072
@ user6245072 stehst du auf chrome canary? Oder am Knoten? Wenn auf dem Knoten, Harmony Flag
aktivieren
Würden /--bSie ein oder zwei Bytes sparen?
Neil
8

MATLAB, 23 Bytes

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

Teste es hier !

Stewie Griffin
quelle
8

Javascript ES6, 59 37 35 34 Bytes

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

Danke an @Kaizo für die unglaublichen 19 Bytes, @Neil für weitere 2 und @gcampbell für 1 mehr!

Probieren Sie es hier aus

Alternative kaputte Versionen

32 Bytes

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

Ursachen NaNfür b==1.

30 Bytes

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

Ursachen Infinityfür b==1.5.

28 Bytes

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

Ausgaben 1für einige gültige Testfälle.

Alte Version für 59 Bytes

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

Bassdrop Cumberwubwubwub
quelle
Warum haben Sie nicht gerade den Fall b == 1 im 32-Byte-Fall behandelt? 40 Bytes: (a, b) => b-1? (Math.pow (b, a * a) -1) / (b-1): a * a
Kaizo
@ Kaizo du hast recht, ich bin ein Idiot: D
Bassdrop Cumberwubwubwub
/~-bist offensichtlich nicht gut für gebrochene b, aber /--bsollte funktionieren, nein?
Neil
Übrigens habe ich die alte Version auf 47 Bytes reduziert:(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Neil,
@Neil du hast recht, natürlich. Das bekommst du, wenn du deine Antworten hast: p Danke!
Bassdrop Cumberwubwubwub
6

Java, 132 Bytes

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

Anmerkungen

  • Dies funktioniert für beliebig große Ausgaben, wie dies von OP gefordert wird (Schade, dass Java große Zahlen unterstützt, dies wäre sonst kürzer).

Ausgänge

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
quelle
6

R, 18 Bytes

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

Erläuterung:

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

05AB1E , 5 Bytes

Code:

nL<mO

Erläuterung:

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

Probieren Sie es online! .

Adnan
quelle
4

Haskell, 30 Bytes

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

oder gleich lang

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

Die erste Version beginnt mit 1mehrmals multipliziert mit m. Dann summiert es die ersten n^2Zahlen dieser Folge. Die zweite Version ist die explizite Formel, wie in anderen Antworten zu sehen.

nimi
quelle
Kannst du nicht einfach tun n#m=sum$(m^)<$>[0..n*n-1]?
xnor
@xnor: Oh, das ist schön. Ich denke, es ist anders genug für eine separate Antwort. Bitte poste es selbst.
nimi
4

J 10 Bytes

+/@:^i.@*:

Verwendungszweck

Ich markiere einige Ganzzahlen mit dem xSuffix, um erweiterte Ganzzahlen zu verwenden, um genaue Ergebnisse zu erhalten.

   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

Erläuterung

+/@:^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
Meilen
quelle
6 Bytes #.*:$*gemäß APL Dude.
FrownyFrog
4

Mathcad, [tbd] Bytes (~ 11)

Bildbeschreibung hier eingeben

Verwendet den in Mathcad eingebauten Summationsoperator. Demonstriert auch die Vereinfachung des symbolischen Prozessors, um eine exakte Formel zu generieren.

Mathcad führt effektiv zwei Prozessor-Engines parallel aus - eine Standard-IEEE-64/80-Bit-Gleitkomma-Engine und ein symbolischer Prozess mit beliebiger Zahlenlänge (MuPad). Die numerische Standardbewertung wird durch das Gleichheitszeichen (=) angezeigt, während ein Pfeil nach rechts die symbolische Bewertung anzeigt.


Mathcad-Zählschema muss noch ermittelt werden, damit keine Byteanzahl angegeben wird.

ctl- $ gibt den Summationsoperator (Sigma) ein, einschließlich leerer Platzhalter, um die Summationsvariable, den Anfangswert, den Endwert und den Ausdruck zu setzen. Ungefähre Anzahl von Byte-Äquivalenten = 11.

Stuart Bruff
quelle
wo ist der code
4.
1
Der "Code" für die eigentliche Herausforderung ist das erste Summierungszeichen (Sigma), das Sie unter der Überschrift "Herausforderungslösung" sehen. Die anderen Bits von "Code" sind unter der Überschrift "Lösungsvarianten" angegeben. Was Sie im Bild sehen, ist genau das, was in einem Mathcad-Arbeitsblatt festgehalten wird. Mathcad verwendet mathematische Symbole für verschiedene Operationen, z. B. eine Vektorsumme oder ein Produkt, Funktionsintegration oder -differenzierung oder logische Operationen. Die meisten Operatoren können über eine Tastenkombination (z. B. Strg-4 für eine implizite Vektorsumme oder Strg- & für eine iterierte Summe) oder über ein Menü oder eine Symbolleiste eingegeben werden.
Stuart Bruff
4

PostgreSQL, 67 66 Bytes

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

SqlFiddleDemo

Eingang: VALUES(side, multiplier)


BEARBEITEN:

Eingabe in Tabelle verschoben, alle Fälle gleichzeitig:

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

SqlFiddleDemo

Ausgabe:

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

TI-Basic, 19 Bytes

Sist Seitenlänge und Mist der Multiplikator.

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

Python, 40 Bytes

lambda l,m:sum(m**i for i in range(l*l))
orlp
quelle
1
lambda l,m:(m**(l*l)-1)/(m-1)
Undichte Nonne
In normalen Sprachen wäre die Verwendung von Formeln kürzer. Ich habe map benutzt, weil esolangs Maps kürzer wären.
Undichte Nonne
Wo ist der Durchgestrichene?
Undichte Nonne
@KennyLau Ich habe immer noch an meiner Antwort gearbeitet. Ich habe diese gepostet, bevor ich Ihren Kommentar gesehen habe.
Orlp
Okay, (noch 7 ...)
Undichte Nonne
3

Ruby: 39 Bytes

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

Prüfung:

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
quelle
Wann hat Ruby eine sumFunktion bekommen ??? Dies ist Spielwechsel
Value Ink
Ach nein! Was ich für eine Ruby-Core-Methode hielt, ist in der Tat ein trauriges Gesicht nach der Rails-Methode . Ich habe die Antwort aktualisiert.
Br3nt
Können Sie einfach Ihre Sprache in Rails ändern? Ich weiß nicht, welche Importe Sie dafür benötigen könnten
Value Ink
3

Python, 41 Bytes

Völlig neu in dieser Golfsache, Kritik erwünscht!

lambda n,m:sum(m**i for i in range(n**2))
Lang Tran
quelle
Es ist eigentlich ganz gut; )
user6245072
Haha danke. Ich musste mal wieder googeln, wie man Lambdas in Python macht, da ich Python eine Weile nicht mehr angerührt habe.
Lang Tran
Willkommen bei Programming Puzzles & Code Golf! Dies ist eine nette Antwort, aber es ist ziemlich ähnlich wie diese .
Dennis
Ah, ich habe nicht gesehen, ob es noch andere Lösungen gibt. Hat er ein Byte gespart, indem er das getan hat, l**lwas ich getan habe?
Lang Tran
l*leigentlich ist das kürzer als l**2.
Dennis
2

Jolf, 18 15 10 Bytes

Vielen Dank an Cᴏɴᴏʀ O'Bʀɪᴇɴ für das Speichern von 3 Bytes und den Hinweis auf das Mapping

uΜzQjd^JwH

Probieren Sie es hier aus!

 Μ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
schwillt an
quelle
Gute Arbeit! Sie können das a vor dem Zeta entfernen, da dies implizit ausgeschlossen ist. Sie können auch Mu (Karte) anstelle von für jedes verwenden, und ich denke, Sie können das D durch Anzeige ersetzen und die Endung entfernen}.
Conor O'Brien
1
@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Vorsichtig, vergessen Sie immer wieder die impliziten Teile von Jolf, sie sind mit Sicherheit eine der besten Möglichkeiten, um ein paar Bytes zu entfernen.
schwillt
2

CJam , 9 Bytes

q~2#,f#:+

Die Eingaben sind in umgekehrter Reihenfolge durch ein Zeilenumbruch oder ein Leerzeichen getrennt.

Probieren Sie es 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
quelle
2

PHP, 58 54 Bytes

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

Hierbei wird nur die Summenformel verwendet, um den Wert anzuzeigen, nachdem überprüft wurde, ob der Multiplikator 1 ist (was in der Formel NAN zurückgibt).

Xanderhall
quelle
2

Mathematica, 22 Bytes

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

Erstellt einen Bereich von {1, 2, ... s^2}, subtrahiert 1 darüber, um ihn zu erstellen {0, 1, ..., s^2-1}. Dann erhebe jedes zur Macht des mBildens {m^0, m^1, ..., m^(s^2-1)}und gib die Summe davon zurück.

Alternativ kann Mathematica die explizite Formel verwenden, indem es das Limit verwendet. Dies erfordert 29 Bytes.

Limit[(s^#^2-1)/(s-1),s->#2]&
Meilen
quelle
Sie könnten Ihre erste Version alsTr[#^Range[#2^2]/#]&
Simon Woods
1

PARI / GP , 25 Bytes

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

Länger aber schneller (35 Bytes):

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

Süß (30 Bytes):

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

C #, 56 Bytes

double f(int n,double q){return(Math.Pow(q,n*n)-1)/--q;}
downrep_nation
quelle
Testfall 256, 1?
user6245072
Ist es nicht 256 ^ 2?
Downrep_nation
1
(Math.Pow(1, 256 * 256) - 1) / --1= 0/0.
user6245072
1
Sie müssen entweder System verwenden; oder System.Math.Pow. Und Ihr Code funktioniert nicht, wenn q = 1 ist, wie von @ user6245072 angegeben.
Horváth Dávid
1

Lua, 54 47 Bytes

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

Führen Sie aus der Befehlszeile mit der Board-Seitenlänge als erstem Argument und dem Multiplikator als zweitem aus.

Vielen Dank an user6245072 für das Speichern von 6 Bytes und Katenkyo für das Speichern einer zusätzlichen 1.


Ursprüngliche 54-Byte-Version:

a,b=...c=1 d=1 for i=2,a^2 do c=c*b d=d+c end print(d)
kidfrommars
quelle
Hallo und willkommen bei PPCG! Gute Antwort!
NoOneIsHere
l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
user6245072
Dies sollte einige Bytes sparen.
user6245072
Durch das Umbenennen von d wird ein Byte gespart, da der Platz in c=1 d=1=> übersprungen werden kann a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g). Wenn der Vorschlag von @ user6245072 funktioniert, können Sie ein Byte nach demselben Prinzip speichern =>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
Katenkyo
Das Leerzeichen zwischen r=0und l,m=...ist ohnehin obligatorisch, es ändert sich also nicht. Auch die Schleife sollte sein, for i=0,l^2-1aber das ist meine Schuld lol.
user6245072
1

𝔼𝕊𝕄𝕚𝕟 11 Zeichen / 14 Bytes

⨭⩥ î²)ⓜⁿ⁽í$

Try it here (Firefox/WebKit Nightly only).

Ja, funktioniert jetzt in WebKit Nightly! Chrome-Support ist der nächste.

Erläuterung

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

RETURN , 32 Bytes

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

Try it here.

Anonymes Lambda, das das Ergebnis auf Stack2 verlässt. Verwendungszweck:

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

Erläuterung

[                              ]!  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
quelle