大家都一直强调规范编码。可是这个世界上有个大师们娱乐的竞赛——国际乱码大赛。

能写出来的都是对语言深入了解的master。我从没想自己也能“恶搞”C,一直都是老老实实编码。就在前几天看了一篇帖子。

感觉把非常规范的代码变成乱码。非常有意思。于是决定动手试一试。

我不得不说。。。我以为看起来还简单的东西。搞了我一天,我去。

。。各种bug。。。

只是也有非常大的收获。我没想到“把代码写乱”也能给我代码收获。

。。我想。这的确非常有意思。This blog will memory my work and process with the interesting skill.

感觉hello world级别的改不出什么东西来,不够“炫酷”。挑了几个好玩的代码。于是选中了以下这块实验田:

/*
1
2 3
4 5 6
7 8 9 10 实现输出三角形数阵 */
#include <stdio.h>
int main ()
{
int row=0,rank=0,num=0,blank=0;//row行,rank列变量,blank变量控制打印空格
int n[10];
for(num=1;num<=10;num++)//给数组赋初值,通过改动这一步得到你想要的数据
{
n[num-1]=num;//通过改动这一步得到你想要的数据。比如2*num-1
} num=0; for(row=1;row<=4;row++)//输出
{
for(blank=1;blank<=5-row;blank++)
printf(" "); for(rank=1;rank<=row;rank++)
{
printf("%d ",n[num]);
num++;
if(rank==row)
printf("\n");
}
}
return 0;
}

对于学过C的老手来说,看懂这个全然不是问题

新手可能有点别扭。只是我还是比較喜欢这家伙,打印了一个三角形数字阵

jasonleaster@ubuntu:~/Desktop$ ./a.out

    1  

   2  3  

  4  5  6  

 7  8  9  10

代码变乱第一步

将for循环改成while循环

void triangle(void)
{
int row = 0,rank = 0,num=0,blank=0;//row行,rank列变量,blank变量控制打印
空格 int n[10]; num = 1; while(num<=10)//给数组赋初值,通过改动这一步得到你想要的数据
{
n[num-1]=num;//通过改动这一步得到你想要的数据,比如2*num-1
num++;
} num=0;
row = 1;
while(row <= 4)//输出
{
blank = 1;
while(blank <= 5-row)
{
printf(" ");
blank++;
} rank = 1;
while(rank<=row;)
{
printf("%d ",n[num]);
num++;
if(rank==row)
printf("\n"); rank++;
}
row++
} return ;
}

这样恶搞的全然还没有深度。

。可是。是个非常好的铺垫。

恶搞代码步骤二,把while循环变递归

通过这个练习能够加强自己的逻辑思维,对于代码的逻辑理解将会非常仔细。。。后面还会更仔细。

。。

。。

/*
1
2 3
4 5 6
7 8 9 10 实现输出三角形数阵 */
#include <stdio.h> int n[10];//Attention. I change the "n" array into a global array static int location = 0; int triangle(int num,int row,int rank,int blank); int main()
{
triangle(1,1,1,1); return 0;
} int triangle(int num,int row,int rank,int blank)
{ //-------------the first recursion block------------------------------
if(num<=10) {
triangle(num+1,0,0,0);
n[num-1] = num; if(num != 1)
{
return 0;
}
}
else if(num == 11)
{
return 0;
}
//------------------------------------------------------------------ //-------------------the fourth recursion block-------------
if(row <= 4)//输出
{
//--------------the second recursion block---------
if(blank <= 5-row)
{
printf(" ");
triangle(12,row,rank,blank+1);//num == 12 pass the first recursion block
if(blank != 1)
{
return 0;
}
}
else if(blank != 100)
{
return 0;//end the recursion
} //---------------------------------------------- //-----------the third recursion block------------ if(rank <= row)
{
printf("%d ",n[location]);
location++; if(rank==row)
printf("\n"); triangle(12,row,rank+1,100);//pass the first and the second recursion
if(rank != 1)
{
return 0;
}
}
else
{
return 0;
}
//--------------------------------------------- triangle(12,row+1,rank,blank);// pass the first recursion } return 0;
}

基本的要领就是通过return 适时的解释当前递归。

(我的这样的策略还不是非常好。事实上能够改变代码的逻辑。消除return 让被调用函数自己主动的在适当的时候挂掉。。而不是通过return 主动杀死。。。

正由于这样,我后面花了非常多时间改代码的逻辑结构)

昨晚凌晨3点半的时候。放弃了,今天晚上8点多的时候调出来了。。

这里去掉了return 原因嘛。就是为了 条件操作符做准备,把代码变的更难看

要知道

推断语句? return :0;

这类的语句是违法的,return 不是个expression,所以不能用在 选择操作符的右边。。。昨晚就是由于这个放弃继续恶搞的。改结构非常坑爹的说。非常锻炼逻辑的说。

//简直就是艰辛!

~

/*
1
2 3
4 5 6
7 8 9 10 实现输出三角形数阵 */
#include <stdio.h> int n[10];//Attention. I change the "n" array into a global array static int location = 0; static int dead = 0; static int first_r = 1; static int second_r = 0; static int third_r = 0; static int fourth_r = 0; void triangle(int num,int row,int rank,int blank); int main()
{
triangle(1,1,1,1); return 0;
} void triangle(int num,int row,int rank,int blank)
{ dead = 0;
//-------------the first recursion block------------------------------
if (num<=10)
{
if(first_r !=0 && second_r != 1 && third_r != 1 && fourth_r != 1)
{
triangle(num+1,0,0,0);
n[num-1] = num;
first_r = 0;
second_r = 1;//进行第二个递归
third_r = 0;
fourth_r = 0;
} if(num == 1)
{
if(row <= 4)
{
//--------------the second recursion block---------
if((blank <= 5-row) && (first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1))
{
printf(" ");
if(first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1)
{
triangle(1,row,rank,blank+1);
first_r = 0;
second_r =0;
third_r = 1;//进行第三个递归
fourth_r = 0; if(blank != 1)
{
dead = 1;
}
else
{
dead = 0;
}
}
}
else
{
dead = 1;
} if(blank == 1)
{
if(rank <= row)
{
printf("%d ",n[location]);
location++; if(rank==row)
{
printf("\n");
dead = 0;
} if(row != rank && (first_r != 1&& second_r != 1 && third_r != 0 && fourth_r != 1))
{
triangle(1,row,rank+1,1);//pass the first and the second recursion
first_r = 0;
second_r = 0;
third_r = 0;
fourth_r = 1;
dead = 1;
}
}
} if(dead == 0)
{
first_r = 1;
second_r= 0;
third_r = 0;
fourth_r= 0;
triangle(1,row+1,1,1);// pass the first recursion
}
}
}
}
}

我预计没人会去分析上面的代码了。各种递归,各种条件限制。

Now,it's time to show the shit!

以下那坨东西是能够执行的。

亲測。。。

/*
1
2 3
4 5 6
7 8 9 10 实现输出三角形数阵 */
#include <stdio.h> int n[10];//Attention. I change the "n" array into a global array static int location = 0; static int dead = 0; static int first_r = 1; static int second_r = 0; static int third_r = 0; static int fourth_r = 0; void triangle(int num,int row,int rank,int blank); int main()
{
triangle(1,1,1,1); return 0;
} void triangle(int num,int row,int rank,int blank)
{ dead = 0;
(num<=10) ? (((first_r !=0 && second_r != 1 && third_r != 1 && fourth_r != 1) ? \
( triangle(num+1,0,0,0),n[num-1] = num,first_r = 0,second_r = 1,third_r = 0,fourth_r = 0):0),\
((num == 1) ? ((row <= 4) ? (( ((blank <= 5-row) &&\
(first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1)) ? \
( printf(" "),(first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1) ?\
(triangle(1,row,rank,blank+1),first_r = 0,second_r =0,third_r = 1,fourth_r = 0,((blank != 1) ? \
(dead = 1) :(dead = 0))) : 0) : (dead = 1) ),((blank == 1) ? ((rank <= row) ?\
((printf("%d ",n[location]),location++),((rank==row) ? ( printf("\n"),dead = 0) : 0),\
((row != rank && (first_r != 1&& second_r != 1 && third_r != 0 && fourth_r != 1)) ?\
( triangle(1,row,rank+1,1),first_r = 0,second_r = 0,third_r = 0,fourth_r = 1,dead = 1) : 0)) : 0 ) : 0),\
((dead == 0) ? (first_r = 1,second_r= 0,third_r = 0,fourth_r= 0,triangle(1,row+1,1,1)) : 0) ) : 0 ) : 0 )):0; }

liuzjian@ubuntu:~$ ./a.out

    1  

   2  3  

  4  5  6  

 7  8  9  10

上面那坨翔可能一般看来好像无解。事实上还是有解的。逆向仅仅要依据括号的匹配规则是能够把代码变规范的。

仅仅是。。。我预计这是个非常蛋疼的工作。。

怎么把代码变的更操蛋?

第三步,糟糕的变量名

#include <stdio.h>

int n[10];
static int _ = 0; static int __ = 0; static int ___ = 1; static int ____ = 0; static int ______ = 0; static int _______ = 0; void ____________(int ________,int _________,int __________,int ___________); int main()
{
____________(1,1,1,1); return 0;
} void ____________(int ________,int _________,int __________,int ___________)
{ __ = 0; (________<=10) ? (((___ !=0 && ____ != 1 && ______ != 1 && _______ != 1) ? \
( ____________(________+1,0,0,0),n[________-1] = ________,___ = 0,____ = 1,______ = 0,_______ = 0):0),\
((________ == 1) ? ((_________ <= 4) ? (( ((___________ <= 5-_________) &&\
(___ != 1&& ____ != 0 && ______ != 1 && _______ != 1)) ? \
( printf(" "),(___ != 1&& ____ != 0 && ______ != 1 && _______ != 1) ? \
(____________(1,_________,__________,___________+1),___ = 0,____ =0,______ = 1,_______ = 0,((___________ != 1) ?\
(__ = 1) :(__ = 0))) : 0) : (__ = 1) ),((___________ == 1) ? ((__________ <= _________) ?\
((printf("%d ",n[_]),_++),((__________==_________) ? ( printf("\n"),__ = 0) : 0),\
((_________ != __________ && (___ != 1&& ____ != 1 && ______ != 0 && _______ != 1)) ?\
( ____________(1,_________,__________+1,1),___ = 0,____ = 0,______ = 0,_______ = 1,__ = 1) : 0)) : 0 ) : 0),\
((__ == 0) ? (___ = 1,____= 0,______ = 0,_______= 0,____________(1,_________+1,1,1)) : 0) ) : 0 ) : 0 )):0;}

jasonleaster@ubuntu:~/Desktop$ ./a.out

    1  

   2  3  

  4  5  6  

 7  8  9  10 



我相信上面这个东东能够把人送进疯人院,可是。。。

它确实能够执行。

对于那些变量名乱用的programmer不要有包容心。切记。

通过"恶搞",事实上能更深的理解语言本身,可以更好的锻炼逻辑分析能力。

学会控制自己的逻辑,不要写自己也不知道的东西。

规范编码非常重要。

事实上恶搞过程中,我领悟最深刻的是两点

1。

代码逻辑的重构

2。普通循环和递归之间的转换

这两点是我最开心的领悟

一步步走向国际乱码大赛-- 恶搞C语言的更多相关文章

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

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

  2. 韩国IT业是怎么走向国际我们须要学习什么

    无论从国土面积仍是从人口数量上来衡量.韩国都不能算是一个大国,而且自然资本十分缺乏,即是在这种情况下,韩国经过几十年的尽力开展变成技能大国,格外是在IT这种新经济范畴更是引人注目.并诞生了三星等国际级 ...

  3. 课时2:用python设计第一个游戏

    目录: 一.第一个小游戏 二.缩进 三.BIF 四.课时02课后习题及答案 ********************* 一.第一个小游戏 ********************* # p2_1.py ...

  4. 《零基础入门学习Python》【第一版】视频课后答案第002讲

    测试题答案: 0. 什么是BIF?BIF 就是 Built-in Functions,内置函数.为了方便程序员快速编写脚本程序(脚本就是要编程速度快快快!!!),Python 提供了非常丰富的内置函数 ...

  5. [转]11个在线编码大赛,与全球程序员PK

    From : http://news.cnblogs.com/n/187196/ 英文原文:10 Online Coding Contests For Programmers! 如果你拥有出色的编码技 ...

  6. 世界视频编码器大赛结果揭晓,腾讯V265编码器勇夺两项第一

    2019年10月22日,由莫斯科国立大学(Moscow State University)举办的MSU世界视频编码器大赛成绩揭晓, 腾讯内部开源协同的V265编码器再创佳绩,一举拿下PSNR(峰值信噪 ...

  7. GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题

    1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...

  8. 01_Linux系统系统语言查询,设置Xshell工具,中文显示,测试Xshell中文字符显示,Linux中文显示乱码设置

              Xshell是一个强大的安全终端模拟软件,它支持SSH1,SSH2,以及Microsoft Windows平台的TELNETNetSarang Xshell 4 Build 0 ...

  9. Cognos开发图表乱码问题

    在此之前提到过在利用TR建模导入IQD数据源的时候遇到乱码的一种解决方案: http://www.cnblogs.com/wxjnew/p/3374029.html 今天说的是在RS中开发新报表的时候 ...

随机推荐

  1. python+ selenium 实现简历自动刷新

    本文用到的文件的下载地址 百度网盘链接: https://pan.baidu.com/s/1wIda-wUz4X_Ck72xgZ6Ddg 提取码: etaa 1 安装Python 和 selenium ...

  2. Python9-文件操作-day8

    # 1.文件路径:d:\xxx.txt# 绝对路径:从根目录开始# 想对路径:当前文件下# 2.编码方式:utf-8/gbk...# 3.操作方式:只读.只写.追加.读写.写读..... f=open ...

  3. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  4. HDU 2829 斜率优化DP Lawrence

    题意:n个数之间放m个障碍,分隔成m+1段.对于每段两两数相乘再求和,然后把这m+1个值加起来,让这个值最小. 设: d(i, j)表示前i个数之间放j个炸弹能得到的最小值 sum(i)为前缀和,co ...

  5. Java-使用哈希码比较对象的值

    在一些特殊的情况下使用 package com.tj; import java.io.File; public class MyHash { public static void main(Strin ...

  6. 为什么我打的jar包没有注解?

    本文来自网易云社区 作者:王飞 一.前言 一切问题的起源就是来自一个问题"为什么我打的jar包没有注解?",带着这个疑问查了一圈资料,原来问题主要是在没有将源码中的注释进行抽取打包 ...

  7. BNUOJ4359 无爱编号

    无爱编号 Time Limit: 2000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class name: ...

  8. Laya List翻页滚动方案 & List滚动源码解析

    Laya List翻页滚动方案 & List滚动源码解析 @author ixenos 2019-03-29 1.List翻页滚动方案 /** * 计算下一页的起始索引, 不足时补足 * @p ...

  9. .NET重构(一):抽象工厂模式实现登录

    导读:一路艰辛,我也走到了重构.在重构之前,师傅让用经典三层(UI.BLL.DAL)敲了登录.用户的增删改查,共五条线.从开始对三层的朦胧,到五条线结束,终于对三层有了逻辑上清晰的理解.然后就画了几天 ...

  10. 安卓手机 HTML5 手机页面 输入表单被键盘遮挡住了

    TML5 手机页面 输入表单被键盘遮挡住了 请问 大神 怎么 js 或者 JQ 判断安卓手机软键盘的键盘隐藏键按下去了? 有使用 uexWindow 方法 能判断到确定键 是 13 但是不知道这个键的 ...