Jeder weiß, dass C eine schöne, sichere Programmiersprache auf hohem Niveau ist. Als Programmierer haben Sie jedoch die folgende Aufgabe.
Schreiben Sie ein Programm, um zwei Zahlen hinzuzufügen.
- Eingabe: Zwei durch Leerzeichen getrennte Ganzzahlen.
- Ausgabe: Die Summe der beiden Zahlen in der Eingabe.
Der Clou ist, dass Ihr Code 100% sicher sein muss. Mit anderen Worten, es muss sich unabhängig von der Eingabe ordnungsgemäß verhalten. Wenn es sich bei der Eingabe tatsächlich um zwei durch Leerzeichen getrennte Ganzzahlen handelt, die beide weniger als 100 Stellen lang sind, muss die Summe ausgegeben werden. Andernfalls muss eine Fehlermeldung ausgegeben und sicher beendet werden.
Wie schwer kann es doch sein?
Allgemeine Anerkennung erhalten pathologische Eingabefälle, die die Antworten anderer Leute brechen :)
Der Code muss ohne Warnung mit gcc -Wall -Wextra auf Ubuntu kompiliert werden.
Klärung.
- Die Eingabe erfolgt von stdin.
- Horizontales Leerzeichen ist nur ein einzelnes Leerzeichen. Vor der ersten Zahl sollte nichts stehen, und die Eingabe sollte entweder mit newline + EOF oder nur mit EOF abgeschlossen werden.
- Die einzige gültige Eingabe, die in Augmented Backus-Naur Form angegeben ist , ist:
NONZERODIGIT = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" POSITIVENUMBER = NONZERODIGIT * 98DIGIT NEGATIVENUMBER = "-" POSITIVENUMBER NUMBER = NEGATIVENUMBER / POSITIVENUMBER / "0" VALIDINPUT = NUMBER SP NUMBER * 1LF EOF
- Die Fehlermeldung besteht aus dem einzelnen Buchstaben 'E', gefolgt von einer neuen Zeile.
- Der Code muss unabhängig von der Eingabe in weniger als 0,5 Sekunden sauber enden.
Antworten:
6610 Bytes (nicht abgeschlossen)
"Guter Junge" C-Programm, das alle Herausforderungskriterien erfüllt. Verwendet das 10er-Komplement für negative Zahlen. Ebenfalls enthalten sind ein Testgeschirr und Testfälle.
Hier ist ein kleines Testgeschirr und ein paar Testfälle, um Ihnen den Einstieg zu erleichtern. Fühlen Sie sich frei, den übermäßigen Gebrauch von Perl herauszureißen. Das System, auf dem es entwickelt wurde, hatte keine moderne Bash.
Ein kleiner Satz von Testfällen:
quelle
bc
zur getrennten Beantwortung.289
BEARBEITEN : Dieser Code funktioniert nur für positive ganze Zahlen. Die Regeln haben sich geändert, seit ich diese Antwort gepostet habe.
Ungolfed und kommentierte Version:
quelle
./tmp.c: In function ‘f’: ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c: In function ‘main’: ./tmp.c:3:1: warning: control reaches end of non-void function [-Wreturn-type]
(s>99|c<48|c>57)
durch eine Fehlerbehebung ersetzt(s>99||c<48||c>57)
?442
Es ist ziemlich lang, also kann ich es am Wochenende weiter spielen. Angenommen, die Eingabe erfolgt von stdin, EOF-terminiert (ohne Zeilenvorschub), das Trennzeichen besteht nur aus einem Zeichen des ASCII-Werts 32 (d. H.
' '
Zeichen).Die Fehlermeldung ist ein einzelnes Zeichen 'E', gefolgt von einer neuen Zeile.
Mit Zeilenumbrüchen und ein wenig Einrückung: (Eine lesbare Version folgt, also zögern Sie nicht, hierher zu springen.)
Die lesbare Version (einige Anweisungen wurden geringfügig geändert, um sie lesbarer zu machen, aber was sie tun, sollte dasselbe sein):
Die
goto fail;
Sache ist hier, um Apple zu verspotten.Die Version von gcc, die ich verwendet habe, ist
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
und es gibt keine Warnungen.quelle
getchar()
immer von stdin abgerufen ). Es wird davon ausgegangen, dass es ohne Zeilenumbruch EOF-terminiert ist . Sie können dies testen, indem Sie entweder [1] [Leerzeichen] [1] [Strg + D] [Strg + D] oderecho -n '1 1' | program
633 Bytes
"Bad Boy" C-Programm, das die halbe Herausforderung meistert. Missbrauch C, wirft viele Warnungen, funktioniert aber ... irgendwie. Arithmetische Operationen mit beliebiger Genauigkeit werden tatsächlich von ausgeführt
bc
.Unbegrenzte Version
quelle