From c6d32f1f9d15c531b7160d115d7bf47d2016a859 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 29 May 2021 20:50:20 +0300 Subject: fix: server logic Sponsored-by: author --- server.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/server.py b/server.py index 369fa79..0479d1d 100755 --- a/server.py +++ b/server.py @@ -1,12 +1,79 @@ #!/usr/bin/env python3 import bottle +import random + + +class Max: + def __init__(self): + self.new(0) + + def new(self, count): + if count == 1: + # List has length 1: we know the answer. + return self.done(0) + + 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 + return self.next(self._pos) + else: + # left >= right: use current best result + return self.next(self._result) + + def next(self, new_result): + self._result = new_result + + # Choose next item to compare. + self._pos += 1 + + if self._pos >= self._count: + # We have reached the end of the list. + return self.done(self._result) + + # Compare newly chosen item with current result. + return self.compare(self._result, self._pos) + + def compare(self, left, right): + self._rid = random.randint(1, 2 ** 30) + self._pos = right + return { + "type": "compare", + "left": left, + "right": right, + "request_id": self._rid, + } + + def done(self, n): + return {"type": "done", "result": n} + + +session = Max() @bottle.post("/") 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.decide(msg["answer"], msg["request_id"]) + + print("result", o, session._pos) bottle.response.content_type = "application/json" - return {"type": "done", "result": 0} + return o bottle.run(host="localhost", port=5000) -- cgit v1.2.1