Удаление пустой строки в исходном коде, которая вызывает неожиданную функциональность [закрыто]


38

Напишите скрипт, который отлично работает, когда в потоке программной логики присутствует пустая строка, но ломается или вызывает неожиданное поведение при удалении этой строки.

Избегайте стандартных лазеек и глупых ответов. Ваша программа должна сделать что-то «полезное», даже если все, что она делает, это добавляет несколько целых чисел.

Удаление пустой строки из многострочной строки не считается, если только ожидаемый вывод этой многострочной строки технически не изменится (т. Е. Если вы удалите все соответствующие пустые строки ^$).

Также не допускаются пустые места; не делайте странных вещей с возвратом каретки, табуляцией, пробелами и т. д.


11
Я думаю, что вы должны исключить пробелы.
nneonneo

17
Я думаю, что Whitespace - это « стандартная лазейка »
core1024

5
nneonneo говорит о Whitespace , это язык, который использует только пробелы в качестве синтаксиса.
Кайл Канос

4
«неожиданная функциональность» - очень хорошая фраза.
Каз

3
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что скрытые проблемы больше не обсуждаются на этом сайте. meta.codegolf.stackexchange.com/a/8326/20469
кошка,

Ответы:


62

Javascript

Открывает всплывающее окно с предупреждением «Hello, World!» если пустая строка существует, в противном случае выводится предупреждение «0».

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

})();

демонстрация

Объяснение:

arguments.callee является ссылкой на самовыполняющуюся анонимную функцию.

Добавление пустого array ( []) приводит функцию к строке, которая дает вам ее исходный код.

indexOfвозвращает, -1если строка не найдена.

Выполнение побитовой операции not ( ~) приводит -1к превращению в 0значение false.


2
Что за обман ?!
Кролтан

1
arguments.calleeсодержит источник функции.
Мэтью

2
Обратите внимание, что это больше не работает в строгом режиме (который будет использовать большинство современного кода). Строгий режим запрещает использование arguments.callee.
Даниэль Ло Нигро

1
@Michael: нет, spec ничего не говорит о точном формате. Фактически , существуют двигатели, которые не сохраняют пробелы.
Берги

2
@DanielLoNigro Вы можете просто дать выражению функции имя и использовать его вместо arguments.callee. Даже делает это короче.
кот

42

С

Эта волшебная программа из 8 шаров все еще будет работать без пустой строки, но она будет немного более решительной - ни один из нейтральных ответов никогда не появится в выходных данных.

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

объяснение

Когда синтаксический анализатор C видит обратную косую черту, за которой следует символ новой строки, он игнорирует оба и обрабатывает вторую строку как продолжение первой. Без пустой строки все «равнодушные» ответы будут рассматриваться как часть предыдущего комментария.


51
Я добавил +1, но видение C-комментариев, заканчивающихся обратной косой чертой, начинает становиться стандартной лазейкой, IMO.
Тим С.

2
Это была ссылка на этот пост «стандартных лазеек» , так что, возможно, это не буквально «лазейка».
Тим С.

5
@TimS. если вам надоело это «решение», почему вы проголосовали?
Джон Дворак

8
Ответы с обратной косой чертой, следующей за строкой в ​​комментарии (триграф или нет триграфа), вызывают у меня желание иметь 125 репутации. Я продолжаю видеть их, и они начинают быть ужасно повторяющимися, полностью прозрачными, уже не умными и не смешными. (К сожалению, для тех, кто их использует, вроде брезгливых здесь, потому что они никоим образом не заслуживают гнева и иногда даже не подозревают об этом - но уловка заключается в том, чтобы его заработать.)
doppelgreener

4
@Jan начинает становиться стандартом не то же самое, что long-standard / overdone ... его использование здесь довольно умное, оно не выглядит неуместным (в отличие от некоторых, которые я видел, у которых по непонятным причинам есть символы) конец комментария или конец комментария символом (ами) начала комментария, чтобы сделать что-то необычное). Итак: я одобряю решение, а не дальнейшее использование его уловки.
Тим С.

37

Befunge-93

v
&
&
+
#

.
@

Моя первая программа befunge :)

Он читает два числа из ввода и печатает их сумму. Если вы удалите пустую строку, она ничего не печатает.

Объяснение:

vустанавливает нисходящее направление для выполнения кода
&читает целое число
+складывает числа вместе
#пропускает следующую команду
.выводит целое число из стека
@завершает программу

Как написано, #пропускает пустую строку и ограничивает с .. Купить при удалении пустой строки, .пропускается.

Кажется, есть хороший переводчик на http://befunge.aurlien.net/


Ах, умный.
Seequ

1
Befunge 98 также делает это. Хорошая мысль. И у этого переводчика есть некоторые преимущества (я не очень много им пользуюсь, поэтому не знаю его преимуществ).
Джастин

32

Рубин / Shell

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

p 1+1

Работает нормально, если новая строка находится сверху, в противном случае первая строка комментария интерпретируется оболочкой как неправильный шебанг.


3
Разве это не всегда работает или всегда не работает? Например, если вы запустили его как ruby youranswer.rb, он не будет искать shebang, потому что он уже запущен в интерпретаторе ruby, но если вы запустили его так, как ./youranswer.rbон вообще не будет работать, потому что нет shebang ..
Восстановите Monica

6
По крайней мере, с моим ruby, shebang считается достойным уважения, даже если вы запускаете его как ruby youranswer.rb, что может быть полезно для установки необходимых параметров командной строки в файле. Так что без перевода строки я получаюruby: no Ruby script found in input (LoadError)
гистократ

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")
}

Если вы удалите пустую строку, вывод не будет напечатан. Что к лучшему, так как ваш стек переполнится, если вы на самом делеIntWrapper .

Это угловой случай с точкой с запятой в Scala. Обычно символы новой строки получают точку с запятой всякий раз, когда результирующий код будет действительным. Тем не менее, разработчики Scala не хотели заставлять людей использовать египетские скобки , поэтому правильно ставить скобки для определения класса сразу после строки - ни одной точки с запятой не добавляется, даже если это возможно. Однако пустая строка отделяет скобки от определения класса. При удалении пустой строки код меняется с определения класса и блока на определение класса с помощью конструктора - и рекурсивного конструктора!


6
Очень мило с их стороны не заставлять египетские скобки. Но точка с запятой, на мой взгляд, плохая идея.
Almo

Вывод точки с запятой получает дурную славу, в основном из-за JavaScript. Это немного менее болезненно, если вы разрабатываете язык с учетом этого (никто не жалуется на это, например, в Python). К сожалению, в Scala есть несколько функций, которые не очень удобны с точкой с запятой. Там есть операторы postfix (которые я соблазнил использовать в своем ответе, но это немного устарело).
James_pic

2
@James_pic: AFAIK никто не жалуется на это в Python, потому что он не существует в Python. В JS точки с запятой являются необходимой частью синтаксиса и могут быть вставлены (выведены) в определенных точках. В Python точки с запятой не являются необходимой частью синтаксиса, но могут использоваться по желанию. Это большая разница.
Мейсон Уилер

Это может показаться большой разницей, но если бы Scala удалила несколько функций, которые в настоящее время делают границы операторов неоднозначными, то она перешла бы с JavaScript-барьера на Python.
James_pic

1
@James_pic: Что отличает python, так это то, что там символ новой строки завершает оператор, если не экранирован или не заключен в скобки любого типа. То есть не существует полного / неполного правила.
Ян Худек

27

GolfScript

~{.@\%:

}do;

Вычисляет GCD из двух ненулевых целых чисел. Удаление пустой строки разрывает программу.

Попробуйте онлайн.

Как это работает

Это реализация евклидова алгоритма в GolfScript:

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

Есть только одна крошечная проблема:

{}doвыталкивает модуль из стека, чтобы проверить, верен ли он, поэтому он должен быть продублирован в конце цикла. Обычно это выполняется ., но :\n\nимеет тот же эффект: он сохраняет самый верхний элемент стека в переменной LF ( :\n), а затем загружает содержимое этой переменной.


7
Вау, даже это переменная? : O
aditsu

@aditsu: Только #, {и }не могут быть использованы в качестве имен переменных, так как они являются частью синтаксиса. Все остальные токены в порядке, включая строки.
Деннис

@ Денис вау. В качестве переменных можно использовать четные строки TIL. Это полезно для чего-нибудь?
Джон Дворак

@JanDvorak: Кроме некоторых краевых случаев (палиндромный код, закулисный код , вероятно, нет. Я думаю, что это всего лишь ( задокументированный ) побочный эффект того, как интерпретатор GolfScript разбивает код на токены.
Деннис

@ Деннис означает ли это, что .:-1хранит данные -1, а не знак минус? Хм ...
Джон Дворак

23

Синтаксис шаблона MediaWiki

Определить шаблон: Foo as

{{{a

b|Uh-oh!}}}

На другой странице

{{Foo|a

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

{{Foo|a


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

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

В MediaWiki имена параметров могут содержать символы новой строки.


1
Хорошо, это то, что я искал, странные крайние случаи, подобные этому.
Нафтули Кей

16

LaTeX (обратная ссылка)

В следующем коде LaTeX используется цитата, а цитата содержит список страниц, где цитируется запись. Вот это первая страница. Пакет hyperrefтакже добавляет ссылки PDF, обратная ссылка на страницу красная, ссылка на цитирование зеленая.

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

Result

Но LaTeX не требует пустой строки, пустая строка выглядит излишней, и пример все равно будет работать без hyperrefпустой строки:

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

Result without hyperref

Но ссылки и обратная ссылка исчезли, поэтому мы вставляем их заново:

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

Но теперь пример сломан и не компилировать больше:

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

?

Что произошло? Пакет hyperref(или более точный пакет backref, который загружен hyperref) хочет получить в конце библиографической записи, чтобы добавить список обратной ссылки. Но синтаксис в LaTeX обеспечивает только начало записи \bibitem, конец может быть где угодно. В этот аварийный пакет backrefдобавлено ограничение, \bibitemкоторое должно заканчиваться записью с пустой строкой. Тогда пакет можно переопределить\bibitem чтобы поместить обратные ссылки в конец записи.

Поскольку пустая строка отсутствует, TeX продолжает ее искать, но вместо этого находит конец файла и выдает сообщение об ошибке.


12

С (полуобфускированный)

Эта маленькая программа берет число в командной строке и вычисляет ее факториал. Тем не менее, он также содержит передовые функциональные возможности AI для проверки во время выполнения, что стандарты кодирования компании, включая правильное использование пробелов и пустых строк, соблюдаются. Удаление пустой строки приведет к тому, что алгоритм отклонит недостаточно обслуживаемую программу.

Никаких продолжений строк или триграфов нигде. Я считаю, что это действительно ANSI C99.

Из-за продвинутой математики, которую вы используете gcc, не забывайте использовать -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;
}

Спойлер

Сложная vrfyфункция никогда не вызывается, а выглядит забавно выглядящим vfryмакросом. Использование функции конкатенации строк препроцессора скрывает тот факт, что мы действительно просто проверяем четность __LINE__.


Также работает сtcc -run
Vi.

Это действительно аккуратно. Это vfryне расширено в определении функции, действительно озадачило меня.
FUZxxl

11

С

Эта программа работает, как и ожидалось (как описано в комментариях), если только перед пустой строкой foo = 5; удалена .

К сожалению, я однажды столкнулся с ошибкой, почти такой же, как в рабочем коде.

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

В этом примере используется do { ... } while (0)идиома для создания многострочного оператора в макросе (см. Https://stackoverflow.com/questions/257418/do- while-0-what-is-it-good-for ). Он также использует символ обратной косой черты для распределения #defineпо нескольким строкам, удобно расположенным вне поля зрения. Тем не менее, это также делает две вещи вроде:

  • После точки с запятой while (0) , в то время как в идиоме это обычно опускается
  • После последней строчки #define

При этом в месте, удаляя пустую строку перед теми foo = 5;причинами , что назначение быть выполнено послеprintf , но и после каждого вызова из FROBмакроса. В результате на выходе после удаления пустой строки будет:

1
6
6

1
В основном дубликат codegolf.stackexchange.com/a/31662/20356
seequ

@TheRare Но это менее очевидно.
Ypnypn

6
Это становится менее очевидным, если вы не посмотрите на эти обратные слеши, которые видны вправо. (Но так как они очень заметно плывут вправо, на них
посмотрят

3
Тем не менее, все, кроме одного, оправданы
QuadmasterXLII

6
@QuadmasterXLII, технически говоря, все они оправданы - правильно, если быть точным.
Марк

9

C / C ++

int main(){

    return __LINE__ - 3;
}

Возвращает успех и может использоваться как реализация для true . Если пустая строка удалена, вы можете использовать ее как реализацию для false .


8

PowerShell

Эта функция добавит два числа.

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

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

Удаление пустой строки вызовет сбой функции с: Unexpected token '$b' in expression or statement.

объяснение

Элементы массива могут быть разделены символами новой строки и / или запятыми. Размещение символа продолжения строки ( `) после $aтребует дополнительной новой строки для разделения $aи $b. В противном случае интерпретатор рассматривает код как $numbers = @($a $b)(без разделителя элементов).


7

TeX

\noindent\everypar{$\bullet$ hello }

world
\bye

Без пустой строки «привет» не печатается.

объяснение

TeX рассматривает пустую строку как разрыв абзаца и \everyparвыполняется в начале нового абзаца.


6

Джава

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 - номер текущей строки, y - номер текущей строки - x. Если между ними есть пустая строка, результат равен 2. Таким образом, код вычисляет 2 ^ число.


1
+1 просто потому, что это Java, хотя, как частый посетитель Code Review, мне интересно, почему вы не используете Math.pow?
Саймон Форсберг

Потому что мой код должен что-то делать. Добавить 2 числа слишком просто.
barteks2x

Использование Math.powи распечатка результата также делает что- то, не так ли?
Саймон Форсберг

И теперь я понял, что действительно могу использовать .Math.pow. Я не знаю, почему я подумал, что мне нужно сделать это таким образом ... Мэтб, я хотел сделать это более "подлым" способом.
barteks2x

7
Ты слишком много играл в гольф. Вы должны посетить Code Review, где мы делаем все правильно!
Саймон Форсберг

6

Perl 5

print(<<""
Hello, World!

);

Этот код печатает Hello, World! . Удаление пустой строки дает вместо этого синтаксическую ошибку.

Объяснение:

в Perl синтаксис здесь-документ для строк многострочных позволяет пустую строку терминатора. Это даже явно задокументировано. Удаление пустой строки приводит к тому, что закрывающая скобка (и все остальное до следующей пустой строки, если она есть) интерпретируется как часть строки, вызывая синтаксическую ошибку.

Сообщения об ошибках, которые вы получаете, на самом деле довольно приличны для такой странной синтаксической функции. Если в программе нет пустых строк послеprint(<<"" строки , Perl просто говорит:

Не могу найти терминатор строки "" нигде до EOF в строке 1 foo.pl.

Если есть в конце программы пустая строка, вы получите что-то вроде этого:

синтаксическая ошибка в строке 4 foo.pl, в EOF
  (Может быть бегущей многострочной << строкой, начинающейся со строки 1)
Выполнение foo.pl прервано из-за ошибок компиляции.


5

партия

@echo off
setLocal enableDelayedExpansion
set NL=^


echo Hello!NL!World

Этот код выведет Helloи на следующую строку World. Когда удаляется одна или обе пустые строки, он вообще ничего не выводит.

Здесь есть объяснение .


4

Рубин

Удаление первой строки приведет к ошибке:

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
Я люблю сообщение об ошибке. Хотелось бы увидеть реакцию того, кто пытается запустить программу и получает этот ответ.
Томсминг

4

питон

Не знаю, подпадает ли это под стандартные лазейки, я посмотрел на список и не увидел этого.

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

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

Запуск этого регулярно возвращается

Hello World!

Запустите его без пустой строки в строке 4, например, как показано ниже:

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

ничего не возвращает


3

Python 2.x

Эта программа выводит пятый символ введенной строки.

import inspect

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

Это никоим образом не скрыто. Если вы удалите пустую строку, она даст четвертый символ и шестой, если вы добавите один.


3

Tcl

Функция, которая добавляет два числа (и проверяет, был ли удален перевод строки):

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

    return [expr $a+$b]
}

Здесь нечего скрывать, он делает то, что говорит, поэтому я не балуюсь объяснением. Эта функция info- швейцарский армейский нож самоанализа (то, что другие языки называют отражением). info bodyвозвращает исходный код функции (если не написан на C или сборке).

Я должен признать, что это поставило меня в тупик, пока я не увидел решение javascript.


3

С

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

Пустая строка a- это локальная переменная a, а без макропараметра ...


3

Технически это не проблема кода, а проблема сервера. Если это будет отправлено в Apache из CGI-скрипта (который может быть сгенерирован на любом языке, который вам нужен), он отправит HTTP-ответ клиенту:

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

Hello world!

С другой стороны, это не удастся, так как отсутствует заголовок после пробела.

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

2

JavaScript

Функция whereamiотвечает позицией вызывающей строки относительно ее собственной позиции в исходном коде.

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

Если какая-либо пустая строка в whereamiфункции удаляется. Выход есть NaN line(s) confusing me. (Добавление строк не нарушает его)

На самом деле он только подсчитывает, сколько строк между iпервой и последней линиями соответственно. Если они подпадают под данное значение. Опорная линия установлена, NaNкоторой не удовлетворяет NaN<callingLineни NaN>=callingLine. Я пытался скрыть это немного в нечитаемых троичных выражениях.


1
Круто. Я не думал об использовании стека исключений таким образом.
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;

Этот Perl-скрипт будет читать файл сценария и проверять, есть ли после строки, содержащей «blabla», закрывающая скобка.


2

Escript

Из-за ошибки в escriptреализации допустимый сценарий должен иметь длину не менее трех строк, а первая строка должна быть строкой Шебанга или пустой строкой. Итак, следующий скрипт должен иметь две пустые строки, где первая должна быть первой:

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

Или он должен быть разбит на две строки, но все равно должен иметь первую пустую строку.

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

В противном случае вы получите

escript: Premature end of file reached

2

Рубин

print %q
2+2=

p(2+2)

Печатает 2+2=4, но выдает синтаксическую ошибку без пустой третьей строки. %qпозволяет любому символу, не являющемуся словом, служить разделителем строк, даже символу новой строки. Таким образом, первые три строки кода фактически эквивалентны print %q"2+2="или просто print "2+2=". Поскольку символ новой строки после 2+2=используется в качестве разделителя кавычек, он также не анализируется как разделитель строк , поэтому вам нужен еще один после него.


1

Бессонница (обе версии)!

Þyoo

â

Этот код печатает ~ (не спрашивайте почему, бессонница странная). Если вы удалите пустую строку, вместо этого будет напечатан символ ÿ.

Кстати, эта первая буква - это шип .


1
Ура, шипы! Давно не видел этого персонажа, +1.
Аддисон Крамп

0

C ++

Это классический и довольно тупой трюк. Вы узнаете, что это, когда увидите, это просто ради завершения. Таким образом, я отмечаю это как ответ сообщества вики.

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

    return 1;
}

Почему это работает


13
Это на самом деле одна из лазеек.
Mhmd

@ Ммм, я не знал. В любом случае, я знаю, что люди всегда используют это в таких вопросах, и я просто хотел оставить это здесь, просто чтобы кто-то не нашел это умным сделать это.
Aearnus

1
Этот ответ неверен по двум причинам. Первое - это ??/значит \​, значит ??//значит \/, и поскольку строка не заканчивается \​, продолжения строки нет. Второе - это то же самое поведение , независимо от того return 0;, выполняется ли оно, потому что это стандартное поведение, когда выполнение mainдостигает закрытия }.
HVd

@hvd Там. Я починил это.
Aearnus

3
@cra I know people always use this in these kinds of question, поэтому мы сделали это стандартной лазейкой
подземный

0

Вставьте это в HTML-файл и откройте его в браузере. Это довольно просто, но немного хитро, потому что для этого нужно взять количество пустых строк в документе и проиндексировать массив для вызова функции, которая показывает предупреждение.

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

Это пограничное нарушение правил. Технически JavaScript не имеет многострочных строк, и это единственная причина, по которой это работает.

Поскольку вы можете иметь синтаксическую ошибку в одном теге сценария, не мешая другим тегам сценария, это показывает положительный результат, только если на странице есть ошибка. Ошибка предотвращает срабатывание второго предупреждения, поскольку оно находится в том же теге сценария.

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

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

0

Рубин

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

)

Секрет в том, что перевод строки - это действительно вкладка, а затем новая строка. Я не знаю, имеет ли это значение, но я подумал, что это умно. Символ после %также является вкладкой, но по некоторым причинам он не отображается как один. Я использую процентную нотацию Ruby для создания строки, которая добавляет первые 2 аргумента, переданных в скрипт. Подробнее об этом здесь: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


Это на самом деле не считается, прочитайте инструкции: «Никаких пустых мест». Точно \nдолжен присутствовать и должен иметь решающее значение для работы программы, как ожидалось.
Нафтули Кей

Ах, хорошо :( хорошо я попробовал
addison

1
Я думаю, что вы можете это исправить: символ новой строки сам по себе может быть разделителем процентов.
гистократ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.