summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-05-29 21:09:18 +0300
committerLars Wirzenius <liw@liw.fi>2021-05-29 21:09:18 +0300
commit3f68408a3f3ab54de4f87c1fd97724f5eb94eff9 (patch)
tree1031960f0497889a4210caa23f074c5e88c4f8f7
parent502b224a0b723504414dfc6de920edd4ab3673c3 (diff)
downloadoso-work-sample-3f68408a3f3ab54de4f87c1fd97724f5eb94eff9.tar.gz
refactor: make server handle also min, not just max
Sponsored-by: author
-rwxr-xr-xserver.py48
1 files 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"