I ranked on the global leaderboard! Never thought I'd make it. Came in at 87th for both stars and 83rd for the first star.
Ruby solution for part 2
classIntCodedefinitialize(instructions)@instructions=instructions@ptr=0@in_buff=[]@out_buff=[]@rel_base=0@blocked=falseenddefsend_input(thing)@in_buff.push(thing)enddefread_output()return@out_buff.shift()enddefinspect()puts@instructions.to_sputs@out_buff.to_senddefisBlocked()return@blockedenddefread_mem(idx)ifidx<0puts"wat: negative index"endval=@instructions[idx]ifval==nil@instructions[idx]=0return0elsereturnvalendenddefwrite_mem(idx)enddefrun()@blocked=falsewhile@ptr<@instructions.lengthdo# puts @ptr, @instructions.to_sbase_op=read_mem(@ptr)# puts base_opop=base_op%100# get last 2 digitsflags=base_op/100# top n digitsarg1=read_value(@instructions,@ptr+1,flags%10)ifop==1flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)flags=flags/10arg3=read_value(@instructions,@ptr+3,flags%10)r=read_mem(arg1)+read_mem(arg2)@instructions[arg3]=r@ptr+=4elsifop==2flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)flags=flags/10arg3=read_value(@instructions,@ptr+3,flags%10)r=read_mem(arg1)*read_mem(arg2)@instructions[arg3]=r@ptr+=4elsifop==3if@in_buff.empty?# puts "waiting for input"@blocked=truereturnfalseendinput=@in_buff.shift()# puts "got input #{input}, putting in location #{arg1}"@instructions[arg1]=input.to_i@ptr+=2elsifop==4output=read_mem(arg1)@out_buff.push(output)# puts "output: #{output}"@ptr+=2elsifop==5flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)ifread_mem(arg1)!=0@ptr=read_mem(arg2)else@ptr+=3endelsifop==6flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)ifread_mem(arg1)==0@ptr=read_mem(arg2)else@ptr+=3endelsifop==7flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)flags=flags/10arg3=read_value(@instructions,@ptr+3,flags%10)ifread_mem(arg1)<read_mem(arg2)@instructions[arg3]=1else@instructions[arg3]=0end@ptr+=4elsifop==8flags=flags/10arg2=read_value(@instructions,@ptr+2,flags%10)flags=flags/10arg3=read_value(@instructions,@ptr+3,flags%10)ifread_mem(arg1)==read_mem(arg2)@instructions[arg3]=1else@instructions[arg3]=0end@ptr+=4elsifop==9@rel_base+=read_mem(arg1)# puts "updated relative base to #{@rel_base}"@ptr+=2elsifop==99# puts "halting!"breakelseputs"wat"return@instructionsendendreturn@instructionsenddefread_value(instructions,arg,flag)ifflag==1returnargelsifflag==2v=read_mem(arg)+@rel_basereturnvelsereturnread_mem(arg)endendenddefpaint(vm)grid=[]grid[100]=[]grid[100][100]='#'# assume the bot starts at 100,100x=100y=100orientation='U'total_painted=0whiletrueifgrid[y]==nilgrid[y]=[]endcurrent_cell=grid[y][x]ifcurrent_cell==nil||current_cell=='.'current_cell=0elsecurrent_cell=1endvm.send_input(current_cell)vm.run()paint_color=vm.read_output()ifgrid[y][x]==niltotal_painted+=1endifpaint_color==0grid[y][x]='.'elsifpaint_color==1grid[y][x]='#'elseputs"wat"endnew_dir=vm.read_output()orientation=rotate(orientation,new_dir)pair=move(x,y,orientation)x=pair[0]y=pair[1]if!vm.isBlockedbreakendendreturngridenddefrotate(orientation,rotate)ifrotate==0# left aka ccwiforientation=='U'return'L'elsiforientation=='L'return'D'elsiforientation=='D'return'R'elsiforientation=='R'return'U'endelse# right aka cwiforientation=='U'return'R'elsiforientation=='R'return'D'elsiforientation=='D'return'L'elsiforientation=='L'return'U'endendenddefmove(x,y,dir)ifdir=='U'return[x,y-1]elsifdir=='R'return[x+1,y]elsifdir=='D'return[x,y+1]elsifdir=='L'return[x-1,y]endendif__FILE__==$0instructions=[]File.open(ARGV[0],"r")do|file_handle|file_handle.each_linedo|line|instructions=line.split(",").map{|n|n.to_i}breakendendvm=IntCode.new(instructions)g=paint(vm)g.eachdo|row|ifrow==nilnextend# puts row.to_srow.eachdo|n|ifn==nil||n=='.'print' 'elseprintnendendputs""endend
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.
I ranked on the global leaderboard! Never thought I'd make it. Came in at 87th for both stars and 83rd for the first star.
Ruby solution for part 2