Ich denke, jeder ist mit Darts vertraut, einige Leute verstehen die Ergebnisse nicht, daher ist für diese Leute hier ein nützlicher Link dazu.
Die Tafel
Eine Dartscheibe kann mit einem in 20 Stücke geschnittenen Kuchen verglichen werden. Jedes Stück ist in 4 Abschnitte unterteilt.
- ein kleiner äußerer Ring namens double (Punkte x2)
- ein großer Ring namens Single (Punkte x1)
- ein weiterer kleiner Ring namens Triple (Punkte x3)
- ein weiterer großer Ring namens Single (Punkte x1)
In der Mitte des Bretts befinden sich 2 weitere Ringe, ein grüner und ein roter (klassisches Brett).
- Roter Ring, Mitte des Bretts genannt Bullseye oder Doppelbulle und gut für 50 Punkte. Dieser zählt als Doppelgänger und darf deshalb mit ihm auschecken.
- Grüner Ring, genannt Stier, einzelner Stier oder einfach 25 und zählt als einzeln.
Herausforderung
Hier finden Sie alle Möglichkeiten zur Kasse mit 3 Pfeilen oder weniger.
Der Benutzer kann eine Ganzzahl eingeben und Sie müssen prüfen, ob es möglich ist, die Punktzahl mit 3 Pfeilen (oder weniger) auf 0 zu bringen.
Beispiele
Beispiel 1:
Input: 170
Output: T20, T20, Bullseye
Beispiel 2:
Input: 6
Output: D3;
S3,S1,D1;
S2,D2;
S2,S2,D1;
D2,D1;
S4,D1;
D1,D1,D1;
S1,S1,D2;
T1,S1,D1;
Beispiel 3:
Input: 169
Output: No possible checkout!
Regeln
- Grundlegende Dartregel: Sie müssen mit einem Doppel (äußerer Ring des Bretts oder Bullauge) enden.
- Keine Verwendung externer Ressourcen.
- Eine harte Codierung möglicher Kassen ist erlaubt, aber denken Sie daran, dass dies ein Codegolf ist, der Ihren Code nicht verkürzt;)
- Zu treffende Zellen werden im Format C + N angezeigt, wobei C = T für Triple, D für Double und S für Single.
- bullseye kann bullseye oder DB, DBull oder etwas Ähnliches genannt werden.
Mögliche Kassen
Um Ihnen den Einstieg zu
erleichtern , ist die höchstmögliche Kaufabwicklung 170. 169.168.166.165.163.162.159 sind in 3 Pfeilen nicht möglich.
Die niedrigstmögliche Kasse ist 2.
Zusätzlich
Dies ist keine Voraussetzung. Fügen Sie die Möglichkeit hinzu, alle möglichen Kassen für alle Ergebnisse anzuzeigen. Grundsätzlich, weil ich mich frage, wie viele Kombinationen möglich sind: P.
Der Gewinner ist derjenige mit dem kürzesten Code.
Viel Spaß beim Codieren.
Antworten:
C ++
248/228230/214 ZeichenRev 0:
Rev 1. Einige Zeichen wurden gespeichert, indem alle Variablen gleichzeitig deklariert und unnötige Klammern entfernt wurden. Es stellt sich heraus, dass in C ++ alle logischen und bitweisen und / oder Vorrang vor Vergleichen haben.
Ich habe eher eine Funktion als ein Programm ausgeführt, wie es andere getan haben. Es gibt die Gesamtzahl der gefundenen Möglichkeiten zurück. Es kann von 230 auf 214 Zeichen reduziert werden, indem die Totalisierungsfunktion entfernt wird.
Beispielausgabe, Punktzahl 6:
Ich zähle verschiedene erste und zweite Pfeile als dieselbe Kombination, wie es das OP getan hat (Beispiel:
T1 S1 D1 = S1 T1 D1), obwohl dies zusätzliche 7 Zeichen kostet. Ich liste immer zuerst die höhere Punktzahl auf (ohne das Verdoppeln und Verdreifachen), da ich denke, dass dies für den Spieler relevanter ist (der seine Strategie ändern kann, wenn er mit dem ersten Pfeil verfehlt). Aus dem gleichen Grund liste ich die Pfeile in der Reihenfolge auf der zweite Pfeil. Ich betrachte den 3. Pfeil als völlig anders als die beiden anderen, daher betrachte ich D1 D2 und D2 D1 als unterschiedliche Fälle, während das OP sie als gleich auflistet.
Mit diesem Zählsystem erhalte ich insgesamt 42336 Möglichkeiten , genau wie bei mmumboss. Wenn verschiedene erste und zweite Pfeile als unterschiedliche Kombinationen gezählt werden, geht dies bis zu 83349.
Ich habe keine for-Schleife mit Mengen verwendet, wie andere es getan haben (ich bin ziemlich neu in C ++ und ich weiß nicht einmal, ob es möglich ist.) Stattdessen missbrauche ich eine Bedingung im Schleifeninkrement, um von 20 auf 25 zu springen Ich verwende die Variable aus einer einzelnen Schleife, um alle möglichen Punkte für einen einzelnen Pfeil zu codieren, wie folgt: S1 D1 T1 S2 D2 T2 usw. mit Modul und Division zum Decodieren. Dies spart die Ausführlichkeit, mehr für Schleifen zu deklarieren, obwohl es Ausdrücke komplizierter macht.
Das Ergebnis ist, dass ein unbenutzter Pfeil als T0 angezeigt wird, aber ich denke, es ist klar, was gemeint ist, zumal ich (indem ich verschiedene erste und zweite Pfeile als dieselbe Kombination betrachtet habe) sie zu Beginn alle zusammen gruppieren konnte meiner Ausgabe.
Ungolfed Version hier. Einige andere Funktionen sind die selektive Verwendung der Operatoren & und && mit | so, dass die gewünschte Rangfolge ohne Klammern angegeben wird.
quelle
MATLAB (
299249241 Zeichen)Dies ist mein erstes ernstes Golfen. Mein erster Versuch (136 Zeichen) liefert das richtige Ergebnis, aber nicht mit der richtigen Formatierung. Es gibt alle Möglichkeiten, die Anzahl der Punkte für jeden Pfeil zu betrachten. Dies bedeutet, dass Single 20 und Double 10 einen separaten Eintrag haben, beide jedoch als 20 angezeigt werden. Natürlich ist der letzte Pfeil immer ein Double.
Im zweiten Versuch wird die Formatierung verbessert, was natürlich die Anzahl der Zeichen erhöht hat:
Verbessert von 299 auf 249 Zeichen bei gleichzeitiger Verbesserung der Ausgabeformatierung. Für diese verbesserte Version lautet die Ausgabe für die Beispielfälle:
f (170):
f (6):
f (169):
Zusätzlich:
Nach meinen Berechnungsfähigkeiten gibt es insgesamt 42336 Möglichkeiten, das Dartspiel zu beenden.
quelle
60 60 50
seinT20 T20 Bullseye
. Ich werde dies in der Frage klarer machen. Gut gemacht, fast da :)Rubin (260 Zeichen)
"Das letzte sollte ein Doppel sein" war das fehlende Stück - konnte nicht herausfinden, warum 168 keine Ergebnisse haben sollte ...:
c. (170)
c. (6)
quelle
Python 2.7 (270 Zeichen)
Ich bin mir nicht sicher, ob Python einen Einzeiler zulässt, aber er ist in drei.
Oder mehr als 278 Zeichen mit der richtigen Meldung "No Checkout" (z. B. 290 hier):
Auf geht's:
f (170)
f (6)
f (169)
Dinge, mit denen ich nicht zufrieden bin:
Dies sind über 10% der Gesamtmenge. Gibt es einen kompakteren Weg ohne itertools etc?
Dies wird verwendet, um Duplikate bei einem Zwei-Pfeil-Finish zu vermeiden (z. B. ['', 'S1', 'D1'] und ['S1', '', 'D1']). Ich halte Ordnung für wichtig (hey - der letzte Pfeil muss ein Doppelpfeil sein, also ist Ordnung eindeutig wichtig), aber der Nichtwurf ist ein Sonderfall.
quelle
05AB1E , 43 Bytes
Ziemlich langsam. Gibt als Liste von Listen oder als leere Liste aus, wenn kein Abschluss möglich ist. Meine Bullen sind
S25
undD25
; Wenn dies nicht erlaubt ist, kann ich es ändern.Probieren Sie es online aus oder überprüfen Sie einige Testfälle gleichzeitig .
Erläuterung:
Es gibt ein paar Schritte:
1) Erstellen Sie eine Liste aller möglichen Einzel-, Doppel- und Dreifachpfeile:
2) Holen Sie sich alle möglichen Finisher (die mit einem Double enden) von bis zu 3 Darts:
3) Behalten Sie nur diejenigen bei, für die die Gesamtpunktzahl der Eingabe-Ganzzahl entspricht:
4) Konvertieren Sie die Daten in die hübsch gedruckte Ergebnisliste (dh
[[20,3],[5,1],[1,2]]
wird["T20","S5","D2"]
):quelle
Kotlin , 254 Bytes
Hinweis: Der Algorithmus basiert auf der C ++ - Antwort von Level River St.
Probieren Sie es online aus!
quelle