改变我世界的十行代码
十行代码中,Hello World 与 JavaScript 怪癖等片段,讲述编程如何让人发笑落泪。
中文
复制

十行代码,每一行都以各自的方式对我意义非凡。或是因为出自我手,或是因为我大段抄来,或是因为它们让我发笑,或是因为它们让我落泪。
Hello World
10 PRINT "HELLO, WORLD!"
20 GOTO 10
我不记得第一次敲下它是什么时候,也不确定是不是这个版本。也许没有逗号,也许感叹号更多。
但不管怎样,计算机照单全收,兴高采烈地向世界问好——尤其是向那个刚刚第一次与计算机对话、瞪大眼睛的孩子问好。
第二行让我彻底明白:你让计算机做什么,它就做什么。Hello world,永远。
天哪,JavaScript 的怪癖,Batman!
Array(16).join('wat' - 1) + ' Batman'
把这行代码复制到浏览器的控制台里,你就得到了一场老派流行文化电视与极客编程幽默的混搭,外加一大勺“JavaScript 真蠢”。
经典之作,我第一次运行它时真的笑出了声。
自修改的 6502 汇编代码
LDX #$00 ; Load X with the value 0
.loop LDA $2000,X ; Load A with the byte at address $2000 + X
STA $0400,X ; Store A at address $0400 + X
INX ; Increase X by one
BNE .loop ; Branch back to .loop while X is not 0
INC .loop+2 ; X is 0, increase the byte at .loop + 2
INC .loop+5 ; Also increase the byte at .loop + 5
LDA .loop+5 ; Load A with the byte at address .loop + 5
CMP #$07 ; Compare it with 7
BNE .loop ; Branch back to .loop if A is not 7
机器语言是最贴近硬件的存在。没有警告,没有日志,没有护栏。它甚至允许你修改自己——在代码运行的过程中覆写代码本身的字节。
比如这个例子,你更新源地址和目的地址的高字节。分支从 $2000 循环到 $20FF,随后的 INC 把地址从 $2000 改成 $2100,然后重新开始循环。
(6502 是小端序,所以我们写 +2 和 +5,而不是 +1 和 +4)
低到不能再低,硬核,还带点危险。意识到自己能这么干,让我彻底明白了一件事:在这么贴近硬件的地方写代码,什么都行得通。
touch.bat
type nul > .\"%*"
这个小小的批处理脚本在 Windows 上实现了穷人的 touch,我从 Windows NT 一直用到 Windows 7。我在 Total Commander 的迷你命令行里敲 touch filename.txt,快速生成新的空文件。离了它活不了。
CSS 调试器
border: 10px solid hotpink;
层叠的 console.log!样式的 var_dump()!表格的 printf()!
而且永远是 hotpink。
无限生命
POKE 9450,173
只要往计算机内存里当前那段二进制代码的对应位置塞进一个特定的字节,你就突然有了无限的生命、能量或金钱。
不仅能让你在游戏里作弊,还带来一个更震撼的认知:任何游戏里的一切都能被操纵,只要你知道该在哪里 PEEK 和 POKE。
加速循环
for(i=0;i10) then readln;
{Hit anykey to quit}
until KeyPressed or Ends;
end.
那是 90 年代初,学校终于搭起了局域网,我和我那帮赛博朋克 scriptkiddies lamers 1337 h4x0rz 哥们儿自然要去探一探。我们知道所有用户名都是三个字母,没人用的账号密码还是默认值。
于是我们用 Borland Pascal 搓了个极其粗糙的用户名扫描器。bug 比代码行数还多,但勉强能用。(它当然该能用——毕竟是 2.00 版!)
我们兴高采烈地黑掉了所有能找到的休眠账号,然后……就没然后了。
RTFM,或者 rm -rf /
# rm -rf /
2000 年前后,你要是碰上 Linux 的问题,多半会跑到 IRC 上求助。很多人就是在那里找到了解决一切 Linux 问题的灵丹妙药,而且永远是同一个:以 root 登录,然后运行 rm -rf /。
无一例外,所有 Linux 问题都消失了!
SKAN2.PAS
{$M $4000,0,0 } {16 Kb stack}
{Skan v2.00 by Trexx}
Program Skan2;
uses crt,dos;
var a,b,c:char;
b1:byte;
str:string[3];
Ends:boolean;
begin
Ends:=False;
a:='a'; {Start values}
b:='a';
c:='a';
repeat
inc(c);
if (c='z') then
begin
inc(b);
c:='a';
end;
if (b='z') then
begin
inc(a);
b:='a';
end;
str:=a+b+c;
{Change this when FULL.EXE is in another directory}
exec('z:\public\full.exe',str);
if (whereY>10) then readln;
{Hit anykey to quit}
until KeyPressed or Ends;
end.
那是 90 年代初,学校终于搭起了局域网,我和我那帮赛博朋克 scriptkiddies lamers 1337 h4x0rz 哥们儿自然要去探一探。我们知道所有用户名都是三个字母,没人用的账号密码还是默认值。
于是我们用 Borland Pascal 搓了个极其粗糙的用户名扫描器。bug 比代码行数还多,但勉强能用。(它当然该能用——毕竟是 2.00 版!)
我们兴高采烈地黑掉了所有能找到的休眠账号,然后……就没然后了。
CSS280
*{transform:translateY(24vh);text-align:center}*>:before{animation:a 9s
1e+9 linear;content:'Roses are #F00'}@keyframes a{10%,15%,35%,40%,60%,65%,
85%,90%{opacity:1}12%,37%,62%,87%{opacity:0}25%{content:'Violets are #00F'
}50%{content:'All my base'}75%{content:'Are belong to you'}}
一首动画诗,全部由 280 个字符的 CSS 写成。没有 JavaScript,连 HTML 都没有——它只需要一个 `` 块,加上这 280 个字符的纯 CSS,就能在一个空文档里跑起来。
这个人为限制比早先 Twitter 规定的 140 字符宽松了一些,让人可以贴出小段代码,复制到空的 CodePen 里就能看到有趣的效果。
我尤其得意的是 1e+9 的时长,它比 infinite 还短(无论时间还是字符数都是)。