Это имеет смысл:
perm (2 0 [1 1]) in src (0 [1 1] 2) result is (2 0 [1 1])
Но с этого момента больше не имеет смысла:
perm (2 0 [1 1]) in src (2 0 [1 1]) result is (1] 0 2 [1)
Давайте посмотрим: сначала вы берете элемент 2
= [1 1]
или 1
, затем элемент 0
= 2
, затем элемент [1 1]
= 0
или 0, 0
. Результат никогда не будет [1 0 2 1]
Так что я считаю, что вам нужно perm
только с индексами без повторений:
perm (2 0 1) in src (0 [1 1] 2) result is (2 0 [1 1])
perm (2 0 1) in src (2 0 [1 1]) result is ([1 1] 2 0)
perm (2 0 1) in src ([1 1] 2 0) result is (0 [1 1] 2)
Что также дает вам циклический c свойство.
Предполагая, что это решит вашу проблему, вы должны сначала удалить повторения, и при построении результата считывать дубликаты.
ОБНОВЛЕНИЕ: Если в вашей перми есть повторения, также удалите их перед Запуск алгоритма.
function removeDuplicates(arr) { // Assumes duplicates are in order
var result = [], prev = null;
for (var el of arr) {
if (el != prev) result.push(el);
prev = el;
}
return result;
}
function apply(src, perm) {
var result = [], prev = null;
var src2 = removeDuplicates(src);
for (var i of perm) {
if (i != prev) { // Ignore duplicates
var el = src2[i];
result.push(el);
if (el % 2 != 0) result.push(el); // duplicate odds
}
prev = i;
}
console.log(`src = [${src}] perm = [${perm}] result = [${result}]`);
}
apply([0, 1, 1, 2], [2, 0, 1]);
apply([2, 0, 1, 1], [2, 0, 1]);
apply([1, 1, 2, 0], [2, 0, 1]);
apply([4, 1, 1, 2, 5, 5, 0, 3, 3, 6, 7, 7], [4, 1, 1, 6, 3, 3, 0, 5, 5, 2, 7, 7]);
apply([6, 1, 1, 0, 3, 3, 4, 5, 5, 2, 7, 7], [2, 1, 1, 6, 3, 3, 4, 5, 5, 0, 7, 7]);
apply([0, 1, 1, 2, 3, 3, 6, 5, 5, 4, 7, 7], [2, 3, 3, 4, 5, 5, 6, 7, 7, 0, 1, 1]);
apply([2, 1, 1, 6, 5, 5, 4, 3, 3, 0, 7, 7], [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 0]);
apply([6, 7, 7, 0, 1, 1, 4, 5, 5, 2, 3, 3], [3, 3, 4, 5, 5, 6, 7, 7, 0, 1, 1, 2]);