Exclusão de uma linha em branco no código-fonte que causa funcionalidade inesperada [fechado]

38

Escreva um script que funcione bem quando uma linha em branco estiver presente no fluxo da lógica do programa, mas quebre ou cause comportamento inesperado ao remover essa linha.

Evite brechas comuns e respostas estúpidas. Seu programa deve fazer algo "útil", mesmo que tudo o que faça seja adicionar alguns números inteiros.

A remoção de uma linha vazia de uma sequência multilinha não conta, a menos que a saída esperada dessa sequência multilinha não deva mudar tecnicamente (por exemplo: se você estiver removendo todas as linhas em branco correspondentes ^$).

Tolos em espaços em branco também não são permitidos; não faça coisas estranhas com retornos de carro, guias, espaços etc.

Naftuli Kay
fonte
11
Eu acho que você deve excluir o espaço em branco.
N
17
Eu acho que Whitespace é uma " brecha padrão "
core1024
5
nneonneo está falando sobre espaço em branco , que é uma linguagem que usa apenas espaços como sintaxe.
Kyle Kanos
4
"funcionalidade inesperada" é uma frase muito boa.
Kaz
3
Estou votando para encerrar esta questão como fora de tópico, porque os desafios secretos não estão mais no tópico neste site. meta.codegolf.stackexchange.com/a/8326/20469
cat

Respostas:

62

Javascript

Abre um pop-up de alerta com "Olá, mundo!" se a linha em branco existir, o alerta será "0".

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

})();

Demo

Explicação:

arguments.callee é uma referência à função anônima de execução automática.

Anexar um array em branco ( []) converte a função em uma string, fornecendo seu código fonte.

indexOfretorna -1se a sequência não for encontrada.

Executar uma operação não bit a bit ( ~) resulta em -1transformação 0, que é um valor falsey.

nderscore
fonte
2
Que truque é esse ?!
Kroltan
1
arguments.calleecontém a fonte da função.
Matthew
2
Observe que isso não funciona mais no modo estrito (que o código mais moderno estaria usando). O modo estrito proíbe o uso de arguments.callee.
Daniel Lo Nigro
1
@ Michael: Não, spec não diz nada sobre o formato exato. De fato , existem motores rodando que não preservam espaços em branco.
Bergi
2
@DanielLoNigro Você pode apenas dar um nome à expressão de função e usá-lo em vez de arguments.callee. Até o torna mais curto.
um gato
42

C

Este programa mágico de 8 bolas ainda funcionará sem a linha em branco, mas será um pouco mais decisivo - nenhuma das respostas neutras aparecerá na saída.

#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;
}

Explicação

Quando o analisador C vê uma barra invertida seguida por um caractere de nova linha, ele ignora os dois e trata a segunda linha como uma continuação da primeira. Sem a linha em branco, as respostas "indiferentes" serão todas tratadas como parte do comentário anterior.

ossifrage melindroso
fonte
51
Marcou com +1, mas ver comentários C terminando com uma barra invertida está começando a se tornar uma brecha padrão, a IMO.
Tim S.Jul
2
Era uma referência a este post "brechas padrão" , então talvez não seja literalmente uma "brecha".
Tim S.
5
@TimS. se você está entediado com esta "solução", por que votou?
John Dvorak
8
As respostas barra invertida - a próxima linha em um comentário (trigraph ou sem trigraph) estão me fazendo desejar ter 125 reputação. Eu continuo vendo eles e eles estão começando a ser terrivelmente repetitivos, totalmente transparentes e não mais inteligentes ou engraçados. (Que é lamentável para aqueles que as usam, como escrúpulos aqui, porque em nada merece a ira e às vezes são totalmente inconscientes disso - mas o truque . Está ganhando)
doppelgreener
4
O @Jan começa a se tornar padrão não é o mesmo que o padrão longo / exagerado ... seu uso é bastante inteligente aqui, não parece fora do lugar (ao contrário de alguns que eu já vi, que inexplicavelmente têm caracteres) final de um comentário ou termine seus comentários com o (s) caractere (s) de início do comentário para fazer algo incomum). Então: votei na solução, não no uso continuado de seu truque.
Tim S.
37

Befunge-93

v
&
&
+
#

.
@

Meu primeiro programa befunge :)

Ele lê dois números da entrada e imprime sua soma. Se você excluir a linha vazia, ela não imprimirá nada.

Explicação:

vdefine uma direção descendente para executar o código
&lê um número inteiro
+adiciona os números juntos
#pula o próximo comando
.imprime um número inteiro da pilha
@finaliza o programa

Conforme escrito, #pula a linha vazia e continua com .. Comprar quando você exclui a linha vazia, .é ignorado.

Parece haver um bom intérprete em http://befunge.aurlien.net/

aditsu
fonte
Ah, inteligente.
see
1
O Befunge 98 também faz isso. Bem pensado. E esse intérprete tem alguns benefícios (não usei muito o seu, por isso não conheço seus benefícios).
Justin
32

Ruby / Shell

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

p 1+1

Funciona bem se uma nova linha estiver no topo, caso contrário, a primeira linha de comentário será interpretada pelo shell como um shebang malformado.

histocrata
fonte
3
Isso não funcionaria sempre ou sempre não funcionaria? Por exemplo, se você executou como ruby youranswer.rb, ele não procuraria um shebang porque ele já está sendo executado no intérprete de rubi, mas se você executou como ./youranswer.rbele não funcionaria porque não há shebang ..
Restabelecer Monica
6
Pelo menos no meu ruby, o shebang é respeitado, mesmo que você o execute ruby youranswer.rb, o que pode ser útil para definir as opções de linha de comando necessárias no arquivo. Assim, sem a nova linha Receboruby: 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")
}

Se você remover a linha em branco, nenhuma saída será impressa. Qual é o melhor, pois sua pilha transbordaria se você realmente pagasse IntWrapper.

Este é um caso de canto da inferência de ponto e vírgula de Scala. Normalmente, as novas linhas obtêm um ponto-e-vírgula sempre que o código resultante for válido. No entanto, os desenvolvedores do Scala não queriam forçar as pessoas a usar colchetes egípcios , por isso é válido colocar os colchetes para uma definição de classe na linha imediatamente após - nenhum ponto-e-vírgula é adicionado, mesmo que possa ser. No entanto, uma linha em branco separa os colchetes da definição de classe. Com a linha em branco removida, o código passa de uma definição de classe e um bloco para uma definição de classe com um construtor - e um construtor recursivo!

James_pic
fonte
6
Muito gentil da parte deles não forçar colchetes egípcios. Mas a dedução de ponto e vírgula é uma má ideia, na minha opinião.
Almo
A inferência de ponto e vírgula recebe um nome ruim, em grande parte devido ao JavaScript. É um pouco menos doloroso se você projetar a linguagem com ela em mente (ninguém reclama disso em Python, por exemplo). Infelizmente, o Scala incluiu alguns recursos que não funcionam bem com a inferência de ponto e vírgula. Há isso, e operadores de postfix (que eu fui tentado a usar na minha resposta, mas é um pouco ultrapassado).
22414 James_pic
2
@ James_pic: AFAIK ninguém reclama disso em Python porque não existe em Python. No JS, ponto e vírgula é uma parte necessária da sintaxe e pode ser inserida (inferida) em determinados pontos. No Python, ponto e vírgula não é uma parte necessária da sintaxe, mas pode ser usado opcionalmente. Essa é uma grande diferença.
Mason Wheeler
Pode parecer uma grande diferença, mas se o Scala removesse alguns recursos, que atualmente tornam os limites das declarações ambíguos, ele passaria do lado do JavaScript para o Python.
James_pic
1
@ James_pic: O que torna o python diferente é que a nova linha termina a instrução, a menos que escape ou dentro de qualquer tipo de colchete. Ou seja, não existe uma regra completa / incompleta.
Jan Hudec
27

GolfScript

~{.@\%:

}do;

Calcula o MDC de dois números inteiros diferentes de zero. A remoção da linha em branco interrompe o programa.

Experimente online.

Como funciona

Esta é uma implementação GolfScript do 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.

Há apenas um pequeno problema:

{}doaparece o módulo da pilha para verificar se é verdade; portanto, ele deve ser duplicado no final do loop. Isso normalmente é realizado por ., mas :\n\ntem o mesmo efeito: ele armazena o item de pilha mais alto na variável LF ( :\n) e depois empurra o conteúdo dessa variável.

Dennis
fonte
7
Uau, mesmo que seja uma variável? :
Ad
@aditsu: Apenas #, {e }não podem ser usados como nomes de variáveis, como eles são parte da sintaxe. Qualquer outro token é bom, incluindo cadeias.
Dennis
@Dennis uau. Até as seqüências TIL podem ser usadas como variáveis. Isso é útil para alguma coisa?
John Dvorak
@JanDvorak: Além de alguns casos bordas (código palíndromo, código secreto , provavelmente não acho que este é apenas um (. Documentado efeito colateral) de como o intérprete GolfScript divide o código em tokens.
Dennis
@ Dennis, isso significa que .:-1armazena a entrada -1, e não o sinal de menos em si? Hmm ...
John Dvorak
23

Sintaxe de modelo do MediaWiki

Definir modelo: Foo as

{{{a

b|Uh-oh!}}}

Em outra página,

{{Foo|a

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

{{Foo|a


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

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

No MediaWiki, os nomes dos parâmetros podem conter novas linhas.

Ypnypn
fonte
1
Bom, isso é o que eu estava procurando, casos extremos estranhos como esse.
Naftuli Kay
16

LaTeX (backref)

O código LaTeX a seguir usa uma citação e a citação contém uma lista de páginas, onde a entrada é citada. Aqui está a primeira página. O pacote hyperreftambém adiciona links em PDF, a referência de volta à página é vermelha, o link de citação é 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

Mas o LaTeX não requer a linha vazia, a linha vazia parece supérflua e o exemplo ainda funcionará sem hyperrefe a linha vazia:

\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 sem hiperref

Mas os links e as referências anteriores se foram, então os reinserimos:

\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}

Mas agora o exemplo está quebrado e não será mais compilado :

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

?

O que aconteceu? O pacote hyperref(ou pacote mais preciso backref, carregado por hyperref) deseja chegar ao final da entrada da bibliografia para adicionar a lista de referências anteriores. Mas a sintaxe no LaTeX fornece apenas o início da entrada até \bibitem, o final pode estar em qualquer lugar. Neste pacote de emergência backref, adicionou uma restrição que \bibitemdeve terminar a entrada com uma linha vazia. Em seguida, o pacote pode ser redefinido \bibitempara colocar as referências anteriores no final da entrada.

Como a linha vazia está ausente, o TeX continua procurando, mas encontrou o final do arquivo e emite a mensagem de erro.

Heiko Oberdiek
fonte
12

C (semi-ofuscado)

Este pequeno programa pega um número na linha de comando e calcula seu fatorial. No entanto, ele também contém a funcionalidade de IA de ponta para verificação em tempo de execução de que os padrões de codificação da empresa, incluindo o uso correto de espaços em branco e linhas em branco, estão sendo seguidos. A remoção de uma linha em branco acionará o algoritmo para rejeitar o programa insuficientemente sustentável.

Não há continuações de linha ou trigrafs em lugar nenhum Eu acredito que é válido ANSI C99.

Devido à matemática avançada envolvida, se você compilar gcc, lembre-se de 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

A vrfyfunção complicada nunca é chamada, mas a vfrymacro de aparência engraçada . O uso do recurso de concatenação de strings do pré-processador disfarça o fato de que realmente estamos apenas verificando a paridade de __LINE__.

Nate Eldredge
fonte
Também trabalha comtcc -run
Vi.
Isso é realmente legal. Isso vfrynão é expandido na definição da função realmente me surpreendeu.
FUZxxl 18/03/2015
11

C

Este programa funciona conforme o esperado (conforme descrito nos comentários), a menos que a linha em branco anterior foo = 5;seja removida.

Infelizmente, encontrei um erro quase exatamente assim no código de produção uma vez.

#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 exemplo usa o do { ... } while (0)idioma para criar uma instrução multilinha em uma macro (consulte https://stackoverflow.com/questions/257418/do- while -0- what - is - it - good-for ). Ele também usa o caractere barra invertida para espalhar #definevárias linhas, convenientemente alinhadas e fora da vista. No entanto, ele também faz duas coisas meio erradas:

  • Existe um ponto e vírgula depois while (0), enquanto o idioma geralmente omite esse
  • Existe uma barra invertida após a linha final do #define

Com isso, remover a linha em branco antes foo = 5;faz com que a atribuição seja executada após a printf, mas também após cada chamada da FROBmacro. Como resultado, a saída após remover a linha em branco é:

1
6
6
Greg Hewgill
fonte
1
Basicamente, uma duplicata do codegolf.stackexchange.com/a/31662/20356
seequ
@TheRare Mas é menos óbvio.
Ypnypn
6
É menos óbvio se você não olhar para as barras invertidas que flutuam muito à direita. (Mas desde que eles estão flutuando muito conspicuamente para a direita, eles estão indo para obter olhou.)
doppelgreener
3
No entanto, todos, exceto um deles, são justificados #
446
6
@QuadmasterXLII, tecnicamente falando, todos são justificados - justificados corretamente, para ser mais preciso.
Mark
9

C / C ++

int main(){

    return __LINE__ - 3;
}

Retorna sucesso e pode ser usado como uma implementação para true . Se a linha vazia for removida, você poderá usá-la como uma implementação para false .

nwp
fonte
8

PowerShell

Esta função adicionará dois números.

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

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

A remoção da linha em branco fará com que a função falhe com: Unexpected token '$b' in expression or statement.

Explicação

Os elementos da matriz podem ser separados por novas linhas e / ou vírgulas. Colocar o caractere de continuação de linha ( `) depois $arequer uma nova linha extra para separar $ae $b. Caso contrário, o intérprete visualiza o código como $numbers = @($a $b)(sem separador de elementos).

Rynant
fonte
7

TeX

\noindent\everypar{$\bullet$ hello }

world
\bye

Sem a linha vazia, "olá" não é impresso.

Explicação

O TeX trata a linha vazia como uma quebra de parágrafo e \everyparé executada no início de um novo parágrafo.

Stephan Lehmke
fonte
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 é o número da linha atual, y é o número da linha atual - x. Se houver uma linha em branco entre eles, o resultado será 2. Portanto, o código calcula 2 ^ número.

barteks2x
fonte
1
+1 simplesmente porque é Java, embora, como visitante frequente da Code Review, me pergunte por que você não está usando Math.pow?
Simon Forsberg
Porque meu código tem que fazer alguma coisa. A adição de 2 números é um pouco simples demais.
barteks2x
Usar Math.powe imprimir o resultado também está fazendo algo , não é?
Simon Forsberg
E agora eu percebi que realmente podia usar.
barteks2x
7
Você está jogando golfe demais. Em vez disso, você deve visitar a Code Review, onde fazemos as coisas corretamente!
Simon Forsberg
6

Perl 5

print(<<""
Hello, World!

);

Este código é impresso Hello, World!. A remoção da linha em branco gera um erro de sintaxe.

Explicação:

A sintaxe aqui-doc do Perl para sequências de várias linhas permite uma sequência terminadora vazia. É até explicitamente documentado. A remoção da linha em branco faz com que o parêntese de fechamento (e todo o resto até a próxima linha em branco, se houver) seja interpretado como parte da sequência, causando um erro de sintaxe.

As mensagens de erro que você recebe são realmente bastante decentes, para um recurso de sintaxe ímpar. Se não houver linhas em branco no programa após a print(<<""linha, o Perl simplesmente diz:

Não foi possível encontrar o "" terminador de strings "" em qualquer lugar antes do EOF na linha 1 do foo.pl.

Se não é uma linha em branco no final do programa, você obter algo como isto em vez disso:

erro de sintaxe na linha 4 do foo.pl, no EOF
  (Pode ser uma string << com várias linhas em fuga, iniciada na linha 1)
A execução do foo.pl foi interrompida devido a erros de compilação.

Ilmari Karonen
fonte
5

Lote

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

Este código será exibido Hellona próxima linha World. Quando uma ou as duas linhas em branco são removidas, ela não produz nada.

Há uma explicação aqui .

desgrudar
fonte
4

Rubi

A exclusão da primeira linha causará erro:

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
fonte
2
Adoro a mensagem de erro. Gostaria de ver a reação de alguém que tenta executar o programa e obtém essa resposta.
tomsmeding
4

Python

Não sei se isso se encaixa nas brechas padrão, olhei para a lista e não vi isso.

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

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

A execução regularmente retorna

Hello World!

Executando-o sem a linha em branco na linha 4, ou seja, como abaixo:

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

não retorna nada.

Zaxvo
fonte
3

Python 2.x

Este programa gera o quinto caractere da string inserida.

import inspect

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

Isso não está de forma alguma oculto. Se você remover a linha vazia, ele fornecerá o quarto caractere e o sexto se você adicionar um.

seequ
fonte
3

Tcl

Uma função que adiciona dois números (e verifica se a nova linha foi excluída):

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

    return [expr $a+$b]
}

Não há nada a esconder aqui, faz o que diz, por isso não estou estragando a explicação. A função infoé um canivete suíço de introspecção (o que outras línguas chamam de reflexão). info bodyretorna o código fonte de uma função (se não estiver escrito em C ou assembly).

Eu tenho que admitir que isso me deixou perplexo até ver a solução javascript.

slebetman
fonte
3

C

#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;
}

Com a linha em branco, aé a variável local a e sem o parâmetro macro ...

urzeit
fonte
3

Tecnicamente, não é um problema de "código", mas um problema de servidor. Se isso for enviado ao Apache a partir de um script CGI (que pode ser gerado com qualquer idioma que você desejar), ele enviará uma resposta HTTP para o cliente:

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

Hello world!

Por outro lado, isso falhará, pois está faltando o espaço em branco após o cabeçalho.

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

Javascript

A função whereamiresponde com a posição da linha de chamada, em relação à sua própria posição no código-fonte.

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

Se qualquer linha em branco na whereamifunção for removida. A saída é NaN line(s) confusing me. (Adicionar linhas não quebra)

Na verdade, conta apenas quantas linhas estão entre ie a primeira e a última linha, respectivamente. Se eles se enquadram em um determinado valor. A linha de referência é definida para a NaNqual nem satisfaz NaN<callingLinenem NaN>=callingLine. Tentei esconder um pouco isso em expressões ternárias ilegíveis.

C5H8NNaO4
fonte
1
Legal. Eu não tinha pensado em usar a pilha de exceções assim.
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;

Este script perl lerá o arquivo de script e verificará se após a linha que contém "blabla" há um colchete.

urzeit
fonte
2

Escript

Devido a um erro na escriptimplementação, o escript válido deve ter pelo menos três linhas e a primeira linha deve ser shebang ou vazia. Portanto, o script a seguir deve ter duas linhas vazias, onde a primeira deve ser a primeira:

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

Ou deve ser quebrado em duas linhas, mas ainda precisa ter a primeira linha vazia.

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

Caso contrário, você receberá

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

Rubi

print %q
2+2=

p(2+2)

Imprime 2+2=4, mas gera um erro de sintaxe sem a terceira linha em branco. %qpermite que qualquer caractere que não seja palavra sirva como delimitador de sequência, até mesmo o caractere de nova linha. Portanto, as três primeiras linhas de código são realmente equivalentes print %q"2+2="ou justas print "2+2=". Como a nova linha posterior 2+2=está sendo usada como um delimitador de cotação, ela também não é analisada como um delimitador de linha ; portanto, você precisa de outra imediatamente após.

histocrata
fonte
1

Insônia (ambas as versões)!

Þyoo

â

Este código imprime um ~ (não pergunte por que, insônia é estranha). Se você remover a linha em branco, ela imprimirá ÿ.

A propósito, a primeira letra é um espinho .

pppery
fonte
1
Viva, espinhos! Não vejo esse personagem há muito tempo, +1.
Addison Crump
0

C ++

Este é um truque clássico e bastante idiota. Você saberá o que é quando vê-lo, isso está aqui apenas por uma questão de conclusão. Como tal, estou marcando isso como uma resposta do wiki da comunidade.

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

    return 1;
}

Por que isso funciona

CrazyM4n
fonte
13
Esta é realmente uma das brechas.
Mhmd
@Mhmd eu não estava ciente. De qualquer maneira, eu sei que as pessoas sempre usam isso nesse tipo de pergunta, e eu só queria deixar isso aqui apenas para que alguém não ache inteligente fazer isso.
Aearnus
1
Esta resposta está errada por dois motivos. A primeira é que ??/significa \​, então ??//significa \/, e como a linha não termina em\​ , não há continuação de linha. A segunda é que o comportamento é exatamente o mesmo, independentemente de return 0;ser executado, porque esse é o comportamento padrão quando a execução mainatinge o fechamento }.
hvd 14/06
@hvd Lá. Eu consertei isso.
Aearnus
3
@cra I know people always use this in these kinds of questioné por isso que nós fizemos isso uma brecha padrão
undergroundmonorail
0

Cole isso em um arquivo html e abra-o no seu navegador. É bem simples, mas um pouco complicado, porque pega o número de linhas em branco no documento e indexa uma matriz para chamar uma função que mostra um 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>

Essa é a quebra de regras limítrofes. Tecnicamente, o JavaScript não possui cadeias de linhas múltiplas, e é o único motivo para isso funcionar.

Como você pode ter um erro de sintaxe em uma tag de script sem interferir nas outras tags de script, isso mostra um resultado positivo apenas se houver um erro na página. O erro impede que o segundo alerta seja acionado porque está na mesma tag de script.

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

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

Rubi

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

)

O segredo é que a nova linha é realmente uma guia, depois uma nova linha. Não sei se isso conta, mas achei que era um cutelo. O personagem após o% também é uma guia, mas por algum motivo, ele não aparece como um. Estou usando a notação de porcentagem de Ruby para criar uma string, que adiciona os 2 primeiros argumentos passados ​​ao script. Há mais sobre isso aqui: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/

Addison
fonte
Na verdade, não conta, leia as instruções: "Sem bobagens em espaço em branco". Exatamente um \ndeve estar presente e deve ser crucial para que o programa funcione conforme o esperado.
Naftuli Kay
Ah, ok :( bem, eu tentei #
1212 addison
1
Acho que você pode consertar isso: uma nova linha pode ser um delimitador de porcentagem.
histocrat