在源代码中删除空白行,这会导致意外的功能。


38

编写一个脚本,该脚本在程序逻辑流程中出现空白行时会正常工作,但在删除该行时会中断或导致意外行为。

避免出现标准漏洞和愚蠢的答案。您的程序应该做一些“有用的事情”,即使它所做的只是添加一些整数。

从多行字符串中删除空行不算在内,除非该多行字符串的预期输出在技术上不应该更改(即:如果要删除所有与匹配的空行^$)。

也不允许使用空白愚蠢;不要用回车符,制表符,空格等做奇怪的事情。


11
我认为您应该排除空格。
nneonneo 2014年

17
我认为Whitespace 一个“ 标准漏洞
core1024

5
nneonneo在谈论Whitespace,这是一种仅使用空格作为其语法的语言。
Kyle Kanos 2014年

4
“意外的功能”是一个非常好的短语。
卡兹(Kaz)2014年

3
我投票结束这个问题是不合时宜的,因为轻率的挑战不再是这个网站上的话题。meta.codegolf.stackexchange.com/a/8326/20469

Answers:


62

Java脚本

用“ Hello,World!”打开一个警报弹出窗口。如果存在空白行,则警告“ 0”。

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

})();

演示版

说明:

arguments.callee 是对自执行匿名函数的引用。

附加一个空白数组([])会将函数强制转换为字符串,从而为您提供源代码。

indexOf-1如果找不到该字符串,则返回。

执行按位非运算(~)会导致-1变为0,这是一个假值。


2
这是什么骗术?
Kroltan 2014年

1
arguments.callee包含函数的来源。
马修

2
请注意,这不再适用于严格模式(大多数现代代码都将使用该模式)。严格模式禁止使用arguments.callee
Daniel Lo Nigro 2014年

1
@Michael:不,spec没有说明确切的格式。实际上,有些引擎运行时并不会保留空格。
Bergi 2014年

2
@DanielLoNigro您可以给函数表达式命名,然后使用它代替arguments.callee。甚至使它更短。
一只猫

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解析器看到反斜杠后跟换行符时,它将忽略两者,并将第二行视为第一行的延续。如果没有空行,则“无差异”的答案都将被视为先前评论的一部分。


51
我+1了,但是看到以反斜杠结尾的C注释开始成为标准漏洞,IMO。
Tim S.

2
它是对此“标准漏洞”帖子的引用,因此可能不是字面上的“漏洞”。
Tim S.

5
@TimS。如果您对这种“解决方案”感到厌烦,为什么要投票?
约翰·德沃夏克

8
下一条反斜杠注释成一个答案(三字符组或无三字符组)使我希望我拥有125个声誉。我一直看到它们,它们开始变得非常重复,完全透明,不再聪明或有趣。(这对于使用它们的人来说是不幸的,就像在这里吱吱作响,因为他们绝不值得生气,有时甚至完全没有意识到这一点-但诀窍就是赚到了。)
doppelgreener 2014年

4
@Jan开始成为标准,与长期标准/过高不一样...在这里,它的用法相当聪明,它看起来也不不合适(与我所见过的有些不同,在这里莫名其妙地具有一些字符)注释的末尾,或以注释开始字符结束他们的注释,以执行不寻常的操作)。因此:我支持解决方案,而不是继续使用其技巧。
Tim S.

37

Befunge-93

v
&
&
+
#

.
@

我的第一个蹦极程序:)

它从输入中读取两个数字并打印它们的总和。如果删除空行,则不会打印任何内容。

说明:

v设置执行代码的向下方向,
&读取整数,
+将数字加在一起,
#跳过下
.一条命令,从堆栈中打印整数,
@结束程序

如所写,#跳过空行并以继续.。删除空行时购买将.被跳过。

http://befunge.aurlien.net/上似乎有一个不错的口译员


啊,聪明的一个。
seequ 2014年

1
Befunge 98也这样做。好想法。而且此解释器有一些好处(我用过的很少,所以我不知道它的好处)。
贾斯汀

32

Ruby /壳

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

p 1+1

如果换行符位于顶部,则工作正常,否则外壳程序会将第一个注释行解释为格式不正确的shebang。


3
这不是总是起作用还是总是不起作用?例如,如果您以的身份运行它ruby youranswer.rb,它将不会寻找shebang,因为它已经在ruby解释器中运行,但是如果您以它的身份./youranswer.rb运行,则它根本就不会运行,因为没有shebang ..
恢复Monica

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分号推断的一个特例。通常,只要结果代码有效,换行符都会使用分号。但是,Scala开发人员不想强迫人们使用埃及方括号,因此在类定义后立即将方括号放在行上是有效的-不添加分号,即使可以添加分号。但是,空行将括号与类定义分开。删除空白行后,代码将从一个类定义和一个块变为具有构造函数的类定义-以及递归构造函数!


6
他们中的好人不强迫埃及人。但是在我看来,分号推断是个坏主意。
Almo 2014年

分号推理起一个坏名字,主要是由于JavaScript。如果您在设计语言时就牢记这一点,就不会那么痛苦(例如,没有人会抱怨使用Python)。不幸的是,Scala包含了一些功能,这些功能在用分号推断时效果不佳。有这个和postfix运算符(我很想在答案中使用它,但是有点过时)。
James_pic 2014年

2
@James_pic:AFAIK在Python中没有人抱怨它,因为它在Python中不存在。在JS中,分号是语法的必要部分,可以在某些点插入(推断)。在Python中,分号不是语法的必要部分,但可以选择使用。那是很大的不同。
梅森惠勒

看起来似乎有很大的不同,但是如果Scala删除了一些功能,这些功能当前使语句边界变得模棱两可,那么它将从JavaScript的一面移到Python的一面。
James_pic 2014年

1
@James_pic:使python与众不同的是,除非换行或在任何类型的括号内,否则换行符会终止该语句。那是没有完整/不完整的规则。
Jan Hudec

27

高尔夫脚本

~{.@\%:

}do;

计算两个非零整数的GCD。删除空白行会中断程序。

在线尝试。

这个怎么运作

这是Euclidean算法的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解释器将代码拆分为令牌的副作用。–
Dennis

@Dennis是否意味着.:-1将输入存储到-1而不是减号本身?嗯...
John Dvorak

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
很好,这是我一直在寻找的东西,像这样的怪异案例。
Naftuli Kay 2014年

16

乳胶(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}

没有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中的语法仅提供by的开头\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 2015年

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-good-for)。它还使用反斜杠字符将a #define分布在多行上,方便地将它们很好地排列在视线之外。但是,这样做也有两件事是错误的:

  • 之后有分号while (0),而惯用语通常会省略
  • 最后一行之后有一个反斜杠 #define

foo = 5;正确执行此操作,如果删除空白行,则会在printf,以及每次调用FROB宏之后执行该赋值。结果,删除空白行后的输出为:

1
6
6


@TheRare但这并不那么明显。
Ypnypn 2014年

6
如果您不看那些反斜线非常明显地向右上方浮动的话,它就不太明显了。(但是,由于它们非常明显地漂浮在右侧,因此我们将对其进行观察。)
doppelgreener 2014年

3
但是,除了其中一个以外,其他所有人都是有道理的
QuadmasterXLII 2014年

6
@QuadmasterXLII,从技术上讲,它们都是有道理的-确切地说,是右对齐的。
2014年

9

C / C ++

int main(){

    return __LINE__ - 3;
}

返回成功,可以用作true的实现。如果删除了空行,则可以将其用作false的实现。


8

电源外壳

此功能将两个数字相加。

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

爪哇

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
Simon Forsberg 2014年

因为我的代码必须要做一些事情。加两个数字有点太简单了。
barteks2x

使用Math.pow并打印结果也在做某事,不是吗?
西蒙·福斯伯格

现在我意识到我真的可以使用.Math.pow了,我不知道为什么我认为我需要这样做。
barteks2x 2014年

7
你打高尔夫球太多了。您应该访问代码审查,而不是在我们做正确的事!
西蒙·福斯伯格

6

Perl 5

print(<<""
Hello, World!

);

此代码打印出来Hello, World!。删除空白行会产生语法错误。

说明:

Perl的多行字符串的here-doc语法允许使用空的终止符字符串。它甚至被明确记录。删除空白行会导致右括号(以及所有其他内容,直到下一个空白行,如果有的话)被解释为字符串的一部分,从而导致语法错误。

对于这种奇怪的语法功能,您收到的错误消息实际上相当不错。如果该print(<<""行之后的程序中根本没有空行,则Perl会简单地说:

在foo.pl第1行EOF之前的任何地方都找不到字符串终止符“”。

如果在节目的最后一个空行,你喜欢的东西这个:

EOF的foo.pl第4行出现语法错误
  (可能是从第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返回函数的源代码(如果不是用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 2014年

2

佩尔

#!/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实施中的错误,有效脚本的长度必须至少为三行,第一行必须为shebang行或空行。因此,以下脚本不必具有两个空行,其中第一个必须是第一个:

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="。由于after后面的换行符2+2=被用作引号定界符,因此它也没有被解析为定界符,因此您需要在其后立即添加另一个。


1

失眠症(两个版本)!

Þyoo

â

这段代码显示〜(不要问为什么,失眠很奇怪)。如果删除空白行,则会打印ÿ。

顺便说一下,第一个字母是荆棘


1
万岁,荆棘!很久没见到这个角色了,+ 1。
Addison Crump 2015年

0

C ++

这是一个经典而愚蠢的把戏。当您看到它时,您将知道它是什么,这只是为了完成而已。因此,我将其标记为社区Wiki答案。

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

    return 1;
}

为什么这样


13
这实际上是漏洞之一。
Mhmd 2014年

@Mhmd我不知道。无论哪种方式,我都知道人们总是在这类问题中使用它,而我只是想把它留在这里,以免有人觉得这样做很聪明。
Aearnus

1
这个答案是错误的,原因有两个。第一个是??/手段\​,因此??//手段\/,并且由于行未以结尾\​,所以没有行继续。第二个是,无论是否执行,其行为是完全相同return 0;,因为这是当执行main到达close时的标准行为}
2014年

@hvd那里。我修好了它。
Aearnus 2014年

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的百分比符号制作一个字符串,该字符串将前两个参数添加到脚本中。此处提供更多信息:http : //teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/


实际上,它不算数,请阅读说明:“没有空格傻瓜。” 确实\n应该存在一个人,并且对于使程序按预期工作至关重要。
Naftuli Kay 2014年

啊,好吧:(好吧,我尝试过
Addison

1
我认为您可以解决此问题:换行符本身可以是百分比分隔符。
histocrat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.