From 3f68408a3f3ab54de4f87c1fd97724f5eb94eff9 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 29 May 2021 21:09:18 +0300 Subject: refactor: make server handle also min, not just max Sponsored-by: author --- server.py | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/server.py b/server.py index 0479d1d..0d676db 100755 --- a/server.py +++ b/server.py @@ -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" -- cgit v1.2.1