summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-05-29 20:50:20 +0300
committerLars Wirzenius <liw@liw.fi>2021-05-29 20:50:20 +0300
commitc6d32f1f9d15c531b7160d115d7bf47d2016a859 (patch)
tree084e72db7cbc8c107bebb8b753d7dace521cbc26
parentc86686f2070a858726c700567c808b44b7c39163 (diff)
downloadoso-work-sample-c6d32f1f9d15c531b7160d115d7bf47d2016a859.tar.gz
fix: server logic
Sponsored-by: author
-rwxr-xr-xserver.py69
1 files changed, 68 insertions, 1 deletions
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)