Ecrivez un script qui fonctionne correctement lorsqu'une ligne vide est présente dans le flux de la logique du programme, mais rompt ou provoque un comportement inattendu lorsque cette ligne est supprimée.
Évitez les échappatoires habituelles et les réponses stupides. Votre programme devrait faire quelque chose "d'utile", même s'il ne fait qu'ajouter quelques entiers.
La suppression d'une ligne vide d'une chaîne multiligne ne compte pas, sauf si la sortie attendue de cette chaîne multiligne ne doit pas techniquement changer (c'est-à-dire: si vous supprimez toutes les lignes vides correspondantes ^$
).
La stupidité des blancs n'est pas autorisée non plus; ne faites pas de choses étranges avec des retours à la ligne, des tabulations, des espaces, etc.
la source
Réponses:
Javascript
Ouvre une alerte avec "Hello, World!" si la ligne vide existe, sinon, alerte "0".
Démo
Explication:
arguments.callee
est une référence à la fonction anonyme à exécution automatique.L'ajout d'un tableau vide (
[]
) convertit la fonction en chaîne, ce qui vous donne son code source.indexOf
retourne-1
si la chaîne n'est pas trouvée.Effectuer une opération bitwise not operation (
~
) aboutit à-1
une transformation en0
valeur de falsey.la source
arguments.callee
contient la source de la fonction.arguments.callee
.arguments.callee
. Même le rend plus court.C
Ce programme magique à 8 balles fonctionnera toujours sans la ligne blanche, mais il sera un peu plus décisif - aucune des réponses neutres n'apparaîtra jamais dans la sortie.
Explication
la source
Befunge-93
Mon premier programme befunge :)
Il lit deux nombres à partir de l'entrée et affiche leur somme. Si vous supprimez la ligne vide, cela n’imprimera rien.
Explication:
v
définit une direction descendante pour l'exécution du code&
lit un entier+
ajoute les nombres ensemble#
saute la commande suivante.
imprime un entier de la pile@
termine le programmeComme écrit,
#
saute la ligne vide et contine avec.
. Achetez lorsque vous supprimez la ligne vide,.
est ignorée.Il semble y avoir un bon interprète à http://befunge.aurlien.net/
la source
Rubis / Coquille
Fonctionne bien si une nouvelle ligne est en haut, sinon la première ligne de commentaire est interprétée par le shell comme un shebang mal formé.
la source
ruby youranswer.rb
, il ne chercherait pas un shebang car il est déjà utilisé dans l'interpréteur ruby, mais si vous l'utilisiez comme./youranswer.rb
s'il ne s'exécutait pas du tout car il n'y avait pas de shebang ..ruby youranswer.rb
, ce qui peut être utile pour définir les commutateurs de ligne de commande nécessaires dans le fichier. Donc sans la nouvelle ligne je reçoisruby: no Ruby script found in input (LoadError)
Scala
Si vous supprimez la ligne vierge, aucune sortie ne sera imprimée. Ce qui est pour le mieux, car votre pile déborderait si vous appeliez réellement
IntWrapper
.la source
GolfScript
Calcule le GCD de deux entiers non nuls. Le retrait de la ligne vide interrompt le programme.
Essayez-le en ligne.
Comment ça marche
Ceci est une implémentation GolfScript de l'algorithme Euclidien:
Il y a juste un petit problème:
la source
#
,{
et}
ne peut pas être utilisé comme nom de variable car il fait partie de la syntaxe. Tout autre jeton est bon, y compris les chaînes..:-1
stocke l'entrée dans-1
, pas le signe moins lui-même? Hmm ...Syntaxe du modèle MediaWiki
Définir le modèle: Foo comme
Dans une autre page,
la source
LaTeX (backref)
Le code LaTeX suivant utilise une citation et la citation contient une liste de pages, où l'entrée est citée. Ici c'est la première page. Le package
hyperref
ajoute également des liens PDF, la référence de page précédente est rouge, le lien de citation est vert.Mais LaTeX ne nécessite pas la ligne vide, la ligne vide semble superflue et l'exemple fonctionnera toujours sans
hyperref
et la ligne vide:Mais les liens et les références arrières ont disparu, nous les réinsérons donc:
Mais maintenant, l'exemple est cassé et ne compilera plus:
Qu'est-il arrivé? Le paquetage
hyperref
(ou le paquetage plus précisbackref
chargé parhyperref
) veut aller à la fin de l'entrée de bibliographie pour ajouter la liste de références arrière. Mais la syntaxe dans LaTeX ne fournit que le début de l'entrée\bibitem
, la fin peut être n'importe où. Dans ce paquet d'urgence,backref
une restriction a été ajoutée, qui\bibitem
doit se terminer par une ligne vide. Ensuite, le paquet peut redéfinir\bibitem
pour mettre les références arrières à la fin de l'entrée.Comme la ligne vide est manquante, TeX continue à la rechercher, mais a plutôt trouvé la fin du fichier et a généré le message d'erreur.
la source
C (semi-obscurcie)
Ce petit programme prend un numéro sur la ligne de commande et calcule sa factorielle. Cependant, il contient également une fonctionnalité avancée d'intelligence artificielle permettant de vérifier, à l'exécution, que les normes de codage de la société, notamment l'utilisation correcte des espaces et des lignes vierges, sont respectées. La suppression d'une ligne vide déclenchera l'algorithme pour rejeter le programme insuffisamment maintenable.
Pas de continuations de lignes ou de trigraphes n'importe où. Je crois que c'est valide ANSI C99.
En raison des mathématiques avancées impliquées, si vous compilez avec
gcc
, pensez à utiliser-lm
.Becquet
la source
tcc -run
vfry
n'est pas développé dans la définition de la fonction m'a vraiment bouleversé.C
Ce programme fonctionne comme prévu (comme décrit dans les commentaires) à moins que la ligne vide avant
foo = 5;
soit supprimée.Malheureusement, j'ai rencontré une fois une erreur presque identique à celle-ci dans le code de production.
Cet exemple utilise l'
do { ... } while (0)
idiome utilisé pour créer une instruction multiligne dans une macro (voir https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). Il utilise également le caractère barre oblique inverse pour répartir#define
plusieurs lignes bien alignées, à l’abri des regards. Cependant, il fait aussi deux choses qui ne vont pas:while (0)
, alors que l'idiome l'oublie généralement#define
Lorsque cela est en place, la suppression de la ligne vide avant
foo = 5;
entraîne l'exécution de cette affectation après leprintf
, mais également après chaque appel de laFROB
macro. En conséquence, le résultat après la suppression de la ligne vide est:la source
C / C ++
Renvoie le succès et peut être utilisé comme une implémentation de true . Si la ligne vide est supprimée, vous pouvez plutôt l'utiliser comme implémentation pour false .
la source
PowerShell
Cette fonction ajoutera deux nombres.
Si vous supprimez la ligne vide, la fonction échouera avec:
Unexpected token '$b' in expression or statement.
Explication
la source
Texas
Sans la ligne vide, "bonjour" n'est pas imprimé.
Explication
TeX traite la ligne vide comme un saut de paragraphe et
\everypar
est exécuté au début d'un nouveau paragraphe.la source
Java
la source
Math.pow
?Math.pow
et imprimer le résultat, c'est aussi faire quelque chose, n'est-ce pas?Perl 5
Ce code imprime
Hello, World!
. La suppression de la ligne vide génère une erreur de syntaxe.Explication:
la source
Lot
Ce code sera affiché
Hello
et sur la ligne suivanteWorld
. Lorsque l'une ou les deux lignes vides sont supprimées, rien ne s'affiche.Il y a une explication ici .
la source
Rubis
La suppression de la première ligne provoquera une erreur:
la source
Python
Je ne sais pas si cela tombe sous les échappatoires habituelles, j'ai regardé la liste et je ne l'ai pas vu.
En cours d'exécution, cela revient régulièrement
L'exécuter sans la ligne blanche sur la ligne 4, c'est-à-dire comme ci-dessous:
ne renvoie rien.
la source
Python 2.x
Ce programme génère le cinquième caractère de la chaîne entrée.
Ce n'est en aucun cas caché. Si vous supprimez la ligne vide, cela donne le quatrième caractère et le sixième si vous en ajoutez un.
la source
Tcl
Une fonction qui ajoute deux nombres (et vérifie si la nouvelle ligne a été supprimée):
Il n'y a rien à cacher ici, il fait ce qu'il dit, donc je n'exploite pas l'explication. La fonction
info
est un couteau suisse d'introspection (que d'autres langages appellent la réflexion).info body
renvoie le code source d'une fonction (s'il n'est pas écrit en C ou en assembleur).Je dois admettre que cela m'a stoppé jusqu'à ce que j'ai vu la solution javascript.
la source
C
Avec la ligne vide,
a
est la variable locale a et sans c'est le paramètre macro ...la source
Techniquement, ce n'est pas un problème de "code", mais un problème de serveur. Si cela est envoyé à Apache à partir d'un script CGI (qui peut être généré avec n'importe quelle langue de votre choix), il enverra une réponse HTTP au client:
D'autre part, cela échouera car il manque l'espace vide après l'en-tête.
la source
JavaScript
La fonction
whereami
répond avec la position de la ligne appelante, par rapport à sa propre position dans le code source.Si une ligne vide de la
whereami
fonction est supprimée. La sortie estNaN line(s) confusing me
. (Ajouter des lignes ne le casse pas)la source
Perl
la source
Escript
Due to bug in
escript
implementation valid escript has to be at least three lines long and first line hast to be shebang line or empty line. So following script hast to have two empty lines where first one has to be first one:Or it hast to be broken in two lines but still has to have first empty line.
Otherwise you will get
la source
Ruby
Prints
2+2=4
, but gives a syntax error without the blank third line.%q
allows any non-word character to serve as a string delimiter, even the newline character. So the first three lines of code are actually equivalent toprint %q"2+2="
, or justprint "2+2="
. Since the newline after2+2=
is being used as a quote delimiter, it's not also parsed as a line delimiter, so you need another one immediately after.la source
Insomnia (both versions)!
This code prints a ~ (don't ask why, insomnia is weird). If you remove the blank line, it prints a ÿ instead.
By the way that first letter is a thorn.
la source
C++
This is a classic and rather dumb trick. You will know what it is when you see it, this is just here for completion's sake. As such, I'm marking this as a community wiki answer.
Why this works
la source
??/
means\
, so??//
means\/
, and as the line doesn't end in\
, there is no line continuation. The second is that the behaviour is exactly the same regardless of whetherreturn 0;
is executed, because that is the standard behaviour when the execution ofmain
reaches the closing}
.I know people always use this in these kinds of question
that's why we made it a standard loopholePaste this into a html file, and open it in your browser. It's pretty simple, but a little tricky because it takes the number of blank lines in the document and indexes an array to call a function which shows an alert.
This one is borderline rule breaking. Technically JavaScript doesn't have multiline strings, which is the only reason this works.
Because you can have a syntax error in one script tag without interfering with the other script tags this shows a positive result only if there's an error on the page. The error prevents the second alert from firing because it's in the same script tag.
la source
Ruby
The secret is that the newline, is really a tab, then a new line. I don't know if this counts but I thought it was cleaver. The character after the
%
is also a tab, but for some reason it doesn't show up like one. I'm using Ruby's percent notation to make a string, that adds the first 2 arguments passed to the script. There's more on that here: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/la source
\n
should be present and should be crucial to having the program work as expected.