2016-11-11 65 views
0
public class MagicSquare 
{ 
    public static int[][] grid = new int[3][3]; 
    public static int i = 0; 
    public static int j = 0; 

    public static void main(String[] args) { 

     int x = 1; 
     int y = 2; 
     int z = 0; 

     while(z < 9) 
     { 
      int holdx = x; 
      int holdy = y; 
      z++; 
      x++; 
      y--; 

     if(x == 3) 
     { 
      x = 0; 
     } 

     if(y == -1) 
     { 
      y = 2; 
     } 

     if(y == 3) 
     { 
      y = 0; 
     } 

     if(grid[x][y] == 0) 
     { 
      grid[x][y] = z; 
     } 

     else 
     { 
      holdy++; 

      if(holdy == 3) 
      { 
       holdy = 0; 
      } 

      grid[holdx][holdy] = z; 
      x = holdx; 
      y = holdy; 
     } 
     }  

     for(int i = 0; i < 3; i++) 
     { 
      System.out.print(grid[i][0]+", "); 
     } 

     System.out.println(" "); 

     for(int i = 0; i < 3; i++) 
     { 
      System.out.print(grid[i][1]+", "); 
     } 

     System.out.println(" "); 

     for(int i = 0; i < 3; i++) 
     { 
      System.out.print(grid[i][2]+", "); 
     } 
} 

輸出看起來像這樣:是否可以將我的代碼壓縮到少於3行?

2,圖4,圖9,
6,8,如圖1所示,
7,3,5,

您好, 我寫了一個黑魔術代碼能夠填滿方格的網格和右方的網格,但如果它填充了一個數字,則下一個數字將放置在當前點以下的方格中。

然後,向上並向右移一個方塊,並在那裏放置下一個整數,如果我也離開網格,則下一個數字將環繞到底部和/或左側。這個程序運行直到所有的方塊都被填滿。

我想知道是否可以將我的代碼在我的while循環開始時縮短到我的for循環結束時變成較短的代碼?

有人說我可以編寫這個USING JUST 2行,我認爲這是奇怪的......但他們說這是可行的!

任何提示,幫助或指針,將不勝感激!

非常感謝!

+0

x,y和z代表什麼? –

+0

告訴他你在一行System.out.println(「2,4,9」+ System.lineSeparator()+「6,8,1」)+ System.lineSeparator()+「7」 3,5,「);'。 :)你可以從刪除無用的靜態變量開始,然後使用一個新的for循環來打印:for(int i = 0; i <3; i ++){int j = 0; j < 3; j ++){System.out。print(grid [i] [j] +「,」); } System.out.println(); }'。 –

+0

*我想知道是否可以濃縮我的代碼* - 這聽起來像你可以用某人[檢查你的工作代碼](http://codereview.stackexchange.com/tour) –

回答

2

不確定少於3行(至少在不犧牲可讀性的情況下),但可以肯定地將這些if語句壓縮。

if(x == 3) { 
    x = 0; 
} 

if(y == -1) { 
    y = 2; 
} 

if(y == 3) { 
    y = 0; 
} 

分解成簡單的

x = x % 3; 
y = (y + 3) % 3; 

而且你可以拉這些插入前x++y--

x = (x + 1) % 3; 
y = ((y - 1) + 3) % 3; 
holdy

同樣(如果你確實需要一個值,我不知道)。

然後,如果您只想打印數組,則可以縮短for循環。

for(int[] row : grid) { 
    System.out.println(Arrays.toString(row)); 
} 
+0

謝謝!這非常有幫助,我堅決認爲用少於3行的代碼就可以做到這一點。 – sushiprograms

0

大約10年前,我寫了下面的代碼來計算幻方的條目。這在一定意義上,可以歸結爲代碼一個一行,並適用於任意奇邊長:

class M 
{ 
    public static void main(String args[]) 
    { 
     int n = 5; 
     int a[][] = new int[n][n]; 
     f(n,1,n/2,n-1,a); 
     print(a); 
    } 

    static int f(int j,int i,int k,int l,int I[][]) 
    { 
     return i>j*j?i-1:(I[k][l]=f(j,i+1,(k+(i%j==0?0:1))%j,(l+(i%j==0?-1:1))%j,I))-1; 
    } 

    public static void print(int a[][]) 
    { 
     for (int i=0; i<a.length; i++) 
     { 
      for (int j=0; j<a[i].length; j++) 
      { 
       System.out.print((a[j][i]<10?" ":"")+a[j][i]+" "); 
      } 
      System.out.println(); 
     } 
    } 
} 

當然,它以某種方式被IOCCC啓發,將是更適合Programming Puzzles & Code Golf,但是可能會顯示當你(ab)適當地使用三元運算符和遞歸時,你可以壓入多少代碼行......

+0

這就是爲什麼我在我的回答中提到可讀性;) –

+0

@ cricket_007當然,這不應該太過嚴重。 (實際上,最初我使用了變量名'i','''''和'',使它*完全*不可讀;-))。但是,當「凝聚」代碼和「代碼行」的可疑概念時,關於什麼是「可行」的問題可能是當與此相關時顯示出奇怪結果的理由。底線應該只是**可讀性比緊湊性更重要**。 – Marco13

相關問題