编写一个脚本,该脚本在程序逻辑流程中出现空白行时会正常工作,但在删除该行时会中断或导致意外行为。
避免出现标准漏洞和愚蠢的答案。您的程序应该做一些“有用的事情”,即使它所做的只是添加一些整数。
从多行字符串中删除空行不算在内,除非该多行字符串的预期输出在技术上不应该更改(即:如果要删除所有与匹配的空行^$
)。
也不允许使用空白愚蠢;不要用回车符,制表符,空格等做奇怪的事情。
编写一个脚本,该脚本在程序逻辑流程中出现空白行时会正常工作,但在删除该行时会中断或导致意外行为。
避免出现标准漏洞和愚蠢的答案。您的程序应该做一些“有用的事情”,即使它所做的只是添加一些整数。
从多行字符串中删除空行不算在内,除非该多行字符串的预期输出在技术上不应该更改(即:如果要删除所有与匹配的空行^$
)。
也不允许使用空白愚蠢;不要用回车符,制表符,空格等做奇怪的事情。
Answers:
用“ Hello,World!”打开一个警报弹出窗口。如果存在空白行,则警告“ 0”。
(function(){
alert(~(arguments.callee+[]).indexOf('\n\n') && "Hello, World!");
})();
说明:
arguments.callee
是对自执行匿名函数的引用。
附加一个空白数组([]
)会将函数强制转换为字符串,从而为您提供源代码。
indexOf
-1
如果找不到该字符串,则返回。
执行按位非运算(~
)会导致-1
变为0
,这是一个假值。
arguments.callee
包含函数的来源。
arguments.callee
。
arguments.callee
。甚至使它更短。
这个神奇的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解析器看到反斜杠后跟换行符时,它将忽略两者,并将第二行视为第一行的延续。如果没有空行,则“无差异”的答案都将被视为先前评论的一部分。
v
&
&
+
#
.
@
我的第一个蹦极程序:)
它从输入中读取两个数字并打印它们的总和。如果删除空行,则不会打印任何内容。
说明:
v
设置执行代码的向下方向,
&
读取整数,
+
将数字加在一起,
#
跳过下
.
一条命令,从堆栈中打印整数,
@
结束程序
如所写,#
跳过空行并以继续.
。删除空行时购买将.
被跳过。
http://befunge.aurlien.net/上似乎有一个不错的口译员
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#! The Amazing Integer Adder !
#! Adds 1 and 1, and displays the result !
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
p 1+1
如果换行符位于顶部,则工作正常,否则外壳程序会将第一个注释行解释为格式不正确的shebang。
ruby youranswer.rb
,它将不会寻找shebang,因为它已经在ruby解释器中运行,但是如果您以它的身份./youranswer.rb
运行,则它根本就不会运行,因为没有shebang ..
ruby youranswer.rb
设置为,它也很荣幸,这对于在文件中设置必要的命令行开关很有用。所以没有换行符,我得到了ruby: no Ruby script found in input (LoadError)
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开发人员不想强迫人们使用埃及方括号,因此在类定义后立即将方括号放在行上是有效的-不添加分号,即使可以添加分号。但是,空行将括号与类定义分开。删除空白行后,代码将从一个类定义和一个块变为具有构造函数的类定义-以及递归构造函数!
~{.@\%:
}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
)中,然后推送该变量的内容。
#
,{
而}
不能用来作为变量名,因为他们是语法的一部分。其他所有标记都可以使用,包括字符串。
.:-1
将输入存储到-1
而不是减号本身?嗯...
定义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中,参数名称可以包含换行符。
以下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中的语法仅提供by的开头\bibitem
,结尾可以在任何地方。在此紧急包backref
中添加了一个限制,该限制\bibitem
必须以空行结束该条目。然后,程序包可以重新定义\bibitem
以将回溯引用放在条目的末尾。
由于缺少空行,TeX会继续寻找它,但是却找到了文件末尾并发出错误消息。
这个小程序在命令行上输入一个数字并计算其阶乘。但是,它还包含用于运行时验证的最先进的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
vfry
是不是在函数定义扩展真是难倒我。
除非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
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 ^数字。
Math.pow
?
Math.pow
并打印结果也在做某事,不是吗?
print(<<""
Hello, World!
);
此代码打印出来Hello, World!
。删除空白行会产生语法错误。
说明:
Perl的多行字符串的here-doc语法允许使用空的终止符字符串。它甚至被明确记录。删除空白行会导致右括号(以及所有其他内容,直到下一个空白行,如果有的话)被解释为字符串的一部分,从而导致语法错误。
对于这种奇怪的语法功能,您收到的错误消息实际上相当不错。如果该
print(<<""
行之后的程序中根本没有空行,则Perl会简单地说:在foo.pl第1行EOF之前的任何地方都找不到字符串终止符“”。如果是在节目的最后一个空行,你喜欢的东西这个:
EOF的foo.pl第4行出现语法错误 (可能是从第1行开始的失控的多行<<字符串) 由于编译错误而中止foo.pl的执行。
删除第一行将导致错误:
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
不知道这是否属于标准漏洞,我看了看清单,却没有看到。
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!'
什么也不返回。
的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
。我试图将其隐藏在不可读的三元表达式中。
由于escript
实施中的错误,有效脚本的长度必须至少为三行,第一行必须为shebang行或空行。因此,以下脚本不必具有两个空行,其中第一个必须是第一个:
main(_) -> io:format("Hello world!~n", []), halt().
或者它不必分成两行,但仍然必须有第一个空行。
main(_) ->
io:format("Hello world!~n", []), halt().
否则你会得到
escript: Premature end of file reached
这是一个经典而愚蠢的把戏。当您看到它时,您将知道它是什么,这只是为了完成而已。因此,我将其标记为社区Wiki答案。
int main() {
//This program won't work without the next line, why??/
return 1;
}
??/
手段\
,因此??//
手段\/
,并且由于行未以结尾\
,所以没有行继续。第二个是,无论是否执行,其行为是完全相同的return 0;
,因为这是当执行main
到达close时的标准行为}
。
I know people always use this in these kinds of question
这就是为什么我们将其设置为标准漏洞
将其粘贴到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>
红宝石
puts (% #{ARGV[0].to_i + ARGV[1].to_i}
)
秘密在于,换行符实际上是一个制表符,然后是一个新行。我不知道这是否有价值,但我认为那是切肉刀。后面的字符%
也是一个选项卡,但由于某种原因,它不会像一个字符一样显示。我正在使用Ruby的百分比符号制作一个字符串,该字符串将前两个参数添加到脚本中。此处提供更多信息:http :
//teohm.com/blog/2012/10/15/start-using-ruby-percent-notation/
\n
应该存在一个人,并且对于使程序按预期工作至关重要。