Das Brettspiel Terra Mystica hat einige sehr interessante Mechanismen für eine der wichtigsten Ressourcen, die Kraft. Anstatt Krafteinheiten von einer Bank zu erhalten und auszugeben, beginnt jeder Spieler das Spiel mit genau 12 Krafteinheiten, die auf drei "Schalen" mit den Bezeichnungen I, II und III verteilt sind. Macht gewinnen und ausgeben verschiebt dann einfach die Macht zwischen diesen Schalen:
- Um eine Krafteinheit auszugeben, bewegen Sie sie von Schüssel III zu Schüssel I (vorausgesetzt, Sie haben eine Einheit in Schüssel III).
- Wenn du eine Krafteinheit erhältst, lege sie in Schüssel II, wenn sich eine Einheit in Schüssel I befindet. Befindet sich keine Einheit in Schüssel I, aber eine Einheit in Schüssel II, stellen Sie sie in Schüssel III. Wenn sich alle Einheiten bereits in Schüssel III befinden, geschieht nichts.
- Wenn Sie mehrere Einheiten auf einmal erhalten oder ausgeben, werden diese einzeln verarbeitet.
Hier ist ein Beispiel. Angenommen, ein Spieler beginnt mit der folgenden Leistungsverteilung (in der angegebenen Reihenfolge I | II | III
):
5 | 7 | 0
Ihre Kraft ändert sich wie folgt, wenn sie einige Male Kraft aufnimmt und ausgibt:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Ihre Aufgabe ist es, das Ergebnis eines solchen Gewinn- oder Ausgabenereignisses zu berechnen.
Die Herausforderung
Sie erhalten vier Ganzzahlen als Eingabe. Die ersten drei, I
, II
, III
, stellen die Energiemenge in jedem der drei Schalen. Sie sind nicht negativ und summieren sich zu 12. Die vierte Zahl P
gibt die Menge der gewonnenen oder verbrauchten Kraft an und befindet sich im Inklusivbereich [-III, 24]
(Sie können also davon ausgehen, dass der Spieler niemals versuchen wird, mehr Kraft zu verbrauchen als sie derzeit können, aber sie könnten mehr Kraft gewinnen, als sie brauchen, um die gesamte Kraft in die Schüssel III zu befördern.
Sie können diese Zahlen in einer beliebigen konsistenten Reihenfolge als separate Argumente, als Liste von Ganzzahlen oder als Zeichenfolge mit diesen Ganzzahlen verwenden. Sie kann auch P
als ein Argument, wie I
, II
, III
als separate Liste Argument.
Die Ausgabe sollten drei ganze Zahlen I'
, II'
, aus III'
denen die Menge an Energie in jeder Schale nach P
Einheiten gewonnen wurden oder verbracht, nach den Regeln oben erläuterten.
Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen und Bereitstellen von Eingaben verwenden.
Sie können jede Programmiersprache verwenden , aber beachten Sie, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Testfälle
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
quelle
Antworten:
Mathematica, 52 Bytes
Dies ist eine unbenannte Funktion, die eine Liste aufnimmt
{I, II, III, P}
als Eingabe verwendet und eine Liste zurückgibt{I', II', III'}
.Eine geschlossene Lösung. Es fühlt sich noch nicht wirklich optimal an ...
quelle
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
ein Byte länger. Ich mag das12-+##
aber.C,
9794 BytesIn ungolfed Form:
quelle
Python 2, 104 Bytes
Probieren Sie es online aus
Ungolfed:
quelle
Haskell, 58 Bytes
Der Zwischenwert gibt
m
die Kraftmenge an, die von der ersten Schüssel (oder, falls negativ) zuz
der dritten Schüssel nach der Aktion fließt. Durch eine 1-Byte-Optimierung in letzter Minute wurde der alte Ausdruck für die zweite Schüssel von der12-a+m-z
Verwendung der Identität abgeänderta+b+c=12
.Der natürliche Ergebnistyp ist ein Tripel für die Schüsseln, sodass die Eingabe die Schüsseln auch als Tripel und die Leistungsänderung als zweites Argument betrachtet. Dies ermöglicht die Bearbeitung aller Testfälle mit einer Anwendung von
scanl
:quelle
Röda ,
10094 BytesUngolfed:
quelle
++
und--
?JavaScript,
6159 BytesProbieren Sie es online!
quelle
GNU sed , 66 Bytes
Beinhaltet +1 für
-r
Verwendet unary (siehe diesen Konsens ).
Probieren Sie es online!
quelle
Retina ,
46413938 BytesVielen Dank an Martin Ender für viele hilfreiche Vorschläge!
Nimmt unäre Eingaben auf. Die erste Zeile enthält die Strommengen in den drei Schalen, kommasepariert, die zweite Zeile die zu zyklisierende Strommenge.
Testsuite - Fasst alle Eingaben in einer einzigen Zeile zusammen und konvertiert sie zur Vereinfachung von dezimal zu unär und umgekehrt.
Erläuterung
Positiver Fall: Wir entfernen wiederholt den
1
Strich aus der zweiten Zeile und verschieben einen Strich1
aus der ersten nicht leeren Schüssel in die folgende, solange dieser Vorgang möglich ist (dh die Anzahl der zu zyklierenden Striche ist ungleich Null und nicht alle) Macht ist in der dritten Schüssel). Dass
Modifikator bedeutetsingle-line
, dass.
auch der Zeilenumbruch berücksichtigt werden kann.Negativer Fall: Alles in einem Schritt erledigt, wobei die durch die letzte Eingabe angezeigte Leistungsmenge von der dritten in die erste Schüssel verschoben wird. Dadurch wird auch die Linie mit der negativen Bewegungsenergie entfernt.
Behalten Sie (grep) nur Zeilen bei, die ein Komma enthalten. Dadurch werden die eventuellen Reste der ersten Zeile entfernt.
quelle
Python 2, 91 Bytes
Basierend auf dieser Antwort
Probieren Sie es online aus
Ungolfed:
quelle
Batch, 87 Bytes
Verwenden Sie die folgenden Formeln:
Da Batch nicht weniger als einen Operator hat, berechne ich
i = min(-i, 0)
miti*=i>>5
.quelle
Perl 6 , 99 Bytes
Lassen Sie
a
,b
, undc
, die Anzahl der Start Token in Schalen I, II, und III. Dann wird für den Fall der Additionskraft eine Liste erstellt, diea
Kopien des Tripletts enthält(-1, 1, 0)
, gefolgt vona + b
Kopien des Tripletts(0, -1, 1)
, gefolgt von unendlichen Kopien von0
. Die erstend
Elemente dieser Liste,d
dh die Menge der hinzuzufügenden Leistung, werden der Startleistungsverteilung elementweise hinzugefügt.Zum Subtrahieren Leistung (negative
d
), wird eine einfache geschlossene Form verwendet:(a - d, b, c + d)
.quelle
tinylisp , 134 bytes
Definiert eine Funktion
f
, die vier Argumente, die drei Bowls (x y z
) und die Menge der übertragenen Leistung (p
), akzeptiert und nach der Transaktion eine Liste der drei Bowls zurückgibt. Hier ist eine korrekt angeordnete Version mit allen Testfällen: Probieren Sie es online aus!quelle