-
Notifications
You must be signed in to change notification settings - Fork 0
/
024.js
64 lines (49 loc) · 1.5 KB
/
024.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// DOES NOT SCALE :(
var arr = [0,1,2,3,4,5,6,7,8,9];
var end_perm_i = 1000000;
var perm = [];
var perm_i = 0;
// Prints current permutation to console
function printPerm(subarr1, subarr2) {
perm_i++;
perm = subarr1.concat(subarr2);
if (perm_i == end_perm_i) {
console.log(perm_i + ": " + perm.join(""));
}
}
// Swap the last digit of subarr1 with next biggest digit in subarr2.
// Returns array [subarr1, subarr2]
function carryOver(subarr1, subarr2) {
var sa1_last_i = subarr1.length - 1;
var sa1_last = subarr1[sa1_last_i];
subarr2.sort();
for (var i = 0; i < subarr2.length; i++) {
if (subarr2[i] > sa1_last) { // swap values
subarr1[sa1_last_i] = subarr2[i];
subarr2[i] = sa1_last;
return [subarr1, subarr2];
}
}
return [subarr1, subarr2]; // if no match, return unchanged
}
function foo(subarr1, subarr2, sa2_count) {
var subarrs = [];
if (sa2_count == 2) {
printPerm(subarr1, subarr2.sort());
printPerm(subarr1, subarr2.reverse());
// If last digit of subarr1 is maxed out, move it to subarr2
while (subarr1[subarr1.length - 1] > Math.max.apply(null, subarr2)) {
subarr2.push(subarr1.pop());
}
if (subarr1.length == 0 || perm_i == end_perm_i) {
console.log("DONE! perm_i = " + perm_i);
return;
}
subarrs = carryOver(subarr1, subarr2);
foo(subarrs[0], subarrs[1], subarrs[1].length);
} else {
subarr1.push(subarr2.shift()); // move first digit of subarr2 to subarr1
foo(subarr1, subarr2, --sa2_count);
}
}
foo([], arr, arr.length);