diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-05-29 21:09:18 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-05-29 21:09:18 +0300 |
commit | 3f68408a3f3ab54de4f87c1fd97724f5eb94eff9 (patch) | |
tree | 1031960f0497889a4210caa23f074c5e88c4f8f7 | |
parent | 502b224a0b723504414dfc6de920edd4ab3673c3 (diff) | |
download | oso-work-sample-3f68408a3f3ab54de4f87c1fd97724f5eb94eff9.tar.gz |
refactor: make server handle also min, not just max
Sponsored-by: author
-rwxr-xr-x | server.py | 48 |
1 files changed, 32 insertions, 16 deletions
@@ -4,28 +4,44 @@ import bottle import random -class Max: +def max(answer): + return answer + + +def min(answer): + return not answer + + +class Find: def __init__(self): - self.new(0) + self.reset() + + def reset(self): + self._algo = None + self._count = None + self._result = 0 + self._pos = 0 + self._rid = None + + def new(self, algo, count): + assert count > 0 - def new(self, count): if count == 1: # List has length 1: we know the answer. return self.done(0) + self.reset() + self._algo = algo self._count = count - self._result = 0 - self._pos = 0 - self._rid = None return self.next(self._result) def decide(self, answer, rid): assert rid == self._rid - if answer: - # left < right: use previous "right" item + if self._algo(answer): + # use previous "right" item in comparison return self.next(self._pos) else: - # left >= right: use current best result + # use previous result return self.next(self._result) def next(self, new_result): @@ -43,7 +59,6 @@ class Max: def compare(self, left, right): self._rid = random.randint(1, 2 ** 30) - self._pos = right return { "type": "compare", "left": left, @@ -55,7 +70,7 @@ class Max: return {"type": "done", "result": n} -session = Max() +session = Find() @bottle.post("/") @@ -63,13 +78,14 @@ def root(): msg = bottle.request.json print("request", msg) msg_type = msg.get("type") - assert msg_type in ("compute_max", "comp_result") if msg_type == "compute_max": - n = msg["length"] - assert n > 0 - o = session.new(n) - else: + o = session.new(max, msg["length"]) + elif msg_type == "compute_min": + o = session.new(min, msg["length"]) + elif msg_type == "comp_result": o = session.decide(msg["answer"], msg["request_id"]) + else: + assert False print("result", o, session._pos) bottle.response.content_type = "application/json" |