import input_type import map_type import sequtils import turtle_type #import instruction_sets/eight_bit #import instruction_sets/ten_bit import instruction_sets/any_bit proc compareTurtles*(left, right: Turtle): int = -cmp(left.score, right.score) # general: proc genTurtle*(input: Input): Turtle = if input.instruction_set == "anybit": return genAnybitTurtle(input, input.bits) else: raise newException(Defect, "Unknown instruction set.") proc executeInstruction(instructionIndex: int, turtle: Turtle, map: Map, input: Input): int = if input.instruction_set == "anybit": return executeAnybit(instructionIndex.uint32, turtle, map, input, input.bits) else: raise newException(Defect, "Unknown instruction set.") proc execute*(turtle: Turtle, map: Map, input: Input) = let treasures = map.getTreasures() # back to start turtle.y = input.size div 2 turtle.x = input.size div 2 turtle.path.xs = @[] turtle.path.ys = @[] turtle.score = 0 turtle.found = repeat(false, treasures.len()) # save turtle original code let turtleOriginalCode = turtle.memory template tpath: Path = turtle.path proc markLocation: bool = tpath.xs.add(turtle.x) tpath.ys.add(turtle.y) if map[turtle.y][turtle.x] == tileTreasure: for i in 0..treasures.high(): let treasure = treasures[i] if treasure[0] == turtle.x and treasure[1] == turtle.y: turtle.found[i] = true if turtle.found.allIt(it): return true return false discard markLocation() var instructionNumber = 0 var instructionIndex = 0 while instructionNumber < input.lifetime: instructionIndex = executeInstruction(instructionIndex, turtle, map, input) if instructionIndex == -1: # out of bounds of map break if turtle.y != tpath.ys[tpath.ys.high()] or turtle.x != tpath.xs[tpath.xs.high()]: if markLocation(): break inc instructionNumber turtle.steps = instructionNumber # restore original code turtle.memory = turtleOriginalCode