1 var fs
= require("fs");
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;
14 function printGrid(g
) {
15 return g
.map(function (row
) {
16 return row
.map(showCell
).join('');
20 function showCell(c
) {
28 // toggle the value of a cell
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]);
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
]);
53 function left(from, to
, grid
) {
54 for (var r
= from-1; r
< to
; r
++) {
55 grid
[r
][0] = toggle(grid
[r
][0]);
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];
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
];
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
];
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
];
87 // Dispatch table for execution
88 var dispatchTable
= {'top': top
, 'left': left
,
89 'row': rotate_row
, 'column': rotate_column
};
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
);
97 // Execute all the commands as a fold on the initial grid
98 function executeCommands(commands
, grid
) {
99 return commands
.reduce(dispatchCommand
, grid
);
103 // Merge the lines of the grid into one line, then pick out the true values
104 function count_pixels(grid
) {
106 function (t
, l
) {return t
.concat(l
);}
108 function (c
) {return c
;}
112 var instrs
= fs
.readFileSync('05-pixels.txt').toString().split('\n');
113 var instructions
= instrs
.map(parseCommand
);
115 var final_grid
= executeCommands(instructions
, initial_grid
);
117 console
.log(count_pixels(final_grid
));
118 console
.log(printGrid(final_grid
));