76 lines
2.0 KiB
Nim
76 lines
2.0 KiB
Nim
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
|