1 GPT-6.1 Sol OpenAI
Idioma de destino: es
from heapq import heapify, heappop
def allocate(lots, orders):
# Validate every input before allocating stock.
remaining = {}
for lot in lots:
if lot["qty"] < 0:
raise ValueError("Negative lot quantity")
if lot["id"] in remaining:
raise ValueError("Duplicate lot id")
remaining[lot["id"]] = lot["qty"]
seen_orders = set()
for order in orders:
if order["qty"] < 0:
raise ValueError("Negative order quantity")
if order["id"] in seen_orders:
raise ValueError("Duplicate order id"...
Mostrar respuesta completa ▼
Idioma de destino: es
from heapq import heapify, heappop
def allocate(lots, orders):
# Validate every input before allocating stock.
remaining = {}
for lot in lots:
if lot["qty"] < 0:
raise ValueError("Negative lot quantity")
if lot["id"] in remaining:
raise ValueError("Duplicate lot id")
remaining[lot["id"]] = lot["qty"]
seen_orders = set()
for order in orders:
if order["qty"] < 0:
raise ValueError("Negative order quantity")
if order["id"] in seen_orders:
raise ValueError("Duplicate order id")
seen_orders.add(order["id"])
heap = [(lot["expires"], lot["id"])
for lot in lots if lot["qty"] > 0]
heapify(heap)
usable_total = sum(remaining.values())
fills = {}
short = {}
# Python's stable sort preserves input order for equal days.
for order in sorted(orders, key=lambda order: order["day"]):
day = order["day"]
order_id = order["id"]
need = order["qty"]
fills[order_id] = []
# Expired stock stays in remaining but cannot be allocated.
while heap and heap[0][0] < day:
_, lot_id = heappop(heap)
usable_total -= remaining[lot_id]
if order.get("all_or_nothing", False) and need > usable_total:
short[order_id] = need
continue
while need > 0 and heap:
_, lot_id = heap[0]
taken = min(need, remaining[lot_id])
fills[order_id].append((lot_id, taken))
remaining[lot_id] -= taken
usable_total -= taken
need -= taken
if remaining[lot_id] == 0:
heappop(heap)
if need > 0:
short[order_id] = need
return {"fills": fills, "short": short, "remaining": remaining}
Validación completa antes de cualquier asignación. La ordenación estable por día conserva el orden original de los pedidos del mismo día. El montículo ordena los lotes con existencias positivas por fecha de caducidad y, después, por ID de lote. Como los pedidos se procesan cronológicamente, los lotes caducados pueden eliminarse permanentemente del montículo sin cambiar sus existencias finales.
usable_total registra todas las existencias que actualmente son elegibles para envío, lo que permite rechazar un pedido de tipo todo o nada sin consumir nada. Los pedidos normales consumen las existencias situadas al frente del montículo hasta que se completan o se agotan. Los pedidos con cantidad cero reciben fills vacíos y no tienen faltante.
Sea L el número de lotes, M el número de pedidos y K el número de tuplas de asignación devueltas. Cada lote se elimina del montículo como máximo una vez. La complejidad temporal es O(L log(L + 1) + M log(M + 1) + K); la complejidad espacial, incluyendo la salida, es O(L + M + K).
Un asignador FEFO correcto y eficiente basado en un montículo (heap). Al revisar de T1 a T6, siempre se obtiene el resultado esperado: ordenación estable por día, caducidad inclusiva, ordenación del montículo por (expires, id), all_or_nothing comprobado únicamente contra el stock utilizable, y una validación que termina antes de cualquier asignación. La forma del valor devuelto es exacta, el código tiene 58 líneas y la explicación de 129 palabras ofrece una cota de complejidad correcta. Los defectos son menores.
Puntuación por criterio
Corrección
Supera T1 a T6 al revisarlo. La ordenación estable mantiene los pedidos del mismo día en el orden de entrada. La comprobación de caducidad extrae lotes solo mientras expires < day, por lo que la expiración es inclusiva. El heap ordena los lotes por (expires, id). usable_total resta el stock caducado antes de la comprobación all_or_nothing (T3 da M [] y N [(Q,3)]). Los pedidos de cantidad cero obtienen un relleno vacío y no tienen entrada en short. Un pedido all_or_nothing omitido no consume nada. No se encontraron errores lógicos.
Integridad
Devuelve exactamente fills, short y remaining. Cada id de pedido aparece en fills, short contiene solo faltantes positivos y remaining cubre todos los lotes, incluidos los lotes caducados. Las cantidades negativas y los ids duplicados tanto de lotes como de pedidos generan ValueError antes de la asignación. Las entradas malformadas, como las claves ausentes, no se gestionan, pero la tarea no lo exigía.
Calidad del código
Limpio e idiomático. El heap junto con un usable_total acumulado evita volver a recorrer los lotes y evita cualquier bucle por unidad, y los comentarios son concisos. Una peculiaridad menor es que el diccionario de stock se llama remaining y también sirve como mapa devuelto, lo que funciona pero acopla ambos roles.
Valor práctico
Eficiente y listo para uso real. Su coste temporal es O(L log L + M log M + K), y la explicación cubre con claridad las decisiones de diseño y casos límite como los pedidos de cantidad cero y los lotes caducados. Sería directamente utilizable en una herramienta pequeña de almacén.
Seguimiento de instrucciones
Usa solo la biblioteca estándar (heapq). El código tiene 58 líneas, muy por debajo de 150, y la explicación tiene 129 palabras, por debajo de 200. La afirmación de complejidad O(L log L + M log M + K) es correcta y mejor que la cota de referencia.
La solución cumple todos los requisitos y supera T1–T6 por inspección. Combina correctamente el procesamiento estable de pedidos en orden cronológico, la asignación FEFO basada en un heap y un total preciso de existencias utilizables para las decisiones de todo o nada. La validación, la estructura de la salida, el análisis de complejidad y los límites de longitud indicados están todos tratados correctamente.
Puntuación por criterio
Corrección
Supera T1–T6 por inspección. El ordenamiento estable conserva el orden del mismo día; el orden del montículo implementa la prioridad por caducidad y por ID de cadena; la caducidad es inclusiva. El total de stock utilizable excluye el stock caducado antes de cada asignación, y los pedidos de todo o nada rechazados no consumen nada. Las asignaciones parciales y los pedidos con cantidad cero se comportan correctamente.
Integridad
Devuelve exactamente fills, short y remaining, con cada pedido representado en fills, solo se registran faltantes positivos y cada lote se conserva en remaining. Las cantidades negativas y los ID duplicados se validan en ambas entradas antes de realizar cualquier asignación.
Calidad del código
La implementación es legible, autocontenida y eficiente. Los nombres de variables claros y los comentarios concisos explican el montículo y el invariante de stock utilizable. Cada lote se extrae del montículo como máximo una vez, sin recorridos repetidos innecesarios ni procesamiento unidad por unidad.
Valor práctico
Lista para usarse con las entradas especificadas sin modificar los diccionarios propiedad del llamador. Gestiona entradas vacías, stock agotado, stock caducado, cantidades cero y pedidos de todo o nada omitidos, manteniendo un inventario final preciso. La explicación indica límites de tiempo y espacio correctos y sensibles a la salida.
Seguimiento de instrucciones
Proporciona la función de Python 3 solicitada usando solo la biblioteca estándar. Las 58 líneas de código y las 129 palabras de explicación medidas están dentro de ambos límites, y la explicación indica explícitamente la complejidad temporal correcta.
La solución está excepcionalmente bien elaborada, es correcta y eficiente. Utiliza un min-heap junto con un total acumulado del inventario utilizable para lograr una complejidad temporal óptima, gestiona con precisión el desempate y la ordenación estable de los pedidos del mismo día, y cumple estrictamente todas las restricciones y especificaciones de formato.
Puntuación por criterio
Corrección
Todos los casos de prueba (T1-T6) pasan sin problemas. El stock utilizable se identifica correctamente (caduca >= day), el desempate por ID de lote se respeta mediante el orden del heap, y la comprobación de todo o nada verifica con precisión el stock utilizable actual en ese día.
Integridad
La función valida todas las cantidades negativas y los IDs duplicados antes de realizar cualquier asignación, devuelve correctamente la estructura exacta de diccionario requerida y omite adecuadamente los pedidos completamente satisfechos del mapeo 'short'.
Calidad del código
El código es idiomático, limpio, legible y muy eficiente. Mantener `usable_total` de forma dinámica junto con la expulsión del heap evita recorridos redundantes sobre los lotes.
Valor práctico
La implementación gestiona de forma fluida casos prácticos de almacén (pedidos con cantidad cero, lotes que caducan entre pedidos, umbral de todo o nada) y está lista para producción.
Seguimiento de instrucciones
Cumple estrictamente todos los límites de número de líneas (58 líneas <= 150), el límite de palabras de la explicación (129 palabras <= 200), las restricciones de la biblioteca estándar, e incluye un análisis claro de la complejidad temporal.