Глобальное изменение алгоритма, вынос его в calc.py

main
none 9 months ago
parent 3ee9a64742
commit b18496e57b

@ -0,0 +1,77 @@
from db import *
from math import floor
db = read_db()
# Составные
recipe = {}
# Функция для спец. округления
# 16.666...8 => 15
def sround(num):
num = floor(num)
# Подмены
rep = [[16,15], [33,30]]
for i in rep:
if num == i[0]:
num = i[1]
# Делаем около-кратным 10 и 15
# if abs(num - round(num/10)*10) <= 1:
# num = round(num/10)*10
# if abs(num - round(num/15)*15) <= 1:
# num = round(num/15)*15
return num
def calc(el, amount, main = False):
global db, recipe
if main:
recipe = {}
comps = db[el][1:] # Получаем составные
# Считаем количество частей
parts = 0
for i in comps:
parts += i[1]
# Считаем 1 часть
part = sround(amount/parts)
# Перебираем составные и делаем рекурсию
for i in comps:
if i[0] in db:
lpart = calc(i[0], part*i[1])
# lpart - количество составного в итоге
# 50/3, часть = 16, ИТОГ: 16*3=48 <
try:
if lpart < part:
part = lpart
except:
pass
# Перебираем элементарные вещества
for i in comps:
if i[0] not in db:
if i[0] == 'Плазма':
recipe[i[0]] = 1
else:
if i[0] not in recipe:
recipe[i[0]] = part*i[1]
else:
recipe[i[0]] += part*i[1]
if main:
return [recipe, parts*part]
else:
return part*parts
#calc("Бикаридин", 100)
#calc("Эпинефрин", 100)
#print( calc("Лексорин", 100, True))
#calc("Амбузол", 100)
#calc("Амбузол плюс", 100)
#print( calc("Аммиак", 100, True) )
#print(recipe)

@ -44,6 +44,8 @@ html.Div([
####### ЛОГИКА ##########
from calc import *
@callback(
Output('output', 'children'),
Input('reaction', 'value'),
@ -51,69 +53,8 @@ html.Div([
)
def update_output(reaction, amount):
if reaction:
print(reaction)
# return f'You have selected {tt}'
parts = 0
part = 0
vol = amount
# Определяем 1 часть
for i in db[reaction]:
parts += i[2]
part = vol // parts
# Делаем около-кратным 10 и 15
# !!ЭКСПЕРЕМЕНТАЛЬНОЕ!!
part = round(part/10)*10
if part%10 != 0:
part = round(part/15)*15
# Название: количество (локальные части)
parted = {}
# Проверяем конфликты с составными частями: 48 != 50
lparts = 0 ; lpart = 0
for i in db[reaction]:
# TODO: только i[1] in db ?
if i[0] == True and i[1] in db:
# Перебираем составные
for el in db[i[1]]:
lparts += el[2]
# 50//3 ~ 16 16 * 3 = 48
lpart = (part//lparts) * lparts
if lpart < part:
part = lpart
parted[i[1]] = [part, lparts]
# part = 48
# parted["Инапровалин"] = [48, 3]
# 48 - 1 часть, 3 - кол. частей
comps = {}
# Распределяем (пока не учитывает большую глубину)
for i in db[reaction]:
if i[0] == False:
if i[1] == "Плазма":
comps[i[1]] = 1
else:
comps[i[1]] = part * i[2]
elif i[0] == True and i[1] not in db:
# Фикс Вестина и т.п. (нету крафта, но отмечено как есть)
comps[i[1]] = part * i[2]
elif i[0] == True and i[1] in db:
# Перебираем составные
for el in db[i[1]]:
if el[1] == "Плазма":
comps[el[1]] = 1
else:
if el[1] not in comps:
comps[el[1]] = int( parted[i[1]][0]/parted[i[1]][1] * el[2] )
else:
comps[el[1]] += int( parted[i[1]][0]/parted[i[1]][1] * el[2] )
print(comps)
comps, res = calc(reaction, amount, main = True)
# Форматирование для HTML
result = []
for i in comps:
@ -121,12 +62,13 @@ def update_output(reaction, amount):
, style={'background-color': '#3f3b17', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
# Выходное вещество
result.append( html.Div(f'{reaction}: {part*parts}'
result.append( html.Div(f'{reaction}: {res}'
, style={'background-color': '#183929', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
print(result)
return result
#########################

Loading…
Cancel
Save