-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcache.js
109 lines (100 loc) · 2.87 KB
/
cache.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const fs = require('fs');
const { pieceTypes, allPieces, Cube, Big } = require('./pieces');
const PIECE_INDEX_TO_CACHE_UP_TO = 2;
class Cache {
constructor() {
if (process.env.LOGGED_PIECES && process.env.DEADENDS_COUNT) {
this.loadFromLog(JSON.parse(process.env.LOGGED_PIECES), Number(process.env.DEADENDS_COUNT));
return;
}
try {
const json = JSON.parse(fs.readFileSync('cache.json'));
this.deadends = json.deadends;
this.deadendsCount = json.deadendsCount;
} catch (e) {
this.deadends = newDeadends();
this.deadendsCount = 0;
}
}
save() {
console.log('saved' + this.deadendsCount);
fs.writeFileSync('cache.json', JSON.stringify({
deadends: this.deadends,
deadendsCount: this.deadendsCount
}));
}
loadFromLog(loggedPieces, deadendsCount) {
this.deadends = newDeadends();
this.deadendsCount = deadendsCount;
const pieces = loggedPieces
.slice(0, PIECE_INDEX_TO_CACHE_UP_TO + 1)
.map(p => {
let vi;
for(vi = 0; vi < 3; vi++) {
const v = Big.variants[vi];
if (p.variant.x === v[0] && p.variant.y === v[1] && p.variant.z === v[2]) {
break;
}
}
return { vi, x: p.coords.x, y: p.coords.y, z: p.coords.z };
});
try {
while(true) {
makePrevPieces();
let deadends = this.deadends;
for(let pi = 0; pi < PIECE_INDEX_TO_CACHE_UP_TO; pi++) {
const p = pieces[pi];
deadends = deadends[p.vi][p.x][p.y][p.z];
}
const p = pieces[PIECE_INDEX_TO_CACHE_UP_TO];
deadends[p.vi][p.x][p.y][p.z] = null;
}
} catch(e) {
}
function makePrevPieces(pi = PIECE_INDEX_TO_CACHE_UP_TO) {
const p = pieces[pi];
const v = Big.variants[p.vi];
if (p.z + 1 <= Cube[2] - v[2]) {
return p.z++;
}
p.z = 0;
if (p.y + 1 <= Cube[1] - v[1]) {
return p.y++;
}
p.y = 0;
if (p.x + 1 <= Cube[0] - v[0]) {
return p.x++;
}
p.x = 0;
if (p.vi + 1 < Big.variants.length) {
return p.vi++;
}
p.vi = 0;
makePrevPieces(pi - 1);
}
}
}
function newDeadends(pieceIndex = 0) {
const deadends = {};
const pieceType = pieceTypes[allPieces[pieceIndex]];
for (let vi = pieceType.variants.length - 1; vi >= 0; vi--) {
const variant = pieceType.variants[vi];
deadends[vi] = {};
for (let x = Cube[0] - variant[0]; x >= 0; x--) {
deadends[vi][x] = {};
for (let y = Cube[1] - variant[1]; y >= 0; y--) {
deadends[vi][x][y] = {};
if (pieceIndex < PIECE_INDEX_TO_CACHE_UP_TO) {
for (let z = Cube[2] - variant[2]; z >= 0; z--) {
deadends[vi][x][y][z] = newDeadends(pieceIndex + 1);
}
}
}
}
}
return deadends;
}
module.exports = {
PIECE_INDEX_TO_CACHE_UP_TO,
cache: new Cache()
}