1987年国际C语言混乱代码大赛获奖的一行代码

macb() ?
lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+
这是CoolShell博主之前做了一个非常有意思的在线puzzle,仿照一些前端过关的游戏,做了几个和程序猿有关的迷题,一个通关游戏。这个事測试的第二题。并为通关的前十名送上《Unix环境高级编程(第三版)》(感谢 from=feed&loc=at" style="color:#6c6351">@出版圈郭志敏
这个是原游戏測试的链接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语言混乱代码大赛获奖的一行代码的更多相关文章
- 国际C语言混乱代码大赛代码赏析(一)【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/9073869 国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程& ...
- 国际C语言混乱代码大赛优胜作品详解之“A clock in one line”
原文链接:https://blog.csdn.net/herorenme/article/details/8864351 摘要:IOCCC,即国际混乱C语言代码大赛是一项著名的国际编程赛事迄今已举办2 ...
- 国际混淆C代码大赛获奖作品部分源码
国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年.1999年 ...
- C语言混乱代码大赛
main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0 ...
- 国际C 语言乱码大赛(IOCCC )
你也许听说过“国际C 语言乱码大赛(IOCCC )”,能获奖的人毫无疑问是世界顶级C 程序员.这是他们利用C 语言的特点极限挖掘的结果.下面这个例子就是网上广为流传的 一个经典作品:// 原始代码如下 ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
- C 语言代码风格之 Linux 内核代码风格
GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区:https://bbs.huaweicloud.com/b ...
- 《明解c语言》已看完,练习代码此奉上
2016年9月20日至2016年11月12日,从学校图书馆借来的<明解c语言>看完了. 大三第一个学期,前8周,有c语言程序设计的课.课本是学校里的老师编写出版的,为了压缩空间,减少页面, ...
- 根据Unicode编码用C#语言把它转换成汉字的代码
rt 根据所具有的Unicode编码用C#语言把它转换成汉字的代码 var s = System.Web.HttpUtility.HtmlDecode(Utf8Str); var o = Newton ...
随机推荐
- C/C++的类型安全
类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域.“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制:有的时候也用“类型安全”形容 ...
- CF802D
D. Marmots (easy) time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 【bzoj4930】棋盘 费用流
题目描述 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y=v 2:对于(x,y)与(u,v)之间 ...
- BZOJ 4719 [Noip2016]天天爱跑步 ——树链剖分
一直以为自己当时是TLE了,但是再看发现居然WA? 然后把数组扩大一倍,就A掉了.QaQ 没什么好说的.一段路径分成两段考虑,上升的一段深度+时间是定值,下降的一段深度-时间是定值,然后打标记统计即可 ...
- SQLite数据库相关操作
一.创建数据库 这里创建了note便签数据表,字段有noteId.noteTitle.noteTime.noteInfo ); // TODO Auto-generated constructor ...
- ftrace用法
ftrace官方文档在kernel/Documentation/trace/ftrace.txt文件中. 使用ftrace接口之前,如果系统没有自动挂载debugfs文件系统,则要先手动挂载. # m ...
- php——两种无限级分类
/** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return strin ...
- Redis命令行之List
一.Redis之List简介 1. List是简单的字符串列表,按照插入顺序排列. 2. 一个列表最多可存储232-1个元素(40多亿). 二.Redis之List命令行操作 Lrange:获取列表指 ...
- js react 全选和反选
onCheckAll = (data) => { var CheckBox = document.getElementsByName(data); for(let i=0;i<CheckB ...
- solus系统配置
#更新软件源 清华稳定源 sudo eopkg ar Tuna https://mirrors.tuna.tsinghua.edu.cn/solus/shannon/eopkg-index.xml 清 ...