@@ -14,6 +14,8 @@ namespace AdventOfCode.Y2025.Day10;
1414
1515record Problem ( int target , int [ ] buttons , int [ ] jolts ) ;
1616
17+ record Equation ( int [ ] buttonIndices , int sum ) ;
18+
1719[ ProblemName ( "Factory" ) ]
1820class Solution : Solver {
1921
@@ -41,16 +43,12 @@ public object PartOne(string input) {
4143
4244 public object PartTwo ( string input ) {
4345 var res = 0L ;
44- var i = 1 ;
4546 foreach ( var p in Parse ( input ) ) {
46- Console . WriteLine ( i + " " + p . buttons . Length + " " + p . jolts . Length ) ;
47- i ++ ;
47+ var s = Solve ( p ) ;
48+ Console . WriteLine ( s ) ;
49+ res += s ;
4850 }
49- return res ;
50- }
51-
52- bool TooMuch ( Problem p , int [ ] state ) {
53- return Enumerable . Range ( 0 , state . Length ) . Any ( i => state [ i ] > p . jolts [ i ] ) ;
51+ return 0 ;
5452 }
5553
5654 int Xor ( int [ ] buttons , int mask ) {
@@ -66,35 +64,84 @@ int Xor(int[] buttons, int mask) {
6664 return res ;
6765 }
6866
69- int Solve ( Problem p , int pushes , int [ ] state ) {
70- if ( pushes > 11 ) {
71- return int . MaxValue ;
67+ Dictionary < string , int > cache ;
68+
69+ int Solve ( Problem p ) {
70+ var equations = new List < Equation > ( ) ;
71+ for ( int i = 0 ; i < p . jolts . Length ; i ++ ) {
72+ var jolt = p . jolts [ i ] ;
73+ var buttonIndices = new List < int > ( ) ;
74+ for ( var buttonIndex = 0 ; buttonIndex < p . buttons . Length ; buttonIndex ++ ) {
75+ var button = p . buttons [ buttonIndex ] ;
76+ if ( ( button & 1 << i ) != 0 ) {
77+ buttonIndices . Add ( buttonIndex ) ;
78+ }
79+ }
80+ equations . Add ( new Equation ( buttonIndices . ToArray ( ) , jolt ) ) ;
7281 }
82+ Console . WriteLine ( p . target + " " + equations . Count ) ;
7383
74- if ( Array . Equals ( state , p . jolts ) ) {
75- return pushes ;
84+ return SolveEquations ( equations ) ;
85+ }
86+
87+ int SolveEquations ( List < Equation > equations ) {
88+ // [.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}
89+
90+ if ( equations . Count == 0 ) {
91+ return 0 ;
7692 }
7793
78- if ( Enumerable . Range ( 0 , state . Length ) . Any ( i => state [ i ] > p . jolts [ i ] ) ) {
79- return int . MaxValue ;
80- }
94+ var res = int . MaxValue / 2 ;
95+ var eq = equations . MinBy ( eq => eq . buttonIndices . Length ) ;
96+ var q = Choose ( eq . sum , eq . buttonIndices , new int [ 20 ] ) . ToArray ( ) ;
97+
98+ foreach ( var xs in q ) {
8199
82- var res = int . MaxValue ;
83- for ( int i = 0 ; i < p . buttons . Length ; i ++ ) {
84- var stateT = Push ( state , p . buttons [ i ] ) ;
85- var m = Solve ( p , pushes + 1 , stateT ) ;
86- if ( m < res ) {
87- res = m ;
100+ var substitutedEquations =
101+ equations . Select ( eqT => Substitute ( eqT , eq . buttonIndices , xs ) ) . ToArray ( ) ;
102+
103+ if ( substitutedEquations . Any ( eq => eq . sum < 0 ) ||
104+ substitutedEquations . Any ( eq => eq . sum > 0 && ! eq . buttonIndices . Any ( ) )
105+ ) {
106+ continue ;
107+ }
108+
109+ var remainingEquations = substitutedEquations . Where ( eq =>
110+ eq . sum != 0 || eq . buttonIndices . Any ( )
111+ ) . ToArray ( ) ;
112+
113+ var cur = xs . Sum ( ) + SolveEquations ( remainingEquations . ToList ( ) ) ;
114+ if ( cur < res ) {
115+ res = cur ;
88116 }
89117 }
90118 return res ;
91119 }
92120
93- int [ ] Push ( int [ ] state , int button ) {
121+ Equation Substitute ( Equation eq , int [ ] indices , int [ ] values ) {
122+ var sum = eq . sum ;
123+ var remainingIndices = eq . buttonIndices . ToList ( ) ;
124+ for ( int i = 0 ; i < indices . Length ; i ++ ) {
125+ var index = indices [ i ] ;
126+ var value = values [ index ] ;
127+ if ( remainingIndices . Contains ( index ) ) {
128+ remainingIndices . Remove ( index ) ;
129+ sum -= value ;
130+ }
131+ }
132+ return new Equation ( remainingIndices . ToArray ( ) , sum ) ;
133+ }
134+
135+
136+ bool TooMuch ( Problem p , int [ ] state ) {
137+ return Enumerable . Range ( 0 , p . jolts . Length ) . Any ( i => state [ i ] > p . jolts [ i ] ) ;
138+ }
139+
140+ int [ ] Push ( int [ ] state , int button , int n ) {
94141 var res = state . ToArray ( ) ;
95142 for ( int i = 0 ; i < state . Length ; i ++ ) {
96143 if ( ( button & ( 1 << i ) ) != 0 ) {
97- res [ i ] ++ ;
144+ res [ i ] += n ;
98145 }
99146 }
100147 return res ;
@@ -142,4 +189,20 @@ from part in parts[1..^1]
142189 }
143190 }
144191
192+ IEnumerable < int [ ] > Choose ( int s , int [ ] indices , int [ ] acc ) {
193+ if ( indices . Length == 1 ) {
194+ acc = acc . ToArray ( ) ;
195+ acc [ indices [ 0 ] ] = s ;
196+ yield return acc ;
197+ yield break ;
198+ }
199+ for ( int i = 0 ; i <= s ; i ++ ) {
200+ foreach ( var v in Choose ( s - i , indices [ 1 ..] . ToArray ( ) , acc ) ) {
201+ var vT = v . ToArray ( ) ;
202+ vT [ indices [ 0 ] ] = i ;
203+ yield return vT ;
204+ }
205+ }
206+ }
207+
145208}
0 commit comments