Видалення порожнього рядка у вихідному коді, що викликає несподівану функціональність [закрито]


38

Напишіть сценарій, який працює добре, коли порожній рядок присутній у потоці логіки програми, але розриває або викликає несподівану поведінку, коли цей рядок видалений.

Уникайте стандартних лазівки і дурних відповідей. Ваша програма повинна зробити щось "корисне", навіть якщо все, що вона робить, це додати кілька цілих чисел.

Видалення порожнього рядка з багаторядкового рядка не зараховується, якщо тільки очікуваний вихід з цієї рядкової рядки технічно не повинен змінюватися (тобто: якщо ви видаляєте всі порожні рядки, що відповідають ^$).

Фолієрія білого простору також не дозволена; не робіть дивних речей із поверненнями для перевезення, вкладками, пробілами тощо.


11
Я думаю, вам слід виключити Whitespace.
nneonneo

17
Я думаю, що Whitespace - це " стандартна лазівка "
core1024,

5
nneonneo говорить про Whitespace , що є мовою, яка використовує лише пробіли як синтаксис.
Кайл Канос

4
"несподівана функціональність" - дуже гарна фраза.
Каз

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

Відповіді:


62

Javascript

Відкриває спливаюче вікно з написом "Привіт, світ!" якщо порожній рядок існує, інакше попереджає "0".

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

})();

Демо

Пояснення:

arguments.callee є посиланням на самовиконання анонімної функції.

Додавання порожнього масиву ( []) кидає функцію на рядок, який дає вам її вихідний код.

indexOfповертається, -1якщо рядок не знайдено.

Виконання побітових операцій ( ~) не призводить до -1перетворення 0, що є фальсифікованим значенням.


2
Що це за хитрість ?!
Кролтан

1
arguments.calleeмістить джерело функції.
Метью

2
Зауважте, що це більше не працює в суворому режимі (який би використовував більшість сучасних кодів). Суворий режим забороняє використання arguments.callee.
Даніель Ло Нігро

1
@Michael: Ні, специфікація нічого не говорить про точний формат. Насправді є двигуни, що працюють навколо, які не зберігають пробіл.
Бергі

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 починає стати стандартним - це не те саме, що давно стандартний / перестарався ... його використання тут досить розумне, воно не виглядає поза місцем (на відміну від деяких, яких я бачив, які незрозуміло мають характер (и) у кінець коментаря або закінчте їх коментарі символами початку коментарів, щоб зробити щось незвичне). Отже: я підтримую рішення, а не продовження використання його хитрості.
Тім С.

37

Befunge-93

v
&
&
+
#

.
@

Моя перша програмка :)

Він зчитує два числа з вхідних даних і друкує їх суму. Якщо ви видалите порожній рядок, він нічого не надрукує.

Пояснення:

vзадає напрямок вниз для виконання коду
&читає ціле число
+додає числа разом
#пропускає наступна команда
.друкує ціле число з стека
@закінчує програму

Як написано, #пропускає через порожній рядок і продовжує з .. Купувати, коли ви видаляєте порожній рядок, .пропускається.

Здається, приємний перекладач на http://befunge.aurlien.net/


Ах, розумний.
seequ

1
Befunge 98 також робить це. Гарне мислення. І цей перекладач має деякі переваги (я не використовував багато ваших, тому не знаю його переваг).
Джастін

32

Ruby / Shell

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

p 1+1

Добре працює, якщо новий рядок знаходиться вгорі, інакше оболонка інтерпретується оболонкою як неправильно сформований шебанг.


3
Чи це не завжди буде працювати, або завжди не працює? Наприклад, якщо ви його запустили ruby youranswer.rb, він би не шукав шебанг, тому що він вже працює в інтерпретаторі на рубіні, але якби ви його запустили, ./youranswer.rbвін би не працював зовсім, тому що немає шебангу ..
Відновіть Моніку

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

29

Скала

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 не хотіли змушувати людей використовувати єгипетські дужки , тому правильно ставити дужки для визначення класу на рядок одразу після цього - не додається крапка з комою, навіть якщо така може бути. Однак порожній рядок відокремлює дужки від визначення класу. З видаленням порожнього рядка код змінюється від визначення класу та блоку, до визначення класу з конструктором - і рекурсивного конструктора при цьому!


6
Дуже приємно з них не змушувати єгипетських брекетів. Але на думку про крапку з комою, на мою думку, погана ідея.
Алмо

Висновок про крапку з комою отримує погану назву, багато в чому завдяки JavaScript. Трохи менш болісно, ​​якщо ви розробляєте мову на увазі (наприклад, ніхто не скаржиться на неї в Python). На жаль, Scala включила кілька функцій, які не дуже добре грають з крапкою з комою. Ось це і оператори Postfix (які я спокусився використати у своїй відповіді, але це трохи пасе).
James_pic

2
@James_pic: AFAIK ніхто не скаржиться на це в Python, оскільки його немає в Python. У JS крапки з комою є необхідною частиною синтаксису, і їх можна вставити (зробити висновок) у певних точках. У Python крапки з комою не є необхідною частиною синтаксису, але можуть бути використані за бажанням. Це велика різниця.
Мейсон Уілер

Це може здатися великою різницею, але якби Скала видалив декілька функцій, які наразі роблять межі заяви неоднозначними, вона переміститься з боку забору JavaScript на Python's.
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: Тільки #, {і }не можуть бути використані в якості імен змінних, так як вони є частиною синтаксису. Будь-який інший жетон чудовий, включаючи рядки.
Денніс

@Dennis wow Навіть рядки TIL можуть використовуватися як змінні. Це корисне для чого-небудь?
Джон Дворак

@JanDvorak: Окрім деяких випадків ребер (паліндромний код, невмілий код , напевно, ні. Я думаю, що це лише ( задокументований ) побічний ефект того, як інтерпретатор GolfScript розбиває код на лексеми.
Денніс

@Dennis це означає, що .:-1зберігає вхід -1, а не сам знак мінус? Хм ...
Джон Дворак

23

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

Визначити шаблон: Foo як

{{{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
Приємно, це уздовж того, що я шукав, таких дивних випадків.
Naftuli Kay

16

LaTeX (backref)

У наведеному нижче коді 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}

Результат

Але 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}

Результат без гіперреф

Але посилання та зворотна посилання вже відсутні, тому ми їх знову вставляємо:

\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

C (напівзакритий)

Ця маленька програма приймає число в командному рядку і обчислює її фактор. Однак він також містить передові функціональні можливості 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-time-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
Це менш очевидно, якщо ви не дивитесь на ті косої нахили, що пливуть дуже помітно вправо. (Оскільки вони плавають там дуже помітно праворуч, вони будуть дивитися.)
doppelgreener

3
Однак всі, крім одного, виправдані
QuadmasterXLII

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

9

C / C ++

int main(){

    return __LINE__ - 3;
}

Повертає успіх і може використовуватися як реалізація для істини . Якщо порожній рядок видалено, ви можете використовувати його як реалізацію для помилкового .


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

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


1
+1 просто тому, що це Java, хоча як частий відвідувач Code Review я дивуюсь, чому ви не використовуєте Math.pow?
Саймон Форсберг

Тому що мій код повинен щось робити. Додавання 2 чисел - занадто просто.
barteks2x

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

І тепер я зрозумів, що я справді можу використовувати .Math.pow Я не знаю, чому я вважав, що мені потрібно зробити це саме так ... Матбе, я хотів це зробити у mor "підлий" спосіб.
barteks2x

7
Ви занадто багато займалися гольфом. Замість цього слід відвідати Code Review, де ми робимо все правильно!
Саймон Форсберг

6

Perl 5

print(<<""
Hello, World!

);

Цей код друкується Hello, World!. Видалення порожнього рядка натомість дає синтаксичну помилку.

Пояснення:

Синтаксис тут-doc для Perl для рядкових рядків Perl дозволяє порожній рядок термінатора. Це навіть явно задокументовано. Видалення порожнього рядка призводить до того, що дужки, що закриваються (і все інше до наступного порожнього рядка, якщо такий є), трактуються як частина рядка, викликаючи синтаксичну помилку.

Повідомлення про помилки, які ви отримуєте, насправді є досить пристойними для такої функції синтаксису дивної кулі. Якщо порожніх рядків у програмі після print(<<""рядка взагалі немає , Perl просто говорить:

Не вдається знайти термінальний рядок "" ніде перед EOF у foo.pl рядок 1.

Якщо це порожній рядок в кінці програми, ви отримаєте що - щось на зразок цього замість того, щоб :

синтаксична помилка у рядку 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
Мені подобається повідомлення про помилку. Хотілося б побачити реакцію того, хто намагається запустити програму і отримає таку відповідь.
tomsmeding

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повертає вихідний код функції (якщо вона не написана на С або збірці).

Я мушу визнати, що до цього я натрапив, поки не побачив рішення 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реалізації дійсний ескрипт повинен бути не менше трьох рядків, а перший рядок повинен бути шебанговою чи порожньою. Отже, наступний сценарій повинен мати дві порожні рядки, де перший повинен бути першим:

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

@Mhmd Я не знав. Так чи інакше, я знаю, що люди завжди використовують це в таких питаннях, і я просто хотів залишити це тут просто, щоб хтось не вважав, що це розумно робити.
Aearnus

1
Ця відповідь є неправильною з двох причин. Перше - це ??/означає \​, ??//значить \/, і оскільки рядок не закінчується \​, продовження рядка не існує. Друга полягає в тому, що поведінка абсолютно однакова незалежно від того, чи return 0;виконується вона, тому що це стандартна поведінка, коли виконання mainдосягає завершення }.
hvd

@hvd Там. Я полагодив це.
Aearnus

3
@cra I know people always use this in these kinds of question, тому ми зробили його стандартною лазівкою
undergroundmonorail

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}

)

Секрет у тому, що новий рядок - це справді вкладка, потім новий рядок. Я не знаю, чи вважається це, але я подумав, що це зрозуміліше. Символ після символу %також є вкладкою, але він чомусь не відображається як один. Я використовую відсоткове позначення Рубі, щоб зробити рядок, який додає перші два аргументи, передані до сценарію. Більше про це тут: http://teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


Це насправді не зараховується, прочитайте інструкцію: "Немає дурного простору". Саме він \nповинен бути присутнім і повинен мати вирішальне значення для того, щоб програма працювала як очікується.
Naftuli Kay

Ну добре :( добре, я спробував
Аддісон

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