予期しない機能を引き起こすソースコードの空白行の削除[終了]


38

プログラムロジックのフローに空白行が存在する場合は正常に動作するが、その行が削除されると予期しない動作が中断または発生するスクリプトを記述します。

標準的な抜け穴と愚かな答えを避けてください。プログラムは、いくつかの整数を追加するだけでも、「有用な」ことを行う必要があります。

複数行の文字列から空行を削除しても、その複数行の文字列から期待される出力が技術的に変更されない限り(つまり、一致するすべての空白行を削除する場合)、カウントされません^$

ホワイトスペースの愚行も許可されていません。キャリッジリターン、タブ、スペースなどで奇妙なことをしないでください。


11
空白を除外する必要があると思います。
nneonneo

17
私は空白のことを考えている標準抜け穴
core1024

5
nneonneoはWhitespaceについて語っています。これは、構文としてスペースのみを使用する言語です。
カイルカノス14年

4
「予期しない機能」は非常に良いフレーズです。
カズ

3
このサイトでは、人手不足の課題がトピックではなくなったため、この質問をトピック外として終了することに投票しています。meta.codegolf.stackexchange.com/a/8326/20469
cat

回答:


62

Javascript

「Hello、World!」というアラートポップアップを開きます 空白行が存在する場合、それ以外の場合は「0」を通知します

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

})();

デモ

説明:

arguments.callee 自己実行匿名関数への参照です。

空の配列([])を追加すると、関数が文字列にキャストされ、ソースコードが得られます。

indexOf-1文字列が見つからない場合に返します。

ビットごとのNOT 演算(~)を実行すると、-1に変換されますが0、これは偽の値です。


2
これはどんな策略ですか?!
Kroltan 14年

1
arguments.callee関数のソースが含まれています。
マシュー

2
これはストリクトモード(ほとんどの最新のコードが使用している)では動作しなくなることに注意してください。厳密モードでは、の使用が禁止されていますarguments.callee
ダニエルローニグロ14年

1
@Michael:いいえ、specは正確な形式について何も述べていません。実際、空白を保持しないエンジンが実行されています。
ベルギ14年

2
@DanielLoNigro関数式に名前を付けて、代わりにそれを使用できますarguments.callee。さらに短くします。
猫14年

42

C

この魔法の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パーサーは、バックスラッシュに続いて改行文字を検出すると、両方を無視し、2番目の行を最初の行の継続として扱います。空の行がない場合、「無関心」の回答はすべて前のコメントの一部として扱われます。


51
私は+1しましたが、バックスラッシュで終わるCのコメントを見ることは、標準の抜け穴IMOになり始めています。
ティムS. 14年

2
これはこの「標準の抜け穴」投稿への参照でしたので、文字通り「抜け穴」ではありません。
ティムS.

5
@TimS。この「解決策」に飽き飽きしているなら、なぜあなたは賛成したのですか?
ジョンドヴォルザーク

8
コメントへの次の行へのバックスラッシュの回答(3文字表記または3文字表記なし)は、私に125の評判があったことを願っています。私はそれら見続け、彼らはひどく反復的で、完全にシースルーになり始め、もはや賢くもおかしくもなくなりました。(ここでのきしみ音のように、それらを使用する人にとっては不幸です。なぜなら、彼らは決して怒りに値せず、時々これをまったく知らないからです-しかし、トリックはそれを獲得しています。)
doppelgreener 14年

4
@Janが標準になり始めているのは、長い標準/やり過ぎと同じではありません...その使用はここではかなり賢いです、それは場違いに見えません(私が見た人とは異なり、コメントの終了、またはコメント開始文字でコメントを終了して、異常なことをする)。だから:私はそのトリックを継続して使用するのではなく、ソリューションを支持します。
ティムS.

37

Befunge-93

v
&
&
+
#

.
@

私の最初の機能プログラム:)

入力から2つの数値を読み取り、それらの合計を出力します。空の行を削除すると、何も印刷されません。

説明:

vコードを実行するための下向きの方向を設定し
&、整数
+を読み取り、数値を加算し
#、次のコマンドをスキップ
.し、スタックから整数を出力し
@、プログラムを終了します。

書かれ#ているように、空行をスキップし、で継続し.ます。空行を削除すると購入.はスキップされます。

http://befunge.aurlien.net/に素敵な通訳がいるようです


ああ、賢い方。
seequ 14年

1
Befunge 98もこれを行います。いい考え。そして、このインタープリターにはいくつかの利点があります(私はあなたのものをあまり使いませんでしたので、その利点を知りません)。
ジャスティン14年

32

ルビー/シェル

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

p 1+1

改行が先頭にある場合は正常に動作します。そうでない場合、最初のコメント行はシェルによって不正なシェバンとして解釈されます。


3
これは常に機能するのでしょうか、それとも機能しないのでしょうか?たとえば、あなたのようにそれを実行した場合、ruby youranswer.rbそれはすでにRubyインタプリタで実行されていますので、それはシェバングのために見ていないだろうが、とあなたはそれを実行した場合./youranswer.rb..何シェバングはありませんので、それがすべてでは実行されないだろう
復活モニカ

6
少なくとも私のルビーでは、それをとして実行してもシェバンは尊重さruby youranswer.rbれます。これは、ファイルに必要なコマンドラインスイッチを設定するのに役立ちます。だから、改行せずに私が取得ruby: no Ruby script found in input (LoadError)
histocrat

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のセミコロン推論の典型的な例です。通常、結果のコードが有効になるたびに、改行にはセミコロンが付きます。ただし、Scalaの開発者は、人々にエジプトのブラケットを使用することを強制したくなかったため、クラス定義のブラケットを直後の行に置くことは有効です-セミコロンは追加できませんが、セミコロンは追加されません。ただし、空白行はクラス定義から角括弧を離します。空白行が削除されると、コードは、クラス定義とブロックから、コンストラクターとその再帰コンストラクターを持つクラス定義に変わります!


6
それらの非常に素晴らしいエジプトのブラケットを強制しないでください。しかし、私の意見では、セミコロンの推論は悪い考えです。
アルモ

セミコロン推論は、主にJavaScriptが原因で悪い名前になります。言語を念頭に置いて言語を設計すれば、少し苦痛はありません(たとえば、Pythonで文句を言う人はいません)。残念ながら、Scalaには、セミコロン推論ではうまく動作しない機能がいくつか含まれていました。これと、接尾辞演算子があります(これを回答で使用したいと思いましたが、少し残念です)。
James_pic 14年

2
@James_pic:私の知る限り、Pythonには文句を言う人はいません。Pythonには存在しないからです。JSでは、セミコロンは構文の必須部分であり、特定のポイントに挿入(推測)できます。Pythonでは、セミコロンは構文の必須部分ではありませんが、オプションで使用できます。それは大きな違いです。
メイソンウィーラー14年

大きな違いのように思えるかもしれませんが、Scalaが現在ステートメントの境界を曖昧にするいくつかの機能を削除すると、JavaScriptのフェンスの側面からPythonの機能に移行します。
James_pic 14年

1
@James_pic:Pythonの違いは、エスケープされるか、何らかの種類の括弧内にない限り、改行がステートメントを終了することです。つまり、完全/不完全なルールはありません。
ジャン・ヒューデック

27

GolfScript

~{.@\%:

}do;

2つの非ゼロ整数の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.

小さな問題が1つだけあります。

{}doスタックからモジュラスをポップして、それが真実であるかどうかを確認します。そのため、ループの終わりに複製する必要があります。これは通常、によって達成されますが、同じ効果.:\n\nあります:最上位のスタックアイテムを変数LF(:\n)に格納し、その変数の内容をプッシュします。


7
わあ、それも変数ですか?:O
aditsu 14年

@aditsu:のみ#{あり}、構文の一部であるため、変数名として使用できません。文字列を含め、他のすべてのトークンは問題ありません。
デニス

@デニスすごい。TILの偶数文字列も変数として使用できます。それは何かに役立ちますか?
ジョンドヴォルザーク

@JanDvorak:別にいくつかのエッジケース(パリンドロームコードから、人手不足のコードはおそらく、ない私は、これは単なる(だと思う。文書 GolfScriptインタプリタがトークンにコードを分割する方法の)副作用。
デニス・

@Dennisは、マイナス記号そのものではなく、.:-1入力をに保存するということ-1ですか?うーん...
ジョン・ドヴォルザーク

23

MediaWikiテンプレートの構文

Template: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
ニース、これは私が探していたものの線に沿って、このような奇妙なエッジケースです。
ナフトゥリケイ14

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

?

何が起こった?Package hyperref(またはによりbackrefロードされるより正確なpackage 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

C

このプログラムは、前の空白行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-it-good-forを参照)。また、バックスラッシュ文字を使用し#defineて複数の行にまたがり、目立たないように並べられています。ただし、2つのことも間違っています。

  • の後while (0)にセミコロンがありますが、イディオムは通常これを省略します
  • 最後の行の後にバックスラッシュがあります #define

代わりにこの、前に空白行を削除してfoo = 5;割り当てを実行させるprintf、だけでなく、後に、すべての呼び出しFROBマクロ。その結果、空白行を削除した後の出力は次のとおりです。

1
6
6


@TheRareしかし、それはそれほど明白ではありません。
Ypnypn 14年

6
右に非常に顕著に浮かぶこれらのバックスラッシュを見ない場合、それはあまり明白ではありません。(しかし、彼らは非常に顕著に右に浮かんでいるので、彼らは見られるでしょう。)
doppelgreener 14年

3
しかし、それらのすべてが、1つは正当化されている
QuadmasterXLII

6
@QuadmasterXLII、技術的に言えば、それらはすべて正当化されています-正確には、正当化されています。
マーク14年

9

C / C ++

int main(){

    return __LINE__ - 3;
}

成功を返し、trueの実装として使用できます。空の行が削除された場合、代わりにfalseの実装として使用できます。


8

パワーシェル

この関数は2つの数値を追加します。

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

空行がないと、「hello」は出力されません。

説明

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であるためです。ただし、コードレビューの頻繁な訪問者として、なぜ使用していないのMath.powでしょうか。
サイモンフォースバーグ14年

私のコードは何かをしなければならないからです。2つの数字を追加するのは少し簡単すぎます。
barteks2x 14年

Math.pow結果を使用して印刷することも何かをしているのではないですか?
サイモンフォースバーグ14年

そして今、私は本当に.Math.powを使用できることに気付きました。なぜそうする必要があると思ったのかわかりません。
barteks2x 14年

7
あなたはゴルフをしすぎています。代わりに、コードレビューにアクセスしてください。
サイモンフォースバーグ14年

6

Perl 5

print(<<""
Hello, World!

);

このコードは印刷されHello, World!ます。空白行を削除すると、代わりに構文エラーが発生します。

説明:

複数行の文字列に対するPerlのhere-doc構文では、空のターミネータ文字列を使用できます。明示的に文書化されています。空白行を削除すると、閉じ括弧(および、存在する場合は次の空白行まで)が文字列の一部として解釈され、構文エラーが発生します。

あなたが得るエラーメッセージは、そのような奇妙な構文機能のために、実際にはかなりまともです。プログラムのprint(<<""行の後に空白行がない場合、Perlは単に次のように言います。

foo.pl 1行目のEOFの前に文字列ターミネーター ""が見つかりません。

プログラムの最後に空の行ある場合、代わりに次のようになります。

foo.pl行4、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

Python

これが標準の抜け穴に該当するかどうかわからない、私はリストを見て、これを見なかった。

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

このプログラムは、入力文字列の5番目の文字を出力します。

import inspect

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

これは決して隠されていません。空の行を削除すると、4番目の文字が追加され、追加すると6番目の文字が追加されます。


3

Tcl

2つの数字を追加する(および改行が削除されたかどうかを確認する)関数:

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

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

空白行aがある場合、ローカル変数はaであり、マクロ変数ではありません...


3

技術的には「コード」の問題ではなく、サーバーの問題です。これがCGIスクリプト(任意の言語で生成可能)からApacheに送信されると、クライアントに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 14年

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は少なくとも3行でなければならず、最初の行はシバン行または空行でなければなりません。したがって、次のスクリプトでは、最初の行が最初の行である必要がある2つの空の行が必要です。

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

または、2行に分割する必要はありませんが、最初の空行が必要です。

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単語以外の文字を、改行文字であっても文字列の区切り文字として使用できます。したがって、コードの最初の3行は、実際には同等print %q"2+2="または単にprint "2+2="です。後の改行2+2=は引用符の区切り文字として使用されているため、区切り文字としても解析されないため、直後に改行が必要です。


1

不眠症(両方のバージョン)!

Þyoo

â

このコードは〜を表示します(理由は聞かないでください、不眠症は奇妙です)。空白行を削除すると、代わりにaが出力されます。

ちなみに、その最初の文字はとげです。


1
いや、いばら!+1の年齢でその文字を見ていません。
アディソンクランプ

0

C ++

これは、古典的でかなり馬鹿げたトリックです。あなたはそれを見るとそれが何であるかを知るでしょう、これは完了のためにここにあります。そのため、これをコミュニティWikiの回答としてマークしています。

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

    return 1;
}

これが機能する理由


13
これは実際には抜け穴の1つです。
Mhmd 14年

@Mhmd知らなかった。いずれにせよ、人々がこの種の質問で常にこれを使用していることを知っています。そして、誰かがこれを行うのが賢いと思わないように、ここに残したかっただけです。
エアナス14年

1
この答えは2つの理由で間違っています。最初つまり??/手段\​ので、??//手段\/、及びラインはで終わらないように\​、何行継続がありません。2つ目は、が実行されるかどうかに関係なく、動作がまったく同じreturn 0;であるということです。これは、の実行がmainClosingに達するときの標準的な動作であるためです}
hvd

@hvdあります。それを私が直した。
エアナス

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には複数行の文字列がありません。これが唯一の理由です。

他のスクリプトタグに干渉することなく、1つのスクリプトタグに構文エラーを含めることができるため、ページにエラーがある場合にのみ肯定的な結果が表示されます。このエラーは、同じスクリプトタグ内にあるため、2番目のアラートが発生しないようにします。

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

)

秘密は、改行がタブであり、改行であることです。これが重要かどうかはわかりませんが、それは包丁だと思いました。後の文字%もタブですが、何らかの理由で表示されません。スクリプトに渡される最初の2つの引数を追加する文字列を作成するために、Rubyのパーセント表記を使用しています。詳細はこちら:http : //teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


実際にはカウントされません。「空白の愚かさはありません」という指示を読んでください。正確に1つ\n存在する必要があり、プログラムを期待どおりに動作させるために不可欠です。
ナフトゥリケイ14

ああ大丈夫:(まあ私は試してみました
アディソン14

1
ただし、これを修正できると思います:改行自体がパーセント区切り文字になる可能性があります。
histocrat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.