Mancala ist der Name einer Familie von Brettspielen, bei denen es sich normalerweise um eine Reihe von Tassen handelt, die mit Perlen gefüllt sind, die die Spieler manipulieren. Diese Herausforderung verwendet einen bestimmten Regelsatz für eine Solitaire-Variante des Spiels.
Das Brett besteht aus einem "Korb" an einem Ende, gefolgt von einer unendlichen Anzahl von Bechern, die ab 1 nummeriert sind. Einige der Becher enthalten eine bestimmte Anzahl von Perlen. Wenn die n
dritte Tasse genau n
Perlen enthält, können Sie die Perlen daraus "säen". Säen bedeutet, alle n
Perlen aus der Tasse zu nehmen und sie dann einzeln in jeder Tasse in Richtung Korb abzulegen. Die letzte Perle wird in den Korb gelegt. Der Spieler gewinnt, wenn sich alle Perlen auf dem Brett im Korb befinden.
Natürlich gibt es viele Bretter, die nicht gewinnbar sind, zum Beispiel, wenn genau eine Perle in der zweiten Tasse ist. Es gibt keine legalen Spiele, da nicht alle Tassen mit 0 Perlen gesät werden können und die zweite Tasse nicht genügend Perlen zum Säen hat. Dies macht offensichtlich keinen Spaß, daher besteht Ihre Aufgabe darin, gewinnbare Boards zu erstellen.
Aufgabe
Bei einer positiven Ganzzahl, die eine Anzahl von Perlen darstellt, wird eine Liste von nicht negativen Ganzzahlen ausgegeben, die die Anzahl der Perlen darstellen, die in jede Tasse gegeben werden sollten, um ein gewinnbares Brett wie oben beschrieben herzustellen. Diese Liste sollte keine nachgestellten Nullen enthalten.
Für eine bestimmte Anzahl von Perlen gibt es immer genau eine gewinnbare Board-Konfiguration.
Demonstration
Dies ist eine Demonstration, wie man das gewinnbare Brett für und die Eingabe von 4 spielt. Das gewinnbare Brett ist [0, 1, 3]
. Wir beginnen mit dem einzigen verfügbaren Zug und säen die Perlen aus der dritten Tasse, um sie zu erhalten [1, 2, 0]
. Jetzt haben wir tatsächlich eine Wahl, aber die einzig richtige ist, die erste Tasse zu säen und zu bekommen : [0, 2, 0]
. Dann säen wir die zweite Tasse nachgiebig [1, 0, 0]
und schließlich säen wir die erste Tasse erneut, um alle leeren Tassen zu erhalten.
Testfälle:
1 => [1]
2 => [0, 2]
3 => [1, 2]
4 => [0, 1, 3]
5 => [1, 1, 3]
6 => [0, 0, 2, 4]
7 => [1, 0, 2, 4]
8 => [0, 2, 2, 4]
9 => [1, 2, 2, 4]
10 => [0, 1, 1, 3, 5]
11 => [1, 1, 1, 3, 5]
12 => [0, 0, 0, 2, 4, 6]
13 => [1, 0, 0, 2, 4, 6]
14 => [0, 2, 0, 2, 4, 6]
15 => [1, 2, 0, 2, 4, 6]
16 => [0, 1, 3, 2, 4, 6]
17 => [1, 1, 3, 2, 4, 6]
18 => [0, 0, 2, 1, 3, 5, 7]
19 => [1, 0, 2, 1, 3, 5, 7]
20 => [0, 2, 2, 1, 3, 5, 7]
Vielen Dank an PeterTaylor für die Entwicklung eines Programms zur Erstellung von Testfällen!
quelle
Antworten:
CJam (21 Bytes)
Online-Demo
Erläuterung
Ich habe unabhängig die in diesem Artikel erwähnte "Unplaying" -Technik abgeleitet . Wir beweisen durch Induktion, dass es für eine bestimmte Anzahl von Perlen genau ein Gewinnbrett gibt.
Basisfall: Mit 0 Perlen ist das einzige Gewinnbrett das leere.
Induktiver Schritt: Wenn wir aus der Tasse säen, ist die Tasse
k
beim nächsten Zugk
leer und jede Tasse, die sich näher am Korb befindet, enthält mindestens eine Perle. Daher können wir das einzigartige Gewinnbrett mitn
Perlen aus dem Gewinnbrett mitn-1
Perlen finden, indem wir nach der leeren Tasse mit der niedrigsten Nummer suchen, eine Perle aus dem Korb und eine aus jeder Tasse unter dieser leeren Tasse nehmen und alle in die leere Tasse legen.Präparation
quelle
Python,
4241 Bytesquelle
JavaScript (ES6),
6337 BytePort der Python-Antwort von @ orlp. Erläuterung: Berücksichtigen Sie die Gesamtzahl der Perlen in der
i
th und höheren Tasse. Bei jedem Spiel aus einer dieser Tassen werdeni
Perlen aus dieser Summe entfernt. (Wenn zum Beispieli
3 ist und Sie ab der fünften Tasse spielen, reduzieren Sie die Anzahl der Perlen in dieser Tasse um fünf, aber Sie addieren auch eine zur vierten und dritten Tasse.) Die Summe muss daher ein Vielfaches sein voni
. Jetzt kann diei-1
dritte Tasse nichti
mehr Perlen enthalten. Damit ein Vielfachesi
davon übrig bleibt, muss der Rest der Perlen modulo enthalten seini
.Vorherige Erklärung (aus dem Link von @ xnor): Der naive Ansatz ist die "Reverse Playing" -Technik. Dies verwendet die Beobachtung, dass ein Spiel eine Tasse leert, so dass beim umgekehrten Spielen eine Perle aus jeder Tasse gesammelt und wie folgt in die erste leere Tasse gelegt wird (63 Byte):
Betrachten Sie jetzt nur die ersten
i
Tassen. In dem Fall, dass einer von ihnen leer ist, erhöht das umgekehrte Spielen1
die Gesamtzahl der Perlen in diesen Bechern, während in dem Fall, dass keine von ihnen leer ist, das umgekehrte Spieleni
von der Gesamtzahl abgezogen wird. Dies entspricht jedoch dem Hinzufügen von1
Moduloi+1
. Nachn
umgekehrten Spielen entspricht die Summe der Perlen in den ersteni
Bechern dahern
Moduloi+1
, oder anders ausgedrückt, die Anzahl der Perlen in deri
dritten Tasse entsprichtn
minus der Summe der Perlen in den vorhergehenden Bechern, Moduloi+1
. Damit diei
dritte Tasse spielbar ist, kann die Anzahl der Perlen nicht überschritten werdeni
, sodass sie tatsächlich der Anzahl der verbleibenden Modulo-Perlen entsprichti+1
. (Beachten Sie, dass ichd=i+1
weniger Bytes verwende.)quelle
+
in ES6 keine Rolle?Ruby, 36 Bytes
Eine Portierung der Antwort von @ orlp, weil es viel zu genial ist, als dass ich mir etwas Besseres vorstellen könnte.
quelle