Einführung
Eines der ersten Dinge, die ich in der Chemie gelernt habe, war die Angabe der Formel für die Verbrennung von Alkanen. Das grundlegendste Beispiel war: 2CH4 + 4O2 > 4H2O + 2CO2
. Beachten Sie, dass die Gleichung vereinfacht werden könnte, indem jeder Koeffizient durch 2 geteilt wird CH4 + 2O2 > 2H2O + CO2
. Um die Sache zu vereinfachen, werden wir diesen Schritt ignorieren .
Sie können sehen, dass bei der Verbrennung eines Alkans Sauerstoff verwendet wird. Nach der Reaktion entstehen nur CO2 und H2O.
Die Aufgabe:
Geben Sie ein vollständiges Programm an, das Eingaben von STDIN oder dem nächstmöglichen Äquivalent annimmt und die Gesamtreaktion mit STDOUT oder dem nächstmöglichen Äquivalent ausgibt.
Die Eingabe erfolgt immer in der Form C(n)H(2n+2)
mit n > 0
. Dies sind einige Beispieleingaben:
CH4
C2H6
C3H8
C4H10
C5H12
C6H14
etc.
Ein nützlicher Tipp:
Jedes Alkan hat ein Standardmuster in der Verbrennungsreaktion:
2C(n)H(2n+2) + (3n+1)O2 > (2n+2)H2O + (2n)CO2
z.B
C4H10
gibt die folgende Gleichung: 2C(4)H(2*4+2) + (3*4+1)O2 > (2*4+2)H2O + (2*4)CO2
. Nachdem wir alles berechnet haben, erhalten wir diese endgültige Gleichung:2C4H10 + 13O2 > 10H2O + 8CO2
Beispiele:
input: CH4
output: 2CH4 + 4O2 > 4H2O + 2CO2
input: C3H8
output: 2C3H8 + 10O2 > 8H2O + 6CO2
input: C4H10
output: 2C4H10 + 13O2 > 10H2O + 8CO2
input: C12H26
output: 2C12H26 + 37O2 > 26H2O + 24CO2
Regeln:
- Sie müssen ein vollständiges Programm bereitstellen.
- Ihr Programm muss Eingaben von STDIN oder dem nächstgelegenen Äquivalent erhalten, wenn dies nicht möglich ist.
- Ihr Programm muss mit STDOUT oder dem nächstgelegenen Äquivalent ausgegeben werden, falls dies nicht möglich ist.
- Beachten Sie, dass ich Leerzeichen für die Beispiele verwendet habe, um die Lesbarkeit zu verbessern. Diese sind nicht erforderlich .
2CH4 + 4O2 > 4H2O + 2CO2
und2CH4+4O2>4H2O+2CO2
sind beide gültige Ausgaben. Wenn Sie jedoch konsequent Leerzeichen für die Ausgabe verwenden, erhalten Sie einen Bonus von -10% - Das ist Code-Golf , also gewinnt das Programm mit der geringsten Anzahl von Bytes!
Antworten:
Pyth, 40 Bytes
Probieren Sie es online aus. Testsuite.
quelle
Python 3, 86 * 0,9 = 77,4 Bytes
Extrahiert die Anzahl von
H
statt der Anzahl vonC
aus der Eingabe. Dies vermeidet SonderfälleCH4
und vereinfacht die Ausgabe von Ausdrücken in Bezug aufN=2n+2
.Die Ausgabe enthält Parameter, die über die Formatierung von Zeichenfolgen eingefügt werden. Der erste Summand ist nur die Eingabezeichenfolge, und der Rest hat die eingesteckten Zahlen berechnet. Beachten Sie, dass
N*1.5-2
(dasselbe wieN*3/2-2
) ein Gleitkomma ergibt, die Zeichenfolgenformatierung es jedoch in ein int umwandelt.quelle
Java, 0,9 * 202 = 181,8 Bytes
Manchmal frage ich mich, ob ich mich nur mit Java verletzt habe.
Danke an @TNT und @TFeld für die 20 Bytes!
Ziemlich einfach. Grundsätzlich schneide ich die Eingabe von
C
bis abH
und erhalte diese Teilzeichenfolge. Wenn es nichts ist, setze ichn
auf eins. Ansonsten setze ich es auf die Zahl zwischenC
undH
. Der folgende Code druckt ihn einfach aus und bringt ihn in die richtige Schreibweise.Ungolfed:
quelle
printf
anstelle von+
(-11 aus Ihrer Rohpunktzahl, wenn ich richtig gezählt habe) verwenden.printf
? (Ein bisschen pingelig, habe es noch nie benutzt.: D)printf
nutzt mechanik ausjava.util.Formatter
. Sie können in Ihrer print-Anweisung eine Zeichenfolge wie "% d" und anschließend einen Wert oder eine Variable angeben, die stattdessen gedruckt wird. Es kann in Situationen nützlich sein , wo Sie eine Menge von Variablen zu drucken, zum Beispiel .Python 2,
12291 * 0,9 = 81,9 Bytesquelle
Javascript ES6, 63 * .9 = 56,7 Byte
Ähnlich wie bei meiner ESMin-Antwort.
quelle
Pyth,
69 Bytes * 0,9 = 62,63 * 0,9 = 57,56 * 0,9 = 50,53 * 0,9 = 48 BytesEs ist genau wie die Antwort von xnor, bei der ich die H-Werte verwende. Eine Variable J wird verwendet, um die Menge an H in der Molekülformel zu speichern.
Probieren Sie es hier aus
quelle
Javascript ES6, 96 * 0,9 = 86,4
quelle
CJam,
4544 BytesProbieren Sie es online aus
Um Sonderfälle zu vermeiden
CH4
, verwende ich die erste Nummer überhaupt nicht und extrahiere die Nummer erst nach demH
. Dies ergibt den Wert von2n+2
. Die verbleibenden Werte werden darauf basierend berechnet und formatiert.Erläuterung:
quelle
2r_[[~]W=_2/(3*)\_2-]"+%dO2>%dH2O+%dCO2"e%
Speichert ein Byte.Perl, (84 + 1) * 0,9 = 76,5
(+1 Zeichen für das Laufen mit der
-n
Flagge)Mein erster Perl Golf!
Es ist wichtig, dass STDIN keinen abschließenden Zeilenumbruch enthält. Anwendungsbeispiel:
Ungolfed-ish:
Die Linien
sind hier ziemlich interessant.
$#x
Stellt den "zuletzt ausgefüllten Index" von dar@x
(und SEs Syntaxhervorhebung denkt, dass es sich um einen Kommentar handelt, weil er dumm ist),$x[$#x]
und wählt daher den erfassten Teil desC(\d)
regulären Ausdrucks aus, falls vorhanden, oder auf1
andere Weise. (Perl ist es egal, dass es sich in allen anderen Fällen um eine Zeichenfolge handelt1
. Sie können in Perl auch numerische Operatoren für Zeichenfolgen verwenden.)quelle
JS, 118 (106) Bytes
quelle
51 * .9 = 45,9 Zeichen / 64 * .9 = 57,6 Bytes
Try it here (Firefox only).
Erläuterung
quelle
Python,
0,9 * 195 = 1750,9 * 190 = 1710,9 * 148 = 133 BytesProbieren Sie es hier aus
quelle
print
und ein"
Zeichen, und dieCO2
Variable könnte etwas kürzer benannt werden :)i[1]
es sich garantiert um"H"
eine Ziffer handelt, können Sie ein weiteres Byte mitif i[1]>"9"
(oder durch ein"9"
beliebiges anderes Zeichen mit einem ASCII-Wert von 58 bis 71)F #, 113
quelle
MATLAB, 96 * 0,9 = 86,4 Bytes
Ziemlich selbsterklärend. Nimmt eine Eingabezeichenfolge (muss in Anführungszeichen gesetzt werden, damit MATLAB nicht versucht, sie auszuführen!). Konvertiert dann die Zahl zwischen C und H in der Eingabe in eine Dezimalzahl. Der Wert 1 wird als Array an die Ausgabe von sscanf angehängt, damit in dem Fall, in dem
CH4
wir den ersten Index im Array extrahieren,n
, eine 1 erhalten, wenn zwischen C und H keine Zahl vorhanden ist. Dann wird nur mit den Leerzeichen gedruckt nach der Formel in der Frage.Dies sollte auch mit Octave funktionieren, wenn Sie hier den Online-Interpreter verwenden .
quelle
C ++, 160 × 0,9 = 144 Bytes
Ein bisschen mehr, als ich erwartet hatte. Liest zuerst char und verwirft es, liest dann int und gibt das Ergebnis aus. Das Problem ist,
n
dass ich 1 bin. Ich kann mir keinen kürzeren Weg vorstellen, es auszugeben.Ungolfed
quelle
Clojure / ClojureScript, 98 * 0,9 = 88,2 Byte
Erzeugt eine anonyme Funktion. Versuchen Sie es , indem Sie hier und geben Sie
(def f #(let...))
dann(f "C3H8")
.quelle
Excel, 123 * 0,9 = 110,7 Byte
Wenn wir CH4-Eingang als C1H4 nehmen könnten, kann auf 122 * 0,9 = 109,8 Bytes reduziert werden
quelle
Gelee , 33 Bytes
Probieren Sie es online!
Der Bonus hilft hier nicht.
quelle