0

いくつかの文字で満たされた配列を取得しました。以下の例を参照してください。 まず、配列がシャッフルされていることを望みます。フィッシャー・イェーツ・シャッフルと呼ばれる最も有名なシャッフルを見つけました。

出力時に、たとえばF2がFF' の隣にあってはなりません。もう一方も同じです。DはD2またはD' の近くにあってはなりません。

たとえば、R B2 UFLF D2 .... などのように出力されます。

ではない: R B2 B' LF D2 ...

ヘルプ、提案はありますか?最初の文字をチェックする必要があることは知ってcharAt()いますが、私はその機能の専門家ではありません。

Javascript

function shuffle(sides) {
    var elementsRemaining = sides.length, temp, randomIndex, last;
    while (elementsRemaining > 1) {
        randomIndex = Math.floor(Math.random() * elementsRemaining--);
        if (randomIndex != elementsRemaining) {
        temp = sides[elementsRemaining];
        sides[elementsRemaining] = sides[randomIndex];
        sides[randomIndex] = temp;
        }
    };
}

  return sides;
}

var sides = ["F ", "R ", "U ", "L ", "D ", "F2 ", "R2 ", "U2 ", "L2 ", "D2 ", "F' ", "R' ", "U' ", "L' ", "D' "];
shuffle(sides);
$('#scramble').html(sides);
4

1 に答える 1

3

シャッフルして制約を確認し、制約が満たされていない場合は繰り返すことができます。制約をチェックする方法は次のとおりです。

var passesConstraint = function(sides) {
    for(var i = 0; i < sides.length - 1; i++) { 
        if (sides[i][0] === sides[i+1][0]) { 
            return false;
        }
     } 
    return true;
}

charAt() を行う必要はありません。文字列は [] 表記でもアクセスできます。

shuffle(sides)
while (!passesConstraint(sides)) {
   shuffle(sides)
}
于 2014-10-08T19:18:35.777 に答える