Поиск всех возможных состояний: их не так много (24 вращения на куб, большинство из которых вы можете отфильтровать). Псевдокод:
for cubeLevel0 in rotations(cubes[0]):
var sidesMatch = function(cube) {
return cube.N==cubeLevel0.N and cube.S==cubeLevel0.S and ...
}
for cubeLevel1 in rotations(cube[1]).filter(sidesMatch):
for cubeLevel2 in rotations(cube[2]).filter(sidesMatch):
for cubeLevel3 in rotations(cube[3]).filter(sidesMatch):
console.log(cubeLevel0, cubeLevel1, cubeLevel2, cubeLevel3)
Вложенные циклы for ужасны, и вы можете удалить их, реализовав это как рекурсивную функцию. Я оставил это так для ясности.
Для реализации функции rotations(cube)
у вас есть несколько вариантов. Наименее сложный способ - взять перед собой физический куб и обозначить каждую сторону {0,1,2,3,4,5}
в произвольном порядке. Затем физически выполните одно из 24 вращений и запишите пермутированный порядок, затем отмените вращение, чтобы вернуться к исходному положению. Затем напишите функцию следующим образом:
// You HAVE to manually discover these with the physical method described above
var rotationPermutations = [[0,1,2,3,4,5,6], [3,4,2,1,5,0], ...(24 of these)...];
function rotations(cube) { // representing a cube as a 6-tuple
return rotationPermutations.map(function(permutation) {
// return [cube[i] for i in permutation]
return permutation.map(function(x){return cube[x]})
});
}
Вы можете быть умнее в вещах, если сможете найти способ определить, когда перестановка неверна; тогда вы можете сгенерировать все 48 перестановок осей (используя представление [[axis0top, axis0bottom], [axis1top, axis1bottom], [axis2top, axis2bottom]]
, переставляя ось 3! way, и переворачивая каждую ось 2 way, так что 2 ^ 3 = 8 возможностей переворота, 3! * 2 ^ 3 = 48 ) и отфильтровать половину из них с неправильной хиральностью. Однако обдумывание этого заняло бы больше времени, чем запись перестановок с использованием ручного метода, описанного выше.