class Cell:
x : int = None
y : int = None
size : int = None
color : str = None
def __init__(self, x, y, size, color):
self.x = x
self.y = y
self.size = size
self.color = color
class Map:
height : int = None
width : int = None
get: list = None
def __init__(self, height, width, size, color='white'):
self.height = height
self.width = width
self.get = [[] for i in range(height)]
for y in range(height):
for x in range(width):
self.get[y].append(Cell(x, y, size, color))
def directionFromAngle(angle): # Function returns (x, y)
if angle == 0:
return (0, 1)
elif angle == 90:
return (1, 0)
elif angle == 180:
return (0, -1)
elif angle == 270:
return (-1, 0)
else:
return None
class Ant(Cell):
direction : tuple = None
angle : int = None
field : Map = None
left_color : str = None
right_color : str = None
def __init__(self, x, y, size, angle, field, color='green', left_color='black', right_color='white'):
Cell.__init__(self, x, y, size, right_color)
self.angle = angle
self.direction = directionFromAngle(self.angle)
self.field = field
self.left_color = left_color
self.right_color = right_color
def next(self):
if self.field.get[self.y][self.x].color == self.right_color:
self.angle = 0 if self.angle + 90 == 360 else self.angle + 90 # Because angle must be 0 not 0
self.field.get[self.y][self.x].color = self.left_color
elif self.field.get[self.y][self.x].color == self.left_color:
self.angle = 0 if self.angle - 90 == 360 else self.angle - 90
self.field.get[self.y][self.x].color = self.right_color
self.x += self.direction[0]
self.y += self.direction[1]
self.direction = directionFromAngle(self.angle)
Y2xhc3MgQ2VsbDoKICAgIHggOiBpbnQgPSBOb25lCiAgICB5IDogaW50ID0gTm9uZQogICAgc2l6ZSA6IGludCA9IE5vbmUKICAgIGNvbG9yIDogc3RyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5LCBzaXplLCBjb2xvcik6CiAgICAgICAgc2VsZi54ID0geAogICAgICAgIHNlbGYueSA9IHkKICAgICAgICBzZWxmLnNpemUgPSBzaXplCiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yCgpjbGFzcyBNYXA6CiAgICBoZWlnaHQgOiBpbnQgPSBOb25lCiAgICB3aWR0aCA6IGludCA9IE5vbmUKICAgIGdldDogbGlzdCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVpZ2h0LCB3aWR0aCwgc2l6ZSwgY29sb3I9J3doaXRlJyk6CiAgICAgICAgc2VsZi5oZWlnaHQgPSBoZWlnaHQKICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKICAgICAgICBzZWxmLmdldCA9IFtbXSBmb3IgaSBpbiByYW5nZShoZWlnaHQpXQogICAgICAgIGZvciB5IGluIHJhbmdlKGhlaWdodCk6CiAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKHdpZHRoKToKICAgICAgICAgICAgICAgIHNlbGYuZ2V0W3ldLmFwcGVuZChDZWxsKHgsIHksIHNpemUsIGNvbG9yKSkKCmRlZiBkaXJlY3Rpb25Gcm9tQW5nbGUoYW5nbGUpOiAjIEZ1bmN0aW9uIHJldHVybnMgKHgsIHkpCiAgICBpZiBhbmdsZSA9PSAwOgogICAgICAgIHJldHVybiAoMCwgMSkKICAgIGVsaWYgYW5nbGUgPT0gOTA6CiAgICAgICAgcmV0dXJuICgxLCAwKQogICAgZWxpZiBhbmdsZSA9PSAxODA6CiAgICAgICAgcmV0dXJuICgwLCAtMSkKICAgIGVsaWYgYW5nbGUgPT0gMjcwOgogICAgICAgIHJldHVybiAoLTEsIDApCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lCgoKY2xhc3MgQW50KENlbGwpOgogICAgZGlyZWN0aW9uIDogdHVwbGUgPSBOb25lCiAgICBhbmdsZSA6IGludCA9IE5vbmUKICAgIGZpZWxkIDogTWFwID0gTm9uZQogICAgbGVmdF9jb2xvciA6IHN0ciA9IE5vbmUKICAgIHJpZ2h0X2NvbG9yIDogc3RyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5LCBzaXplLCBhbmdsZSwgZmllbGQsIGNvbG9yPSdncmVlbicsIGxlZnRfY29sb3I9J2JsYWNrJywgcmlnaHRfY29sb3I9J3doaXRlJyk6CiAgICAgICAgQ2VsbC5fX2luaXRfXyhzZWxmLCB4LCB5LCBzaXplLCByaWdodF9jb2xvcikKICAgICAgICBzZWxmLmFuZ2xlID0gYW5nbGUKICAgICAgICBzZWxmLmRpcmVjdGlvbiA9IGRpcmVjdGlvbkZyb21BbmdsZShzZWxmLmFuZ2xlKQogICAgICAgIHNlbGYuZmllbGQgPSBmaWVsZAogICAgICAgIHNlbGYubGVmdF9jb2xvciA9IGxlZnRfY29sb3IKICAgICAgICBzZWxmLnJpZ2h0X2NvbG9yID0gcmlnaHRfY29sb3IKCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpZWxkLmdldFtzZWxmLnldW3NlbGYueF0uY29sb3IgPT0gc2VsZi5yaWdodF9jb2xvcjoKICAgICAgICAgICAgc2VsZi5hbmdsZSA9IDAgaWYgc2VsZi5hbmdsZSArIDkwID09IDM2MCBlbHNlIHNlbGYuYW5nbGUgKyA5MCAjIEJlY2F1c2UgYW5nbGUgbXVzdCBiZSAwIG5vdCAwCiAgICAgICAgICAgIHNlbGYuZmllbGQuZ2V0W3NlbGYueV1bc2VsZi54XS5jb2xvciA9IHNlbGYubGVmdF9jb2xvcgogICAgICAgIGVsaWYgc2VsZi5maWVsZC5nZXRbc2VsZi55XVtzZWxmLnhdLmNvbG9yID09IHNlbGYubGVmdF9jb2xvcjoKICAgICAgICAgICAgc2VsZi5hbmdsZSA9IDAgaWYgc2VsZi5hbmdsZSAtIDkwID09IDM2MCBlbHNlIHNlbGYuYW5nbGUgLSA5MCAKICAgICAgICAgICAgc2VsZi5maWVsZC5nZXRbc2VsZi55XVtzZWxmLnhdLmNvbG9yID0gc2VsZi5yaWdodF9jb2xvcgogICAgIAogICAgICAgIHNlbGYueCArPSBzZWxmLmRpcmVjdGlvblswXQogICAgICAgIHNlbGYueSArPSBzZWxmLmRpcmVjdGlvblsxXQogICAgICAgIHNlbGYuZGlyZWN0aW9uID0gZGlyZWN0aW9uRnJvbUFuZ2xlKHNlbGYuYW5nbGUpCg==