Viele Leute sind zu ihrem örtlichen Bowlingzentrum gegangen, um ein paar Bowlingspiele zu spielen, und viele kämpfen weiterhin darum, ihre Punktzahlen zu berechnen. World Bowling hat ein vereinfachtes Punktesystem eingeführt, um mehr Menschen für den Sport zu begeistern. Dieses Punktesystem wird in internationalen Spielen verwendet.
Das Punktesystem funktioniert wie folgt (aus Wikipedia ):
Das World Bowling Scoring-System, das als "Current Frame Scoring" [32] bezeichnet wird, vergibt die Pins folgendermaßen:
- Streik: 30 (unabhängig von den Ergebnissen der folgenden Würfe)
- spare: 10 plus pinfall beim ersten würfeln des aktuellen bildes
- open: Gesamt-Pinfall für den aktuellen Frame
Wenn Sie mit Bowling nicht vertraut sind, finden Sie hier eine Zusammenfassung.
Am Ende einer Bowlingbahn befinden sich 10 Kegel, mit denen alle mit einer Bowlingkugel niedergeschlagen werden sollen. Sie erhalten 2 Wurfbälle, um zu versuchen, sie alle niederzuschlagen, vorzugsweise mit dem ersten Wurf (bekannt als Schlag ). Wenn Sie einen Treffer erzielen, ist dieser Frame abgeschlossen und Sie müssen den Ball nicht ein zweites Mal rollen. Ein Streik ist 30 wert.
Wenn Sie nicht alle zehn umwerfen, erhalten Sie eine weitere Rolle. Wenn Sie alle verbleibenden Stifte umwerfen, spricht man von einem Ersatz . Die Punktzahl ist 10 Pins + die Anzahl der Pins, die beim ersten Wurf abgeworfen wurden. Wenn ich zum Beispiel 7 Pins umgestoßen und dann die restlichen 3 Pins umgestoßen hätte, wäre das 17 wert.
Wenn Sie nach Ihrem zweiten Wurf nicht alle zehn besiegen, spricht man von einem offenen Frame . Die Punktzahl ist die Gesamtzahl der Stifte wert, die für diesen Frame abgeworfen wurden.
Ein Spiel besteht aus 10 Bildern . Wenn Sie mit dem traditionellen Bowling-Scoring vertraut sind, erhalten Sie im 10. Frame beim World Bowling Scoring keine Extrarolle. Bei der traditionellen Bowling-Wertung sind 12 aufeinanderfolgende Schläge erforderlich, um eine perfekte Punktzahl von 300 zu erzielen, während bei der World Bowling-Wertung nur 10 aufeinanderfolgende Schläge erforderlich sind.
Herausforderung
Ihre Herausforderung besteht darin, die Punktzahl anhand eines Bewertungsbogens zu berechnen.
Auf einem Punkteblatt wird ein Fehler durch einen Strich ( - ), einen Schlag mit einem X und einen Ersatz mit einem Schrägstrich ( / ) angezeigt . Wenn diese nicht zutreffen, wird die Pinfall-Anzahl einfach mit einer Zahl (1-9) angegeben. Fouls und Splits werden ebenfalls auf den Spielberichten aufgezeichnet, aber Sie müssen sich nicht darum kümmern.
Eingang
Sie erhalten eine Zeichenfolge, die aus Punktzahlen für jedes Bild besteht und insgesamt zehn Bilder enthält. Jeder Frame hat bis zu zwei Werte oder nur 1 Wert, wenn ein Strike aufgetreten ist. Ihre Eingabe kann ein Zeichenfolgenparameter für eine Funktion sein, der aus einer Datei oder aus STDIN gelesen wird.
Wenn ich zum Beispiel bei meinem ersten Wurf 1 Nadel und dann 2 umgestoßen hätte, würde der Rahmen wie "12" aussehen. Dies bedeutet nicht 12 (zwölf), sondern 1 und 2 für insgesamt 3.
Wenn ich jeden Stift mit beiden Rollen (Rinnenkugeln) verpasst hätte, würde es so aussehen "-" (Punktzahl 0).
Jeder Frame wird durch ein Leerzeichen getrennt.
Probeneingabe
-- 9- -9 X -/ 8/ 71 15 44 X
Um dieses Beispiel aufzuschlüsseln,
- Frame 1 (-) - beide Rollen sind verpasst. erzielte 0
- Frame 2 (9-) - 9 auf der ersten Rolle niedergeschlagen, auf der zweiten Rolle verfehlt. Punktzahl 9
- Frame 3 (-9) - Verpasste alles beim ersten, bekam 9 beim zweiten. Punktzahl 9
- Frame 4 (X) - Strike, alle zehn niedergeschlagen. Ergebnis 30
- Frame 5 (- /) - Spare, verpasste alles beim ersten, warf alles mit dem zweiten Wurf nieder. Ergebnis 10 + 0 = 10
- Frame 6 (8 /) - Spare, 8 Stifte auf der ersten Rolle, die anderen 2 mit der zweiten Rolle niedergeschlagen. Ergebnis 10 + 8 = 18
- Rahmen 7 (71) - offener Rahmen, 7 Stifte auf der ersten Rolle, 1 Stift auf der zweiten Rolle. Ergebnis 7 + 1 = 8
- Die Rahmen 8, 9, 10 folgen denselben Beispielen wie oben.
Ausgabe
Die Ausgabe ist einfach ein Wert, der die Summe der Ergebnisse aller 10 Frames enthält. Bei Verwendung der Beispieleingabe ist die Ausgabe 128. Bei Ihrer Ausgabe kann es sich um eine Zeichenfolge oder einen numerischen Typ handeln. Dies kann ein Funktionsrückgabewert sein oder in STDOUT geschrieben werden.
Regeln
- Angenommen, die Eingabe ist immer gültig. Ein ungültiger Frame wäre beispielsweise "/ 8", "XX", "123", "0" usw.
- Sie müssen sich keine Gedanken über Splits oder Fouls machen.
- Ihr Code kann ein vollständiges Programm oder eine Funktion sein, die eine Zeichenfolge aufnimmt und die Punktzahl zurückgibt.
- Ihr Code darf keine Ausnahmen auslösen.
- Dies ist Codegolf, die Antwort mit der geringsten Anzahl von Bytes gewinnt.
- Sprachen, die Includes oder Importe verwenden, müssen die Importanweisungen als Teil ihres Codes enthalten und auf die Byteanzahl angerechnet werden.
Testfälle
"-- 9- -9 X -/ 8/ 71 15 44 X" -> 128
"-- -1 2- 12 22 5- 42 61 8- 72" -> 45
"X X X 1/ 2/ 3/ 4/ 5/ -- 9/" -> 174
"X X X X X X X X X X" -> 300
"-- -- -- -- -- -- -- -- -- --" -> 0
Antworten:
05AB1E ,
1211 BytesCode
Probieren Sie es online!
Erläuterung
quelle
JavaScript, 43 Bytes
Code-Snippet anzeigen
Wie es funktioniert
Wir konvertieren jedes Zeichen auf seinen Punkt:
Dann summiere alle Punkte.
Konvertieren
Der bitweise ODER- Operator
|
konvertiert seinen Operanden vor der Operation in Int32. Bei der Konvertierung in Int32 wird der Wert zuerst in das 64-Bit-Gleitkommazahlenformat (Number) konvertiert und anschließend in Int32 umgeleitet (oder bei Ungültigkeit in 0 konvertiert).ToInt32({'/':10,X:30}[c])
könnte gelesen werden als:ToInt32(undefined)
->ToInt32(NaN)
-> 0;ToInt32(c)
könnte sein:Number(c)
0 ist, ist das Ergebnis 0;Number(c)
lautet dasNaN
Ergebnis 0.Summe
[c,...s] = s
lassenc = s[0]
, unds = s.slice(1)
;quelle
Stax , 13 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert ist es so.
Führen Sie dieses aus
quelle
Python 2 , 55 Bytes
Probieren Sie es online!
Basierend auf dem String-Index-Ansatz vieler Lösungen.
quelle
Java 8,
645946 Bytes-5 Bytes dank @Neil .
-13 Bytes dank @ OlivierGrégoire .
Erläuterung:
Probieren Sie es online aus.
quelle
("123456789//"+1e6+1e6+"X")
scheint 5 Bytes zu sparen.F #,
106103 BytesProbieren Sie es online!
Ich denke, dass dieses Rätsel (ohne das Golfen) eine großartige Frage für einen Leitfaden "Funktionale Programmierung für Anfänger" wäre. Und ich sollte es wissen!
-3 von Kevin Cruijssen, um festzustellen, dass das Leerzeichen zwischen 'und "dann" gelöscht werden kann. Vielen Dank!
Die Stax-Lösung von recursive für die Verwendung von String-Indizes ist sehr, sehr gut. Wenn Sie es auf F # portieren, können Sie es für 77 Bytes erhalten :
Versuchen Sie dies online!
quelle
'
für -3 Bytes löschen können.Gelee , 17 Bytes
Eine monadische Verknüpfung, die eine Liste von Zeichen akzeptiert und eine Ganzzahl zurückgibt
Probieren Sie es online!
Wie?
Ebenfalls mit 17:
Versuch das
quelle
Perl 6 , 30 Bytes
Probieren Sie es online!
quelle
Retina , 17 Bytes
Probieren Sie es online!
Ich bin nicht ganz auf dem neuesten Stand der Retina-Änderungen. Ich werde sie mir genauer ansehen, wenn ich die Gelegenheit dazu bekomme und herausfinde, ob es neue Tricks gibt, wie man so etwas runtergolfen kann. Der Code verwandelt alle Strikes in drei Ersatzteile, alle Ersatzteile in zehn Punkte und alle Punkte in die entsprechende Anzahl von Unterstrichen. Dann wird die Anzahl der Unterstriche gezählt.
quelle
Perl 5
-pF
,3027 Bytes-3 Bytes dank Xcali
Probieren Sie es online!
quelle
/X/
anstelle vony/X//
und eines durch Verwenden vonm%/%
anstelle von schneideny%/%%
: Probieren Sie es online aus!y///
wann ich sie außerhalb einer Schleife gemacht habe. Thanks05AB1E , 14 Bytes
Probieren Sie es online!
Erläuterung
quelle
J , 33 Bytes
Probieren Sie es online!
Erläuterung:
]
die Eingabe('-123456789',20 1#'/X')
hängt 20/
und einsX
an die Zeichenkette an-123456789
i.
Findet die Indizes der Eingabe in der obigen Zeichenfolge31|
Modulo 31 - um die Leerzeichen loszuwerden - werden sie nicht in der Zeichenkette gefunden, alsoi.
gibt es 31 für sie zurück1#.
Findet die Summe der Indizesquelle
Python 2 , 67 Bytes
-3 Bytes dank @KevinCruijssen
Probieren Sie es online!
quelle
'-123456789'+'/'*20+'X':sum(p.index(i)
zu'-123456789/'+'X'*20:sum(p.rfind(i)
Gelee , 12 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python 3.6 , 54 Bytes
Probieren Sie es online!
quelle
Kotlin , 50 Bytes
Probieren Sie es online!
Hoffentlich verstößt es nicht gegen die Regeln, deine eigene Frage zu beantworten, aber ich wollte mich an dem Spaß beteiligen.
Math.E
erzeugt den Wert2.718281828459045
. Ich benutze es, um eine Füllzeichenfolge zu erstellen, um X auf Position 30 zu drücken.indexOf
Ruft die Position (0-basiert) des Zeichens in der Zeichenfolge "12345 ..." ab. Wenn es nicht gefunden wird, gibt es -1 zurück. Wir addieren 1, um diese 0 zu machen, und das macht auch die 0-basierte Position zum Wert des Strings.quelle
PHP,
119109 Bytes-10 Bytes dank @KevinCruijssen
Probieren Sie es online!
quelle
($b=='/'?10+(int)$a:((int)$a+(int)$b))
um(int)$a+($b=='/'?10:(int)$b)
für -10 Bytes.Holzkohle , 23 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
quelle
Rot , 93 Bytes
Probieren Sie es online!
quelle
C # (.NET Core) , 40 + 18 = 58 Byte
Probieren Sie es online!
quelle
C # (Visual C # Interactive Compiler) , 53 Byte
Probieren Sie es online!
quelle
SNOBOL4 (CSNOBOL4) ,
169151147 BytesProbieren Sie es online!
quelle
Clojure , 70 Bytes
Probieren Sie es online!
Wenn man
reduce
über einen String geht, wird jedes Zeichen in ein Zeichen umgewandelt - wer hätte das gedacht. Aber das meine ich, ich muss schreiben\space
und das tut mehr weh, als man sich vorstellen kann. Beim Erstellen einer tatsächlichen Zahl aus einem Zeichen wird auch die Kombination vonbigint
und verwendetstr
scheint die einzig verwendbare Kombination zu sein.Nun, abgesehen von all diesen Kämpfen: Anonyme Funktion, die die Punktzahl als eine natürliche zurückgibt.
quelle
Ruby , 38 Bytes
Probieren Sie es online!
quelle