From 5b926491c414548e98952136594f258d41484197 Mon Sep 17 00:00:00 2001 From: gnomerd Date: Sun, 15 Dec 2019 01:02:20 +0100 Subject: [PATCH] Fixing the intcode compiler thing --- 2019/Day2/Part1.cs | 44 +++++++++++++-------- 2019/Day2/Part2.cs | 17 ++++---- 2019/Day2/Program.cs | 39 ++++++++++-------- 2019/Day2/bin/Debug/netcoreapp2.2/Day2.dll | Bin 7680 -> 8192 bytes 2019/Day2/bin/Debug/netcoreapp2.2/Day2.pdb | Bin 1840 -> 1892 bytes 2019/Day2/input.txt | 2 +- 2019/Day2/obj/Debug/netcoreapp2.2/Day2.dll | Bin 7680 -> 8192 bytes 2019/Day2/obj/Debug/netcoreapp2.2/Day2.pdb | Bin 1840 -> 1892 bytes 8 files changed, 58 insertions(+), 44 deletions(-) diff --git a/2019/Day2/Part1.cs b/2019/Day2/Part1.cs index bb584cc..48c5198 100644 --- a/2019/Day2/Part1.cs +++ b/2019/Day2/Part1.cs @@ -24,40 +24,50 @@ namespace Part1 { } public dynamic runopcode( int[] array, int i, vars.intcode opcode ) { - int writepos; + int[] output = array; // CREATE NEW INSTANCE + int writepos = output[i+3]; + int mod1 = output[ output[i+1] ]; + int mod2 = output[ output[i+2] ]; - if( opcode == vars.intcode.ADD ) { + if( writepos >= output.Length ) { + Console.WriteLine( "[Warning] Tried to write at non-existent address ({0}/{1})", writepos, output.Length ); + writepos = output.Length - 1; // just write it at the end of the program + } - int sum = array[array[i+1]] + array[array[i+2]]; // get the two values - writepos = Math.Clamp( array[i+3], 0, array.Length - 1 ); // get the write pos - Debug( "ADD (" + i.ToString() + "/" + array.Length.ToString() + ") " + "Sum=" + sum.ToString() + " at i=" + writepos.ToString() ); + Console.WriteLine( "Mod1: {0}, Mod2: {1}, Writepos: {2}, mod1loc: {3}, mod2loc: {4}", mod1, mod2, writepos, output[i+1], output[i+2] ); + + if( opcode == vars.intcode.ADD ) { - array[writepos] = sum; // write the value + Debug( "ADD (" + i.ToString() + "/" + output.Length.ToString() + ") " + "Sum=" + (mod1 + mod2).ToString() + " at i=" + writepos.ToString() ); + output[writepos] = mod1 + mod2; // write the value } else if( opcode == vars.intcode.MULT ) { - - int product = array[array[i+1]] * array[array[i+2]]; // get the product - writepos = Math.Clamp( array[i+3], 0, array.Length - 1 ); - Debug( "MULT (" + i.ToString() + "/" + array.Length.ToString() + ") " + "Product=" + product.ToString() + " at i=" + writepos.ToString() ); - array[writepos] = product; // write the value + Debug( "MULT (" + i.ToString() + "/" + output.Length.ToString() + ") " + "Product=" + (mod1 * mod2).ToString() + " at i=" + writepos.ToString() ); + output[writepos] = mod1 * mod2; // write the value } else if ( opcode == vars.intcode.STOP ) { - Debug( "STOP (" + i.ToString() + "/" + array.Length.ToString() + ")" ); + Debug( "STOP (" + i.ToString() + "/" + output.Length.ToString() + ")" ); } - return array; + return output; } public int[] intcode( int[] input ) { int[] output = input; // make an instanse of the input where we can change stuff - Debug( "\n----Running Intcode----" ); + + Console.Write( "\nRunning: " ); + for( int c = 0; c < input.Length; c++ ){ Console.Write( input[c].ToString() + "," ); } + + Debug( "\n----DEBUG----" ); for( int i = 0; i < output.Length; i+= NEXT ) { - vars.intcode opcode = getOpcode(input[i]); - output = runopcode( output, i, opcode ); + if( i+3 < output.Length ) { + vars.intcode opcode = getOpcode(input[i]); + output = runopcode( output, i, opcode ); + } if( (int)output[i] == 99 ) { break; } } - Debug( "----Intcode finished----\n" ); + Debug( "----END-OF-DEBUG----\n" ); return output; } } diff --git a/2019/Day2/Part2.cs b/2019/Day2/Part2.cs index 2c32aa6..fe24673 100644 --- a/2019/Day2/Part2.cs +++ b/2019/Day2/Part2.cs @@ -4,29 +4,28 @@ namespace Part2 { public class calcInputs { public void bruteforce( int[] input, int find ) { int noun, verb; - int[] input_c = input; // keep a version of the original - int[] output = new int[input_c.Length]; + int[] input_c; // keep a version of the original + int[] output = new int[input.Length]; bool success = false; int min = 0; // min and max for the input values - int max = 99; // + int max = 6; // Part1.compile compile = new Part1.compile(); for( int i = 0; i < max + 1; i++ ) { - input = input_c; // reset the intcode + input_c = input; // reset the intcode noun = Math.Clamp( i, min, max ); verb = Math.Clamp( i, min, max ); - input[1] = noun; - input[2] = verb; + input_c[1] = noun; + input_c[2] = verb; - Console.WriteLine( "Checking: {0}, {1} for {2}", noun, verb, find ); - output = compile.intcode( input ); + output = compile.intcode( input_c ); - Console.WriteLine( input[0] ); + Console.WriteLine( input_c[0] ); if( output[0] == find ) { Console.WriteLine( "({0}) Found: {1}, {2}", find, noun, verb ); success = true; diff --git a/2019/Day2/Program.cs b/2019/Day2/Program.cs index d490361..8e85346 100644 --- a/2019/Day2/Program.cs +++ b/2019/Day2/Program.cs @@ -13,29 +13,34 @@ namespace Day2 { Part1.compile compile = new Part1.compile(); - //// Part 1 stuff //// - intcodes[1] = 12; - intcodes[2] = 2; - - output = compile.intcode( intcodes ); // run the intcode program - - Console.WriteLine("\n--Intcode result--"); - for( int i = 0; i < output.Length; i++ ) { - if( i != output.Length - 1 ) { - Console.Write( output[i].ToString() + "," ); - } else { - Console.Write( output[i].ToString() + "\n" ); - } - } - Console.WriteLine( "--End of Intcode result--\n" ); + // //// Part 1 stuff //// + // intcodes[1] = 12; + // intcodes[2] = 2; + + // output = compile.intcode( intcodes ); // run the intcode program - Console.WriteLine( "Part 1 result: " + output[0].ToString() ); // get the pos 0 + // Console.WriteLine("\n--Intcode result--"); + // for( int i = 0; i < output.Length; i++ ) { + // if( i != output.Length - 1 ) { + // Console.Write( output[i].ToString() + "," ); + // } else { + // Console.Write( output[i].ToString() + "\n" ); + // } + // } + // Console.WriteLine( "--End of Intcode result--\n" ); + + // Console.WriteLine( "Part 1 result: " + output[0].ToString() ); // get the pos 0 //// Part 2 stuff //// Part2.calcInputs calcInputs = new Part2.calcInputs(); - calcInputs.bruteforce( intcodes, 9801 ); + int[] intcodes2 = intcodes; // make a new instance of it + for( int c = 0; c < intcodes2.Length; c++ ){ + Console.Write( intcodes2[c].ToString() + "," ); + } + Console.WriteLine(""); + calcInputs.bruteforce( intcodes2, 16 ); } } } diff --git a/2019/Day2/bin/Debug/netcoreapp2.2/Day2.dll b/2019/Day2/bin/Debug/netcoreapp2.2/Day2.dll index 49a8f623d790e0597c6c2a9bf5a727d8c13db22b..a1bbfc95110ff041909ca590389bd6e37715b8ae 100644 GIT binary patch delta 2587 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 diff --git a/2019/Day2/bin/Debug/netcoreapp2.2/Day2.pdb b/2019/Day2/bin/Debug/netcoreapp2.2/Day2.pdb index d3a5ccc3b47e533054ae2c1ec8d882dcf3ba229a..977c9398271978cddc74e863c5f8379dc7c99a22 100644 GIT binary patch literal 1892 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 diff --git a/2019/Day2/obj/Debug/netcoreapp2.2/Day2.pdb b/2019/Day2/obj/Debug/netcoreapp2.2/Day2.pdb index d3a5ccc3b47e533054ae2c1ec8d882dcf3ba229a..977c9398271978cddc74e863c5f8379dc7c99a22 100644 GIT binary patch literal 1892 zcmYjSTWpk75T2Pm{rA$cEVcI*x@A%By>VCM(rtlawS}dM;ks;BSnclC?rx=#%Pws~ zf*O&81br|;ja(99G-@>A7B2)|d_W<@2V#uGpy-P+B2o04f4AB{nK?6O=FItK=A84l zh1Rw)G3i$V>S=HD54AKl+Y@Bb9tfL3fu6n{I(Gv!O`z{1`U|7l1EKU_EU`1C_T3I5 zqjS9>+5>ro%By=j+cBPnei9UD>rZMh=MMv0Yd^TN@<@Abk?Z4;%?p;#I|U@xQ;S1Ri0bV{adJnVujoNlyr&J9p0y#llaD5Uh ze%B=|bd#BGV`O>`R*h9&h^2enX9tyvgBF8+0==Qz+8@(#2g75mrl&Ehx(obi$V)&D z?COTD-?@T533?4=lofd(dcm&Poa6Lz=&o`4w+Q2gUQzJ>6?WAtp?e`~BUP`0z83P~ zf?f@M3uMLQfxV`%ej@Y<<8<9$zg-}vFu2fCa0ey84b22ELgf^-_QpwmaH2&ZCPgcD zUSs}GV5W%Xfm@UTciItL)B>68m`ojzwDP)(_H=CC56NMB7SU9lhEFLxb-Zn#2tVwX zfxyuBv>ozCd=Y%2dU7yN_DGZd%q%leH z@NOGA*qw^1f3}|XJ$~?yWM^b#{`R{&)-Au}{Cd*i5MAtkTaKSxzb*6SYv(&Y{KS9s z`CIGHby4u$6_V^cG17d!yL0#^S)t)nIvRK9hsMrs!^|$TD;bZPXn(lh)iaoUHX2E% zO2U0Z(L_4=jHY8+n_HHc_V9442lkzV;do;t$RMF+rsWcvj1z@emS~dJUZl3= zVLkmj^Qp~1Y86@%dr2eH4CyT;YHD|S(?2o&+3idWKDMkUOx#|(`0qPS~TOJ zp;cNH+)MSqza#sKS=mSRwu{-1K;$hL+hIInTK+dWaBaPXx~yVaBTd14Sg*mOfDJ0S zgaaJpU6MT{x%(ss?#amA3KR+TqAu1%&cS1D22tMeO8ZU`~2ZMg|?@!W`%=|Owd}q$w&iT7z zd%BsJbX0-{d%Gi39j)!o1X=Vlgl9obgJZ{Z?gvmrpua-&0NGwXt;H_Yz2GSzlsq`q z2VKX{t{#G32l*qA1w^&GuD*Ha>9x>(^YjwTsJ;kzt>0_z`eNvpAfE;Kv0mfad&kvl zp)Z6y?doCZiyd+0d0A@#3<`oS$H9-?N*hNz*XQoqfEiT5!5ji7$9_3S;#5zqE&@is^{o96ffoG8j;E3|PT72#(&G~}Vdp1+ z%IR{JUd)W=l9P58%ZWrXo25iNm58d1Y}r(nCNuU}K9MV{Wao2Oq;&ixoal_-!b|@f z{WSFS+52`hQCffW!Lj{2=Dc^R-;B|XeV63J%R@)1^-VWP0P%odK+$$i&mFiLAekmaJ%K*|>FA&A`yZt2d*YM>^W({xt{g-TU>b|4!io zdW)?lrgrIBK-&!(p-*TPtu|<>wFVWdwovSlAmb}_uEpSf`Xzw;>dkqIX@zv)rWq)k znbu0Qj#y^&b_AK8l)R&&Ib;TRB;RkL?MHCa4Xq2tofB8kh5*i4ttAI)83*|g7cO$K zl8ZfDy3Vt0GJ8;FS6R5Xg>PAqi@|s%*NN}~kHRZ9)?8~Xo_gc=i`x#L9C&-A=jLBq z=4S5}F6#qPv5qNhnuMAK5!4#=N~N+YjminqZ#19^IK7n->^2WI7~Hi60Sg(RoCNe5 zbZ(>CcwAGlMD*Fxz}p$mMXZh%3anb9nXyhI+>y-|vULLQoR`8a2sf-5b+)uJA|75q zUI%SXM>xPCuICXhoZ-UzT)4x9zq$Ch%;u$7E2Sr#m^P@5KJ4V;r133DUv4%eW}OQi=6XmvW7mdSp+Sy~uHi8Y0nl9%sh zidf&Af@}eXKS#US6{1ao!WCwPMl}f7H8U19P!JEYzI(k)>rF?s3p=N<s