Auf einer Party wurde ich in das Spiel LCR eingeführt. Jetzt ist es kein großartiges Spiel, da es keine Fertigkeiten gibt, sondern nur zufällige Chancen. Aber es brachte mich zum Nachdenken, ich könnte das codieren, und ich machte ein schnelles Programm in R, um das Spiel zu modellieren.
Die Spielregeln wurden von Wikipedia an unsere Spielweise angepasst:
Jeder Spieler erhält mindestens 3 Chips. Die Spieler würfeln abwechselnd drei sechsseitige Würfel, von denen jeder auf einer Seite mit "L", "C", "R" und auf den drei verbleibenden Seiten mit einem einzelnen Punkt markiert ist. Für jedes geworfene "L" oder "R" muss der Spieler einen Chip links oder rechts an den Spieler weitergeben. Ein "C" zeigt einen Chip in der Mitte (Topf) an. Ein Punkt hat keine Wirkung.
Wenn ein Spieler weniger als drei Chips übrig hat, ist er noch im Spiel, aber die Anzahl der Chips entspricht der Anzahl der Würfel, die er in seinem Zug würfelt, anstatt alle drei zu würfeln. Wenn ein Spieler keine Chips hat, gibt er die Würfel in seinem Zug weiter, kann aber Chips von anderen erhalten und den nächsten Zug entsprechend machen. Der Gewinner ist der letzte Spieler, der Chips in die Mitte legt.
Wettbewerb: Schreiben Sie ein Programm in der Sprache Ihrer Wahl, das Eingaben für die Anzahl der Spieler und die Anzahl der Startchips enthält und ein LCR-Spiel simuliert, das den Status des Spiels anzeigt, nachdem jeder Spieler gewürfelt hat.
Ein Spiel kann beispielsweise wie folgt ausgegeben werden:
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
ht: JonathanAllan
Die Ausgabe muss nicht genau so aussehen, aber es sollte leicht zu erkennen sein, wie viele Chips jeder Spieler hat und wie viele Chips das Zentrum für jede Runde hat.
Es ist Code Golf, also gewinnt der kürzeste Code.
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
- Ist das der Fall?Antworten:
Emacs Lisp , 279 Bytes
Verwenden Sie diese Funktion als
(f 4 3)
.Besser lesbare Version:
Ausgabebeispiel:
quelle
Java 8,
281277275274253 BytesVersion, die den gleichen Status ausgibt, wenn ein Turn-Spieler noch 0 Chips hat:
Beginnt mit dem dritten Player im Array.
Probieren Sie es online aus.
Version, bei der Spieler mit 0 verbleibenden Chips (274 Byte) übersprungen werden:
Beginnt beim ersten Spieler im Array.
Probieren Sie es online aus.
-7 Bytes dank @ OlivierGrégoire .
Erklärung (der zweiten Version):
quelle
s=0;for(int C:c)s+=C;
(21 Bytes) kann durchs=A.stream(c).sum();
(20 Bytes) ersetzt werdenc[i%p]-=r<3?1:0
→c[i%p]-=1-r/3
. Dies würde 2 Bytes sparen.A
ausjava.util.Arrays
. : D Und wenn Sie es in die Schleife setzen, um das Semikolon zu speichern, sind es -2 Bytes. Und1-r/3
ist in der Tat richtig ( siehe hier ). Vielen Dank.s=c[u=(i+r-1+p)%p]+=1-r&1-r/4
(spart 2 Bytes im Vergleich zus=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0
)Python 2 ,
159148 BytesProbieren Sie es online aus!
Druckt alle Spielerchips nach jedem Wurf
quelle
n*c - sum(players)
. Wenn ich es explizitGelee , 39 Bytes
+2, um das Wiederholungsverhalten zu korrigieren (
¡
muss ein Nullzeichen vorangestellt werden, damit«3Ḣ$
->⁸FḢ«3
)Wenn wir die Ausgabelisten definieren können, die gedreht werden sollen, damit die Chips des Spielers, der zuvor links gehandelt hat, ganz rechts sind 6 Bytes für 33 Bytes (meiner Meinung nach ist es jedoch etwas umständlich, das zu lesen).
Ein dyadischer Link, der links Chips pro Spieler und rechts Spieleranzahl akzeptiert, der eine Liste der Chipzählungen der Spieler zu Beginn des Spiels und nach jeder Runde ergibt (einschließlich Runden, in denen 0 Chips einen Pass erzwingen). .
Probieren Sie es online aus!
Wie?
Jeder Spieler wirft seinerseits bis zu dreimal, abhängig von seiner Chipanzahl, eine Münze. Wenn ein Spieler die Köpfe dreht, tut er nichts, aber wenn er die Schwänze dreht, würfelt er einen dreiseitigen Würfel und verliert einen Chip gegen L, C oder R. (Beachten Sie, dass 0 Flips, wenn ein Spieler 0 Chips hat, dem Pass entsprechen.)
Dies wird wiederholt bis die Summe der Spielerchips 0 ist.
Die Implementierung dreht die Spieler in jeder Runde um eine Stelle nach links und dreht dann die resultierenden Zustände zurück, um alle auszurichten, als ob sie es nicht wären.
quelle
Ø.X¤?
ist in der Anweisung zum bis zu dreimaligen Wiederholen verschachtelt⁸«3Ḣ¤¡
.C #, 356 & le; +13 & le; Bytes
Benötigt
using System;
insgesamt +13 Bytes für den unten gezeigten Code, wenn ich das zählen muss. Ansonsten einfach in eine Klasse stecken und anrufenL(players, starting chips);
.Beispielausgabe für ein 2,2-Spiel:
Weniger Golfversion:
quelle
C # (Visual C # Interactive Compiler) ,
201199 ByteProbieren Sie es online aus!
quelle
Holzkohle , 61 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Wechselt zwischen der Ausgabe der Würfelwürfe und der verbleibenden Chips (weder die anfängliche Anzahl der Chips noch die Anzahl der Chips in der Mitte sind in der Ausgabe enthalten). Erläuterung:
Beginnen Sie mit dem ersten Spieler.
Wiederholen, bis niemand mehr Chips hat.
Wirf bis zu drei Würfel für den aktuellen Spieler. Diese Würfel sind mit 0-5 gekennzeichnet, wobei 0-2 den Punkt darstellt, 3 nach links geht, 4 zur Mitte geht, 5 nach rechts ist.
Addieren Sie die Anzahl der Chips, die der Spieler rechts links und die Anzahl der Chips, die der Spieler links rechts übergeben hat, aber subtrahieren Sie die Anzahl der Chips, die der Spieler selbst weitergegeben hat.
Zum nächsten Spieler vorrücken.
Geben Sie die neue Anzahl der von den Spielern gehaltenen Chips aus.
Tatsächlich ist es für jeden einfacher, gleichzeitig zu würfeln. Dies kann in 50 Bytes erfolgen, einschließlich des Druckens der Würfelwürfe sowie der verbleibenden Chips:
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes.
quelle
05AB1E (Legacy) ,
58504952 ByteVersion, die den gleichen Status ausgibt, wenn ein Turn-Spieler noch 0 Chips hat (
504952 Bytes ):Probieren Sie es online aus.
Version, die Spieler mit 0 verbleibenden Chips überspringt (
585760 Bytes ):Probieren Sie es online aus.
Beide +3 Bytes bei Verwendung der Legacy-Version, da die neue 05AB1E-Version einen seltsamen Fehler aufweist. Es sollte funktionieren mit
Ws\
(Minimum drücken ohne zu knallen; tauschen; Liste verwerfen) ersetzt durchß
(Popliste und Minimum drücken) und0›
(prüfen, ob größer als 0) ersetzt durchd
(prüfen, ob nicht negativ / größer oder gleich 0) in der neue Version, aber aus irgendeinem Grund wird die Listenreihenfolge nach dem Trailing geändert¼
! .. : S (und die neue Version ist auch extrem langsam und läuft nach 60 Sekunden ab, bevor das Ergebnis beendet wird ..>.>)Die erste Eingabe ist die Anzahl der Spieler, die zweite Eingabe die Anzahl der Chips pro Spieler.
Erklärung (der zweiten Version):
quelle
[2, 3, 3, 3]
gefolgt von[2, 2, 2, 6]
..: S Ich werde sehen, ob ich die Ursache finden und beheben kann. Wenn nicht, kann ich es immer löschen und nur das Legacy verwenden, da es sowieso viel mehr ausgibt. Die neue Version ist aus irgendeinem Grund ziemlich langsam mit komplexen Schleifen.>.>counter_variable
. Ich habe versucht, das Problem in einem einfacheren Beispiel zu reproduzieren, kann dies jedoch nicht. Es hat etwas mit den verschachtelten if-Anweisungen und Maps in der Endlosschleife zu tun, aber es ist definitiv komisch. Wie auch immer, ich habe diese Version entfernt und jetzt bleibt nur die ältere (und schnellere) Version übrig, die wie beabsichtigt funktioniert.