11function combo ( n , r ) {
2- if ( n >= 0n && n <= 3n ) return n ;
3- if ( n === 4n ) return r . A ;
4- if ( n === 5n ) return r . B ;
5- if ( n === 6n ) return r . C ;
6- throw new Error ( "Invalid combo" ) ;
2+ return [ 0n , 1n , 2n , 3n , r . A , r . B , r . C ] [ n ] ;
73}
84
95const opcodes = [
10- /* 0 */ ( r , p ) => ( r . A = r . A / 2n ** combo ( p , r ) ) ,
11- /* 1 */ ( r , p ) => ( r . B = r . B ^ p ) ,
12- /* 2 */ ( r , p ) => ( r . B = combo ( p , r ) % 8n ) ,
13- /* 3 */ ( r , p ) => r . A && ( r . ip = Number ( p ) - 2 ) ,
14- /* 4 */ r => ( r . B = r . B ^ r . C ) ,
15- /* 5 */ ( r , p ) => r . out . push ( Number ( combo ( p , r ) % 8n ) ) ,
16- /* 6 */ ( r , p ) => ( r . B = r . A / 2n ** combo ( p , r ) ) ,
17- /* 7 */ ( r , p ) => ( r . C = r . A / 2n ** combo ( p , r ) ) ,
6+ ( r , p ) => ( r . A = r . A / 2n ** combo ( p , r ) ) ,
7+ ( r , p ) => ( r . B = r . B ^ p ) ,
8+ ( r , p ) => ( r . B = combo ( p , r ) % 8n ) ,
9+ ( r , p ) => r . A && ( r . ip = Number ( p ) - 2 ) ,
10+ r => ( r . B = r . B ^ r . C ) ,
11+ ( r , p ) => r . out . push ( Number ( combo ( p , r ) % 8n ) ) ,
12+ ( r , p ) => ( r . B = r . A / 2n ** combo ( p , r ) ) ,
13+ ( r , p ) => ( r . C = r . A / 2n ** combo ( p , r ) ) ,
1814] ;
1915
2016function run ( program , registers ) {
@@ -25,7 +21,7 @@ function run(program, registers) {
2521 opcodes [ op ] ( registers , param ) ;
2622 registers . ip += 2 ;
2723 }
28- return registers ;
24+ return registers . out . join ( "," ) ;
2925}
3026
3127function parse ( input ) {
@@ -36,7 +32,7 @@ function parse(input) {
3632 return { program, registers } ;
3733}
3834
39- // in general the program always:
35+ // In general the program always:
4036// 1) does calculations on A, ignoring B and C
4137// 2) A = A / 8
4238// 3) output the calculated value
@@ -48,9 +44,9 @@ function parse(input) {
4844// 3) Repeat until it outputs the whole program
4945function solve2 ( program , r ) {
5046 for ( let i = 0n ; i < 8n ; i ++ ) {
51- const { out } = run ( program , { ...r , A : r . A + i } ) ;
52- if ( program . join ( "," ) . endsWith ( out . join ( "," ) ) ) {
53- if ( out . length === program . length ) return r . A + i ;
47+ const out = run ( program , { ...r , A : r . A + i } ) ;
48+ if ( program . join ( "," ) === out ) return r . A + i ;
49+ if ( program . join ( "," ) . endsWith ( out ) ) {
5450 const result = solve2 ( program , { ...r , A : ( r . A + i ) * 8n } ) ;
5551 if ( result ) return result ;
5652 }
@@ -59,7 +55,7 @@ function solve2(program, r) {
5955
6056export function part1 ( input ) {
6157 const { program, registers } = parse ( input ) ;
62- return run ( program , registers ) . out . join ( "," ) ;
58+ return run ( program , registers ) ;
6359}
6460
6561export function part2 ( input ) {
0 commit comments