-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathHidden-Word.js
109 lines (93 loc) · 3.23 KB
/
Hidden-Word.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
// https://www.codingame.com/ide/puzzle/hidden-word
const dict = [...new Array(+readline())].map(readline);
const grid = [...new Array(+(readline().split(' ')[0]))]
.map(() => readline().split(''));
let mark = [...grid];
const horizontalWords =
(grid) => [...new Array(grid.length)].map((_, i) => grid[i].join(''));
const horz = horizontalWords(grid);
const markWords = (words, action, grid) => {
words.forEach((word, wordIndex) => {
dict.forEach((dictWord) => {
action(word, wordIndex, dictWord, grid);
});
});
};
const reverse = (str) => str.split('').reverse().join('');
const indexOf = (word, dictWord) => word.indexOf(dictWord) === -1 ?
word.indexOf(reverse(dictWord)) : word.indexOf(dictWord);
const markHorizontal = (word, wordIndex, dictWord, mark) => {
if (word.includes(dictWord) ||
word.includes(reverse(dictWord))) {
let index = indexOf(word, dictWord);
mark[wordIndex] = (mark[wordIndex].join('').substring(0, index) +
'x'.repeat(dictWord.length) + mark[wordIndex]
.join('')
.substring(index + dictWord.length))
.split('');
}
};
markWords(horz, markHorizontal, mark);
const mirrorLines = (grid) => {
const swapped = [];
for (let col = 0; col < grid.length; col++) {
let word = '';
for (let row = 0; row < grid.length; row++) {
word += grid[row][col];
}
swapped.push(word.split(''));
}
return swapped;
};
const gridMirrorLines = mirrorLines(grid);
const verticalWords = horizontalWords(gridMirrorLines);
const markMirrorLines = mirrorLines(mark);
markWords(verticalWords, markHorizontal, markMirrorLines);
mark = mirrorLines(markMirrorLines);
// get all diagonal words from left to right
const diagLR = (grid) => {
const diagXY = [];
for (let row = 0; row < grid.length - 1; row++) {
let word = '';
let word2 = '';
for (let k = 0; k < grid.length && row + k < grid.length; k++) {
word += grid[row + k][k];
word2 += grid[k][row + k];
}
diagXY.push([row, word]);
diagXY.push([row, word2]);
}
diagXY.shift();
return diagXY;
};
const diagXY = diagLR(grid);
// mark all matched words from left to right
const markDiaognal = (word, wordIndex, dictWord, mark) => {
if (word[1].includes(dictWord) ||
word[1].includes(reverse(dictWord))) {
let index = indexOf(word[1], dictWord);
if (wordIndex % 2 === 1) {
for (let k = 0; k < dictWord.length; k++) {
mark[word[0] + k][k] = 'x';
}
} else {
for (let k = 0; k < dictWord.length; k++) {
mark[k + index][word[0] + k + index] = 'x';
}
}
}
};
markWords(diagXY, markDiaognal, mark);
const mirrorDiag =
(grid) => horizontalWords(grid).map((line) => reverse(line).split(''));
const gridMirrorDiag = mirrorDiag(grid);
const diagYX = diagLR(gridMirrorDiag);
const markMirrorDiag = mirrorDiag(mark);
markWords(diagYX, markDiaognal, markMirrorDiag);
mark = mirrorDiag(markMirrorDiag);
console.log(
mark.reduce(
(answer, wordArray) =>
answer += wordArray.filter((e) => e !== 'x').join(''),
'')
);