37 lines
		
	
	
		
			619 B
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			619 B
		
	
	
	
		
			Crystal
		
	
	
	
	
	
| def parse(input)
 | |
|   input.lines.map do |s|
 | |
|     code, int = s.split(" ")
 | |
|     {code, int.to_i32}
 | |
|   end
 | |
| end
 | |
| 
 | |
| def run(prog)
 | |
|   acc = 0
 | |
|   pc = 0
 | |
|   visited = Set(Int32).new
 | |
|   input = Channel(Int32).new
 | |
|   output = Channel({Symbol, Int32}).new
 | |
|   spawn do
 | |
|     loop do
 | |
|       if pc >= prog.size
 | |
|         output.send({:term, acc})
 | |
|         break
 | |
|       elsif visited.includes? pc
 | |
|         output.send({:inf, acc})
 | |
|         break
 | |
|       end
 | |
| 
 | |
|       visited << pc
 | |
|       code, int = prog[pc]
 | |
|       case code
 | |
|       when "acc"
 | |
|         acc += int
 | |
|       when "jmp"
 | |
|         pc += int - 1
 | |
|       end
 | |
|       pc += 1
 | |
|     end
 | |
|   end
 | |
|   {input, output}
 | |
| end
 |