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

出力は次のようになります。

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

_

こんにちは、正方形のグリッドとその右側を埋めることができる黒魔術コードを書きましたが、数字で埋められた場合、次の数字は現在の場所の下にある正方形に置かれます.

次に、1 マス上と右に移動し、そこに次の整数を配置します。グリッドから外れると、次の数字は下または左に回り込みます。このプログラムは、すべてのマスが埋まるまで実行されます。

while ループから for ループの最後までのコードを短いコードに凝縮できるかどうか疑問に思っていました。

誰かが、たった 2 行を使用してこれをコーディングできると言っていましたが、それは奇妙だと思います... しかし、彼らは実行可能だと言いました!

ヒント、ヘルプ、またはポインターをいただければ幸いです。

どうもありがとう!

4

2 に答える 2

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));
}
于 2016-11-11T23:06:19.483 に答える
0

約 10 年前、私は魔方陣のエントリを計算する次のコードを書きました。これは、ある意味では、1 行のコードに要約され、任意の奇数エッジ長に対して機能します。

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に触発されたものであり、プログラミング パズルとコード ゴルフに適していますが、三項演算子と再​​帰を適切に (ab) 使用すると、1 行のコードにどれだけ押し込めるかがわかります。 .

于 2016-11-11T23:36:56.507 に答える