Eliminación de una línea en blanco en el código fuente que causa una funcionalidad inesperada [cerrado]

38

Escriba un script que funcione bien cuando haya una línea en blanco en el flujo de la lógica del programa, pero se rompa o cause un comportamiento inesperado cuando se elimine esa línea.

Evite las lagunas estándar y las respuestas estúpidas. Su programa debe hacer algo "útil", incluso si todo lo que hace es agregar algunos enteros.

Eliminar una línea vacía de una cadena multilínea no cuenta, a menos que el resultado esperado de esa cadena multilínea no cambie técnicamente (es decir, si está eliminando todas las líneas en blanco que coinciden ^$).

Foolery de espacios en blanco tampoco está permitido; no hagas cosas raras con retornos de carro, tabulaciones, espacios, etc.

Naftuli Kay
fuente
11
Creo que deberías excluir los espacios en blanco.
nneonneo
17
Creo que Whitespace es un " vacío legal "
core1024
55
nneonneo está hablando de Whitespace , que es un lenguaje que usa solo espacios como sintaxis.
Kyle Kanos
44
"funcionalidad inesperada" es una muy buena frase.
Kaz
3
Estoy votando para cerrar esta pregunta como fuera de tema porque los desafíos poco claros ya no están en el tema en este sitio. meta.codegolf.stackexchange.com/a/8326/20469
gato

Respuestas:

62

Javascript

Abre una ventana emergente de alerta con "¡Hola, mundo!" si existe la línea en blanco, de lo contrario alerta "0".

(function(){
    alert(~(arguments.callee+[]).indexOf('\n\n') && "Hello, World!");

})();

Manifestación

Explicación:

arguments.callee es una referencia a la función anónima de ejecución automática.

Agregar una matriz en blanco ( []) convierte la función en una cadena, que le proporciona su código fuente.

indexOfdevuelve -1si no se encuentra la cadena.

Realizar una operación no bit a bit ( ~) da como resultado que -1se convierta 0, lo cual es un valor falso.

nderscore
fuente
2
¿Qué engaño es esto?
Kroltan
1
arguments.calleecontiene la fuente de la función.
Mateo
2
Tenga en cuenta que esto ya no funciona en modo estricto (que usaría el código más moderno). El modo estricto prohíbe el uso de arguments.callee.
Daniel Lo Nigro
1
@ Michael: No, la especificación no dice nada sobre el formato exacto. De hecho , hay motores funcionando que no conservan los espacios en blanco.
Bergi
2
@DanielLoNigro Simplemente puede darle un nombre a la expresión de la función y usarla en lugar de arguments.callee. Incluso lo hace más corto.
un gato
42

do

Este programa mágico de 8 bolas seguirá funcionando sin la línea en blanco, pero será un poco más decisivo: ninguna de las respuestas neutrales aparecerá en la salida.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
  int x, t;
  char *quotes[] = {
        // Positive :-)
        "It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it",
        "As I see it, yes", "Most likely", "Outlook good", "Yes", "Signs point to yes",
        // Indifferent :-\

        "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
        // Negative :-(
        "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful" };
  srandom(time(NULL)); // Initialize random number generator
  x = random() % (sizeof(quotes) / sizeof(char*)); // Choose a random outcome
  printf("The Magic Eight Ball says...\n%s\n",quotes[x]);
  return 0;
}

Explicación

Cuando el analizador C ve una barra invertida seguida de un carácter de nueva línea, ignora ambos y trata la segunda línea como una continuación de la primera. Sin la línea vacía, las respuestas "indiferentes" serán tratadas como parte del comentario anterior.

ossifrage aprensivo
fuente
51
I + 1, pero ver los comentarios de C que terminan con una barra invertida está comenzando a convertirse en un vacío estándar, en mi opinión.
Tim S.
2
Era una referencia a esta publicación de "escapatorias estándar" , así que quizás no sea literalmente una "escapatoria".
Tim S.
55
@TimS. si estás aburrido con esta "solución", ¿por qué votaste?
John Dvorak
8
Las respuestas de barra diagonal inversa a la siguiente línea en un comentario (trigraph o no trigraph) me hacen desear tener 125 reputación. Los sigo viendo y comienzan a ser terriblemente repetitivos, totalmente transparentes y ya no son listos ni divertidos. (Lo cual es lamentable para los que los utilizan, como aprensivos aquí, porque de ninguna manera merecen la ira y algunas veces son totalmente conscientes de esto - pero el truco . Está ganando ella)
doppelgreener
44
@Jan comienza a convertirse en estándar no es lo mismo que estándar largo / exagerado ... su uso es bastante inteligente aquí, no parece fuera de lugar (a diferencia de algunos que he visto, que inexplicablemente tienen caracteres en al final de un comentario, o finalice sus comentarios con los caracteres de inicio de comentarios para hacer algo inusual). Entonces: voté por la solución, no por el uso continuado de su truco.
Tim S.
37

Befunge-93

v
&
&
+
#

.
@

Mi primer programa de befunge :)

Lee dos números de la entrada e imprime su suma. Si elimina la línea vacía, no imprime nada.

Explicación:

vestablece una dirección hacia abajo para ejecutar el código
&lee un número entero
+agrega los números juntos
#omite el siguiente comando
.imprime un número entero desde la pila
@finaliza el programa

Tal como está escrito, #salta la línea vacía y continúa con .. Comprar cuando elimina la línea vacía, .se omite.

Parece que hay un buen intérprete en http://befunge.aurlien.net/

aditsu
fuente
Ah, inteligente.
seequ
1
Befunge 98 también hace esto. Buen pensamiento. Y este intérprete tiene algunos beneficios (no he usado los suyos mucho, así que no sé cuáles son).
Justin
32

Ruby / Shell

​​​​​​
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!   The Amazing Integer Adder             !
#! Adds 1 and 1, and displays the result   !
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

p 1+1

Funciona bien si una nueva línea está en la parte superior; de lo contrario, la primera línea de comentarios es interpretada por el shell como un shebang con formato incorrecto.

histocrat
fuente
3
¿Esto no funcionaría siempre o no funcionaría siempre? Por ejemplo, si lo ejecutó como ruby youranswer.rb, no buscaría un shebang porque ya se está ejecutando en el intérprete de ruby, pero si lo ejecutó como ./youranswer.rbno funcionaría en absoluto porque no hay shebang ..
Vuelva a instalar a Monica
66
Al menos con mi ruby, el shebang se respeta incluso si lo ejecuta como ruby youranswer.rb, lo que puede ser útil para configurar los modificadores de línea de comandos necesarios en el archivo. Así que sin la nueva línea que obtengoruby: no Ruby script found in input (LoadError)
histocrat
29

Scala

case class IntWrapper(i: Int)

{
  val answer = (IntWrapper(0) /: (1 to 100)){(x, y) => IntWrapper(x.i + y)} // Add up ints
  println(s"Sum of wrapped integers is $answer")
}

Si elimina la línea en blanco, no se imprimirá ninguna salida. Lo cual es lo mejor, ya que su pila se desbordaría si realmente llamara IntWrapper.

Este es un caso de esquina de la inferencia de punto y coma de Scala. Normalmente, las líneas nuevas obtienen un punto y coma siempre que el código resultante sea válido. Sin embargo, los desarrolladores de Scala no querían obligar a las personas a usar corchetes egipcios , por lo que es válido poner los corchetes para una definición de clase en la línea inmediatamente después: no se agrega punto y coma, aunque podría serlo. Sin embargo, una línea en blanco separa los corchetes de la definición de clase. Con la línea en blanco eliminada, el código cambia de ser una definición de clase y un bloque, a una definición de clase con un constructor, ¡y un constructor recursivo!

James_pic
fuente
66
Muy amable de su parte no forzar los soportes egipcios. Pero la inferencia de punto y coma es una mala idea, en mi opinión.
Almo
La inferencia de punto y coma recibe un mal nombre, en gran parte debido a JavaScript. Es un poco menos doloroso si diseñas el lenguaje con esto en mente (nadie se queja de eso en Python, por ejemplo). Desafortunadamente, Scala incluyó un par de características que no funcionan bien con inferencia de punto y coma. Hay esto, y operadores de postfix (que tuve la tentación de usar en mi respuesta, pero es un poco pasado de moda).
James_pic
2
@James_pic: AFAIK nadie se queja de eso en Python porque no existe en Python. En JS, los puntos y comas son una parte necesaria de la sintaxis y se pueden insertar (inferir) en ciertos puntos. En Python, los puntos y comas no son una parte necesaria de la sintaxis, pero se pueden usar opcionalmente. Esa es una gran diferencia.
Mason Wheeler
Puede parecer una gran diferencia, pero si Scala eliminara algunas características, que actualmente hacen que los límites de las declaraciones sean ambiguos, pasaría del lado de la cerca de JavaScript al de Python.
James_pic
1
@James_pic: Lo que hace que Python sea diferente es que la nueva línea termina la declaración a menos que se escape o esté dentro de cualquier tipo de paréntesis. Es decir, no hay una regla completa / incompleta.
Jan Hudec
27

GolfScript

~{.@\%:

}do;

Calcula el MCD de dos enteros distintos de cero. Eliminar la línea en blanco interrumpe el programa.

Pruébalo en línea.

Cómo funciona

Esta es una implementación de GolfScript del algoritmo euclidiano:

      # STACK: "15 24"
~     # Interpret the input string.
{     # STACK: 15 24
  .@  # Duplicate the topmost integer and rotate the other on top of both copies.
      # STACK: 24 24 15
  \   # Swap the topmost integers.
      # STACK: 24 15 24
  %   # Calculate the modulus.
      # STACK: 24 15
}do   # If the modulus is non-zero, repeat the loop.
;     # Discard the last modulus.

Solo hay un pequeño problema:

{}dosaca el módulo de la pila para verificar si es verdadero, por lo que debe duplicarse al final del ciclo. Esto normalmente se logra mediante ., pero :\n\ntiene el mismo efecto: almacena el elemento de la pila superior en la variable LF ( :\n), luego empuja el contenido de esa variable.

Dennis
fuente
77
Wow, incluso eso es una variable? : O
aditsu
@aditsu: solo #, {y }no puede usarse como nombres de variables, ya que son parte de la sintaxis. Todos los demás tokens están bien, incluidas las cadenas.
Dennis
@Dennis wow. TIL incluso las cadenas se pueden utilizar como variables. ¿Eso es útil para algo?
John Dvorak
@ JanDvorak: Aparte de algunos casos extremos (código palindrómico, código oculto , probablemente no. Creo que esto es solo un efecto secundario ( documentado ) de cómo el intérprete de GolfScript divide el código en tokens.
Dennis
@Dennis, ¿eso significa que .:-1almacena la entrada -1, no el signo menos en sí? Hmm ...
John Dvorak
23

Sintaxis de plantilla de MediaWiki

Definir plantilla: Foo como

{{{a

b|Uh-oh!}}}

En otra pagina

{{Foo|a

b=Works!}}  <!-- outputs "Works!" -->

{{Foo|a


b=Works!}}  <!-- outputs "Uh-oh!" -->

{{Foo|a
b=Works!}}  <!-- outputs "Uh-oh!" -->

En MediaWiki, los nombres de los parámetros pueden contener nuevas líneas.

Ypnypn
fuente
1
Bien, esto está en la línea de lo que estaba buscando, casos extraños como este.
Naftuli Kay
16

LaTeX (backref)

El siguiente código de LaTeX utiliza una cita y la cita contiene una lista de páginas, donde se cita la entrada. Aquí está la primera página. El paquete hyperreftambién agrega enlaces PDF, la referencia de la página es roja, el enlace de la cita es verde.

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.

\end{thebibliography}
\end{document}

Resultado

Pero LaTeX no requiere la línea vacía, la línea vacía parece superflua y el ejemplo seguirá funcionando sin ella hyperrefy la línea vacía:

\documentclass{article}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Resultado sin hiperref.

Pero los enlaces y la referencia anterior se han ido, por lo que los reinsertamos:

\documentclass{article}
\usepackage[colorlinks,pagebackref]{hyperref}
\begin{document}
Donald E. Knuth is the inventor of \TeX~\cite{knuth}.
\begin{thebibliography}{9}
\bibitem{knuth}
Donald E. Knuth: \textit{The \TeX book}; Addison Wesley, 1984.
\end{thebibliography}
\end{document}

Pero ahora el ejemplo está roto y ya no se compilará :

Runaway argument?
 Donald E. Knuth: \textit {The \TeX book}; Addison Wesley, 1984. \end \ETC.
! File ended while scanning use of \BR@@bibitem.
<inserted text> 
                \par 
<*> knuth

?

¿Que pasó? El paquete hyperref(o el paquete más preciso backref, que se carga por hyperref) quiere llegar al final de la entrada de la bibliografía para agregar la lista de referencia posterior. Pero la sintaxis en LaTeX solo proporciona el comienzo de la entrada \bibitem, el final puede estar en cualquier lugar. En este paquete de emergencia se backrefha agregado una restricción que \bibitemtiene que finalizar la entrada con una línea vacía. Entonces el paquete puede redefinir\bibitem para colocar las referencias al final de la entrada.

Como falta la línea vacía, TeX sigue buscándola, pero en su lugar encontró el final del archivo y emite el mensaje de error.

Heiko Oberdiek
fuente
12

C (semi-ofuscado)

Este pequeño programa toma un número en la línea de comando y calcula su factorial. Sin embargo, también contiene funciones de inteligencia artificial de vanguardia para la verificación del tiempo de ejecución de que se siguen los estándares de codificación de la compañía, incluido el uso correcto de espacios en blanco y líneas en blanco. Al eliminar una línea en blanco, el algoritmo rechazará el programa que no se puede mantener lo suficiente.

No hay continuaciones de línea ni trigrafos en ningún lado. Creo que es válido ANSI C99.

Debido a las matemáticas avanzadas involucradas, si compila con gcc, recuerde usar -lm.

#include <setjmp.h>
#include <stdio.h>
#define max(x,y) ((x<y?y:x))
#define swap(x,y) ((x^=y,y^=x,x^=y))
#include <stdlib.h>
#include <math.h>
#define vfry(x,p,z,y,i) (!!y&((z##z##L##I##p##x##z##z)))
#define NDEBUG

/* 
 * Proper use of whitespace is essential!
 * Please do not remove any blank lines.
 */

const double E = 2.71828182845904523536;

int vrfy(double epsilon, int magic, const char *key, long int L) {
  /* You are not expected to understand this */
  double x=284.2891,u=2.34e56;
  while (rand()+magic*pow(epsilon,sin(x-E))!=log(u*L))
    x*=vrfy(1.0/epsilon,(int)u,&key[swap(L,magic)],L++);
  return u/lgamma(x);
}

int main(int argc, char *argv[]) {
  int N_=831293812; /* do not change, see Knuth 1987 */
  if (!vfry(E, N,_, "M=&;VT=I!9", 0xfe86ddcaL)) {
    fprintf(stderr, "Code standards violation detected!\n");
    abort();
  }
  if (argc < 2) {
    fprintf(stderr, "Usage: %s n\nComputes n!\n", argv[0]);
    exit(1);
  }
  int m=1, n=atoi(argv[1]), i;
  for (i=1; i <= n; i++)
    m *= i;
  printf("%d! = %d\n", n, m);
  return 0;
}

Spoiler

La vrfyfunción complicada nunca se llama, sino más bien la vfrymacro de aspecto divertido . El uso de la función de concatenación de cadenas del preprocesador oculta el hecho de que realmente solo estamos verificando la paridad de __LINE__.

Nate Eldredge
fuente
También funciona contcc -run
Vi.
Esto es realmente genial. Eso vfryno se expande en la definición de la función realmente me dejó perplejo.
FUZxxl
11

do

Este programa funciona como se esperaba (como se describe en los comentarios) a menos que la línea en blanco antes foo = 5; se elimine la .

Lamentablemente, una vez encontré un error casi exactamente como esto en el código de producción.

#include <stdio.h>

int main()
{
    int foo = 0;

    #define FROB(x) do {                                            \
        x++;                                                        \
        printf("%d\n", x);                                          \
    } while (0);                                                    \

    foo = 5;
    FROB(foo); /* prints 6 */
    FROB(foo); /* prints 7 */
    FROB(foo); /* prints 8 */

    return 0;
}

Este ejemplo usa el do { ... } while (0)idioma para crear una declaración multilínea en una macro (consulte https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for ). También utiliza el carácter de barra diagonal inversa para extender una #definesobre varias líneas, convenientemente alineadas fuera de la vista. Sin embargo, también hace dos cosas mal:

  • Hay un punto y coma después while (0), mientras que el idioma generalmente omite esto
  • Hay una barra invertida después de la línea final del #define

Con esto en su lugar, la eliminación de la línea en blanco antes de foo = 5;causas que la asignación que se ejecutará después de la printf, sino también después de cada invocación de la FROBmacro. Como resultado, el resultado después de eliminar la línea en blanco es:

1
6
6
Greg Hewgill
fuente
1
Básicamente un duplicado de codegolf.stackexchange.com/a/31662/20356
verqu
@TheRare Pero es menos obvio.
Ypnypn
66
Es menos obvio si no ves esas barras invertidas que flotan muy visiblemente a la derecha. (Pero dado que flotan allí muy visiblemente hacia la derecha, los
verán
3
Sin embargo, todos menos uno de ellos están justificados
QuadmasterXLII
66
@QuadmasterXLII, técnicamente hablando, todos están justificados, justificados correctamente, para ser precisos.
Mark
9

C / C ++

int main(){

    return __LINE__ - 3;
}

Devuelve el éxito y se puede usar como una implementación para true . Si se quita la línea en blanco que se puede utilizar como una aplicación de falso en su lugar.

nwp
fuente
8

Potencia Shell

Esta función agregará dos números.

function add ($a, $b) {
    $numbers = @($a `

            $b)
        $numbers| measure -sum| select -expand sum
}

Eliminar la línea en blanco hará que la función falle con: Unexpected token '$b' in expression or statement.

Explicación

Los elementos de matriz se pueden separar por líneas nuevas y / o comas. Colocar el carácter de continuación de línea ( `) después $arequiere una nueva línea adicional para separar $ay $b. De lo contrario, el intérprete ve el código como $numbers = @($a $b)(sin separador de elementos).

Rynant
fuente
7

Texas

\noindent\everypar{$\bullet$ hello }

world
\bye

Sin la línea vacía, "hola" no se imprime.

Explicación

TeX trata la línea vacía como un salto de párrafo y \everyparse ejecuta al comienzo de un nuevo párrafo.

Stephan Lehmke
fuente
6

Java

import java.util.Scanner;

public class BlankLine
{
    public static void main( String[] args )
    {
        //This calculates 2^ given number
        //if you remove blank line after the next line it will always print 1
        int x = new Throwable().getStackTrace()[0].getLineNumber();

        int y = new Throwable().getStackTrace()[0].getLineNumber() - x;
        System.out.println("Number:");
        Scanner scanner = new Scanner(System.in);
        int r = 1;
        int n = scanner.nextInt();

        for(int i = 0; i < n; i++){
            r *= y;
        }
        System.out.println("2^number: "+r);
    }
}

x es el número de línea actual, y es el número de línea actual - x. Si hay una línea en blanco entre ellos, el resultado es 2. Entonces, el código calcula 2 ^ número.

barteks2x
fuente
1
+1 simplemente porque es Java, aunque como visitante frecuente de Code Review me pregunto por qué no lo está utilizando Math.pow.
Simon Forsberg
Porque mi código tiene que hacer algo. Agregar 2 números es un poco demasiado simple.
barteks2x
Usar Math.powe imprimir el resultado también está haciendo algo , ¿no?
Simon Forsberg
Y ahora me di cuenta de que realmente podía usar .Math.pow No sé por qué pensé que tenía que hacerlo de esa manera ... Matbe, quería hacerlo de una manera más "astuta".
barteks2x
77
Has estado jugando demasiado al golf. ¡Deberías visitar Code Review en lugar de hacer las cosas bien!
Simon Forsberg
6

Perl 5

print(<<""
Hello, World!

);

Este código se imprime Hello, World!. Eliminar la línea en blanco da un error de sintaxis en su lugar.

Explicación:

Sintaxis here-doc de Perl para cadenas de varias líneas permite una cadena de terminación vacía. Incluso está explícitamente documentado. La eliminación de la línea en blanco hace que el paréntesis de cierre (y todo lo demás hasta la siguiente línea en blanco, si la hay) se interprete como parte de la cadena, causando un error de sintaxis.

Los mensajes de error que recibe son realmente bastante decentes, para una característica de sintaxis tan extraña. Si no hay líneas en blanco en el programa después de la print(<<""línea, Perl simplemente dice:

No se puede encontrar el terminador de cadena "" en ningún lugar antes de EOF en foo.pl línea 1.

Si no es una línea en blanco al final del programa, se obtiene algo como esto en su lugar:

error de sintaxis en foo.pl línea 4, en EOF
  (Podría ser una cadena de múltiples líneas desbocada << que comienza en la línea 1)
Ejecución de foo.pl abortada debido a errores de compilación.

Ilmari Karonen
fuente
5

Lote

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

Este código saldrá Helloy en la siguiente línea World. Cuando se eliminan una o ambas líneas en blanco, no genera nada en absoluto.

Hay una explicación aquí .

carne sin carne
fuente
4

Rubí

La eliminación de la primera línea causará un error:

line = IO.readlines($0).first.chomp if line.empty? puts 34+4 else raise "Please add a newline at the beginning of the program." end
Mhmd
fuente
2
Me encanta el mensaje de error Me gustaría ver la reacción de alguien que intenta ejecutar el programa y obtiene esa respuesta.
Tomsmeding
4

Pitón

No sé si esto cae dentro de las lagunas estándar, miré la lista y no vi esto.

src = open(__file__, 'r')
code = src.readlines()
src.close()

if code[3] == '\n':
    print 'Hello World!'

Ejecutar esto regularmente regresa

Hello World!

Ejecutarlo sin la línea en blanco en la línea 4, es decir, como a continuación:

src = open(
__file__, 'r')
code = src.readlines()
src.close()
if code[3] == '\n':
    print 'Hello World!'

no devuelve nada

Zaxvo
fuente
3

Python 2.x

Este programa genera el quinto carácter de la cadena ingresada.

import inspect

text = raw_input()
print 'Fifth character of the string:', text[inspect.getlineno(inspect.currentframe())]

Esto no está oculto de ninguna manera. Si elimina la línea vacía, le da el cuarto carácter y el sexto si agrega uno.

seequ
fuente
3

Tcl

Una función que agrega dos números (y comprueba si se ha eliminado la nueva línea):

proc add {a b} {
    if {[llength [split [info body add] \n]] < 5} {error "function has been modified"}

    return [expr $a+$b]
}

No hay nada que ocultar aquí, hace lo que dice, así que no estoy estropeando la explicación. La función infoes una navaja suiza de introspección (lo que otros lenguajes llaman reflexión). info bodydevuelve el código fuente de una función (si no está escrito en C o ensamblado).

Tengo que admitir que esto me dejó perplejo hasta que vi la solución de JavaScript.

slebetman
fuente
3

do

#include <stdio.h>


int main() {
    const char* a = "You love blank lines.";
    #define print_out(a) \

    printf("%s\n", a);
    a = "You don't seem to love blank lines";
    print_out(a);
    return 0;
}

Con la línea en blanco, aes la variable local a y sin ella es el parámetro macro ...

urzeit
fuente
3

Técnicamente no es un problema de "código", sino uno de servidor. Si se envía a Apache desde un script CGI (que se puede generar con cualquier idioma que desee), enviará una respuesta HTTP al cliente:

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8

Hello world!

Por otro lado, esto fallará ya que le falta el espacio en blanco después del encabezado.

HTTP/1.x 200 OK 
Content-Type: text/html; charset=UTF-8
Hello world!
cwallenpoole
fuente
2

JavaScript

La función whereamiresponde con la posición de la línea de llamada, en relación con su propia posición en el código fuente.

console.log (whereami ()) //3 line(s)  before me 


function whereami () {
    var a=function a(e){try{to}catch(c){for(var d=c.stack.split("\n"),b=0;b<d.length&&!~d[b].indexOf("a");b++);return c.stack.split("\n")[b+~~e].match(/:(\d+)/)[1]-~~window.hasOwnProperty("__commandLineAPI")}},a1=a(1),i


    i= a(2)>a(1)+4?a(1):a(1)>a1+2?a1-1:a/a1



    return ((i=(a(2)<i?i-1:a(1)>i+3?a(2)-a(1)-1:a/1)) + " line(s) "   ) + (i<a(2)?" after":(i>=a(2)?" before":"confusing")) + " me";
}


console.log (whereami ()) //3 line(s)  after me

Si whereamise elimina alguna línea en blanco en la función. La salida es NaN line(s) confusing me. (Agregar líneas no lo rompe)

En realidad, solo cuenta cuántas líneas hay entre ila primera y la última línea, respectivamente. Si caen por debajo de un valor dado. La línea de referencia se establece para NaNque ni satisface NaN<callingLineni NaN>=callingLine. Traté de ocultarlo un poco en expresiones ternarias ilegibles.

C5H8NNaO4
fuente
1
Guay. No había pensado en usar la pila de excepciones de esa manera.
nderscore
2

Perl

#!/usr/bin/perl

use strict;
use warnings;

open IN, "<".$0 or die "Did not find input files!";
while (<IN>) {
        m/blabla/ && ((<IN> =~ /\}/ && print "tra-la-la...\n") || print "ti-ri-li\n");

}
close IN;

Esta secuencia de comandos de Perl leerá el archivo de secuencia de comandos y comprobará si después de la línea que contiene "blabla" hay un corchete de cierre.

urzeit
fuente
2

Escript

Debido a un error en la escriptimplementación, el escript válido debe tener al menos tres líneas de largo y la primera línea debe ser shebang o vacía. Entonces, el siguiente script debe tener dos líneas vacías donde la primera tiene que ser la primera:

main(_) -> io:format("Hello world!~n", []), halt().

O debe dividirse en dos líneas, pero aún debe tener la primera línea vacía.

main(_) ->
    io:format("Hello world!~n", []), halt().

De lo contrario, obtendrá

escript: Premature end of file reached
Hynek -Pichi- Vychodil
fuente
2

Rubí

print %q
2+2=

p(2+2)

Imprime 2+2=4, pero da un error de sintaxis sin la tercera línea en blanco. %qpermite que cualquier carácter que no sea de palabra sirva como delimitador de cadena, incluso el carácter de nueva línea. Entonces, las primeras tres líneas de código son en realidad equivalentes print %q"2+2="o simplemente print "2+2=". Como la nueva línea posterior 2+2=se está utilizando como delimitador de comillas, no se analiza también como un delimitador de línea , por lo que necesita otra inmediatamente después.

histocrat
fuente
1

Insomnio (ambas versiones)!

Þyoo

â

Este código imprime un ~ (no pregunte por qué, el insomnio es extraño). Si elimina la línea en blanco, imprime un ÿ en su lugar.

Por cierto, esa primera letra es una espina .

pppery
fuente
1
¡Hurra, espinas! No he visto ese personaje en años, +1.
Addison Crump
0

C ++

Este es un truco clásico y bastante tonto. Sabrás lo que es cuando lo veas, esto es solo para completarlo. Como tal, estoy marcando esto como una respuesta wiki comunitaria.

int main() {
    //This program won't work without the next line, why??/

    return 1;
}

Por que esto funciona

CrazyM4n
fuente
13
Este es realmente uno de los vacíos legales.
Mhmd
@Mhmd no estaba al tanto. De cualquier manera, sé que la gente siempre usa esto en este tipo de preguntas, y solo quería dejar esto aquí solo para que a alguien no le resulte inteligente hacer esto.
Aearnus
1
Esta respuesta es incorrecta por dos razones. El primero es que ??/significa \​, así que ??//significa \/, y como la línea no termina \​, no hay continuación de línea. El segundo es que el comportamiento es exactamente el mismo independientemente de si return 0;se ejecuta, porque ese es el comportamiento estándar cuando la ejecución de mainllega al cierre }.
hvd
@hvd allí. Lo arreglé.
Aearnus
3
@cra I know people always use this in these kinds of questionpor eso lo convertimos en una escapatoria estándar
undergroundmonorail
0

Pegue esto en un archivo html y ábralo en su navegador. Es bastante simple, pero un poco complicado porque toma el número de líneas en blanco en el documento e indexa una matriz para llamar a una función que muestra una alerta.

<body>
<script>
[null, function(){alert("GIVE ME MY LINE BACK")}, function(){alert("2 + 2 = " + (2+2))}][document.body.innerHTML.split("\n\n").length]()

</script>
</body>

Este es el incumplimiento de la regla límite. Técnicamente, JavaScript no tiene cadenas multilínea, que es la única razón por la que esto funciona.

Debido a que puede tener un error de sintaxis en una etiqueta de script sin interferir con las otras etiquetas de script, esto muestra un resultado positivo solo si hay un error en la página. El error evita que se active la segunda alerta porque está en la misma etiqueta de script.

<body>
<script>
window.onerror=function(){
  alert("2 + 2 = " + (2+2));
}
</script>
<script>
var a = "\

";
alert("GIVE ME MY LINE BACK!");
</script>
</body>
Bandido
fuente
0

Rubí

puts (% #{ARGV[0].to_i + ARGV[1].to_i}

)

El secreto es que la nueva línea es realmente una pestaña, luego una nueva línea. No sé si esto cuenta, pero pensé que era ingenioso. El carácter después del %también es una pestaña, pero por alguna razón no aparece como tal. Estoy usando la notación porcentual de Ruby para hacer una cadena, que agrega los primeros 2 argumentos pasados ​​al script. Hay más sobre eso aquí: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/

Addison
fuente
En realidad no cuenta, lea las instrucciones: "Sin espacios en blanco". Exactamente uno \ndebe estar presente y debe ser crucial para que el programa funcione como se espera.
Naftuli Kay
Ah ok :( bueno, lo intenté
addison
1
Sin embargo, creo que puede solucionar esto: una nueva línea en sí misma puede ser un delimitador porcentual.
histocrat