-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
129 lines (111 loc) · 2.87 KB
/
index.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import robot from 'robotjs';
import readlineSync from 'readline-sync';
import Dictionary from './dictionary-trie.js';
// SET TOP LEFT TILE COORD HERE
const TOP_LEFT_TILE = [800, 540];
// SET BOTTOM RIGHT TILE COORD HERE
const BOTTOM_RIGHT_TILE = [1100, 850];
// CONFIGURE MOUSE DELAY HERE
const MOVE_DELAY = 50;
robot.setMouseDelay(MOVE_DELAY);
// CONFIGURE DEBUG TEXT HERE
const DEBUG_MODE = true;
// Import dictionary
const dict = new Dictionary('words.txt');
// Record start time so we know when to stop mouse
const startTime = new Date();
function msleep(n) {
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
}
function sleep(ms) {
msleep(ms);
}
// Populate tileCoords map:
const tileCoords = new Map();
const tilePxDiff = ((BOTTOM_RIGHT_TILE[0] - TOP_LEFT_TILE[0]) / 2) * (2 / 3);
new Array(16)
.fill()
.forEach((_, i) =>
tileCoords.set(`${Math.floor(i / 4)},${i % 4}`, [
TOP_LEFT_TILE[0] + (i % 4) * tilePxDiff,
TOP_LEFT_TILE[1] + Math.floor(i / 4) * tilePxDiff,
]),
);
// Get grid input from stdin
const grid = new Map(
readlineSync
.question('Enter grid characters: ')
// 'LHNIMADDCIISTEST'
.toLowerCase()
.split('')
.map((char, i) => [`${Math.floor(i / 4)},${i % 4}`, char]),
);
// Keep map of paths for each word
const directions = new Map();
let callCount = 0;
const DFS = (currWord, visitedTileMap, tile, foundWords, trieNode) => {
const [x, y] = tile.split(',').map((char) => Number(char));
if (
x < 0 ||
y < 0 ||
x > 3 ||
y > 3 ||
visitedTileMap.has(tile) ||
trieNode == null
)
return;
callCount++;
visitedTileMap.set(tile, visitedTileMap.size);
currWord += grid.get(tile);
if (currWord.length > 2 && dict.contains(currWord)) {
foundWords.add(currWord);
directions.set(currWord, [...visitedTileMap.keys()]);
}
[
[0, 1],
[1, 0],
[0, -1],
[-1, 0],
[1, 1],
[-1, -1],
[1, -1],
[-1, 1],
].forEach((adj) =>
DFS(
currWord,
new Map(visitedTileMap),
`${x + adj[0]},${y + adj[1]}`,
foundWords,
dict.getChild(trieNode, grid.get(tile)),
),
);
};
// Find words
const foundWords = new Set();
for (const tile of grid.keys()) {
DFS('', new Map(), tile, foundWords, dict.getRoot());
}
// Sort words by length
const sortedWords = [...foundWords];
sortedWords.sort((a, b) => b.length - a.length);
// Draw the words
for (const word of sortedWords) {
const path = directions.get(word);
robot.moveMouse(...tileCoords.get(path[0]));
robot.mouseToggle('down');
sleep(50);
for (const tile of path) {
robot.dragMouse(...tileCoords.get(tile));
sleep(10);
}
robot.mouseToggle('up');
if (new Date() - startTime > 80000) break;
}
if (DEBUG_MODE)
console.log(`
=====Debug Info=====
Recursive calls: ${callCount}
Words found: ${sortedWords.length}
Time ran for: ${new Date() - startTime}
=====End Debug =====
`);