是否可以将我的代码压缩到少于3行?

时间:2016-11-11 22:07:47

标签: java magic-square

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]+", ");
       }
}

输出看起来像这样:

2,4,9,
6,8,1,
7,3,5,

您好, 我写了一个黑魔法代码,能够填充正方形和右边的网格,但是如果它填充了数字,那么下一个数字将放在低于其当前位置的正方形中。

然后,向上和向右移动一个方格并将下一个整数放在那里,如果我也离开网格,那么下一个数字将环绕到底部和/或左边。该程序一直运行,直到所有方块都被填满。

我想知道是否有可能从我的while循环开始将我的代码压缩到我的for循环结束为更短的代码?

有人说我可以编写这个使用JUST 2行,我认为这很奇怪......但是他们说它很可行!

任何提示,帮助或指针都将不胜感激!

非常感谢你!

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分: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)使用时,您可以将多少代码压缩到一行代码中适当的三元运算符和递归...