私は特定の方法でシャッフルする必要がある文字列 "ABCDEFGHIJKLMN"を持っています。これを行うために、すべての文字が完了するまで、下から上 - >上 - >左 - >右(たとえば、列あたり4文字)の文字を順番に書きます。最後の列が完了していない場合は、空のスペースが下部にある必要があります(これは非常に重要です)。そのような:縦反転パターンで文字をシャッフルする方法は?
DHLN
CGKM
BFJ
AEI
我々はテキストを読むようshuffleは、左の列で、文字のブロックを読んで新しい文字列を生成することによって達成される - >右:
"DHLNCGKMBFJAEI" の列はありません
例完全(word.size%column_height!= 0)は物事をかなり複雑にします。
私はいくつかの解決策を思いつきましたが、この問題をより簡潔に(すなわち、読みやすく、読みやすく)、よりエレガントにする方法があるかどうかはわかりません。私の解決策は、最終的な不完全な列を扱うためのコードの醜い別個のブロックを持っているか、複雑すぎるように思える。
私の質問は、もっとうまくできますか?
あなたがスポイラーを必要とせず、あなた自身でそれを見つけようとするならば、今読んでおいてください。あなたは、私がこれまでにいじったものから仕事をしたい場合は、コードの作業部分は
var result = "";
var str = "ABCDEFGHIJKLMN";
var nr_rows = 4;
var current_row = 4;
var columns = Math.floor(str.length/nr_rows);
var modulus_table = str.length % nr_rows;
var modulus_position = -1;
for (var i = 0; i < nr_rows; i++) {
for (var j = 0; j < columns; j++) {
result += str[current_row + j * nr_rows - 1];
}
if (modulus_table > 0) {
result += str[str.length + modulus_position];
modulus_table--;
modulus_position--;
}
current_row--;
}
console.log(result);
がで正しく、次の例では、それを各文字をループ置くだろう配列に移るです行列のような配列ですが、うまくいきません。配列を別の方法で作成する必要があります。この問題の別の例については、How to create empty 2d array in javascript?を参照してください。これはまた、最後の不完全な列の最後の文字を上端ではなく下端に合わせて修正するためには醜いハッキングが必要です。
var result = [[],[]];
var str = "ABCDEFGHIJKLMN";
var nr_rows = 4;
var row = nr_rows - 1;
var column = 0;
for (var i = 0; i < str.length; i++) {
result[row][column] = str[i];
row--;
if (row < 0) {
row = nr_rows;
column++;
}
}
console.log(result);
この最後の方法は、フルマトリクスアレイを行くが、それは3つの異なる方向に配列をループする必要があるため、それはすぐに、複雑になります。最初に、間違った場所に文字を含むダミー配列を作成しますが、 '未定義'の位置は空のままにする必要があります。これは、読み取り方向から90度回転した配列を読み込むことによって実現されます。 この最初の手順がないと、空の位置が上部の代わりに下部に積み重ねられます。
「未定義」値を使用して、行列の任意の穴をスキップして、カラクタを正しい場所に書き直すには、2番目のパスが必要です。このチェックはすべての位置に対して行われ、不完全な最後の行を処理するためのコードブロックはありません。
3回目のパスで最後のシャッフルされた文字列が形成されます。これはあまりにも複雑で紛らわしいようです。
// matrix populated top->bottom and left->right
// with the characters in the wrong place
// but the undefined postions in the correct place of the empty positions
var matrix = [];
var str = "ABCDEFGHIJKLMN";
var rows = 4;
var columns = Math.ceil(str.length/rows);
var k = 0;
for (var i = 0; i < rows; i++) {
matrix[i] = [];
for (var j = columns - 1; j >= 0; j--) {
matrix[i][j] = str[k];
k++;
}
}
// populate the matrix with the chars in the correct place and the 'undefined' positions left empty
var k = 0;
for (var i = 0; i < rows; i++) {
for (var j = 0; j < columns; j++) {
if (matrix[i][j] != undefined) {
matrix[i][j] = str[k];
k++;
}
}
}
// read matrix in correct direction and send to string, skipping empty positions
var result = "";
for (var j = columns - 1; j >= 0; j--) {
for (var i = 0; i < rows; i++) {
if (matrix[i][j] != undefined) {
result += matrix[i][j];
}
}
}
console.log(result);
"*最後の行が完了していない場合... *" "最後の列... *場合*" でなければなりません。 – RobG
何が問題なのですか? – guest271314
読みやすく(標準ライブラリと式を使用できます):操作を複数の標準マトリックス操作に分割します。 1.文字列を4xn行列に、2. Transpose行列を、3. Horizontallyミラー/フリップ行列を、4.最後の列をシフトします。5.行列を1x(mxn)文字列に変更します。 –