2014-10-08 2 views
0

일부 글자로 채워진 배열이 있습니다. 아래 예를 참조하십시오. 먼저 배열을 섞어 놓고 싶습니다. 그런데 가장 유명한 셔플이 Fisher-Yates 셔플이라는 것을 알았습니다.자바 스크립트 배열 셔플은 서로 옆에 두 개를 출력해서는 안됩니다.

이제 출력 할 때, 예. F2F 또는 F ' 옆에 있으면 안됩니다. 다른 사람에게도 마찬가지입니다. DD2 또는 D '에 가까이 있지 않아야합니다.

출력해야합니다. 예 : R B2 U F L F D2 .... 등등.

하지 : R B2의 B ' L F D2 ...

어떤 도움, 제안? 첫 번째 문자를 charAt()으로 확인해야한다는 것을 알고 있지만 그 기능의 전문가는 아닙니다.

자바 스크립트

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); 
+0

셔플 된 배열에 연속적인 항목이 없음을 보장 하시겠습니까? –

+0

예, 맞습니다. 그게 내가 원하는거야. – user3613655

답변

2
당신은 셔플 당신의 제약 조건을 확인하고 제약 조건이 충족되지 않을 경우 반복 할 수 있습니다

. 체크 제약 조건에 대한 귀하의 방법 당신은 수 charAt을 (할 필요가 없다

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; 
} 

) 일 수있다, 문자열이 너무 표기 []에 액세스 할 수 있습니다.

shuffle(sides) 
while (!passesConstraint(sides)) { 
    shuffle(sides) 
} 
+0

owh lol 작동! 감사!! – user3613655