Schreiben Sie ein Skript, das einwandfrei funktioniert, wenn im Ablauf der Programmlogik eine leere Zeile vorhanden ist, diese jedoch abbricht oder ein unerwartetes Verhalten verursacht, wenn diese Zeile entfernt wird.
Vermeiden Sie Standardlücken und dumme Antworten. Ihr Programm sollte etwas "Nützliches" tun, auch wenn es nur ein paar Ganzzahlen hinzufügt.
Das Entfernen einer leeren Zeile aus einer mehrzeiligen Zeichenfolge zählt nicht, es sei denn, die erwartete Ausgabe dieser mehrzeiligen Zeichenfolge sollte sich technisch nicht ändern (dh, wenn Sie alle übereinstimmenden leeren Zeilen entfernen ^$
).
Whitespace-Dummheiten sind ebenfalls nicht erlaubt. Mach keine seltsamen Dinge mit Wagenrückläufen, Tabulatoren, Leerzeichen usw.
popularity-contest
underhanded
Naftuli Kay
quelle
quelle
Antworten:
Javascript
Öffnet ein Benachrichtigungs-Popup mit "Hallo, Welt!" Wenn die leere Zeile vorhanden ist, wird andernfalls "0" gemeldet.
Demo
Erläuterung:
arguments.callee
ist ein Verweis auf die sich selbst ausführende anonyme Funktion.Durch Anhängen eines leeren Arrays (
[]
) wird die Funktion in eine Zeichenfolge umgewandelt, die den Quellcode angibt.indexOf
Gibt zurück,-1
wenn die Zeichenfolge nicht gefunden wird.Durchführen einer bitweisen Operation nicht (
~
) ergibt-1
in schaltet wird0
, der ein Falsey Wert.quelle
arguments.callee
enthält die Quelle der Funktion.arguments.callee
.arguments.callee
. Auch macht es kürzer.C
Dieses magische 8-Ball-Programm funktioniert weiterhin ohne die Leerzeile, ist jedoch etwas entscheidender - keine der neutralen Antworten wird jemals in der Ausgabe erscheinen.
Erläuterung
quelle
Befunge-93
Mein erstes befunge Programm :)
Es liest zwei Zahlen aus der Eingabe und gibt ihre Summe aus. Wenn Sie die leere Zeile löschen, wird nichts gedruckt.
Erläuterung:
v
Setzt eine Abwärtsrichtung zum Ausführen des Codes&
liest eine Ganzzahl+
addiert die Zahlen#
überspringt den nächsten Befehl.
druckt eine Ganzzahl vom Stapel und@
beendet das Programm#
Überspringt wie geschrieben die leere Zeile und setzt mit fort.
. Kaufen, wenn Sie die leere Zeile löschen,.
wird übersprungen.Es scheint einen netten Dolmetscher bei http://befunge.aurlien.net/ zu geben
quelle
Ruby / Shell
Funktioniert einwandfrei, wenn sich eine neue Zeile oben befindet, andernfalls wird die erste Kommentarzeile von der Shell als fehlerhafter Shebang interpretiert.
quelle
ruby youranswer.rb
so laufen lassen, würde es nicht nach einem Shebang suchen, weil es bereits im Ruby-Interpreter ausgeführt wird, aber wenn Sie es so./youranswer.rb
laufen lassen, würde es überhaupt nicht ausgeführt werden, weil es keinen Shebang gibt.ruby youranswer.rb
kann nützlich sein, um die erforderlichen Befehlszeilenoptionen in der Datei festzulegen. Also ohne den Zeilenvorschub bekomme ichruby: no Ruby script found in input (LoadError)
Scala
Wenn Sie die leere Zeile entfernen, wird keine Ausgabe gedruckt. Welches ist für das Beste, da Ihr Stapel überlaufen würde, wenn Sie tatsächlich aufriefen
IntWrapper
.quelle
GolfScript
Berechnet die GCD von zwei Ganzzahlen ungleich Null. Das Entfernen der leeren Zeile unterbricht das Programm.
Probieren Sie es online aus.
Wie es funktioniert
Dies ist eine GolfScript-Implementierung des Euklidischen Algorithmus:
Es gibt nur ein kleines Problem:
quelle
#
,{
und}
kann nicht als Variablennamen verwendet werden, da sie von der Syntax ist Teil. Jedes andere Token ist in Ordnung, einschließlich Zeichenfolgen..:-1
die Eingabe in gespeichert wird-1
, nicht das Minuszeichen selbst? Hmm ...MediaWiki-Vorlagensyntax
Vorlage definieren: Foo als
Auf einer anderen Seite
quelle
LaTeX (backref)
Der folgende LaTeX-Code verwendet ein Zitat und das Zitat enthält eine Liste von Seiten, auf denen der Eintrag zitiert wird. Hier ist es die erste Seite. Das Paket
hyperref
fügt auch PDF-Links hinzu, die Referenz auf der Rückseite ist rot, der Link zum Zitieren ist grün.LaTeX benötigt jedoch keine Leerzeile, die Leerzeile sieht überflüssig aus und das Beispiel funktioniert auch ohne
hyperref
und die Leerzeile:Aber die Links und die Rückverweise sind weg, daher fügen wir sie erneut ein:
Aber jetzt ist das Beispiel gebrochen und wird nicht mehr kompiliert :
Was ist passiert? Package
hyperref
(oder genauer Packagebackref
, das von geladen wirdhyperref
) möchte am Ende des Bibliographieeintrags die Rückverweisliste hinzufügen. Die Syntax in LaTeX sieht jedoch nur den Beginn der Eingabe vor\bibitem
, das Ende kann überall sein. In diesem Notfallpaketbackref
wurde eine Einschränkung hinzugefügt,\bibitem
die den Eintrag mit einer Leerzeile beenden muss. Dann kann das Paket neu definiert werden\bibitem
, um die Rückverweise am Ende des Eintrags zu setzen.Da die leere Zeile fehlt, sucht TeX weiterhin danach, findet jedoch stattdessen das Dateiende und gibt die Fehlermeldung aus.
quelle
C (halbverschleiert)
Dieses kleine Programm nimmt eine Zahl in die Kommandozeile und berechnet deren Fakultät. Es enthält jedoch auch hochmoderne AI-Funktionen zur Laufzeitüberprüfung, die sicherstellen, dass die Kodierungsstandards des Unternehmens, einschließlich der korrekten Verwendung von Leerzeichen und Leerzeilen, eingehalten werden. Das Entfernen einer leeren Zeile löst aus, dass der Algorithmus das nicht ausreichend wartbare Programm ablehnt.
Keine Linienfortsetzungen oder Trigraphen. Ich glaube es ist ANSI C99 gültig.
Denken Sie aufgrund der fortgeschrittenen Mathematik daran, diese
gcc
zu verwenden , wenn Sie mit kompilieren-lm
.Spoiler
quelle
tcc -run
vfry
wird in der Funktionsdefinition nicht erweitert, hat mich wirklich überrumpelt.C
Dieses Programm funktioniert wie erwartet (wie in den Kommentaren beschrieben), es sei denn, die vorstehende Leerzeile
foo = 5;
wird entfernt.Leider bin ich einmal auf einen ähnlichen Fehler im Produktionscode gestoßen.
In diesem Beispiel wird das
do { ... } while (0)
Idiom zum Erstellen einer mehrzeiligen Anweisung in einem Makro verwendet (siehe https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). Das Backslash-Zeichen wird auch verwendet, um ein Zeichen#define
über mehrere Zeilen zu verteilen . Es macht jedoch auch zwei Dinge falsch:while (0)
, während die Redewendung dies normalerweise weglässt#define
Wenn Sie an dieser Stelle die leere Zeile vor entfernen,
foo = 5;
wird diese Zuweisung nach demprintf
, aber auch nach jedem Aufruf desFROB
Makros ausgeführt. Infolgedessen lautet die Ausgabe nach dem Entfernen der Leerzeile wie folgt:quelle
C / C ++
Gibt Erfolg zurück und kann als Implementierung für true verwendet werden . Wenn die leere Zeile entfernt wird, können Sie sie stattdessen als Implementierung für false verwenden.
quelle
Power Shell
Diese Funktion fügt zwei Zahlen hinzu.
Wenn Sie die leere Zeile entfernen, schlägt die Funktion fehl mit:
Unexpected token '$b' in expression or statement.
Erläuterung
quelle
TeX
Ohne die leere Zeile wird "Hallo" nicht gedruckt.
Erläuterung
TeX behandelt die leere Zeile als Absatzumbruch und
\everypar
wird am Anfang eines neuen Absatzes ausgeführt.quelle
Java
quelle
Math.pow
?Math.pow
und drucken Sie das Ergebnis ist auch etwas zu tun , ist es nicht?Perl 5
Dieser Code wird gedruckt
Hello, World!
. Das Entfernen der leeren Zeile führt stattdessen zu einem Syntaxfehler.Erläuterung:
quelle
Stapel
Dieser Code wird
Hello
in der nächsten Zeile ausgegebenWorld
. Wenn eine oder beide Leerzeilen entfernt werden, wird überhaupt nichts ausgegeben.Hier gibt es eine Erklärung .
quelle
Rubin
Das Löschen der ersten Zeile verursacht einen Fehler:
quelle
Python
Ich weiß nicht, ob dies unter die Standardlücken fällt. Ich habe mir die Liste angesehen und das nicht gesehen.
Laufen diese regelmäßig zurück
Führe es ohne die leere Zeile in Zeile 4 aus, also wie folgt:
gibt nichts zurück.
quelle
Python 2.x
Dieses Programm gibt das fünfte Zeichen der eingegebenen Zeichenfolge aus.
Dies ist in keiner Weise verborgen. Wenn Sie die leere Zeile entfernen, erhalten Sie das vierte Zeichen und das sechste, wenn Sie eines hinzufügen.
quelle
Tcl
Eine Funktion, die zwei Zahlen hinzufügt (und prüft, ob die neue Zeile gelöscht wurde):
Hier gibt es nichts zu verbergen, es macht, was es sagt, also verderbe ich die Erklärung nicht. Die Funktion
info
ist ein Schweizer Taschenmesser der Selbstbeobachtung (was andere Sprachen Reflexion nennen).info body
Gibt den Quellcode einer Funktion zurück (falls nicht in C oder Assembly geschrieben).Ich muss zugeben, dass dies mich ratlos machte, bis ich die Javascript-Lösung sah.
quelle
C
Mit der leeren Zeile
a
ist die lokale Variable a und ohne sie der Makroparameter ...quelle
Technisch gesehen kein "Code" -Problem, sondern ein Server-Problem. Wenn dies von einem CGI-Skript an Apache gesendet wird (das in einer beliebigen Sprache generiert werden kann), sendet es eine HTTP-Antwort an den Client:
Auf der anderen Seite schlägt dies fehl, da das Leerzeichen nach dem Header fehlt.
quelle
JavaScript
Die Funktion
whereami
antwortet mit der Position der aufrufenden Leitung relativ zu ihrer eigenen Position im Quellcode.Wenn eine leere Zeile in der
whereami
Funktion entfernt wird. Die Ausgabe istNaN line(s) confusing me
. (Das Hinzufügen von Zeilen unterbricht es nicht.)quelle
Perl
quelle
Escript
Aufgrund eines Fehlers in der
escript
Implementierung muss ein gültiges Escript mindestens drei Zeilen lang sein und die erste Zeile muss eine einfache oder eine leere Zeile sein. Das folgende Skript muss also zwei leere Zeilen haben, wobei die erste die erste sein muss:Oder es muss in zwei Zeilen unterbrochen werden, muss aber immer noch die erste leere Zeile enthalten.
Sonst wirst du bekommen
quelle
Rubin
Druckt
2+2=4
, gibt aber einen Syntaxfehler ohne die leere dritte Zeile aus.%q
Ermöglicht, dass jedes Nicht-Wort-Zeichen als Zeichenkettenbegrenzer dient, auch das Zeilenumbruchszeichen. Die ersten drei Codezeilen entsprechen also tatsächlichprint %q"2+2="
oder nurprint "2+2="
. Da der Zeilenumbruch danach2+2=
als Anführungszeichen verwendet wird, wird er nicht auch als Zeilenumbruch analysiert , sodass Sie unmittelbar danach einen neuen benötigen.quelle
Schlaflosigkeit (beide Versionen)!
Dieser Code gibt ein ~ aus (fragen Sie nicht warum, Schlaflosigkeit ist seltsam). Wenn Sie die leere Zeile entfernen, wird stattdessen ein ÿ gedruckt.
Übrigens ist dieser erste Buchstabe ein Dorn .
quelle
C ++
Dies ist ein klassischer und ziemlich dummer Trick. Sie werden wissen, was es ist, wenn Sie es sehen. Dies ist nur zur Vervollständigung hier. Als solche markiere ich dies als eine Community-Wiki-Antwort.
Warum funktioniert das?
quelle
??/
Mittel\
, also??//
Mittel\/
, und wenn die Linie in endet nicht\
, gibt es keine Zeilenfortsetzungs. Das zweite ist, dass das Verhalten genau das gleiche ist, unabhängig davon, obreturn 0;
es ausgeführt wird, da dies das Standardverhalten ist, wenn die Ausführung vonmain
das Schließen erreicht}
.I know people always use this in these kinds of question
deshalb haben wir es zu einem Standard-Schlupfloch gemachtFügen Sie dies in eine HTML-Datei ein und öffnen Sie sie in Ihrem Browser. Es ist ziemlich einfach, aber etwas knifflig, da es die Anzahl der Leerzeilen im Dokument benötigt und ein Array indiziert, um eine Funktion aufzurufen, die eine Warnung anzeigt.
Dies ist ein Verstoß gegen die Grenzregeln. Technisch gesehen hat JavaScript keine mehrzeiligen Zeichenfolgen. Dies ist der einzige Grund, warum dies funktioniert.
Da in einem Skript-Tag ein Syntaxfehler auftreten kann, ohne die anderen Skript-Tags zu beeinträchtigen, wird nur dann ein positives Ergebnis angezeigt, wenn auf der Seite ein Fehler vorliegt. Der Fehler verhindert, dass die zweite Warnung ausgelöst wird, da sie sich im selben Skript-Tag befindet.
quelle
Rubin
Das Geheimnis ist, dass die neue Zeile wirklich ein Tabulator ist, dann eine neue Zeile. Ich weiß nicht, ob das zählt, aber ich dachte, es wäre ein Hackmesser. Das Zeichen nach dem
%
ist ebenfalls ein Tabulator, aber aus irgendeinem Grund wird es nicht wie ein Tabulator angezeigt. Ich verwende Rubys Prozentnotation, um einen String zu erstellen, der die ersten beiden Argumente hinzufügt, die an das Skript übergeben werden. Mehr dazu hier: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/quelle
\n
sollte anwesend sein und entscheidend dafür sein, dass das Programm wie erwartet funktioniert.