Vor einigen Jahren erstellte Hot Wheels ein einfaches Flash-Spiel namens "Formula Fuelers Racers" *. Um das Spiel zu spielen, wählst du drei Zutaten aus einem Kühlschrank aus, die in dein Auto gelegt werden und dann gegen das zufällig erzeugte Auto des Computers rasen. Es stellt sich heraus, dass die Mechanik dieses Spiels ziemlich einfach ist. Zunächst einmal wird die tatsächliche "Rennzeit" Ihres Autos zufällig generiert und hat keinen Einfluss darauf, ob Sie das Rennen gewinnen oder nicht. Zweitens wird der Sieger des Rennens anhand einer Punktzahl ermittelt, die aus den ausgewählten Zutaten berechnet wird (doppelte Zutaten sind zulässig und die Reihenfolge ist wichtig). Jeder Zutat ist ein "Wert" und eine "Operation" zugeordnet, wie in der folgenden Tabelle gezeigt:
# ingredient val op
1 Hot Salsa 2 +
2 Root Beer 1 +
3 Milk 1 +
4 Pickle Juice 2 +
5 Mystery Lunch -3 *
6 BBQ Sauce 2 +
7 Egg 1 +
8 Ketchup 2 +
9 Mustard -1 *
10 Melon 1 +
11 Chocolate Milk 1 +
12 Mayonnaise -2 *
13 Baby Food 0 +
14 Pepper 1 +
15 Salt 2 +
16 Syrup -1 *
17 Salad Dressing 2 +
18 Orange Juice 1 +
19 Soy Sauce 2 +
Der Einfachheit halber bezieht sich diese Herausforderung auf Zutaten anhand ihrer Nummer und nicht ihres Namens. Hier sind die Schritte zum Berechnen einer Punktzahl:
- Initialisieren Sie zuerst die Punktzahl mit dem Wert der ersten Zutat.
- Verwenden Sie dann die Operation der zweiten Zutat, um die aktuelle Punktzahl und den Wert der zweiten Zutat zu kombinieren und eine aktualisierte Punktzahl zu erhalten.
- Verwenden Sie schließlich die Operation der dritten Zutat, um die aktuelle Punktzahl und den Wert der dritten Zutat zu kombinieren, um die endgültige Punktzahl zu erhalten.
Höhere Werte sind besser und schlagen immer niedrigere Werte.
Zum Beispiel haben die Zutaten 1 2 3
eine Punktzahl von (2+1)+1 = 4
. Die Zutaten 7 5 6
haben eine Punktzahl von (1*-3)+2 = -1
. Daher 1 2 3
schlägt 7 5 6
.
Herausforderung
In dieser Herausforderung schreiben Sie ein Programm, das eine geordnete Liste mit 3 ganzen Zahlen erstellt und die entsprechende Punktzahl ausgibt.
Eingang
Ihr Programm akzeptiert möglicherweise eine Liste mit drei Ganzzahlen im bequemsten Format. Sie können entweder die 1-Indizierung für die Inhaltsstoffnamen (wie oben) oder die 0-Indizierung (1 von jedem Index oben abziehen) verwenden.
Ausgang
Ihr Programm muss eine einzelne Ganzzahl ausgeben, die die Punktzahl angibt.
Testfälle
4 5 5 => 18 // max score
5 5 5 => -27 // min score
13 13 13 => 0
1 2 3 => 4
7 5 6 => -1
16 2 19 => 2
19 7 12 => -6
* Diese Seite ist ziemlich veraltet und funktioniert in einigen Browsern nicht, aber Sie müssen das Spiel für diese Herausforderung nicht spielen.
quelle
Antworten:
Gelee , 24 Bytes
Nimmt eine Liste mit Zutaten mit Index 0 auf.
Probieren Sie es online! oder sehen Sie sich eine Testsuite an
Wie?
Verwendet eine leicht verschlungene Form der Komprimierung der Werte als Basis-6-Zahl und die Tatsache, dass die multiplikativen Einträge die negativen sind. Anstatt einfach um 3 nach oben zu schieben, um die 6-stelligen Basiswerte zu erhalten, werden die inkrementierten komplementären Werte verwendet - dies spart Bytes, indem das
Ị
Atom die negativen Einträge vor dem Komplementierungsschritt heraussucht und gleichzeitig ein Byte in der 250er-Basis speichert Kompression.quelle
zẈ€$ụ¤
werden als ihre (1-indizierten) Indizes in der Jelly-Codepage gelesen, die[123,188,13,37,226,4]
als Basis-250-Zahl interpretiert werden:123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004
(siehe Abschnitt mit String-Literalen im Tutorial .)JavaScript (ES6),
8984827873 ByteNimmt die Eingabe als Array mit 3 Ganzzahlen unter Verwendung der 0-Indizierung.
Testfälle
Code-Snippet anzeigen
Vorherige Version, 78 Bytes
Übernimmt die 3 Ganzzahlen in der aktuellen Syntax
(a)(b)(c)
und verwendet die 0-Indizierung.Wie es funktioniert
Eine etwas ungewöhnliche Sache an diesem Code ist, dass er nur zwei Argumente in der gängigen Currying-Syntax akzeptiert
a => b =>
und schließlich eine Funktion zurückgibt, die die dritte übernimmt.Nervenzusammenbruch
Testfälle
Code-Snippet anzeigen
quelle
Befunge,
7473 BytesProbieren Sie es hier aus! Es ist seltsam, dass mein Code nur mit diesem einen Interpreter funktioniert.
Die zweite Zeile enthält grundsätzlich alle Werte aus der Tabelle. Die nicht numerischen Werte sind tatsächlich negative Werte, da sie vor den Ziffern in der ASCII-Tabelle stehen. Es gibt ein bisschen Logik, die bestimmt, ob die Zahl negativ ist oder nicht, und wenn ja, wird diese Zahl mit dem Ergebnis multipliziert.
Die rechte Seite der dritten Zeile initialisiert die erste Nummer. Wenn ich das nicht tun müsste, könnte ich eine Menge Bytes sparen.
quelle
PHP, 128 Bytes
PHP, 138 Bytes
Online Version
Erweitert
quelle
Python 2 ,
123110107 BytesProbieren Sie es online!
-3 Bytes dank @mathjunkie
quelle
5445054524413452545
dann subtrahieren 3 können Sie Tonnen von Bytes sparen .n=[n+i,n*i][i<0]
Innerhalb der Schleife spart man 3 Bytes05AB1E , 29 Bytes
Probieren Sie es online!
Dies funktioniert tatsächlich für so viele oder so wenige Eingaben, wie Sie möchten, sodass Sie Autos mit 4 oder mehr Merkmalen oder Autos mit nur 2 haben können. Dies war nicht beabsichtigt, nur wie es endete.
quelle
CJam ,
4338 BytesEs könnte eine Möglichkeit geben, die Liste weiter zu komprimieren ...
Verwendet eine 0-basierte Indizierung.
Probieren Sie es online!
Erläuterung
Dieses Programm nutzt die Tatsache, dass ein Wert genau dann multiplikativ und nicht additiv ist, wenn er negativ ist.
quelle
+ *
Trick!Lua,
140131 Bytesquelle
JavaScript,
8572 Bytes[a,b,c]
Übernimmt dank ETHproductions Eingaben im Format -13 Bytes
quelle
x=>(b="...",b<0?"*":"+")+b
vermeidenreturn
, denke ich. (Auch brauchen Sie nicht die[... ]
, Indexierung funktioniert auf Zeichenfolgen)a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)
für Sie?)
danach+b
R,
125123 BytesAnonyme Funktion, die drei Ganzzahlen als Eingabe verwendet. Definiert eine Liste von Werten und Operationen und wertet dann nur die Werte aus, die von der Eingabe aufgerufen werden, d
o3(o2(v1,v2),v3)
. H. Es gibt fast definitiv eine golferischere Möglichkeit, dies zu tun!Update: Nach einiger Überarbeitung habe ich eine Alternative, ebenfalls 123 Bytes . Wieder eine anonyme Funktion, die Eingaben jedoch als einzelner Vektor mit drei Werten akzeptiert. Verwendet denselben Ansatz, definiert eine Liste von Werten und Operationen und bewertet sie.
quelle
Haskell,
186116112108 BytesHauptfunktion ist
k
. Neu bei Code Golf, daher bin ich mir sicher, dass es ein paar Bytes gibt, die ich mit geschickter Verwendung von abschneiden könnte$
Operatoren im Vergleich zu Klammern . Ich werde die Antwort wahrscheinlich aktualisieren, wenn ich weitere Verbesserungen finde.Im Wesentlichen kann das Programm so aufgeteilt werden:
*
wo positive Werte immer sind+
).v
auf Eingabe-Ganzzahlen abgebildeten die entsprechenden Operationen und Werte von jeder abruft und die richtige Ausgabe zurückgibt.AKTUALISIEREN
Besonderer Dank für den Hinweis auf den fromEnum-Trick! Das hat gut geklappt. Außerdem habe ich den Teil in den Regeln übersehen, der besagt, dass eine akzeptable Lösung eine Funktion sein könnte, die eine Liste von ganzen Zahlen enthält. Das hat enorm viel Arbeit gespart.
UPDATE 2
Nach anderen Vorschlägen sollten Sie eine Handvoll Bytes rasieren, indem Sie Vorgänge neu anordnen. Dabei wird ein else-Schutz erstellt, der immer True ergibt, und ein Muster, das mit W übereinstimmt, das mit einer Liste von 3 Elementen übereinstimmt. Danke für die Vorschläge!
UPDATE 3
Ein weiterer Dank geht an Laikoni für den Hinweis auf weitere Codegolfregeln, die mir nicht bekannt waren. Auch die Zuordnung von v zu meiner Eingabe zum Erstellen einer Liste von teilweise angewendeten Funktionen war eine phänomenale Idee und sparte mir 4 zusätzliche Bytes!
quelle
[Int] -> Int
anstatt von stdin zu lesen und in stdout zu schreiben. Dies ist standardmäßig zulässig, wird jedoch in diesem Fall in der Abfrage sogar explizit erwähnt, dass die Angabe einer Liste von Ganzzahlen als Eingabe zulässig ist.fromEnum
anstelle vondigitToInt
ist wahrscheinlich kürzer, da Sie den Import verwerfen können.v=(map((-51+).fromEnum)"95 ... 5"!!)
speichert zwei Klammern.o x|x<0=(*)|0<1=(+)
Speichert ein Byte in der zweiten Wache.w
ist ein zusätzlicher Raum übrig. Da Sie nur Listen der Länge 3 bearbeiten müssen, können Sie diese auchw[x,y,z]=
als Mustervergleich verwenden.Haskell,
9287 BytesProbieren Sie es online!
Basierend auf der Antwort von @ maple_shaft habe ich es nur ein bisschen faktorisiert.
Danke an @Laikoni für 5 Bytes!
quelle
f=
weil anonyme Funktionen als Übermittlung zulässig sind. Sie werden nur benötigt, um das Beispiel zum Laufen zu bringen.C
171161 Bytesquelle
8086 Maschinencode, 62 Bytes
Die letzten drei Bytes enthalten den (nullindizierten) Eingang. Hey, du hast mir gesagt, ich könnte das bequemste Eingabeformat verwenden. In diesem Fall ist das Hardcoding!
Ausgabe ist der an die Shell zurückgegebene Fehlercode.
Wie es funktioniert:
quelle