Guest User

Untitled

a guest
Dec 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. // C ← op(A, B)
  2.  
  3. let beforeIp;
  4. let ip = 0;
  5. let ipReg;
  6. const regs = [1, 0, 0, 0, 0, 0];
  7. const instructions = {
  8. setIp: (value, regs) => { beforeIp = regs[value]; ipReg = value; regs[value] = ip; },
  9.  
  10. seti: ([a,b,c], r) => r[c] = a,
  11. setr: ([a,b,c], r) => r[c] = r[a],
  12.  
  13. addi: ([a,b,c], r) => r[c] = r[a] + b,
  14. addr: ([a,b,c], r) => r[c] = r[a] + r[b],
  15.  
  16. muli: ([a,b,c], r) => r[c] = r[a] * b,
  17. mulr: ([a,b,c], r) => r[c] = r[a] * r[b],
  18.  
  19. bani: ([a,b,c], r) => r[c] = r[a] & b,
  20. banr: ([a,b,c], r) => r[c] = r[a] & r[b],
  21.  
  22. bori: ([a,b,c], r) => r[c] = r[a] | b,
  23. borr: ([a,b,c], r) => r[c] = r[a] | r[b],
  24.  
  25. gtir: ([a,b,c], r) => r[c] = Number(a > r[b]),
  26. gtri: ([a,b,c], r) => r[c] = Number(r[a] > b),
  27. gtrr: ([a,b,c], r) => r[c] = Number(r[a] > r[b]),
  28.  
  29. eqir: ([a,b,c], r) => r[c] = Number(a === r[b]),
  30. eqri: ([a,b,c], r) => r[c] = Number(r[a] === b),
  31. eqrr: ([a,b,c], r) => r[c] = Number(r[a] === r[b]),
  32. }
  33.  
  34. const program = require('fs').readFileSync('aoc-input-19', 'utf-8').trim()
  35. .split('\n')
  36. .map(line => {
  37. if (line.startsWith('#ip')) {
  38. return {
  39. action: instructions.setIp,
  40. value: Number(line.split(' ')[1]),
  41. line,
  42. }
  43. } else {
  44. const [inst, ...args] = line.split(' ');
  45. return {
  46. action: instructions[inst],
  47. value: args.map(Number),
  48. line,
  49. };
  50. }
  51. });
  52.  
  53. //apparently this instruction is not part of the program
  54. const ipSetter = program.shift();
  55. ipSetter.action(ipSetter.value, regs);
  56.  
  57. // 10551343
  58. // part 2 doesn't really complete, but observation shows what formula to use to compute the result
  59.  
  60. // for part 1, uncomment next line
  61. //regs[0] = 0;
  62. let gen = 0;
  63. while(ip >= 0 && ip < program.length) {
  64. ++gen;
  65. const instr = program[ip];
  66.  
  67. instr.action(instr.value, regs);
  68.  
  69. if (ipReg) {
  70. ++regs[ipReg];
  71. ip = regs[ipReg];
  72. } else {
  73. ++ip;
  74. }
  75. }
  76.  
  77. console.log(gen, regs);
Add Comment
Please, Sign In to add comment