一步步走向國際亂碼大賽-- 惡搞C語言

       你們都一直強調規範編碼。但是這個世界上有個大師們娛樂的競賽——國際亂碼大賽。express

       能寫出來的都是對語言深刻了解的master。我從沒想本身也能「惡搞」C,一直都是老老實實編碼。就在前幾天看了一篇帖子。ubuntu

感受把很是規範的代碼變成亂碼。很是有意思。因而決定動手試一試。
數組


        我不得不說。。。我覺得看起來還簡單的東西。搞了我一天,我去。函數

。。各類bug。。。post

只是也有很是大的收穫。我沒想到「把代碼寫亂」也能給我代碼收穫。編碼

。。我想。這的確很是有意思。This blog will memory my work and process with the interesting skill.spa




感受hello world級別的改不出什麼東西來,不夠「炫酷」。挑了幾個好玩的代碼。因而選中瞭如下這塊實驗田:rest

/* 
              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的老手來講,看懂這個全然不是問題

新手可能有點彆扭。只是我仍是比較喜歡這傢伙,打印了一個三角形數字陣code

jasonleaster@ubuntu:~/Desktop$ ./a.out
    1  
   2  3  
  4  5  6  
 7  8  9  10 
blog


代碼變亂第一步

將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。普通循環和遞歸之間的轉換

這兩點是我最開心的領悟



相關文章
相關標籤/搜索