diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-05-29 20:50:20 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-05-29 20:50:20 +0300 |
commit | c6d32f1f9d15c531b7160d115d7bf47d2016a859 (patch) | |
tree | 084e72db7cbc8c107bebb8b753d7dace521cbc26 | |
parent | c86686f2070a858726c700567c808b44b7c39163 (diff) | |
download | oso-work-sample-c6d32f1f9d15c531b7160d115d7bf47d2016a859.tar.gz |
fix: server logic
Sponsored-by: author
-rwxr-xr-x | server.py | 69 |
1 files changed, 68 insertions, 1 deletions
@@ -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) |