]> git.somenet.org - pub/jan/ctf-seminar.git/blob - writeups/chrztoph/overTheWire2019/challenge5/challenge5.js
Add OTW Advent 2019 CTF writeup
[pub/jan/ctf-seminar.git] / writeups / chrztoph / overTheWire2019 / challenge5 / challenge5.js
1 var sudoku = require('sudoku');
2 var _ = require("lodash")
3
4 const A = 0;
5 const B = 1;
6 const C = 2;
7 const D = 3;
8 const E = 4;
9 const F = 5;
10 const G = 6;
11 const H = 7;
12 const I = 8;
13
14 const N1 = 0;
15 const N2 = 1;
16 const N3 = 2;
17 const N4 = 3;
18 const N5 = 4;
19 const N6 = 5;
20 const N7 = 6;
21 const N8 = 7;
22 const N9 = 8;
23
24 const isValidMap = (map) => {
25     // B9 + B8 + C1 + H4 + H4 = 23
26     if (map[B][N9] + map[B][N8] + map[C][N1] + map[H][N4] + map[H][N4] !== 23) {
27         return false;
28     }
29
30     // A5 + D7 + I5 + G8 + B3 + A5 = 19
31     if (map[A][N5] + map[D][N7] + map[I][N5] + map[G][N8] + map[B][N3] + map[A][N5] !== 19) {
32         return false;
33     }
34
35     // I2 + I3 + F2 + E9 = 15
36     if (map[I][N2] + map[I][N3] + map[F][N2] + map[E][N9] !== 15) {
37         return false;
38     }
39
40     // I7 + H8 + C2 + D9 = 26
41     if (map[I][N7] + map[H][N8] + map[C][N2] + map[D][N9] !== 26) {
42         return false;
43     }
44
45     // I6 + A5 + I3 + B8 + C3 = 20
46     if (map[I][N6] + map[A][N5] + map[I][N3] + map[B][N8] + map[C][N3] !== 20) {
47         return false;
48     }
49
50     // I7 + D9 + B6 + A8 + A3 + C4 = 27
51     if (map[I][N7] + map[D][N9] + map[B][N6] + map[A][N8] + map[A][N3] + map[C][N4] !== 27) {
52         return false;
53     }
54
55     // C7 + H9 + I7 + B2 + H8 + G3 = 31
56     if (map[C][N7] + map[H][N9] + map[I][N7] + map[B][N2] + map[H][N8] + map[G][N3] !== 31) {
57         return false;
58     }
59
60     // D3 + I8 + A4 + I6 = 27
61     if (map[D][N3] + map[I][N8] + map[A][N4] + map[I][N6] !== 27) {
62         return false;
63     }
64
65     // F5 + B8 + F8 + I7 + F1 = 33
66     if (map[F][N5] + map[B][N8] + map[F][N8] + map[I][N7] + map[F][N1] !== 33) {
67         return false;
68     }
69
70     // A2 + A8 + D7 + E4 = 21
71     if (map[A][N2] + map[A][N8] + map[D][N7] + map[E][N4] !== 21) {
72         return false;
73     }
74
75     // C1 + I4 + C2 + I1 + A4 = 20
76     if (map[C][N1] + map[I][N4] + map[C][N2] + map[I][N1] + map[A][N4] !== 20) {
77         return false;
78     }
79
80     // F8 + C1 + F6 + D3 + B6 = 25
81     if (map[F][N8] + map[C][N1] + map[F][N6] + map[D][N3] + map[B][N6] !== 25) {
82         return false;
83     }
84
85     return true;
86 }
87
88 var puzzle = [
89     null, null, null, null, null, null, null, null, 1,
90     null, 1, 2, null, null, null, null, null, null,
91     null, null, null, null, null, null, 2, null, null,
92     null, null, null, null, null, null, null, null, 2,
93     null, 2, null, null, null, null, null, null, null,
94     null, null, null, null, null, null, null, null, null,
95     null, null, null, null, null, null, 1, 2, null,
96     1, null, null, null, null, 2, null, null, null,
97     null, null, null, 1, null, null, null, null, null];
98
99 let solution = _.chunk(sudoku.solvepuzzle(puzzle), 9);
100 while (!isValidMap(solution)) {
101     solution = _.chunk(sudoku.solvepuzzle(puzzle), 9);
102 }
103
104 console.log(solution)