from datetime import datetime
class ChaceCalcer:
def __init__(self, functor, initValue):
self.lasttime = datetime.now().timestamp()
self.functor = functor
self.value = initValue
def get(self):
now = datetime.now().timestamp()
functor = self.functor
self.value = functor(now - self.lasttime, self.value)
self.lasttime = now
return self.value
class ChaceCalclerShell:
def __init__(self):
self.values = dict()
def __getitem__(self, name):
return self.values[name]
def initValue(self, name, functor, initValue=0):
self.values[name] = ChaceCalcer(functor, initValue)
return self.values[name]
import time
import math
chacher = ChaceCalclerShell()
chacher.initValue('linear', lambda timedelta, prevValue: prevValue + timedelta * 2, 100)
#зададим функцию, линейно возростающую
time.sleep(1)
print('linear :', chacher['linear'].get())
chacher.initValue('exponent', lambda timedelta, prevValue: prevValue * (math.exp(timedelta)), 1)
#с некоторой задержкой также добавим экспененциальную зависимость
print('exponent:', chacher['exponent'].get())
time.sleep(3)
print('linear :', chacher['linear'].get())
time.sleep(2)
print('linear :', chacher['linear'].get())
print('exponent:', chacher['exponent'].get())
time.sleep(2)
print('linear :', chacher['linear'].get())
print('exponent:', chacher['exponent'].get())
linear : 102.0174617767334
exponent: 1.0
linear : 108.0318660736084
linear : 112.05375576019287
exponent: 151.284176584114
linear : 116.07564210891724
exponent: 1129.0029375966299
import math
min = 1
max = 100
maxdepth = math.ceil(math.log(max-min + 1, 2))
print('возможные ответы: 1 - равно, 2 - загаданое число больше, 3 - загаданое число меньше ')
result = None
round = 1
while result is None and round <= maxdepth:
print(f'число находится в диапазоне [{min}, {max}].')
print(f'попытка {round} / {maxdepth}')
round += 1
support = (min + max) // 2
answer = ''
while answer not in { '1', '2', '3' }:
answer = input(f'это {support}? :')
if answer not in { '1', '2', '3' }:
print('ответ не распознан. попробуем ещё раз')
if answer == '2':
min = support + 1
if answer == '3':
max = support - 1
if answer == '1':
result = support
if result is not None:
print('результат -', result)
import math
def binsearch(min, max, check, depth=1, maxdepth=None):
if maxdepth is None:
maxdepth = math.ceil(math.log(max-min + 1, 2))
if depth > maxdepth:
print('Ваши ответы противоречивы. прощайте.')
return None
print(f'число находится в диапазоне [{min}, {max}].')
print(f'попытка {depth} / {maxdepth}')
support = (min + max) // 2
result = check(support)
if result == 'меньше':
return binsearch(support+1, max, check, depth=depth+1, maxdepth=maxdepth)
if result == 'больше':
return binsearch(min, support-1, check, depth=depth+1, maxdepth=maxdepth)
return support
def guess():
print('возможные ответы: 1 - равно, 2 - загаданое число больше, 3 - загаданое число меньше ')
answers = {
'1' : 'равно',
'2' : 'меньше',
'3' : 'больше'
}
def check(req):
answer = ''
while answer not in answers.keys():
answer = input(f'это {req}? :')
if answer not in answers.keys():
print('ответ не распознан. попробуем ещё раз')
return answers[answer]
return check
result = binsearch(1, 100, guess())
if result is not None:
print('результат -', result)
async def a():
def b():
asyncio.run(c())
await asyncio.get_running_loop().run_in_executor( None, b)
async def a():
def b():
await c()
b()