From c384d9b144f08dba6ffc0add6a700bbd0bb8af6c Mon Sep 17 00:00:00 2001 From: Fedor Lyanguzov Date: Sat, 8 Jan 2022 20:28:57 +0300 Subject: [PATCH] Task 17.1 and 17.2 --- 17/17.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 17/input | 1 + 2 files changed, 59 insertions(+) create mode 100644 17/17.py create mode 100644 17/input diff --git a/17/17.py b/17/17.py new file mode 100644 index 0000000..3cd5157 --- /dev/null +++ b/17/17.py @@ -0,0 +1,58 @@ +''' +x=143..177, y=-106..-71 +''' + +target = (143, 177, -71, -106) + +places = { + (1,1,1,1): 'c', + (1,0,0,1): 'tl', + (1,1,0,1): 't', + (0,1,0,1): 'tr', + (1,0,1,1): 'l', + (0,1,1,1): 'r', + (1,0,1,0): 'bl', + (1,1,1,0): 'b', + (0,1,1,0): 'br', +} + +def place(x, y, l, r, t, b): + p1 = int(x<=r) + p2 = int(x>=l) + p3 = int(y<=t) + p4 = int(y>=b) + return places[(p1, p2, p3, p4)] + + +def sign(x): + if x!=0: + return x//abs(x) + return 0 + +def step(x, y, dx, dy): + return x+dx, y+dy, dx-sign(dx), dy-1 + +def shoot(dx, dy, target): + state = (0, 0, dx, dy) + p = place(0, 0, *target) + best_y = 0 + while p in {'tl', 't', 'l'}: + state = step(*state) + best_y = max(state[1], best_y) + p = place(*state[:2], *target) + return p, best_y + +def test(): + target = (20, 30, -5, -10) + assert shoot(7, 2, target)[0]=='c' + assert shoot(6, 3, target)[0]=='c' + assert shoot(9, 0, target)[0]=='c' + assert shoot(17, -4, target)[0]!='c' + assert shoot(6, 9, target)==('c', 45) + + +if __name__ == '__main__': + res = list(filter(lambda x: x[0]=='c', (shoot(dx, dy, target) for dy in range(-1000, 1000) for dx in range(1000)))) + print(max(res, key=lambda x: x[1])) + print(len(res)) + diff --git a/17/input b/17/input new file mode 100644 index 0000000..d86dcb1 --- /dev/null +++ b/17/input @@ -0,0 +1 @@ +target area: x=143..177, y=-106..-71