Ihre Aufgabe ist es, die Punktzahl eines Spielers in einem 10-Pin-Bowlingspiel nach bis zu 21 Würfeln zusammenzufassen und auszugeben .
Die Rollen werden in der von Ihnen bevorzugten Eingabemethode als eine Folge von ganzen Zahlen dargestellt . Jede Ganzzahl entspricht der Anzahl der Stifte, die in diesem Wurf niedergeschlagen wurden.
Wertung
Nach jeder Runde wird die Anzahl der in dieser Runde umgeworfenen Stifte in die Endwertung gezählt. Wenn ein Spieler im ersten Wurf einer Runde alle zehn Stifte abwirft, ist dies ein Schlag , und die Runde ist vorbei. Ansonsten dauert die Runde noch einen Wurf. Wenn der zweite Wurf einer Runde alle verbleibenden Stifte umwirft, ist dies ein Ersatz .
Für jeden Schlag gibt es einen Bonus , der der Summe der Stifte entspricht, die in den beiden nächsten Würfen niedergeschlagen wurden. Für jeden Ersatz gibt es einen Bonus, der der Anzahl der Stifte entspricht, die beim nächsten Wurf umgeworfen wurden.
In der zehnten und letzten Runde können dem Spieler zusätzliche Würfe gewährt werden: Im Falle eines Streiks erhält der Spieler zwei weitere Würfe, um seinen Streikbonus zu bilden. Im Falle eines Ersatzes erhält der Spieler einen weiteren Wurf.
Beispiele
Input: 4 3 8 2 7 1 10 7 3 0 10 2 2 10 10 5 4
Output: 131
Input: 10 10 9 1 7 3 2 7 10 1 9 10 7 1 10 10 10
Output: 183
Regeln
- Sie können davon ausgehen, dass die Eingabe gültig ist.
- Gemäß Megos Kommentar habe ich die Anforderungen an die Eingabe- / Ausgabemethoden gelockert, um unseren aktuellen Standard zu erfüllen .
- Antworten in Sprachen, die neuer sind als die Herausforderung, sind zulässig
- Kürzester Code gewinnt!
space separated integers
?Antworten:
GolfScript,
5041 ZeichenEin weiterer Versuch in GolfScript ( online ausführen ).
Es folgt eine Erläuterung des Codes. Die Lösung nutzt die Stapel-Natur des Problems (verbrauchen Sie Rollen nacheinander), aber deshalb muss die Eingabe umgekehrt werden.
Vorherige Version:
quelle
Python,
11611010510310099 ZeichenDie Eingabe von 30 Zeichen ist lästig. Vorschläge sind willkommen.
Vielen Dank an Howard für die Verbesserungen.
quelle
1+(z[i]!=10)
mit2-(z[i]>9)
einem Zeichen zu speichern.i
vollständig entfernen (auf 0 setzen) und stattdesseni+=...
verwendenz=z[2-(z[0]>9)::];
z=input()
sollten sie in Ordnung sein (effektiv eine Zeichenfolgendarstellung einer Liste vonint
s nehmen undeval
sie verwenden). Vollständige Programme sollten jedoch irgendwo ausgegeben werden (ich denke, das war damals auch so). Als solches glaube ich, dass dies in diesem 78-Byte-ProgrammR 101 Bytes
Ich bin mir nicht sicher, warum diese Herausforderung bewältigt wurde, aber ich mag sie, deshalb antworte ich sowieso zu spät.
Probieren Sie es online!
Ungolfed:
Rekursive Funktion. Nimmt
x
als Eingabe, die die Scores enthält. Initialisiert dies
Kerne undc
zählt die Anzahl der geworfenen Runden.Die if-Anweisung prüft, ob 10 Runden geworfen wurden oder ob
x
leer ist. In diesem Fall wird die Punktzahl zurückgegeben. Ansonsten ruft sich die Funktion wie folgt auf:Es entfernt die Würfe
x
, indem es überprüft, ob es sich um einen Schlag handelt oder nicht. In diesem Fall wird der erste Eintrag entfernt, ansonsten die ersten beiden.(S=x[1]!=10)
prüft auf Streiks. Wir entfernen (-
) index0:S
, wobeiS
1 ist, wenn es sich um einen Strike handelt, und 0, wenn nicht. Und dann fügen wir ein:-(0:(x[1]!=10)+1)
. Wir übergeben die verkürztenx
zum nächsten Anruf.Die Punktzahl wird ermittelt, indem man feststellt,
x[1:2]
ob es sich um eine reguläre Runde handelt undx[1:3]
ob es sich um einen Streik oder eine Ersatzrunde handelt. Wir prüfen, obsum(x[1:2])
größer oder gleich 10 ist. Wenn es sich um einen Streik handelt, ist dies offensichtlich der Fall. Wenn es ein Ersatz ist, funktioniert dies auch. Wenn dies also WAHR ist, addieren wirx[3]
die Summe. Dies wird dann hinzugefügts
.quelle
CoffeeScript (
234215170)BEARBEITEN : Ein heftiges Umschreiben, das Howards großartigen Stack-basierten Ansatz schamlos plagiiert. Ich bin zuversichtlich, dass mehr herausgenommen werden kann, um auf das letzte Element eines Arrays zuzugreifen, ohne es zu zerstören ...
quelle
Ruby, 252 Bytes
Akzeptiert Eingaben in ein Array, fügt man zuerst alle Elemente hinzu und sucht dann nach Ersatz- und Trefferbonus
quelle
PHP, 82 Bytes
Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit
-nr
oder testen Sie es online .Nervenzusammenbruch
quelle
Perl 5 , 65 + 2 = 67 Bytes
Benötigt
-ap
FlaggenProbieren Sie es online!
quelle
Jelly ,
3635 BytesEin monadischer Link, der eine Liste von Ganzzahlen akzeptiert und eine Ganzzahl zurückgibt.
Probieren Sie es online!
Wie?
Berechnet die Punktzahl für jeden überlappenden Lauf von drei Schalen so, als ob er am Anfang eines Frames begonnen hätte und fügt optional eine Strike-ID hinzu (
-1
), glättet diese resultierende Liste, teilt sie an den Strike- IDs auf und verwirft dann jedes zweite Ergebnis von jeden Block (Entfernen der Punkte der Läufe, die nicht wirklich mit dem Start eines Frames begonnen haben).Um dem letzten Frame gerecht zu werden, wird zuerst eine Null an die Eingabe angehängt (um das dreiteilige Schneiden zu ermöglichen, damit ein Frame auf der vorletzten Schüssel beginnen kann), und die resultierenden Scores werden auf die ersten zehn gekürzt (um das Jetzt zu entfernen) möglichen falschen 11. Frame), bevor Sie sie aufsummieren.
quelle
Perl, 140?
Erster Versuch:
Leider gibt es bestimmte Fälle, in denen dies fehlschlägt. Ich werde später kommen und es wiederholen.
quelle