也談漂亮代碼

看到負暄瑣話裏面的漂亮代碼,頗有同感。前一段就在TopCoder SRM345 Div1 250 Pathfinding上看到漂亮代碼的威力。先看看Spieler代碼
class Pathfinding 

public
  
int getDirections(int x, int y) 
  { 
    
if ( x == 0 ) 
    { 
      
if ( y < 0 ) 
      { 
        y 
= -y; 
        
if ( y % 2 ) 
          
return y + 2
        
else 
          
return y + 4
      } 
      
else 
        
return y; 
    } 
    
else if ( y == 0 ) 
    { 
      
return getDirections(y, x); 
    } 
    
else if ( x > 0 ) 
    { 
      
if ( y > 0 ) 
      { 
        
if ( x % 2 == 0 || y % 2 == 0 ) 
          
return x + y; 
        
else 
          
return x + y + 2
      } 
      
else 
      { 
        y 
= -y; 
        
if ( x % 2 ) 
          
return x + y; 
        
else 
        { 
          
if ( y % 2 ) 
            
return x + y + 2
          
else 
            
return x + y; 
        } 
      } 
    } 
    
else  
    { 
      
if ( y > 0 ) 
        
return getDirections(y, x); 
      
else 
      { 
        x 
= -x; 
        y 
= -y; 
        
if ( x % 2 || y % 2 ) 
          
return x + y + 2
        
else 
          
return x + y + 4
      } 
    } 

    
return 0
  } 
};

 
洋洋灑灑,只要是對條件做判斷。說實話,這已經相當不容易了。我也試着列出過所有條件然後總結,這可真不是一個好活:(這裏還有一個簡潔版,來自AdrainKuegel:
int a;
class Pathfinding {
public:
    
int getDirections(int x, int y){
        
if(x > y)
            
return getDirections(y, x);
        
if(y >= 0 && x%2+y%2 <0 || x%2 > 0 && y%2 || y<0 &&(x%2 || y%%2))
            a 
= 2
        
if(!(x%2+y%2&& x<0 && y<=0)
            a 
= 4;
        
return abs(x) + abs(y) + a;
};
 
 
但是,這個世界還是有很多牛銀存在的,就讓我們看看zouyu9631的程序:
 
class Pathfinding{ 
public
  
int getDirections(int x, int y){ 
    
if(y > x){int t = x; x = y; y = t;} 
    
if(y >= 0){ 
      
if(x%2 && y %2return x+y+2
      
else return x+y; 
    } 
    
return 1+getDirections(-y, x-1); 
  } 
};
 
簡潔,果然簡潔很多,但是...很多事情就怕但是,但是我們還是要但是一下。但是,這就夠好了嗎?看看yiuyuho的代碼吧:
 
class Pathfinding{
public:
 
int getDirections(int x, int y){
  
if(x<0return 1+getDirections(-x, y-1);
  
if(y<0return 1+getDirections(x-1-y);
  
if(x%2==0 || y%2==0return x+y;
  
return x+y+2;
 }
};
 
驚豔!
 
當我們合上張開半天忘記合上的嘴的時候,思考是最重要的事情。其實原來這是一個如此簡單的數學函數,只是通過位移把目標移動到第一象限而已。回過頭來再看TC對這個問題的分類:Geometry, Simple Math。原來是我們的數學功夫太差啊:(
 
最後貼上Joe對判斷一件作品是否是藝術的四個標準:
  • 這段代碼非人不能寫出,富於想象力。
  • 這段代碼除了實現既定功能外,具有高度的表現力。
  • 這段代碼很美。
  • 這段代碼傳遞的美感和思想超越了它自身。

MSN Spaces Link: http://vanzolo.spaces.live.com/Blog/cns!4A43F3D396FBF12F!2146.entry

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章