this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Day 7, part 1

+501
+13
index.js
··· 66 66 }); 67 67 var totalBrightness = Day6.totalBrightness(grid2); 68 68 console.log('Day 6, Part 2:', totalBrightness); 69 + 70 + /** 71 + * Day 7! 72 + * ----------------------------------- 73 + */ 74 + var Day7 = require('./lib/day7'); 75 + var day7Input = fs.readFileSync('./input/day7.txt', 'utf8'); 76 + 77 + day7Input.split('\n').forEach(function(instruction) { 78 + Day7.processInstruction(instruction); 79 + }); 80 + 81 + console.log('Day 7, Part 1:', Day7.getWireSignal('a'));
+339
input/day7.txt
··· 1 + af AND ah -> ai 2 + NOT lk -> ll 3 + hz RSHIFT 1 -> is 4 + NOT go -> gp 5 + du OR dt -> dv 6 + x RSHIFT 5 -> aa 7 + at OR az -> ba 8 + eo LSHIFT 15 -> es 9 + ci OR ct -> cu 10 + b RSHIFT 5 -> f 11 + fm OR fn -> fo 12 + NOT ag -> ah 13 + v OR w -> x 14 + g AND i -> j 15 + an LSHIFT 15 -> ar 16 + 1 AND cx -> cy 17 + jq AND jw -> jy 18 + iu RSHIFT 5 -> ix 19 + gl AND gm -> go 20 + NOT bw -> bx 21 + jp RSHIFT 3 -> jr 22 + hg AND hh -> hj 23 + bv AND bx -> by 24 + er OR es -> et 25 + kl OR kr -> ks 26 + et RSHIFT 1 -> fm 27 + e AND f -> h 28 + u LSHIFT 1 -> ao 29 + he RSHIFT 1 -> hx 30 + eg AND ei -> ej 31 + bo AND bu -> bw 32 + dz OR ef -> eg 33 + dy RSHIFT 3 -> ea 34 + gl OR gm -> gn 35 + da LSHIFT 1 -> du 36 + au OR av -> aw 37 + gj OR gu -> gv 38 + eu OR fa -> fb 39 + lg OR lm -> ln 40 + e OR f -> g 41 + NOT dm -> dn 42 + NOT l -> m 43 + aq OR ar -> as 44 + gj RSHIFT 5 -> gm 45 + hm AND ho -> hp 46 + ge LSHIFT 15 -> gi 47 + jp RSHIFT 1 -> ki 48 + hg OR hh -> hi 49 + lc LSHIFT 1 -> lw 50 + km OR kn -> ko 51 + eq LSHIFT 1 -> fk 52 + 1 AND am -> an 53 + gj RSHIFT 1 -> hc 54 + aj AND al -> am 55 + gj AND gu -> gw 56 + ko AND kq -> kr 57 + ha OR gz -> hb 58 + bn OR by -> bz 59 + iv OR jb -> jc 60 + NOT ac -> ad 61 + bo OR bu -> bv 62 + d AND j -> l 63 + bk LSHIFT 1 -> ce 64 + de OR dk -> dl 65 + dd RSHIFT 1 -> dw 66 + hz AND ik -> im 67 + NOT jd -> je 68 + fo RSHIFT 2 -> fp 69 + hb LSHIFT 1 -> hv 70 + lf RSHIFT 2 -> lg 71 + gj RSHIFT 3 -> gl 72 + ki OR kj -> kk 73 + NOT ak -> al 74 + ld OR le -> lf 75 + ci RSHIFT 3 -> ck 76 + 1 AND cc -> cd 77 + NOT kx -> ky 78 + fp OR fv -> fw 79 + ev AND ew -> ey 80 + dt LSHIFT 15 -> dx 81 + NOT ax -> ay 82 + bp AND bq -> bs 83 + NOT ii -> ij 84 + ci AND ct -> cv 85 + iq OR ip -> ir 86 + x RSHIFT 2 -> y 87 + fq OR fr -> fs 88 + bn RSHIFT 5 -> bq 89 + 0 -> c 90 + 14146 -> b 91 + d OR j -> k 92 + z OR aa -> ab 93 + gf OR ge -> gg 94 + df OR dg -> dh 95 + NOT hj -> hk 96 + NOT di -> dj 97 + fj LSHIFT 15 -> fn 98 + lf RSHIFT 1 -> ly 99 + b AND n -> p 100 + jq OR jw -> jx 101 + gn AND gp -> gq 102 + x RSHIFT 1 -> aq 103 + ex AND ez -> fa 104 + NOT fc -> fd 105 + bj OR bi -> bk 106 + as RSHIFT 5 -> av 107 + hu LSHIFT 15 -> hy 108 + NOT gs -> gt 109 + fs AND fu -> fv 110 + dh AND dj -> dk 111 + bz AND cb -> cc 112 + dy RSHIFT 1 -> er 113 + hc OR hd -> he 114 + fo OR fz -> ga 115 + t OR s -> u 116 + b RSHIFT 2 -> d 117 + NOT jy -> jz 118 + hz RSHIFT 2 -> ia 119 + kk AND kv -> kx 120 + ga AND gc -> gd 121 + fl LSHIFT 1 -> gf 122 + bn AND by -> ca 123 + NOT hr -> hs 124 + NOT bs -> bt 125 + lf RSHIFT 3 -> lh 126 + au AND av -> ax 127 + 1 AND gd -> ge 128 + jr OR js -> jt 129 + fw AND fy -> fz 130 + NOT iz -> ja 131 + c LSHIFT 1 -> t 132 + dy RSHIFT 5 -> eb 133 + bp OR bq -> br 134 + NOT h -> i 135 + 1 AND ds -> dt 136 + ab AND ad -> ae 137 + ap LSHIFT 1 -> bj 138 + br AND bt -> bu 139 + NOT ca -> cb 140 + NOT el -> em 141 + s LSHIFT 15 -> w 142 + gk OR gq -> gr 143 + ff AND fh -> fi 144 + kf LSHIFT 15 -> kj 145 + fp AND fv -> fx 146 + lh OR li -> lj 147 + bn RSHIFT 3 -> bp 148 + jp OR ka -> kb 149 + lw OR lv -> lx 150 + iy AND ja -> jb 151 + dy OR ej -> ek 152 + 1 AND bh -> bi 153 + NOT kt -> ku 154 + ao OR an -> ap 155 + ia AND ig -> ii 156 + NOT ey -> ez 157 + bn RSHIFT 1 -> cg 158 + fk OR fj -> fl 159 + ce OR cd -> cf 160 + eu AND fa -> fc 161 + kg OR kf -> kh 162 + jr AND js -> ju 163 + iu RSHIFT 3 -> iw 164 + df AND dg -> di 165 + dl AND dn -> do 166 + la LSHIFT 15 -> le 167 + fo RSHIFT 1 -> gh 168 + NOT gw -> gx 169 + NOT gb -> gc 170 + ir LSHIFT 1 -> jl 171 + x AND ai -> ak 172 + he RSHIFT 5 -> hh 173 + 1 AND lu -> lv 174 + NOT ft -> fu 175 + gh OR gi -> gj 176 + lf RSHIFT 5 -> li 177 + x RSHIFT 3 -> z 178 + b RSHIFT 3 -> e 179 + he RSHIFT 2 -> hf 180 + NOT fx -> fy 181 + jt AND jv -> jw 182 + hx OR hy -> hz 183 + jp AND ka -> kc 184 + fb AND fd -> fe 185 + hz OR ik -> il 186 + ci RSHIFT 1 -> db 187 + fo AND fz -> gb 188 + fq AND fr -> ft 189 + gj RSHIFT 2 -> gk 190 + cg OR ch -> ci 191 + cd LSHIFT 15 -> ch 192 + jm LSHIFT 1 -> kg 193 + ih AND ij -> ik 194 + fo RSHIFT 3 -> fq 195 + fo RSHIFT 5 -> fr 196 + 1 AND fi -> fj 197 + 1 AND kz -> la 198 + iu AND jf -> jh 199 + cq AND cs -> ct 200 + dv LSHIFT 1 -> ep 201 + hf OR hl -> hm 202 + km AND kn -> kp 203 + de AND dk -> dm 204 + dd RSHIFT 5 -> dg 205 + NOT lo -> lp 206 + NOT ju -> jv 207 + NOT fg -> fh 208 + cm AND co -> cp 209 + ea AND eb -> ed 210 + dd RSHIFT 3 -> df 211 + gr AND gt -> gu 212 + ep OR eo -> eq 213 + cj AND cp -> cr 214 + lf OR lq -> lr 215 + gg LSHIFT 1 -> ha 216 + et RSHIFT 2 -> eu 217 + NOT jh -> ji 218 + ek AND em -> en 219 + jk LSHIFT 15 -> jo 220 + ia OR ig -> ih 221 + gv AND gx -> gy 222 + et AND fe -> fg 223 + lh AND li -> lk 224 + 1 AND io -> ip 225 + kb AND kd -> ke 226 + kk RSHIFT 5 -> kn 227 + id AND if -> ig 228 + NOT ls -> lt 229 + dw OR dx -> dy 230 + dd AND do -> dq 231 + lf AND lq -> ls 232 + NOT kc -> kd 233 + dy AND ej -> el 234 + 1 AND ke -> kf 235 + et OR fe -> ff 236 + hz RSHIFT 5 -> ic 237 + dd OR do -> dp 238 + cj OR cp -> cq 239 + NOT dq -> dr 240 + kk RSHIFT 1 -> ld 241 + jg AND ji -> jj 242 + he OR hp -> hq 243 + hi AND hk -> hl 244 + dp AND dr -> ds 245 + dz AND ef -> eh 246 + hz RSHIFT 3 -> ib 247 + db OR dc -> dd 248 + hw LSHIFT 1 -> iq 249 + he AND hp -> hr 250 + NOT cr -> cs 251 + lg AND lm -> lo 252 + hv OR hu -> hw 253 + il AND in -> io 254 + NOT eh -> ei 255 + gz LSHIFT 15 -> hd 256 + gk AND gq -> gs 257 + 1 AND en -> eo 258 + NOT kp -> kq 259 + et RSHIFT 5 -> ew 260 + lj AND ll -> lm 261 + he RSHIFT 3 -> hg 262 + et RSHIFT 3 -> ev 263 + as AND bd -> bf 264 + cu AND cw -> cx 265 + jx AND jz -> ka 266 + b OR n -> o 267 + be AND bg -> bh 268 + 1 AND ht -> hu 269 + 1 AND gy -> gz 270 + NOT hn -> ho 271 + ck OR cl -> cm 272 + ec AND ee -> ef 273 + lv LSHIFT 15 -> lz 274 + ks AND ku -> kv 275 + NOT ie -> if 276 + hf AND hl -> hn 277 + 1 AND r -> s 278 + ib AND ic -> ie 279 + hq AND hs -> ht 280 + y AND ae -> ag 281 + NOT ed -> ee 282 + bi LSHIFT 15 -> bm 283 + dy RSHIFT 2 -> dz 284 + ci RSHIFT 2 -> cj 285 + NOT bf -> bg 286 + NOT im -> in 287 + ev OR ew -> ex 288 + ib OR ic -> id 289 + bn RSHIFT 2 -> bo 290 + dd RSHIFT 2 -> de 291 + bl OR bm -> bn 292 + as RSHIFT 1 -> bl 293 + ea OR eb -> ec 294 + ln AND lp -> lq 295 + kk RSHIFT 3 -> km 296 + is OR it -> iu 297 + iu RSHIFT 2 -> iv 298 + as OR bd -> be 299 + ip LSHIFT 15 -> it 300 + iw OR ix -> iy 301 + kk RSHIFT 2 -> kl 302 + NOT bb -> bc 303 + ci RSHIFT 5 -> cl 304 + ly OR lz -> ma 305 + z AND aa -> ac 306 + iu RSHIFT 1 -> jn 307 + cy LSHIFT 15 -> dc 308 + cf LSHIFT 1 -> cz 309 + as RSHIFT 3 -> au 310 + cz OR cy -> da 311 + kw AND ky -> kz 312 + lx -> a 313 + iw AND ix -> iz 314 + lr AND lt -> lu 315 + jp RSHIFT 5 -> js 316 + aw AND ay -> az 317 + jc AND je -> jf 318 + lb OR la -> lc 319 + NOT cn -> co 320 + kh LSHIFT 1 -> lb 321 + 1 AND jj -> jk 322 + y OR ae -> af 323 + ck AND cl -> cn 324 + kk OR kv -> kw 325 + NOT cv -> cw 326 + kl AND kr -> kt 327 + iu OR jf -> jg 328 + at AND az -> bb 329 + jp RSHIFT 2 -> jq 330 + iv AND jb -> jd 331 + jn OR jo -> jp 332 + x OR ai -> aj 333 + ba AND bc -> bd 334 + jl OR jk -> jm 335 + b RSHIFT 1 -> v 336 + o AND q -> r 337 + NOT p -> q 338 + k AND m -> n 339 + as RSHIFT 2 -> at
+72
lib/day7.js
··· 1 + var R_INSTRUCTION_PARSER = /^([0-9a-z]+)?\s*([A-Z]+)?\s*([0-9a-z]+)?\s+\->\s+([a-z]+)$/; 2 + 3 + var wires = {}; 4 + 5 + module.exports = { 6 + 7 + processInstruction: function(instruction) { 8 + if (!instruction.match(R_INSTRUCTION_PARSER)) return; 9 + var parts = this.parseParts(instruction); 10 + this.registerWire(parts); 11 + }, 12 + 13 + parseParts: function(instruction) { 14 + var parts = instruction.match(R_INSTRUCTION_PARSER); 15 + 16 + parts[1] = convertToNumberIfNumber(parts[1]); 17 + parts[3] = convertToNumberIfNumber(parts[3]); 18 + 19 + var returnObj = { 20 + // convert missing input1 to null instead of undefined 21 + input1: typeof(parts[1]) === 'undefined' ? null : parts[1], 22 + input2: typeof(parts[3]) === 'undefined' ? null : parts[3], 23 + operation: typeof(parts[2]) === 'undefined' ? null : parts[2], 24 + output: parts[4] 25 + }; 26 + 27 + return returnObj; 28 + }, 29 + 30 + registerWire: function(parts) { 31 + wires[parts.output] = function() { 32 + var getInput1 = useNumberOrWireInput(parts.input1); 33 + var getInput2 = useNumberOrWireInput(parts.input2); 34 + 35 + var result; 36 + 37 + if (parts.operation !== 'NOT') { 38 + switch(parts.operation) { 39 + case 'AND': result = getInput1() & getInput2(); break; 40 + case 'OR': result = getInput1() | getInput2(); break; 41 + case 'LSHIFT': result = getInput1() << getInput2(); break; 42 + case 'RSHIFT': result = getInput1() >> getInput2(); break; 43 + case null: result = getInput1(); break; 44 + } 45 + } else { 46 + result = getInput2() ^ 65535 47 + } 48 + 49 + wires[parts.output] = function() { return result }; 50 + return result; 51 + }; 52 + }, 53 + 54 + getWireSignal: function(wire) { 55 + return wires[wire](); 56 + }, 57 + 58 + resetWires: function() { wires = {} } 59 + 60 + }; 61 + 62 + function convertToNumberIfNumber(x) { 63 + return parseInt(x) == x ? parseInt(x) : x; 64 + } 65 + 66 + function useNumberOrWireInput(input) { 67 + if (typeof(input) === 'number') { 68 + return function() { return input }; 69 + } else { 70 + return function() { return wires[input]() }; 71 + } 72 + }
+77
spec/day7.spec.js
··· 1 + var expect = require('chai').expect; 2 + var Day7 = require('../lib/day7'); 3 + 4 + describe('Day7', function() { 5 + 6 + it('does the thing', function() { 7 + var instructions = [ 8 + 'x AND y -> d', 9 + 'x OR y -> e', 10 + '123 -> x', 11 + '456 -> y', 12 + 'x LSHIFT 2 -> f', 13 + 'y RSHIFT 2 -> g', 14 + 'NOT x -> h', 15 + 'NOT y -> i' 16 + ]; 17 + 18 + instructions.forEach(function(instruction) { 19 + Day7.processInstruction(instruction); 20 + }); 21 + 22 + expect(Day7.getWireSignal('x')).to.equal(123); 23 + expect(Day7.getWireSignal('y')).to.equal(456); 24 + expect(Day7.getWireSignal('d')).to.equal(72); 25 + expect(Day7.getWireSignal('e')).to.equal(507); 26 + expect(Day7.getWireSignal('f')).to.equal(492); 27 + expect(Day7.getWireSignal('g')).to.equal(114); 28 + expect(Day7.getWireSignal('h')).to.equal(65412); 29 + expect(Day7.getWireSignal('i')).to.equal(65079); 30 + }); 31 + 32 + 33 + describe('#parseParts', function() { 34 + it('breaks instruction into parts', function() { 35 + var instruction1 = 'fl LSHIFT 1 -> gf'; 36 + var instruction2 = '1 AND ds -> dt'; 37 + var instruction3 = 'NOT kt -> ku'; 38 + var instruction4 = 'lv LSHIFT 15 -> lz'; 39 + var instruction5 = 'la -> aa'; 40 + 41 + expect(Day7.parseParts(instruction1)).to.eql({ 42 + input1: 'fl', 43 + input2: 1, 44 + operation: 'LSHIFT', 45 + output: 'gf' 46 + }); 47 + 48 + expect(Day7.parseParts(instruction2)).to.eql({ 49 + input1: 1, 50 + input2: 'ds', 51 + operation: 'AND', 52 + output: 'dt' 53 + }); 54 + 55 + expect(Day7.parseParts(instruction3)).to.eql({ 56 + input1: null, 57 + input2: 'kt', 58 + operation: 'NOT', 59 + output: 'ku' 60 + }); 61 + 62 + expect(Day7.parseParts(instruction4)).to.eql({ 63 + input1: 'lv', 64 + input2: 15, 65 + operation: 'LSHIFT', 66 + output: 'lz' 67 + }); 68 + 69 + expect(Day7.parseParts(instruction5)).to.eql({ 70 + input1: 'la', 71 + input2: null, 72 + operation: null, 73 + output: 'aa' 74 + }); 75 + }); 76 + }); 77 + });