Es ist Wochenende und was machen die coolen Jungs am Wochenende? Trinken natürlich! Aber weißt du was nicht so cool ist? Trinken und fahren. Sie beschließen also, ein Programm zu schreiben, das Ihnen sagt, wie geladen Sie sind und wann Sie wieder fahren können, ohne von den Bullen überfahren zu werden und Ihren Führerschein zu verlieren.
Die Herausforderung
Berechnen Sie anhand einer Liste von Getränken, die Sie heute Abend genossen haben, Ihren Blutalkoholspiegel und die Zeit, die Sie warten müssen, bis Sie in Ihr Auto steigen und nach Hause kommen können.
Eingang
Die Eingabe wird eine Liste der Getränke sein, die Sie heute Abend hatten. Das wird so aussehen:
4 Schüsse Alkohol 1 Glas Wein 2 Flaschen Bier 3 Gläser Wasser
Container werden immer Plural sein.
Wie Sie sehen können, besteht jeder Eintrag aus:
- Die Art des Getränks (Alkohol, Wein, Bier, Wasser)
- Der Behälter für das Getränk (Schüsse, Gläser, Flaschen)
- Die Menge x der Getränke, die Sie von diesem Typ als Ganzzahl mit x> 0 hatten,
Jede Getränkeart fügt Ihrem Blut eine bestimmte Menge Alkohol hinzu:
Alkohol -> 0,5 ‰ / 100 ml Bier -> 0,1 ‰ / 100 ml Wein -> 0,2 ‰ / 100 ml Wasser -> -0,1 ‰ / 100 ml
Wasser ist hier die Ausnahme, da es Ihr Blut verdünnt und Ihren Alkoholspiegel senkt (wäre so schön, wenn das tatsächlich funktionieren würde ...).
Jeder Container hat ein bestimmtes Volumen:
Schüsse -> 20 ml Gläser -> 200 ml Flaschen -> 500 ml
Ausgabe
Sie müssen zwei Zahlen ausgeben:
- Der Alkoholgehalt in ‰
- Die Zeit in Stunden müssen Sie warten, bis Sie 0,5 ‰ oder weniger erreicht haben, damit Sie wieder fahren können. Sie verlieren 0,1 ‰ pro Stunde.
Anmerkungen
- Der Alkoholgehalt kann niemals unter Null fallen.
- Gleiches gilt für die Wartezeit. Wenn Sie 0,5 ‰ oder weniger haben, geben Sie Null aus.
- Die Reihenfolge der Getränke spielt keine Rolle, daher kann Trinkwasser den Alkoholgehalt während der Berechnung unter Null senken. Wenn es dort bleibt, müssen Sie es durch Null ersetzen.
Der Alkoholgehalt für das obige Beispiel würde wie folgt berechnet:
4 Schüsse Alkohol -> 0,4 ‰ 1 Glas Wein -> 0,4 ‰ 2 Flaschen Bier -> 1,0 ‰ 3 Gläser Wasser -> -0,6 ‰ => 0,4 + 0,4 + 1 - 0,6 = 1,2 ‰
Um 0,5 ‰ zu erreichen, müssen Sie 0,7 ‰ verlieren. Sie verlieren 0,1 ‰ pro Stunde, müssen also 7 Stunden warten, um wieder zu fahren.
Regeln
- Sie können die Eingabe in jedem gewünschten Format vornehmen, müssen jedoch die oben angegebenen genauen Zeichenfolgen verwenden. Sie können die Zahlen als ganze Zahlen nehmen.
- Sie können die beiden Zahlen in beliebiger Reihenfolge ausgeben. Machen Sie einfach klar, welche Sie in Ihrer Antwort verwenden.
- Sie können davon ausgehen, dass die Eingabe immer mindestens einen Eintrag enthält.
- Funktion oder volles Programm erlaubt.
- Standardregeln für die Eingabe / Ausgabe.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Einreichung.
Testfälle
Eingabe als Liste von Zeichenfolgen. Gibt zuerst den Alkoholgehalt aus, die Werte werden durch ein Komma getrennt.
["4 Schuss Alkohol", "1 Glas Wein", "2 Flaschen Bier", "3 Gläser Wasser"] -> 1,2, 7 ["10 Schuss Alkohol", "1 Flasche Wasser"] -> 0,5, 0 ["3 Gläser Wein", "2 Flaschen Alkohol"] -> 6,2, 57 ["6 Schuss Bier", "3 Gläser Wasser"] -> 0, 0 ["10 Gläser Bier"] -> 2,0, 15
Viel Spaß beim Codieren!
quelle
function drive(a) { if (a.every(v=>/water/.test(v))) return [0, 0]; throw new TeetotalException; }
Antworten:
Javascript (ES6), 109
Nimmt Eingaben als Arrays von Arrays von Strings / Integer auf, z
Ausgaben für ein einfaches Array, z
[1.2, 7]
Erklärt
quelle
[[3,"shots", "booze"]]
TSQL,
301,299,219, 206 BytesDie Eingabe erfolgt in die temporäre Tabelle
#I
(Sie haben ein beliebiges Format angegeben :)Code:
Danke für die Ideen, es zu verbessern, Micky T :)
quelle
IIF
Funktion anstelle vonCASE
Anweisungen für einige Bytes verwendenJOIN(SELECT .. )A(Y,S)ON Y=N
und(L+ABS(L))/2,10*((L-.5+ABS(L-.5))/2)
ist kürzer als die zuvor erwähnte IIF-Funktion. Sie können auch etwas sparen, wenn Sie die Werte für Größe und Stärke kreuzweise verknüpfen möchten. zBSELECT V,N,Q*S FROM(VALUES(...))A(N,S),(VALUES(...)B(V,Q)
JavaScript (ES6), 131
Weniger Golf gespielt
quelle
Perl,
133119 + 3 =136122 BytesZum Laufen mit
perl -p
. Übernimmt eine linienorientierte Eingabe in STDIN und eine Ausgabe in STDOUT.Weniger Golfversion:
Vielen Dank an dev-null für Vorschläge zum Einsparen von 11 Bytes.
quelle
\d
zu.