Ausgehend von zwei Listen mit Würfeln für einen Kampf im Risiko muss Ihr Programm oder Ihre Funktion ausgeben, wie viele Truppen jeder Spieler verliert.
Hintergrund
Sie müssen dies nicht lesen, denn es handelt sich lediglich um Hintergrundinformationen. Springe zur Unterüberschrift "Aufgabe", um unvermindert fortzufahren.
Im Risikospiel kann ein Spieler einen anderen Spieler angreifen (tatsächlich ist dies erforderlich, um zu gewinnen). Der Ausgang eines Kampfes wird durch das Würfeln bestimmt. Jede Schlacht besteht aus einer Abfolge von Teilkämpfen, in denen jeder Spieler bis zu einem 2
seiner Armeestücke verlieren kann .
In einem Teilkampf werfen der Verteidiger und der Angreifer jeweils mehrere Würfel, deren Anzahl je nach Umständen variieren kann, die für diese Herausforderung nicht relevant sind. Der am höchsten bewertete Würfel des Angreifers wird mit dem am höchsten bewerteten Würfel des Verteidigers verglichen. Wenn der Würfel des Angreifers höher ist als der des Verteidigers, verliert der Verteidiger ein Teil. Ansonsten verliert der Angreifer ein Teil.
Wenn beide Spieler mindestens zwei Würfel haben, werden die zweithöchsten Würfel der beiden Spieler verglichen. Wenn der Würfel des Angreifers höher ist als der des Verteidigers, verliert der Verteidiger ein Teil. Ansonsten verliert der Angreifer ein Teil.
(Verteidiger gewinnt Unentschieden. Wenn sowohl Verteidiger als auch Angreifer einen Wurf 4
ausführen, verliert der Angreifer eine Figur.)
In diesem Teilkampf aus dem Wikipedia-Artikel sind die Würfel des Angreifers rot und die des Verteidigers weiß. Der höchste Würfel des Angreifers 4
und der höchste des Verteidigers 3
. Da der Angreifer höher war, verliert der Verteidiger ein Stück. Die zweithöchsten sind 3
für den Angreifer und 2
für den Verteidiger. Da der Angreifer wieder höher war, verliert der Verteidiger ein weiteres Stück. In diesem Teilkampf verliert der Angreifer also keine Steine und der Verteidiger verliert 2
Steine.
Beachten Sie, dass die dritthöchsten Stücke nicht verglichen werden. Dies liegt daran, dass der Verteidiger in einem Teilkampf nicht mehr als zwei Würfel hat. Es gibt also keine dritthöchsten Stücke, die jemals verglichen werden könnten.
Aufgabe
Ausgehend von den unsortierten Würfeln (ganze Zahlen im Bereich von 1 bis einschließlich 6) sowohl des Angreifers als auch des Verteidigers einer Teilschlacht des Risikos in einer beliebigen zweckmäßigen Form, geben Sie die Anzahl der Armeestücke aus, die jeder Spieler verliert. Die Ausgabe kann in einer beliebigen zweckmäßigen Form erfolgen, sofern sie unterschiedliche Ausgaben aufweist, um die fünf Möglichkeiten anzuzeigen. Sie müssen angeben, welche unterschiedlichen Ausgänge in Ihrer Frage enthalten sind.
Die Ausgabe wird wie folgt bestimmt: Beginnen Sie mit def=0
und atk=0
. Ist der größte Wert der Würfelwurfliste des Angreifers größer als der größte Wert der Würfelwurfliste des Verteidigers, erhöhen Sie ihn def
. Andernfalls inkrementieren atk
.
Wenn beide Würfelwurflisten mindestens eine Länge haben 2
, gilt Folgendes: Wenn der zweitgrößte Wert der Würfelwurfliste des Angreifers größer ist als der zweitgrößte Wert der Liste, erhöhen Sie def
und erhöhen Sie ihn ansonsten atk
.
Schließlich muss das Programm oder die Funktion eine eindeutige Kennung für jede der folgenden 5 Ausgabemöglichkeiten ausgeben:
╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 1 ║ 0 ║
║ 0 ║ 1 ║
║ 2 ║ 0 ║
║ 1 ║ 1 ║
║ 0 ║ 2 ║
╚═══╩═══╝
Beispiel
Verteidiger: [3, 2]
Angreifer : Maximaler [2, 4, 1]
Verteidiger 3
und maximaler Angreifer 4
. 4>3
, so ist der def=1
Zweite des Verteidigers 2
und der Zweite des Angreifers 2
. Not(2>2)
so atk=1
. Die Ausgabe könnte dann sein [1,1]
.
Testfälle
Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]
Beispielimplementierung
Python 2 oder 3
def risk(atk_rolls,def_rolls):
# set the rolls in descending order, e.g. [5,3,2]
atk_rolls = sorted(atk_rolls,reverse = True)
def_rolls = sorted(def_rolls,reverse = True)
# minimum length.
minlen = min(len(atk_rolls),len(def_rolls))
atk_lost = 0
def_lost = 0
# compare the highest-valued rolls
if atk_rolls[0]>def_rolls[0]:
def_lost += 1
else:
atk_lost += 1
if minlen == 2:
# compare the second-highest-valued rolls
if atk_rolls[1] > def_rolls[1]:
def_lost += 1
else:
atk_lost += 1
return [def_lost, atk_lost]
Spezifikationen
- Die Eingabe kann in jeder Form erfolgen, bei der nur die Würfel des Verteidigers und des Angreifers eindeutig codiert sind .
- Die Ausgabe kann in einer beliebigen Form erfolgen, die eine eindeutige Ausgabe für jede der fünf oben aufgeführten Möglichkeiten bietet.
- Die Rollen des Verteidigers sind eine Liste
1
oder2
ganze Zahlen im Satz[1,2,3,4,5,6]
. Der Angreifers Rollen sind eine Liste der1
zu3
ganzen Zahlen in der Menge[1,2,3,4,5,6]
. - Da dies Codegolf ist , gewinnt der kürzeste Code in jeder Sprache ! Sie nicht lassen Antworten in Golf Sprachen entmutigen zu veröffentlichen Antworten in anderen Sprachen.
quelle
Antworten:
NAND-Tore, 237
Erstellt mit Logisim
Die Eingänge sind 3-Bit-Binäreingänge ohne Vorzeichen, die links eingegeben werden. Die Ausgänge (2 Bits) befinden sich rechts.
Es ist zu groß, um auf den Bildschirm zu passen, und Logisim kann nicht zoomen, sodass das Bild schwarzweiß ist. Es tut uns leid :(
Funktioniert für alle Testfälle.
Es gibt wahrscheinlich einen besseren Weg, dies mit einer Speicherschaltung zu tun, damit große Abschnitte wiederverwendet werden können.
quelle
Jelly ,
1211 BytesEin monadischer Link, der eine Liste von
Defender, Attacker
Würfeln (jeweils als Listen) erstellt und eine ganze Zahl zwischen-2
und2
einschließlich zurückgibt (Verteidigerverluste - Angreiferverluste):Probieren Sie es online! oder sehen Sie sich eine Testsuite an (die die Ergebnisse dem OP-Format zuordnet).
Wie?
quelle
Netzhaut , 82 Bytes
Probieren Sie es online! Die erste Eingabezeile sind die Würfel des Angreifers, die zweite die Würfel des Verteidigers. Returns (in separaten Zeilen)
AA
,AD
,DD
,A
oderD
nach Bedarf.quelle
Python 2 ,
8375 BytesProbieren Sie es online!
Das Ergebnis sind Verteidigerverluste - Angreiferverluste
quelle
MATL , 23 Bytes
Probieren Sie es online!
Ich bin mir nicht sicher, warum Verteidiger mehr Würfel als Angreifer haben dürfen, aber vielleicht kenne ich mich mit Risiko nicht so gut aus. Das Kernprogramm besteht darin
>t~,sD
, dass alle anderen Bytes unterschiedliche Eingabelängen zulassen, wobei eine gewisse Sortierung vorgenommen wird. Die Eingabe erfolgt durch Angreifer gefolgt von Verteidiger, die Ausgabe durch Angreifer gefolgt von Verteidigerverlusten.quelle
JavaScript (SpiderMonkey) ,
978378 BytesProbieren Sie es online!
-4 Bytes und fest dank @ovs und @Craig Ayre
-1 Bytes dank @Shaggy
quelle
d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
Schale , 10 Bytes
Probieren Sie es online!
Eingabe als zwei getrennte Listen von Rollen, Ausgabe wie bei der Operation.
Erläuterung
¤z>Ö>
sortiert jede Liste in absteigender Reihenfolge und zippt sie dann, um die entsprechenden Elemente zu vergleichen (und die längere Liste abzuschneiden).M#eI¬
Erstellt eine 2-Elemente-Liste (e
) mit Zählwerten (#
) von Wahrheitswerten (durch IdentitätI
) und falschen Werten (durch logische Negation¬
).quelle
Perl 5 , 66 + 1 (-a) = 67 Bytes
Probieren Sie es online!
Eingang:
Zwei Linien. Die erste Linie ist Verteidiger (Spieler 1), die zweite ist Angreifer (Spieler 2). Einzelne Rollen durch Leerzeichen getrennt.
Ausgabe:
Zeigt eine effektive Änderung der Stärke des Verteidigers gegenüber dem Angreifer an.
quelle
Gelee , 30 Bytes
Probieren Sie es online!
Veeeeeeeery ungolfed! > _ <
Gibt Werte genau wie in Testfällen aus.
quelle
R , 46 Bytes
Probieren Sie es online!
Alles, was dies bewirkt, sind drei Sortierungen und ein Vergleich ... plus Extrahieren der ersten beiden Elemente in der Mitte.
Die Eingabe erfolgt über zwei Vektoren von Würfeln.
Ausgabe wie folgt codiert:
Funktioniert, weil beim Extrahieren in R das Argument nicht wiederverwendet wird, sondern das Ergebnis mit
NA
aufgefüllt wird, um die angeforderte Länge zu erhalten.quelle