12
12
string [ ] rawChunks = File . ReadAllText ( args [ 0 ] ) . Trim ( ) . Split ( "\n \n " ) ;
13
13
List < int > registers = rawChunks [ 0 ] . Split ( "\n " ) . Select ( l => int . Parse ( l . Split ( ": " ) [ 1 ] ) ) . ToList ( ) ;
14
14
List < int > program = rawChunks [ 1 ] . Split ( " " ) [ 1 ] . Split ( "," ) . Select ( int . Parse ) . ToList ( ) ;
15
+ Machine machine = new Machine ( registers , program ) ;
15
16
16
- var machine = new Machine { Registers = registers , Program = program } ;
17
- List < int > output = machine . Run ( ) ;
17
+ {
18
+ List < int > output = machine . Copy ( ) . Run ( ) ;
19
+ Console . WriteLine ( $ "Part 1: { string . Join ( "," , output ) } ") ;
20
+ }
18
21
19
- Console . WriteLine ( $ "{ machine } ") ;
20
- Console . WriteLine ( $ "Part 1: { string . Join ( "," , output ) } ") ;
22
+ for ( int i = 0 ; ; i ++ )
23
+ {
24
+ if ( i % 10_000_000 == 0 ) {
25
+ Console . WriteLine ( $ " (searching { i } ...)") ;
26
+ }
27
+ machine . Registers [ 0 ] = i ;
28
+ List < int > output = machine . Copy ( ) . Run ( ) ;
29
+ if ( output . SequenceEqual ( machine . Program ) )
30
+ {
31
+ Console . WriteLine ( $ "Part 2: { i } ") ;
32
+ break ;
33
+ }
34
+ }
21
35
22
36
return 0 ;
23
37
@@ -26,6 +40,12 @@ public class Machine
26
40
public List < int > Registers ;
27
41
public List < int > Program ;
28
42
43
+ public Machine ( List < int > registers , List < int > program )
44
+ {
45
+ Registers = registers ;
46
+ Program = program ;
47
+ }
48
+
29
49
public List < int > Run ( )
30
50
{
31
51
var outputs = new List < int > ( ) ;
@@ -35,7 +55,7 @@ public List<int> Run()
35
55
int operand = Program [ i + 1 ] ;
36
56
int combo = operand >= 4 && operand < 7 ? Registers [ operand - 4 ] : operand ;
37
57
bool jumped = false ;
38
- Console . WriteLine ( $ "{ ( new string [ ] { "adv" , "bxl" , "bst" , "jnz" , "bxc" , "out" , "bdv" , "cdv" } ) [ opcode ] } { operand } : { string . Join ( "" , Program . Take ( i ) ) } \x1B [4m{ Program [ i ] } \x1B [0m{ string . Join ( "" , Program . Skip ( i + 1 ) ) } - { string . Join ( "," , Registers ) } ") ;
58
+ // Console.WriteLine($"{(new string[] {"adv", "bxl", "bst", "jnz", "bxc", "out", "bdv", "cdv"})[opcode]} {operand}: {string.Join("", Program.Take(i))}\x1B[4m{Program[i]}\x1B[0m{string.Join("", Program.Skip(i + 1))} - {string.Join(",", Registers)}");
39
59
switch ( opcode )
40
60
{
41
61
case 0 : // adv (A divide)
@@ -75,5 +95,7 @@ public List<int> Run()
75
95
return outputs ;
76
96
}
77
97
78
- public override string ToString ( ) => $ "Program: { string . Join ( "," , Program ) } , Registers: { string . Join ( "," , Registers ) } ";
98
+ public Machine Copy ( ) => new Machine ( Registers . ToList ( ) , Program . ToList ( ) ) ;
99
+
100
+ public override string ToString ( ) => $ "Registers: { string . Join ( "," , Registers ) } , Program: { string . Join ( "," , Program ) } ";
79
101
}
0 commit comments