UBS-Server / routes /lab_work.py
m-abdur2024's picture
Upload 40 files
0d3476b verified
raw
history blame
No virus
4.8 kB
from flask import request, jsonify
import logging
from routes import app
import re
from collections import deque
logger = logging.getLogger(__name__)
from flask import request, jsonify
@app.route('/lab_work', methods=['POST'])
def lab_work():
data = request.get_json()
# Adjusting to handle both list and dict inputs
if isinstance(data, dict):
# If data is a dict, extract the markdown tables
test_cases = []
for value in data.values():
if isinstance(value, list):
test_cases.extend(value)
else:
test_cases.append(value)
else:
test_cases = data
output = []
for test_case in test_cases:
labs = parse_markdown_table(test_case)
inspections = simulate_labs(labs)
output.append(inspections)
return jsonify(output)
def parse_markdown_table(test_case):
import re
labs = {}
lines = test_case.strip().split('\n')
# Skip header lines
data_lines = [line for line in lines if not re.match(r'^\|[-\s]*\|$', line) and not line.startswith('|Lab')]
for line in data_lines:
# Split the line into columns
cols = [col.strip() for col in line.strip('|').split('|')]
if len(cols) != 4:
continue # Skip malformed lines
lab_number = int(cols[0])
cell_counts = list(map(int, cols[1].split()))
increment_str = cols[2]
condition_str = cols[3]
# Parse increment operation
increment_op = parse_increment(increment_str)
# Parse condition
divisor, true_lab, false_lab = map(int, condition_str.split())
labs[lab_number] = {
'cell_counts': cell_counts,
'increment_op': increment_op,
'divisor': divisor,
'true_lab': true_lab,
'false_lab': false_lab,
'inspections': 0,
'queue': cell_counts.copy()
}
return labs
def parse_increment(increment_str):
import re
# Example increments: 'count * 2', 'count + 5', 'count * count'
if 'count * count' in increment_str:
return lambda count: count * count
else:
match = re.match(r'count ([\*\+]) (\d+|count)', increment_str)
if match:
operator, operand = match.groups()
if operand == 'count':
if operator == '*':
return lambda count: count * count
elif operator == '+':
return lambda count: count + count
else:
operand = int(operand)
if operator == '*':
return lambda count: count * operand
elif operator == '+':
return lambda count: count + operand
# If increment cannot be parsed, return identity function
return lambda count: count
def simulate_labs(labs):
from collections import deque
from math import gcd
from functools import reduce
# Initialize labs' queues and inspections
for lab in labs.values():
lab['queue'] = deque(lab['cell_counts'])
lab['inspections'] = 0
# Compute the LCM of all the divisors to use for modulus
divisors = [lab['divisor'] for lab in labs.values()]
lcm_value = reduce(lambda a, b: a * b // gcd(a, b), divisors)
days = 10000
intervals = range(1000, days + 1, 1000)
inspection_records = {}
for day in range(1, days + 1):
# Prepare a temporary storage for new dishes to be added to labs
new_dishes = {lab_number: deque() for lab_number in labs}
for lab_number, lab in labs.items():
while lab['queue']:
count = lab['queue'].popleft()
lab['inspections'] += 1
# Apply increment operation
new_count = lab['increment_op'](count)
new_count %= lcm_value # Apply modulus to prevent counts from growing too large
# Apply condition
if new_count % lab['divisor'] == 0:
next_lab_number = lab['true_lab']
else:
next_lab_number = lab['false_lab']
# Pass the dish to the next lab
new_dishes[next_lab_number].append(new_count)
# Update labs' queues with new dishes
for lab_number, lab in labs.items():
lab['queue'].extend(new_dishes.get(lab_number, []))
# Record inspections at intervals
if day in intervals:
inspection_records[str(day)] = [lab['inspections'] for lab_number, lab in sorted(labs.items())]
return inspection_records