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.


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

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


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*

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)].


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).


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

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)


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

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

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! .


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.


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

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.


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              ║
╚══════╩══════╩══════════════════════╝

3

TI-Basic, 19 Bytes

Sist Seitenlänge und Mist der Multiplikator.

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

3

Python, 40 Bytes

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

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

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))

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

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)]

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).


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]&

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))


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)

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.