My solution in C#
Tried to make it look decent with the Operation enum and an Instruction class:
usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.IO;usingSystem.Linq;usingSystem.Text;namespaceAdventOfCode2020{enumOperation{nop,acc,jmp}classInstruction{publicOperationOperation{get;set;}publicintArgument{get;set;}publicboolIsExecuted{get;set;}}staticclassDay8{staticList<Instruction>Instructions=newList<Instruction>();staticintaccumulator=0;staticintinstructionPosition=0;//InstructionChanged is used to show which instruction had to be changedstaticInstructionInstructionChanged;publicstaticvoidExecute(){List<string>input=newList<string>(File.ReadAllLines("C:\\Users\\DirkFraanje\\Documents\\adventofcodeday8.txt"));//Added a imer just for funvartimer=newStopwatch();timer.Start();//First create a nice list of instructions from the inputfileforeach(varinstructionininput){Instructions.Add(CreateNewInstruction(instruction));}//Run recursive method to find the instruction that has to be changedFindInstructionToChange();//Stop the timer, show the answer and just for fun the instruction that has to be changedtimer.Stop();Console.WriteLine($"Answer: {accumulator} ");Console.WriteLine($"Instruction to change: {InstructionChanged.Operation} {InstructionChanged.Argument}");Console.WriteLine($"Executed in: {timer.ElapsedMilliseconds} milliseconds");}privatestaticvoidFindInstructionToChange(){vari=0;while(true){varinstruction=Instructions[i];switch(Instructions[i].Operation){caseOperation.nop:instruction.Operation=Operation.jmp;if(RunBootCodeSuccesful()){//Before returning the answer change the answer back to it's original Operation so it can be showed in the consoleinstruction.Operation=Operation.nop;InstructionChanged=instruction;return;}elseinstruction.Operation=Operation.nop;break;caseOperation.acc:break;caseOperation.jmp:instruction.Operation=Operation.nop;if(RunBootCodeSuccesful()){//Before returning the answer change the answer back to it's original Operation so it can be showed in the consoleinstruction.Operation=Operation.jmp;InstructionChanged=instruction;return;}elseinstruction.Operation=Operation.jmp;break;default:break;}i++;//Reset everything to it's defaultaccumulator=0;instructionPosition=0;Instructions.ForEach(x=>x.IsExecuted=false);}}privatestaticboolRunBootCodeSuccesful(){while(true){varinstruction=Instructions[instructionPosition];switch(instruction.Operation){caseOperation.nop:instructionPosition++;break;caseOperation.acc:accumulator+=instruction.Argument;instructionPosition++;break;caseOperation.jmp:instructionPosition+=instruction.Argument;break;default:break;}instruction.IsExecuted=true;if(instructionPosition>Instructions.Count-1)returntrue;varnextInstruction=Instructions[instructionPosition];if(nextInstruction.IsExecuted)returnfalse;}}staticInstructionCreateNewInstruction(stringinstructionline){varinstruction=newInstruction();varsplitOperationAndArgument=instructionline.Split('');switch(splitOperationAndArgument[0]){case"nop":instruction.Operation=Operation.nop;break;case"acc":instruction.Operation=Operation.acc;break;case"jmp":instruction.Operation=Operation.jmp;break;default:break;}instruction.Argument=int.Parse(splitOperationAndArgument[1]);returninstruction;}}}
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
My solution in C#
Tried to make it look decent with the Operation enum and an Instruction class: