macb() ?

lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+

这是CoolShell博主之前做了一个非常有意思的在线puzzle,仿照一些前端过关的游戏,做了几个和程序猿有关的迷题,一个通关游戏。这个事測试的第二题。并为通关的前十名送上《Unix环境高级编程(第三版)》(感谢

from=feed&loc=at" style="color:#6c6351">@出版圈郭志敏 赞助)或一个马克杯(感谢@linux命令行精选网 赞助))这些谜题非常有趣同一时候也有一定的难度。因为水平有限,我并没有通关。但我感觉这些东西确实非常有意思非常值得一做。还是能够从中学到不少东西的。

这个是原游戏測试的链接http://fun.coolshell.cn/

这个測试我认为还是蛮有趣的。刚一进去看到页面就懵了无从下手啊。限于个人能力及知识面狭窄,在作者的提示下了解到这是一段与Brainfuck编程语言有关的字段。网上一番搜索查看资料后,求解答到答案是“welcome.html”。

详细求解实现过程看Brainfuck——让你脑子凌乱的程序语言

一看到这个键盘就发现跟我们寻常键盘布局不一样。于是就想到,这个题就是将图中键盘的字符与我们电脑键盘上对应位置的字符替换。于是我非常快的做了。结果例如以下

main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
 

看到这里有点傻眼了,难道这就是传说中的C语言混乱代码。这是4th International Obfuscated C Code Contest (1987),由AT&T Bell Labs的David Korn所写。

历届国际C语言混乱代码大赛作品赞赏。将代码COPY后粘贴到IDE里面。编译提示"unix was
notdeclared in this scope"。

好吧,没有声明。那果断的用#define宏定义个值呗

#define unix 1

尼玛,竟然执行出结果unix。

这结果真是令人意向不到,混乱代码就是一个字“乱”的有才。

通过查看相关资料。最后算是弄清了它的真面目了。

首先复习一点知识:

字符型常量和ASCII字符集。每一个字符在内存中占用一个字节,用来存储它的ASCII码值。因此。C语言的字符具有数值特征。能够像整数一样參加运算。

转义字符:有一些字符,如回车符('\r'),换行符('\n')等控制符号,它们不能在屏幕上显示。也无法从键盘输入,仅仅能用转义字符表示。转义字符由反斜杠加上一个字符或数字组成,它将反斜杠后面的字符或数字转换成别的意义。

\ddd        1-3位八进制字符所代表的字符,如\102='B'
\xhh 1-2位十六进制字符所代表的字符。如\x41='A'
printf("%x",'\n');printf("%x",'\r');//换行符。回车符的ASCII码值分别为a,d,即十进制的10。13

最后。非常重要的一点啦

int a[3]={1,2,3};
printf("%d %d\n",a[2], 2[a]);
//没错,你的眼睛却是没有看错。他竟然真的都输出是3</span>

以上翻阅自《C和指针》,arry[2]和2[arry]是等价的,这个诡异技巧之所以可行,源于C语言实现下表的方法。

尽管两者并无区别但毫无疑问这样影响程序的可阅读性啦。不建议大面积推广造成不必要的杀伤!

看到这里,我们能够将上面的翻译过的那段代码再度转换一下,例如以下:

main(){printf(&unix["\021%six\n"],(unix)["have"]+"fun"-0x60);}
//\021=17,ASCII字符为DC1。它是一个字符 ;\012=10=0xa='\n',\0='0'。则
main(){printf(&"DC1%six\n\0"[unix],"have"[unix]+"fun"-0x60);}
//令unix=1。则
main(){printf(&"DC1%six\n"[1],"have"[1]+"fun"-0x60);}
//&"DC1%six\n",去字符串中下标1处的地址,则
main(){printf("%six\n",'a'-0x60+"fun");}
//a的ASCII仅仅为97=0x61,则
main(){printf("%six\n","fun"+1);}
以上等同main(){printf("%six\n","un");}

写到这里。整个过程应该非常清晰明确了。

OK,接着看下一题去

1987年国际C语言混乱代码大赛获奖的一行代码的更多相关文章

  1. 国际C语言混乱代码大赛代码赏析(一)【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/9073869 国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程& ...

  2. 国际C语言混乱代码大赛优胜作品详解之“A clock in one line”

    原文链接:https://blog.csdn.net/herorenme/article/details/8864351 摘要:IOCCC,即国际混乱C语言代码大赛是一项著名的国际编程赛事迄今已举办2 ...

  3. 国际混淆C代码大赛获奖作品部分源码

    国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年.1999年 ...

  4. C语言混乱代码大赛

    main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0 ...

  5. 国际C 语言乱码大赛(IOCCC )

    你也许听说过“国际C 语言乱码大赛(IOCCC )”,能获奖的人毫无疑问是世界顶级C 程序员.这是他们利用C 语言的特点极限挖掘的结果.下面这个例子就是网上广为流传的 一个经典作品:// 原始代码如下 ...

  6. 【南阳OJ分类之语言入门】80题题目+AC代码汇总

    小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...

  7. C 语言代码风格之 Linux 内核代码风格

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区:https://bbs.huaweicloud.com/b ...

  8. 《明解c语言》已看完,练习代码此奉上

    2016年9月20日至2016年11月12日,从学校图书馆借来的<明解c语言>看完了. 大三第一个学期,前8周,有c语言程序设计的课.课本是学校里的老师编写出版的,为了压缩空间,减少页面, ...

  9. 根据Unicode编码用C#语言把它转换成汉字的代码

    rt 根据所具有的Unicode编码用C#语言把它转换成汉字的代码 var s = System.Web.HttpUtility.HtmlDecode(Utf8Str); var o = Newton ...

随机推荐

  1. centos dhcp 服务器搭建 多vlan

    centos dhcp 服务器搭建   多vlan centos 6.5   版本     /etc/dhcp/dhcpd.conf         服务器配置文件 /etc/rc.d/init.d/ ...

  2. 【Go】错误处理

    · error类型是一个接口类型,也是一个Go语言的内建类型.在这个接口类型的声明中只包含了一个方法Error.这个方法不接受任何参数,但是会返回一个string类型的结果.它的作用是返回错误信息的字 ...

  3. mysql5.7.23版本安装教程

    亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间.希望这篇文章能够帮助大家少走弯路~~ 1.下载我下载的是64位. 2.解压下载之后,我选 ...

  4. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...

  5. php那些坑

    1.创建数组不是new array(),是$aaa=array(),没有new,数组可以传入键值$aaa=array("key"=>"value"); 2 ...

  6. 回顾基础知识,类,fbv,cbv

    一 类中绑定方法的传参,不需要self class Foo(object): def __init__(self,name): self.name = name def foo(self,x): se ...

  7. BZOJ4725: [POI2017]Reprezentacje ró?nicowe

    $n \leq 1e5$,$x \leq 1e9$. 1e9呵呵,暴力处理$a_n$的前几项直到1e9.然后处理出差的数列,每次在这里面找,找得到就回答,找不到,那有贡献的只有$a_i-a_{i-1} ...

  8. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  9. 转载 cc、gcc、g++、CC的区别概括

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

  10. codechef Tree and Queries Solved

    题目链接: https://www.codechef.com/problems/IITK1P10 大概是:修改点值,求子树节点为0有多少个, DFS序后,BIT 询问,修改 ;    {        ...