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.


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.


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.


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/


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.


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!


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.


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.


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.


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__.


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

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.


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).


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.


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.


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.


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í .


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

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


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.


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.


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 ...


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!

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.


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.


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

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.


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 .


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


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>

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/


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.