Compare commits
2 commits
586fd80706
...
3cfe2a57b4
Author | SHA1 | Date | |
---|---|---|---|
3cfe2a57b4 | |||
20f789ed71 |
3 changed files with 308 additions and 0 deletions
|
@ -75,6 +75,7 @@ nest-asyncio==1.6.0
|
|||
notebook==7.3.2
|
||||
notebook_shim==0.2.4
|
||||
numpy==2.0.2
|
||||
nvidia-nccl-cu12==2.25.1
|
||||
opt_einsum==3.4.0
|
||||
optree==0.14.0
|
||||
overrides==7.7.0
|
||||
|
@ -137,3 +138,4 @@ Werkzeug==3.1.3
|
|||
wheel==0.45.1
|
||||
widgetsnbextension==4.0.13
|
||||
wrapt==1.17.2
|
||||
xgboost==2.1.4
|
||||
|
|
203
tasks/18 - decisions.ipynb
Normal file
203
tasks/18 - decisions.ipynb
Normal file
File diff suppressed because one or more lines are too long
103
tasks/19 - findpath.py
Normal file
103
tasks/19 - findpath.py
Normal file
|
@ -0,0 +1,103 @@
|
|||
from enum import Enum
|
||||
import numpy as np
|
||||
|
||||
|
||||
class Direction(Enum):
|
||||
UP = 0
|
||||
LEFT = 1
|
||||
RIGHT = 2
|
||||
DOWN = 3
|
||||
|
||||
|
||||
class Field(Enum):
|
||||
NOTHING = 0
|
||||
WIN = 1
|
||||
|
||||
def __str__(self) -> str:
|
||||
match self:
|
||||
case Field.NOTHING: return ""
|
||||
case Field.WIN: return ""
|
||||
case _: raise NotImplementedError("field type not implemented")
|
||||
|
||||
|
||||
class Player:
|
||||
x_pos: int
|
||||
y_pos: int
|
||||
|
||||
def __init__(self, start_x: int, start_y: int) -> None:
|
||||
self.x_pos = start_x
|
||||
self.y_pos = start_y
|
||||
|
||||
def __str__(self) -> str:
|
||||
return " "
|
||||
|
||||
|
||||
class Map:
|
||||
map: np.ndarray
|
||||
x: int
|
||||
y: int
|
||||
|
||||
def __init__(self, x: int, y: int) -> None:
|
||||
self.map = np.array([Field.NOTHING] * (x*y)).reshape(y, x)
|
||||
self.map[0][0] = Field.WIN
|
||||
self.map[-1][-1] = Field.WIN
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def make_player(self) -> Player:
|
||||
return Player(int(self.x/2), int(self.y/2))
|
||||
|
||||
def __str__(self) -> str:
|
||||
buf = "-" + "-" * (self.x * 3) + "\n"
|
||||
for row in self.map:
|
||||
for field in row:
|
||||
buf += (f"|{field} ")
|
||||
buf += ("|\n")
|
||||
buf += "-" + "-" * self.x * 3
|
||||
return buf
|
||||
|
||||
def render(self, player: Player) -> str:
|
||||
buf = "-" + "-" * self.x * 3 + "\n"
|
||||
for y, row in enumerate(self.map):
|
||||
for x, field in enumerate(row):
|
||||
if (player.x_pos, player.y_pos) == (x, y):
|
||||
buf += ("| ")
|
||||
else:
|
||||
buf += (f"|{field} ")
|
||||
buf += ("|\n")
|
||||
buf += "-" + "-" * self.x * 3
|
||||
return buf
|
||||
|
||||
def set_position(self, player: Player, x: int, y: int) -> bool:
|
||||
if not 0 <= x <= self.x and 0 <= y <= self.y:
|
||||
return False
|
||||
else:
|
||||
player.x_pos = x
|
||||
player.y_pos = y
|
||||
return True
|
||||
|
||||
def move(self, player: Player, direction: Direction) -> bool:
|
||||
match direction:
|
||||
case Direction.UP: return self.set_position(player, player.x_pos,
|
||||
player.y_pos-1)
|
||||
case Direction.DOWN: return self.set_position(player, player.x_pos,
|
||||
player.y_pos+1)
|
||||
case Direction.LEFT: return self.set_position(player, player.x_pos-1,
|
||||
player.y_pos)
|
||||
case Direction.RIGHT: return self.set_position(player, player.x_pos+1,
|
||||
player.y_pos)
|
||||
|
||||
|
||||
def main():
|
||||
map = Map(5, 5)
|
||||
p = map.make_player()
|
||||
print(map.render(p))
|
||||
assert map.move(p, Direction.UP)
|
||||
print(map.render(p))
|
||||
assert map.move(p, Direction.LEFT)
|
||||
assert map.move(p, Direction.LEFT)
|
||||
print(map.render(p))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Reference in a new issue