Removing files from data analysis directory
[ou-summer-of-code-2017.git] / 05-display-board / day5.js
1 var fs = require("fs");
2
3 const WIDTH = 80;
4 const HEIGHT = 8;
5
6 var initial_grid = new Array(HEIGHT);
7 for (var i = 0; i < HEIGHT; i++) {
8 initial_grid[i] = new Array(WIDTH);
9 for (var j = 0; j < WIDTH; j++) {
10 initial_grid[i][j] = false;
11 }
12 }
13
14 function printGrid(g) {
15 return g.map(function (row) {
16 return row.map(showCell).join('');
17 }).join('\n');
18 }
19
20 function showCell(c) {
21 if (c) {
22 return '*';
23 } else {
24 return ' ';
25 }
26 }
27
28 // toggle the value of a cell
29 function toggle(c) {
30 if (c) {
31 return false;
32 } else {
33 return true;
34 }
35 }
36
37 // turn a stirng into a command (a three-element array)
38 function parseCommand(str) {
39 var command = str.split(' ').slice(-3);
40 command[1] = Number(command[1]);
41 command[2] = Number(command[2]);
42 return command;
43 }
44
45 // implement the instructions
46 function top(from, to, grid) {
47 for (var c = from-1; c < to; c++) {
48 grid[0][c] = toggle(grid[0][c]);
49 };
50 return grid;
51 }
52
53 function left(from, to, grid) {
54 for (var r = from-1; r < to; r++) {
55 grid[r][0] = toggle(grid[r][0]);
56 };
57 return grid;
58 }
59
60 function rotate_column(col, raw_n, grid) {
61 var n = raw_n % HEIGHT;
62 var temp_column = new Array(HEIGHT);
63 for (var i = 0; i < HEIGHT; i++) {
64 temp_column[i] = grid[i][col-1];
65 };
66 var new_col = temp_column.slice(-n).concat(temp_column.slice(0, -n));
67 for (var i = 0; i < HEIGHT; i++) {
68 grid[i][col-1] = new_col[i];
69 };
70 return grid;
71 }
72
73 function rotate_row(row, raw_n, grid) {
74 var n = raw_n % WIDTH;
75 var temp_row = new Array(WIDTH);
76 for (var i = 0; i < WIDTH; i++) {
77 temp_row[i] = grid[row-1][i];
78 };
79 var new_row = temp_row.slice(-n).concat(temp_row.slice(0, -n));
80 for (var i = 0; i < WIDTH; i++) {
81 grid[row-1][i] = new_row[i];
82 };
83 return grid;
84 }
85
86
87 // Dispatch table for execution
88 var dispatchTable = {'top': top, 'left': left,
89 'row': rotate_row, 'column': rotate_column};
90
91
92 // Do one command, based on the function stored in the dispatch table
93 function dispatchCommand(grid, command) {
94 return dispatchTable[command[0]](command[1], command[2], grid);
95 }
96
97 // Execute all the commands as a fold on the initial grid
98 function executeCommands(commands, grid) {
99 return commands.reduce(dispatchCommand, grid);
100 }
101
102
103 // Merge the lines of the grid into one line, then pick out the true values
104 function count_pixels(grid) {
105 return grid.reduce(
106 function (t, l) {return t.concat(l);}
107 ).filter(
108 function (c) {return c;}
109 ).length
110 }
111
112 var instrs = fs.readFileSync('05-pixels.txt').toString().split('\n');
113 var instructions = instrs.map(parseCommand);
114
115 var final_grid = executeCommands(instructions, initial_grid);
116
117 console.log(count_pixels(final_grid));
118 console.log(printGrid(final_grid));