3

わかりました。セル オートマトンのいくつかの基本原則を使用して、ルールから計算された一連のデータを生成するプログラムを実行することができました。各セルはブール値です。

現在、私はそれをそのまま保存しています-boolean [] []データ-最初のインデックスは行で、2番目はセルです。

これで、その音楽をスコア (配列として保存) に変換したいところまで来ました。このページには、CA データからどのように変換されるかを示す図が示されています。

ソース

データを採点する

目標

ストレージスキームを使用してプログラム的にこれを行う方法を理解するのに苦労しています。誰かがそれを助けてくれれば、必要に応じてより多くの情報を提供できます。

4

1 に答える 1

1

マッピングは簡単に見えます:

target[x, y] = source[OFFSET - y, x]

whereは、コピーする最後のOFFSET行のインデックスです(正しく数えた場合)。33

実装では、ネストされた 2 つのループを使用して配列をコピーできます。


編集:

コンバーターは次のようになります。

public class Converter
{
    public static boolean[][] convert(boolean[][] source, int offset, int width)
    {
        final boolean[][] target = new boolean[width][source.length];

        for(int targetRow=0 ; targetRow<width ; targetRow++)
        {
            for(int targetCol=0 ; targetCol<source.length ; targetCol++)
            {
                target[targetRow][targetCol] = source[targetCol][offset + width-1 - targetRow];
            }
        }

        return target;
    }
}

これは、以下のテスト コード (元の配列と変換された配列) の出力で、オフセット2(最初の 2 行は省略されています) と幅7(7 列が変換されています) を使用しています。

     █     
    ███    
   ██  █   
  ██ ████  
 ██  █   █ 
██ ████ ███

   █ █
  ██  
 █ █ █
██ ███
 ██  █
  ██ █
   ██ 

テストコードは、ソース配列の文字列定義を変換し、配列コンテンツを出力することです:

public class ConverterTest
{
    private final static int OFFSET = 2;
    private final static int WIDTH = 7;

    private static final String[] sourceString = {
        "     █     ",
        "    ███    ",
        "   ██  █   ",
        "  ██ ████  ",
        " ██  █   █ ",
        "██ ████ ███",
    };


    public static void main(String[] args)
    {
        final boolean[][] source = getSourceArray();
        printArray(source);
        final boolean[][] target = Converter.convert(source, OFFSET, WIDTH);
        printArray(target);
    }


    private static boolean[][] getSourceArray()
    {
        final boolean[][] sourceArray = new boolean[sourceString.length][sourceString[0].length()];

        for(int row=0 ; row<sourceString.length ; row++)
        {
            for(int col=0 ; col<sourceString[0].length() ; col++)
            {
                sourceArray[row][col] = (sourceString[row].charAt(col) != ' ');
            }
        }

        return sourceArray;
    }


    private static void printArray(boolean[][] arr)
    {
        for(int row=0 ; row<arr.length ; row++)
        {
            for(int col=0 ; col<arr[0].length ; col++)
            {
                System.out.print(arr[row][col] ? '█' : ' ');
            }
            System.out.println();
        }
        System.out.println();
    }
}
于 2012-03-27T10:47:09.103 に答える