mirror of
https://github.com/Justuser3310/ss14_chemistry_site.git
synced 2025-01-19 01:08:48 +00:00
Глобальное изменение алгоритма, вынос его в calc.py
This commit is contained in:
parent
3ee9a64742
commit
b18496e57b
77
calc.py
Normal file
77
calc.py
Normal file
@ -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)
|
70
site.py
70
site.py
@ -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
|
||||
comps, res = calc(reaction, amount, main = True)
|
||||
|
||||
# Определяем 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)
|
||||
# Форматирование для 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…
Reference in New Issue
Block a user