Orivel Orivel
Abrir menu

Programação

Compare correção, qualidade e utilidade prática do código gerado.

Snapshot 2026-W42 Resultados em 2026-10-16

6 modelos responderam às mesmas 16 tarefas. Os mesmos juízes (Claude Opus 5.5 / GPT-6.1 Sol / Gemini 3.8 Flash) avaliaram cada resposta de 0 a 10, e a nota mostrada é a média dos 3 juízes.

Este gênero tem uma única tarefa, então a ordem abaixo é o resultado desta tarefa, não uma classificação dos modelos neste gênero. A classificação geral usa todas as 16 tarefas.

Num relance

Nº 1 nesta tarefa

GPT-6.1 Sol
9.74 0.01 à frente do 2º

Último nesta tarefa

Gemini 3.5 Flash-Lite
8.89

Diferença entre o melhor e o pior

0.85 pts Quanto menor, mais equilibrado

Resultados desta tarefa

Alocação FEFO de Estoque com Pedidos Tudo-ou-Nada

Posição Modelo Média (de 0 a 10)
1 GPT-6.1 Sol 9.74
2 Claude Sonnet 5.5 9.73
3 GPT-6 Luna 9.66
4 Claude Opus 5.5 9.60
5 Gemini 3.8 Flash 9.12
6 Gemini 3.5 Flash-Lite 8.89
Cores da nota ≥ 9 8–9 7–8 6–7 5–6 < 5

Diferença entre a maior e a menor média: 0.85 pontos.

A tarefa

Alocação FEFO de Estoque com Pedidos Tudo-ou-Nada

Instruções

Escreva uma função Python 3 allocate(lots, orders) para um pequeno armazém de alimentos que sempre despacha primeiro o estoque com vencimento mais próximo.

Entradas:

  • lots: uma lista de dicionários {"id": str, "qty": int, "expires": int}. expires é o último número de dia em que o lote ainda pode ser despachado.
  • orders: uma lista de dicionários {"id": str, "day": int, "qty": int} com uma chave opcional "all_or_nothing": bool (padrão False). A lista não está necessariamente ordenada por dia.

Requisitos:

  1. Processe os pedidos em ordem crescente de day; pedidos com o mesmo dia são processados na ordem em que aparecem na lista de entrada.
  2. Para um pedido no dia d, um lote só é utilizável se expires >= d e ainda tiver estoque. Retire estoque dos lotes utilizáveis em ordem crescente de expires, desempatando por ordem crescente do id do lote (comparação de strings simples), até que o pedido seja atendido ou o estoque utilizável se esgote.
  3. Um pedido normal pode ser atendido parcialmente. Um pedido all_or_nothing cuja quantidade exceda o estoque total utilizável no seu dia não recebe nada, e esse estoque continua disponível para pedidos posteriores.
  4. Retorne um dicionário com exatamente três chaves: "fills" mapeia cada id de pedido para uma lista de tuplas (lot_id, qty) na ordem em que o estoque foi retirado (uma lista vazia se nada foi alocado); "short" mapeia apenas os ids de pedidos cuja quantidade não atendida é maior que 0 para essa quantidade; "remaining" mapeia cada id de lote para seu estoque final.
  5. Lance ValueError antes de alocar qualquer coisa se algum lote ou pedido tiver qty negativo, ou se algum id de lote ou id de pedido aparecer mais de uma vez.
  6. Use apenas a biblioteca padrão. Mantenha o código com no máximo 150 linhas e acompanhe-o de uma explicação de no máximo 200 palavras que informe a complexidade de tempo.
Como os juízes foram instruídos a avaliar
Lista de verificação de requisitos: (1) pedidos ordenados por dia com ordenação estável (ordem de entrada mantida para dias iguais) — correção; (2) "utilizável" significa expires >= dia e estoque > 0, retirado na ordem (expires, id) — correção; (3) atendimentos parciais para pedidos normais, all_or_nothing comparado apenas ao estoque utilizável naquele dia, e um pedido all_or_nothing ignorado não consome nada — correção; (4) formato de retorno exatamente fills/short/remaining conforme especificado — completude; (5) validação ValueError antes de qualquer alocação — completude; (6) biblioteca padrão, código <= 150 linhas, explicação <= 200 palavras com declaração de complexidade — seguimento de instruções. Código com mais de 165 linhas: seguimento de instruções -2 ou mais. Gabarito (pré-calculado; comparar, não executar). T1 lotes L1(5, exp 10), L2(5, exp 3); pedido O1 dia 1 qty 7 -> fills {O1: [(L2,5),(L1,2)]}, short {}, remaining {L1:3, L2:0}. Decidido pela ordenação dos lotes por validade. T2 lotes A(4, exp 5), B(4, exp 8); pedidos listados X(dia 6, qty 4) depois Y(dia 5, qty 5) -> fills {Y: [(A,4),(B,1)], X: [(B,3)]}, short {X:1}, remaining {A:0, B:0}. Falha se os pedidos forem processados na ordem de entrada (gera X [(B,4)], Y [(A,4)], short Y 1) ou se a validade for tratada como exclusiva (expires > dia). T3 lotes P(6, exp 2), Q(4, exp 9); pedidos M(dia 3, qty 5, all_or_nothing) depois N(dia 3, qty 3) -> fills {M: [], N: [(Q,3)]}, short {M:5}, remaining {P:6, Q:1}. Falha se a verificação all_or_nothing usar o estoque total (10) em vez do estoque utilizável (4). T4 lotes b(2, exp 4), a(2, exp 4), c(1, exp 1); pedidos Z(dia 1, qty 0), W(dia 2, qty 5) -> fills {Z: [], W: [(a,2),(b,2)]}, short {W:1}, remaining {b:0, a:0, c:1}. Testa o desempate por id e pedido de quantidade zero (presente em fills, ausente em short). T5 lotes K(3, exp 5), J(3, exp 6); pedidos R(dia 4, qty 2) depois S(dia 4, qty 4, all_or_nothing) -> fills {R: [(K,2)], S: [(K,1),(J,3)]}, short {}, remaining {K:0, J:0}. Falha se pedidos all_or_nothing forem reordenados. T6 id de lote duplicado, ou um pedido com qty -2 -> ValueError, sem estado parcial retornado. Nota 9+ apenas se o código passar em T1-T6 por leitura, for limpo (sem passagens desnecessárias sobre todos os lotes por unidade de quantidade) e a declaração de complexidade estiver correta (aproximadamente O(L log L + O log O + O x L) ou melhor). Limites: processa pedidos na ordem de entrada ou usa expiração exclusiva -> correção <= 5; all_or_nothing verificado contra o estoque total -> correção <= 6; código que não executaria como escrito (erro de sintaxe, nome indefinido) -> correção <= 3; formato de retorno errado -> completude <= 6.

Cada juiz dá de 0 a 10 em cada critério; a nota é a média ponderada dos critérios.

Respostas, da maior para a menor média

Os juízes leem o original em inglês. As traduções servem apenas para leitura.

1 GPT-6.1 Sol

Média (de 0 a 10) 9.74
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.a...
Mostrar resposta completa ▼
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}

A validação é concluída antes de qualquer alocação. A ordenação estável por dia preserva a ordem original dos pedidos do mesmo dia. O heap ordena os lotes com estoque positivo pela data de validade e, em seguida, pelo ID do lote. Como os pedidos são processados em ordem cronológica, os lotes vencidos podem ser removidos permanentemente do heap sem alterar o estoque final deles.

usable_total acompanha todo o estoque atualmente elegível para envio, permitindo que um pedido do tipo "tudo ou nada" seja rejeitado sem consumir nada. Pedidos normais consomem o estoque da frente do heap até serem atendidos ou o estoque se esgotar. Pedidos com quantidade zero recebem atendimentos vazios e nenhuma falta.

Seja L o número de lotes, M o número de pedidos e K o número de tuplas de alocação retornadas. Cada lote é removido do heap no máximo uma vez. A complexidade de tempo é O(L log(L + 1) + M log(M + 1) + K); a complexidade de espaço, incluindo a saída, é O(L + M + K).

Claude Opus 5.5 9.22

Um alocador FEFO correto e eficiente, baseado em heap. Ao percorrer de T1 a T6, o resultado esperado é obtido todas as vezes: ordenação estável por dia, validade inclusiva, ordenação do heap por (expires, id), all_or_nothing verificado apenas em relação ao estoque utilizável, e validação concluída antes de qualquer alocação. O formato de retorno é exato, o código tem 58 linhas, e a explicação de 129 palavras apresenta um limite de complexidade correto. As falhas são pequenas.

Nota por critério

Correção

95

Passa em T1 a T6 pela leitura do código. A ordenação estável mantém os pedidos do mesmo dia na ordem de entrada. A verificação de validade remove lotes somente enquanto expires < day, então a validade é inclusiva. O heap ordena os lotes por (expires, id). usable_total subtrai o estoque vencido antes da verificação all_or_nothing (T3 resulta em M [] e N [(Q,3)]). Pedidos com quantidade zero recebem um fill vazio e nenhuma entrada em short. Um pedido all_or_nothing ignorado não consome nada. Não foram encontrados erros de lógica.

Completude

92

Retorna exatamente fills, short e remaining. Todo id de pedido aparece em fills, short contém apenas faltas positivas, e remaining cobre todos os lotes, incluindo os lotes vencidos. Quantidades negativas e ids duplicados, tanto de lotes quanto de pedidos, geram ValueError antes da alocação. Entradas malformadas, como chaves ausentes, não são tratadas, mas a tarefa não exigia isso.

Qualidade do código

90

Limpo e idiomático. O heap somado a um usable_total em execução evita reanalisar os lotes e evita qualquer laço por unidade, e os comentários são concisos. Uma pequena peculiaridade é que o dicionário de estoque se chama remaining e também serve como mapa retornado, o que funciona, mas acopla esses dois papéis.

Valor prático

88

Eficiente e pronto para uso real. Seu custo de tempo é O(L log L + M log M + K), e a explicação descreve com clareza as decisões de projeto e casos extremos, como pedidos com quantidade zero e lotes vencidos. Poderia ser usado diretamente em uma ferramenta de armazém pequena.

Seguimento de instruções

93

Usa apenas a biblioteca padrão (heapq). O código tem 58 linhas, bem abaixo de 150, e a explicação tem 129 palavras, abaixo de 200. A declaração de complexidade O(L log L + M log M + K) está correta e é melhor que o limite de referência.

GPT-6.1 Sol 10.00

A solução atende a todos os requisitos e passa em T1–T6 por inspeção. Ela combina corretamente o processamento estável de pedidos em ordem cronológica, a alocação FEFO baseada em heap e um total preciso de estoque utilizável para as decisões de tudo ou nada. A validação, a estrutura da saída, a análise de complexidade e os limites de tamanho indicados são todos tratados corretamente.

Nota por critério

Correção

100

Passa em T1–T6 por inspeção. A ordenação estável preserva a ordem dos pedidos do mesmo dia; a ordenação do heap implementa a prioridade por validade e por ID em string; a validade é inclusiva. O total de estoque utilizável exclui o estoque vencido antes de cada alocação, e pedidos rejeitados no modo tudo-ou-nada não consomem nada. Atendimentos parciais e pedidos com quantidade zero se comportam corretamente.

Completude

100

Retorna exatamente fills, short e remaining, com cada pedido representado em fills, apenas faltas positivas registradas e cada lote mantido em remaining. Quantidades negativas e IDs duplicados são validados em ambas as entradas antes de qualquer alocação.

Qualidade do código

100

A implementação é legível, autocontida e eficiente. Nomes de variáveis claros e comentários objetivos explicam o heap e o invariante do estoque utilizável. Cada lote é removido do heap no máximo uma vez, sem varreduras repetidas desnecessárias nem processamento por unidade.

Valor prático

100

Pronta para uso com as entradas especificadas, sem modificar os dicionários de propriedade do chamador. Trata entradas vazias, estoque esgotado, estoque vencido, quantidades zero e pedidos tudo-ou-nada ignorados, preservando um inventário final preciso. A explicação apresenta limites corretos de tempo e espaço sensíveis à saída.

Seguimento de instruções

100

Fornece a função Python 3 solicitada usando apenas a biblioteca padrão. As 58 linhas de código e as 129 palavras de explicação medidas estão dentro dos dois limites, e a explicação declara explicitamente a complexidade de tempo correta.

Gemini 3.8 Flash 10.00

A solução é excepcionalmente bem elaborada, correta e eficiente. Ela usa um min-heap junto com um total acumulado do estoque utilizável para alcançar a complexidade de tempo ideal, trata com precisão o critério de desempate e a ordenação estável para pedidos do mesmo dia, e segue rigorosamente todas as restrições e especificações de formatação.

Nota por critério

Correção

100

Todos os casos de teste (T1-T6) passam sem problemas. O estoque utilizável é identificado corretamente (validade >= dia), o desempate por ID do lote é respeitado pela ordenação do heap, e a verificação de tudo ou nada compara corretamente com o estoque utilizável atual naquele dia.

Completude

100

A função valida todas as quantidades negativas e IDs duplicados antes de qualquer alocação ocorrer, retorna corretamente a estrutura exata de dicionário exigida e omite adequadamente os pedidos totalmente atendidos do mapeamento 'short'.

Qualidade do código

100

O código é idiomático, limpo, legível e altamente eficiente. Manter `usable_total` dinamicamente junto com a remoção do heap evita varreduras redundantes sobre os lotes.

Valor prático

100

A implementação trata com naturalidade casos práticos de armazém (pedidos de quantidade zero, lotes que vencem entre pedidos, limiar de tudo ou nada) e está pronta para produção.

Seguimento de instruções

100

Seguiu estritamente todos os limites de número de linhas (58 linhas <= 150), os limites de contagem de palavras da explicação (129 palavras <= 200), as restrições da biblioteca padrão, e incluiu uma análise clara de complexidade de tempo.

2 Claude Sonnet 5.5

Média (de 0 a 10) 9.73
def allocate(lots, orders):
    # ---- validation (nothing is allocated if this fails) ----
    seen_lots = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError("negative lot qty: %r" % (lot["id"],))
        if lot["id"] in seen_lots:
            raise ValueError("duplicate lot id: %r" % (lot["id"],))
        seen_lots.add(lot["id"])
    seen_orders = set()
    for o in orders:
        if o["qty"] < 0:
            raise ValueError("negative order qty: %r" % (o["id"],))
        if o["id"] in seen_orders:
            raise ValueError("duplicate order id: %r" % (o["id"],))...
Mostrar resposta completa ▼
def allocate(lots, orders):
    # ---- validation (nothing is allocated if this fails) ----
    seen_lots = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError("negative lot qty: %r" % (lot["id"],))
        if lot["id"] in seen_lots:
            raise ValueError("duplicate lot id: %r" % (lot["id"],))
        seen_lots.add(lot["id"])
    seen_orders = set()
    for o in orders:
        if o["qty"] < 0:
            raise ValueError("negative order qty: %r" % (o["id"],))
        if o["id"] in seen_orders:
            raise ValueError("duplicate order id: %r" % (o["id"],))
        seen_orders.add(o["id"])

    # ---- setup ----
    # Lots in FEFO order: earliest expiry first, ties by id.
    ordered = sorted(lots, key=lambda l: (l["expires"], l["id"]))
    ids = [l["id"] for l in ordered]
    exp = [l["expires"] for l in ordered]
    stock = [l["qty"] for l in ordered]
    n = len(ordered)

    fills = {o["id"]: [] for o in orders}
    short = {}

    # sorted() is stable, so same-day orders keep their input order.
    queue = sorted(orders, key=lambda o: o["day"])

    ptr = 0                 # first lot that is neither expired nor drained
    usable = sum(stock)     # stock in lots not yet expired for current day

    for o in queue:
        d = o["day"]
        need = o["qty"]

        # Days are non-decreasing, so an expired lot stays expired.
        while ptr < n and exp[ptr] < d:
            usable -= stock[ptr]
            ptr += 1

        if o.get("all_or_nothing", False) and need > usable:
            if need > 0:
                short[o["id"]] = need
            continue

        i = ptr
        while need > 0 and i < n:
            take = min(stock[i], need)
            if take > 0:
                fills[o["id"]].append((ids[i], take))
                stock[i] -= take
                usable -= take
                need -= take
            i += 1

        # Drained lots form a prefix of the unexpired lots; skip them.
        while ptr < n and stock[ptr] == 0:
            ptr += 1

        if need > 0:
            short[o["id"]] = need

    remaining = {ids[i]: stock[i] for i in range(n)}
    return {"fills": fills, "short": short, "remaining": remaining}

Explicação

As entradas são validadas primeiro, de modo que um ValueError é lançado antes de qualquer alocação. Os lotes são ordenados uma única vez por (expires, id). Os pedidos são ordenados por day. A ordenação do Python é estável, então pedidos do mesmo dia mantêm a ordem de entrada.

Um ponteiro ptr marca o primeiro lote que não está vencido nem vazio. Como os dias nunca diminuem, um lote que venceu continua vencido. Como o estoque é sempre retirado do lote utilizável mais antigo, os lotes esgotados formam um prefixo dos lotes utilizáveis. Assim, ptr só avança.

Um contador acumulado usable guarda o estoque dos lotes que ainda não venceram. Ele permite verificar em O(1) um pedido do tipo tudo ou nada. Se o pedido for grande demais, nada é alterado e o estoque continua disponível.

Complexidade de tempo: O(n log n + m log m + n + m + F), em que n é o número de lotes, m é o número de pedidos e F é o número de entradas de atendimento retornadas. F é no máximo m + n, já que cada pedido esgota lotes e deixa no máximo um parcialmente usado. O total é, portanto, O(n log n + m log m). O espaço extra é O(n + m).

Claude Opus 5.5 9.18

Uma solução correta e eficiente. Verificada contra T1–T6, ela produz os preenchimentos, as faltas e os valores restantes esperados, incluindo a ordenação estável no mesmo dia, a validade inclusiva, os desempates por (expires, id) e os pedidos de tudo ou nada verificados apenas contra o estoque utilizável. O ponteiro amortizado e o contador corrente de estoque utilizável estão corretos, e a complexidade informada está correta e é melhor do que o limite de referência. O código tem 67 linhas e a explicação tem 185 palavras. Restam apenas pequenos detalhes.

Nota por critério

Correção

94

Passa em T1–T6 pela leitura. Os pedidos usam ordenação estável por dia, e a expiração é inclusiva (exp < d expira). Os lotes são ordenados por (expires, id). O contador de utilizáveis acompanha corretamente o estoque em lotes não expirados, então pedidos de tudo ou nada são comparados com o estoque utilizável e não consomem nada quando são ignorados. Pedidos de quantidade zero ficam fora de short. As invariantes do ptr se mantêm mesmo com lotes de quantidade zero no meio da lista.

Completude

92

Retorna exatamente fills, short e remaining. Fills contém tuplas (lot_id, qty) e inclui todos os ids de pedidos. Short lista apenas faltas positivas, e remaining cobre todos os lotes. Quantidades negativas e ids duplicados são validados antes de qualquer estado ser construído.

Qualidade do código

90

Limpo e bem comentado. Usa um ponteiro para frente amortizado e um contador O(1) de utilizáveis, sem reexaminar unidades. Listas paralelas mantêm o laço principal simples. Uma pequena ressalva: os arrays paralelos são um pouco menos legíveis do que uma lista de registros mutáveis.

Valor prático

88

Eficiente e pronto para uso em produção no cenário descrito, com mensagens de erro claras. Não verifica tipos de entrada nem chaves ausentes, mas isso não era exigido.

Seguimento de instruções

93

Usa apenas a biblioteca padrão. O código tem 67 linhas, bem abaixo de 150, e a explicação tem 185 palavras, abaixo de 200. Inclui uma declaração correta de complexidade, O(n log n + m log m), com justificativa.

GPT-6.1 Sol 10.00

A implementação atende a todos os requisitos e passa em T1–T6 por inspeção. Ela mantém corretamente o estoque utilizável ao longo dos dias que avançam, preserva o estoque expirado em remaining e ignora pedidos do tipo tudo ou nada que não podem ser atendidos, sem consumir estoque. A validação, a estrutura da saída e a complexidade declarada estão todas corretas.

Nota por critério

Correção

100

Implementa corretamente a ordenação estável por dia, a expiração inclusiva, FEFO com desempate por id em string, atendimentos parciais e verificações tudo-ou-nada com base no estoque utilizável atual. O contador corrente de estoque utilizável e o ponteiro que avança apenas para frente permanecem consistentes durante toda a alocação.

Completude

100

Retorna exatamente fills, short e remaining, incluindo fills vazios e estoque vencido inalterado quando necessário. Todas as quantidades negativas e ids duplicados são validados antes do início da alocação.

Qualidade do código

100

Código limpo e autocontido, com fases claras de validação e alocação, comentários úteis sobre invariantes e sem mutação da entrada. O ponteiro e o total corrente de estoque evitam varreduras completas repetidas do estoque.

Valor prático

100

Pronto para uso com as entradas especificadas, com mensagens de erro de validação informativas, alocação determinística e tratamento eficiente independentemente da magnitude das quantidades. A explicação descreve com precisão tanto o algoritmo quanto seus custos de recursos.

Seguimento de instruções

100

Usa apenas a funcionalidade padrão do Python, fornece a função solicitada em 67 linhas de código e a acompanha com uma explicação de 185 palavras contendo uma afirmação correta sobre a complexidade de tempo.

Gemini 3.8 Flash 10.00

A solução está completamente correta, elegante e ótima. Ela atende rigorosamente a todos os requisitos e casos extremos: ordenação estável dos pedidos por dia, ordenação FEFO dos lotes com desempate por id, validação exata que lança ValueError antes do processamento, verificação do tipo tudo ou nada em O(1) usando uma soma corrente do estoque utilizável e percurso preciso com dois ponteiros, alcançando complexidade de tempo O(n log n + m log m). As restrições de número de linhas e de número de palavras também foram totalmente cumpridas.

Nota por critério

Correção

100

Passa em todos os casos de teste, de T1 a T6. Trata corretamente a ordenação FEFO com desempate pelo id do lote, a fila de pedidos estável por dia, a filtragem de estoque utilizável (expires >= day) e a preservação do estoque tudo-ou-nada sem alocação.

Completude

100

Todos os requisitos e casos de borda são tratados. Lança ValueError antes da alocação em caso de quantidades negativas ou ids duplicados. Retorna exatamente o esquema de dicionário exigido (preenche todos os pedidos, short apenas para pedidos não atendidos, e remaining para todos os lotes).

Qualidade do código

100

Código Python excepcionalmente limpo, legível e idiomático. A varredura linear amortizada, com avanço de ponteiro e um saldo corrente de estoque utilizável, é elegante e eficiente.

Valor prático

100

Implementação prática de alocação de armazém, que evita percursos redundantes pelos lotes, tornando-a performática e adequada a ambientes reais de produção.

Seguimento de instruções

100

Segue todas as instruções com precisão: usa apenas a biblioteca padrão, mantém o código bem abaixo de 150 linhas (67 linhas) e apresenta uma explicação dentro do limite de 200 palavras (185 palavras), com análise de complexidade de tempo correta.

3 GPT-6 Luna

Média (de 0 a 10) 9.66
def allocate(lots, orders):
    # Validate everything before creating or changing allocation state.
    lot_ids = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError("lot quantity cannot be negative")
        if lot["id"] in lot_ids:
            raise ValueError("duplicate lot id")
        lot_ids.add(lot["id"])

    order_ids = set()
    for order in orders:
        if order["qty"] < 0:
            raise ValueError("order quantity cannot be negative")
        if order["id"] in order_ids:
            raise ValueError("duplicate order id")
        order_ids.add(order["id"])...
Mostrar resposta completa ▼
def allocate(lots, orders):
    # Validate everything before creating or changing allocation state.
    lot_ids = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError("lot quantity cannot be negative")
        if lot["id"] in lot_ids:
            raise ValueError("duplicate lot id")
        lot_ids.add(lot["id"])

    order_ids = set()
    for order in orders:
        if order["qty"] < 0:
            raise ValueError("order quantity cannot be negative")
        if order["id"] in order_ids:
            raise ValueError("duplicate order id")
        order_ids.add(order["id"])

    remaining = {lot["id"]: lot["qty"] for lot in lots}
    sorted_lots = sorted(lots, key=lambda lot: (lot["expires"], lot["id"]))
    fills = {order["id"]: [] for order in orders}
    short = {}

    for order in sorted(orders, key=lambda order: order["day"]):
        order_id = order["id"]
        qty = order["qty"]
        usable = [
            lot for lot in sorted_lots
            if lot["expires"] >= order["day"] and remaining[lot["id"]] > 0
        ]
        available = sum(remaining[lot["id"]] for lot in usable)

        if order.get("all_or_nothing", False) and qty > available:
            short[order_id] = qty
            continue

        needed = qty
        for lot in usable:
            taken = min(needed, remaining[lot["id"]])
            if taken:
                fills[order_id].append((lot["id"], taken))
                remaining[lot["id"]] -= taken
                needed -= taken
            if needed == 0:
                break

        if needed > 0:
            short[order_id] = needed

    return {"fills": fills, "short": short, "remaining": remaining}

Os pedidos são processados em ordem crescente de dia, de forma estável, e os lotes são considerados primeiro por validade e depois por ID. Um pedido do tipo tudo ou nada que não possa ser totalmente atendido deixa o estoque intocado. As entradas são validadas antes de o estado de alocação ser criado, e as listas e dicionários de entrada não são modificados.

Para L lotes e O pedidos, a complexidade de tempo é O(L log L + O log O + OL): a ordenação dos lotes e dos pedidos, mais a varredura dos lotes utilizáveis para cada pedido. A complexidade de espaço é O(L + O), excluindo as alocações retornadas.

Claude Opus 5.5 8.99

Uma solução correta e limpa. Conferindo-a com o gabarito, ela passa de T1 a T6: usa uma ordenação estável por dia, validade inclusiva, ordenação dos lotes por (expires, id), uma verificação de tudo ou nada considerando apenas o estoque utilizável, e mantém pedidos de quantidade zero fora de short. A validação ocorre antes de qualquer estado ser construído, o formato do retorno é exato e a declaração de complexidade é precisa. O código tem 50 linhas e a explicação, 82 palavras, ambos bem dentro dos limites. Os únicos pontos fracos são pequenos: não há verificações de tipo nem de chaves ausentes, e os lotes utilizáveis são reconstruídos a cada pedido.

Nota por critério

Correção

93

Passa nos seis casos do gabarito pela leitura. A função sorted do Python é estável, então pedidos do mesmo dia mantêm a ordem de entrada. A validade é inclusiva (>=), os lotes são ordenados por (expires, id) e a verificação de tudo ou nada compara com o estoque utilizável naquele dia, sem consumir nada quando o pedido é ignorado. Um pedido de quantidade zero produz um preenchimento vazio e nenhuma entrada em short.

Completude

90

Retorna exatamente as chaves fills, short e remaining. Todo id de pedido aparece em fills, short lista apenas faltas positivas e remaining cobre todos os lotes. ValueError é lançado para quantidades negativas e ids de lote ou pedido duplicados antes de existir qualquer estado de alocação. Tipos e chaves ausentes não são validados, mas a tarefa não exigia isso.

Qualidade do código

87

Legível e conciso, com nomes claros, lotes pré-ordenados e sem loops por unidade. As entradas não são modificadas. A lista de lotes utilizáveis e sua soma são reconstruídas por uma varredura completa para cada pedido, o que é aceitável na complexidade O x L declarada. A guarda 'if taken' é levemente redundante.

Valor prático

85

Diretamente utilizável no cenário do armazém. É eficiente o suficiente para conjuntos pequenos, e o padrão de all_or_nothing é tratado por dict.get. As mensagens de ValueError são claras, mas não identificam o id problemático, e há pouca tratativa defensiva além do que foi especificado.

Seguimento de instruções

92

Usa apenas a biblioteca padrão. O código tem 50 linhas (limite 150) e a explicação tem 82 palavras (limite 200). A explicação declara a complexidade de tempo correta, O(L log L + O log O + OL), e também fornece a complexidade de espaço. Todas as restrições declaradas são respeitadas.

GPT-6.1 Sol 10.00

A implementação satisfaz todos os requisitos e passa em T1–T6 por inspeção. Ela trata corretamente o processamento estável dos pedidos, a validade inclusiva, o desempate FEFO, os atendimentos parciais e as falhas do tipo tudo ou nada que não consomem estoque. A validação ocorre antes da alocação, as entradas são preservadas, e a explicação concisa indica a complexidade correta.

Nota por critério

Correção

100

Passa em T1–T6 por inspeção. A ordenação estável por dia, as verificações de validade inclusiva, a ordenação de lotes por validade/ID, os pedidos de quantidade zero e as verificações tudo-ou-nada apenas com estoque utilizável estão todas corretas.

Completude

100

Retorna exatamente fills, short e remaining, com as entradas exigidas e as alocações em tuplas. Ambas as coleções de entrada são totalmente verificadas quanto a quantidades negativas e IDs duplicados antes de qualquer alocação ocorrer.

Qualidade do código

100

Código claro e autocontido, com nomes descritivos, validação direta e lógica de alocação simples. Evita a mutação das entradas e não executa trabalho por unidade de quantidade.

Valor prático

100

Pronto para uso com as entradas especificadas, com tratamento correto de estoque vencido, faltas, alocações vazias e pedidos tudo-ou-nada ignorados. A explicação descreve com precisão o comportamento e os custos de recursos.

Seguimento de instruções

100

Usa apenas funções nativas do Python, respeita o limite de 150 linhas de código e o limite de 200 palavras da explicação, e acompanha o código com afirmações corretas sobre a complexidade de tempo e de espaço auxiliar.

Gemini 3.8 Flash 10.00

A solução atende perfeitamente a todas as especificações e restrições. Ela trata corretamente a ordenação estável dos pedidos por dia, a priorização dos lotes por validade e ID, os pedidos com quantidade zero, as verificações de tudo ou nada em relação ao estoque utilizável disponível, a validação da entrada antes da alocação e os formatos exatos dos dicionários de saída. A explicação que a acompanha é concisa e indica com precisão a complexidade de tempo e de espaço.

Nota por critério

Correção

100

A implementação passa em todos os casos de teste (T1-T6). Ela usa a ordenação estável do Python para as datas dos pedidos, avalia corretamente a usabilidade dos lotes com validade inclusiva (`expires >= day`), avalia com precisão os pedidos de tudo ou nada em relação ao estoque atualmente utilizável e desempata os lotes de forma limpa.

Completude

100

Todos os casos de borda e requisitos de validação são cobertos com rigor. Quantidades negativas e IDs duplicados de lotes e pedidos geram `ValueError` antes que qualquer estado de alocação seja modificado, e a estrutura de retorno corresponde exatamente à especificação de dicionário exigida.

Qualidade do código

100

O código é idiomático, limpo, legível e bem estruturado, sem dependências desnecessárias ou lógica excessivamente complexa.

Valor prático

100

A função não modifica as coleções de entrada, controla corretamente o estoque restante e é imediatamente utilizável em um cenário real de alocação de estoque em armazém.

Seguimento de instruções

100

Seguiu estritamente todas as instruções: usa apenas a biblioteca padrão, fica bem abaixo do limite de 150 linhas de código (50 linhas) e bem abaixo do limite de 200 palavras da explicação (82 palavras), e detalha explicitamente a complexidade de tempo.

4 Claude Opus 5.5

Média (de 0 a 10) 9.60
def allocate(lots, orders):
    """Alocar estoque FEFO (primeiro a vencer, primeiro a sair) para os pedidos.

    Retorna {"fills": ..., "short": ..., "remaining": ...}.
    Lança ValueError para quantidades negativas ou ids duplicados.
    """
    # ---- Validação (antes de qualquer alocação) ----
    seen_lots = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError(f"lote {lot['id']!r} tem qty negativa")
        if lot["id"] in seen_lots:
            raise ValueError(f"id de lote duplicado {lot['id']!r}")
        seen_lots.add(lot["id"])

    seen_orders = set()
    for or...
Mostrar resposta completa ▼
def allocate(lots, orders):
    """Alocar estoque FEFO (primeiro a vencer, primeiro a sair) para os pedidos.

    Retorna {"fills": ..., "short": ..., "remaining": ...}.
    Lança ValueError para quantidades negativas ou ids duplicados.
    """
    # ---- Validação (antes de qualquer alocação) ----
    seen_lots = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError(f"lote {lot['id']!r} tem qty negativa")
        if lot["id"] in seen_lots:
            raise ValueError(f"id de lote duplicado {lot['id']!r}")
        seen_lots.add(lot["id"])

    seen_orders = set()
    for order in orders:
        if order["qty"] < 0:
            raise ValueError(f"pedido {order['id']!r} tem qty negativa")
        if order["id"] in seen_orders:
            raise ValueError(f"id de pedido duplicado {order['id']!r}")
        seen_orders.add(order["id"])

    # ---- Configuração (os dicts de entrada nunca são modificados) ----
    stock = {lot["id"]: lot["qty"] for lot in lots}
    # Ordem FEFO: vencimento mais próximo primeiro, empates por id do lote (comparação de strings).
    fefo = sorted(lots, key=lambda l: (l["expires"], l["id"]))
    fills = {order["id"]: [] for order in orders}
    short = {}

    # sorted() é estável, então os pedidos do mesmo dia mantêm a ordem de entrada.
    for order in sorted(orders, key=lambda o: o["day"]):
        oid, day, need = order["id"], order["day"], order["qty"]

        usable = [l["id"] for l in fefo
                  if l["expires"] >= day and stock[l["id"]] > 0]

        if order.get("all_or_nothing", False):
            available = sum(stock[lid] for lid in usable)
            if need > available:
                # Não alocar nada; o estoque fica para pedidos posteriores.
                if need > 0:
                    short[oid] = need
                continue

        for lid in usable:
            if need == 0:
                break
            take = min(need, stock[lid])
            stock[lid] -= take
            need -= take
            fills[oid].append((lid, take))

        if need > 0:
            short[oid] = need

    return {"fills": fills, "short": short, "remaining": stock}

Como funciona

A função verifica primeiro todos os lotes e pedidos. Ela lança ValueError para qualquer qty negativa ou id repetido, de modo que nada é alocado quando a entrada é inválida. Ela ordena os lotes uma única vez por (expires, id). Também ordena os pedidos por day. A ordenação do Python é estável, então os pedidos do mesmo dia mantêm a ordem de entrada. Para cada pedido, ela lista os lotes que ainda podem ser usados: expires >= day e estoque maior que 0. Se um pedido do tipo tudo-ou-nada precisar de mais do que o total de estoque utilizável, ele não recebe nada e toda a sua quantidade vai para short. Caso contrário, ela retira estoque dos lotes utilizáveis na ordem FEFO e registra uma tupla (lot_id, qty) para cada lote usado. Qualquer quantidade ainda não atendida vai para short. Pedidos com quantidade 0 recebem uma lista de atendimentos vazia e não aparecem em short. A função trabalha com cópias dos níveis de estoque e nunca altera os dicts de entrada.

Complexidade de tempo: O(L log L + O log O + O·L), onde L é o número de lotes e O é o número de pedidos. Os dois termos com logaritmo vêm da ordenação dos lotes e dos pedidos. O termo O·L vem da varredura dos lotes uma vez para cada pedido. O uso de espaço é O(L + O + F), onde F é o total de tuplas de atendimento.

Claude Opus 5.5 9.11

A solução está correta e passa em todos os seis testes do gabarito, conforme verificado pela leitura. Ela usa uma ordenação estável para os pedidos, validade inclusiva, ordenação dos lotes por (expires, id) e verifica os pedidos all_or_nothing apenas em relação ao estoque utilizável. A validação acontece antes da alocação e o formato do retorno é exato. O código é curto e limpo, e a declaração de complexidade é precisa. O principal defeito é que a explicação tem 220 palavras, acima do limite de 200 palavras.

Nota por critério

Correção

95

Todos os seis testes passam. T1 decorre da ordenação FEFO. T2 exige a ordenação estável por dia e expires >= day inclusivo, e ambos estão presentes. T3 verifica o pedido all_or_nothing contra o estoque utilizável (4), e não contra o estoque total. T4 aplica o desempate por id e trata o pedido de qty zero. T5 mantém a ordem de entrada para pedidos do mesmo dia. T6 executa a validação primeiro. Um pedido all_or_nothing ignorado não consome nada. Não encontrei erros de lógica.

Completude

93

O dicionário de retorno tem exatamente fills, short e remaining. Fills inclui todos os ids de pedido, com listas vazias quando nada foi alocado. Short contém apenas faltas positivas. Remaining cobre todos os lotes. Qty negativa e ids duplicados de lotes e de pedidos disparam ValueError antes de qualquer alocação.

Qualidade do código

90

O código é limpo e legível. Os lotes são ordenados uma única vez, cada pedido faz uma única passagem pelos lotes, os dicionários de entrada não são mutados e os comentários são úteis. Uma pequena ineficiência é reconstruir a lista de lotes utilizáveis para cada pedido, mas isso é aceitável nesta escala.

Valor prático

88

É diretamente utilizável, com mensagens de erro informativas e sem mutação das entradas. A explicação é clara e declara a complexidade corretamente como O(L log L + O log O + O·L), além do uso de espaço.

Seguimento de instruções

80

Usa apenas a biblioteca padrão, o código tem 57 linhas (bem abaixo de 150) e a complexidade de tempo está declarada. No entanto, a explicação tem 220 palavras contra um limite de 200, um excesso de 10%, por isso há dedução de pontos.

GPT-6.1 Sol 9.90

A implementação trata corretamente a alocação FEFO, o processamento estável dos pedidos, os pedidos de tudo ou nada, a validação e a estrutura de retorno exigida. Ela passa nos testes T1–T6 por inspeção, preserva as entradas e informa a complexidade correta. O único defeito é que a explicação excede o limite de 200 palavras.

Nota por critério

Correção

100

Passa nos casos T1–T6 por inspeção. Usa ordenação estável por dia, expiração inclusiva e ordenação de lotes por (expires, id). A verificação de disponibilidade de tudo ou nada inclui apenas o estoque utilizável, e pedidos ignorados não consomem nada.

Completude

100

Retorna exatamente fills, short e remaining com o conteúdo exigido. Valida quantidades negativas e IDs duplicados em ambas as entradas antes do início da alocação.

Qualidade do código

100

Código claro e autocontido, com lógica de validação e alocação direta. Evita a mutação das entradas e a iteração por unidade, e as declarações de complexidade de tempo e espaço estão corretas.

Valor prático

100

Pronto para uso com as entradas especificadas, com mensagens de erro de validação informativas e tratamento correto de alocações vazias, quantidades zero, estoque vencido e atendimentos parciais.

Seguimento de instruções

90

Usa apenas Python padrão, permanece dentro do limite de 57 linhas de código e inclui a declaração de complexidade exigida. Foi descontado 1 ponto porque a explicação medida tem 220 palavras, excedendo o limite de 200 palavras.

Gemini 3.8 Flash 9.80

A implementação atende corretamente a todos os requisitos funcionais e passa nos casos de teste T1 a T6. O formato de retorno e a lógica de validação correspondem com precisão à especificação. O único defeito é exceder o limite de 200 palavras na explicação (medido em 220 palavras).

Nota por critério

Correção

100

Todos os casos extremos (T1–T6) passam corretamente. A ordenação é estável nos dias dos pedidos, os lotes são ordenados por (expires, id), as verificações de estoque do tipo tudo ou nada calculam corretamente apenas o estoque utilizável naquele dia, e as alocações de estoque sem mutação funcionam como esperado.

Completude

100

A função retorna exatamente as chaves solicitadas, com tipos e valores adequados. A validação prévia à alocação cobre estritamente quantidades negativas e IDs duplicados, tanto para os lotes quanto para os pedidos.

Qualidade do código

100

Código Python limpo e idiomático, com comentários claros, estruturas de dados adequadas e nomes de variáveis sensatos.

Valor prático

100

Implementação diretamente utilizável e autocontida, com entradas puras e sem mutação.

Seguimento de instruções

80

O código está bem dentro do limite de 150 linhas (57 linhas), usa apenas a biblioteca padrão e a complexidade é informada. No entanto, a contagem medida de palavras da explicação fora dos blocos de código é de 220 palavras, excedendo o limite explícito de no máximo 200 palavras (10% acima, -2 pontos).

5 Gemini 3.8 Flash

Média (de 0 a 10) 9.12
def allocate(lots, orders):
    # 1. Validação
    seen_lot_ids = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError(f"Quantidade negativa lote: {lot['qty']}")
        if lot["id"] in seen_lot_ids:
            raise ValueError(f"ID de lote duplicado: {lot['id']}")
        seen_lot_ids.add(lot["id"])

    seen_order_ids = set()
    for order in orders:
        if order["qty"] < 0:
            raise ValueError(f"Quantidade negativa de pedido: {order['qty']}")
        if order["id"] in seen_order_ids:
            raise ValueError(f"ID de pedido duplicado: {order['id']}")...
Mostrar resposta completa ▼
def allocate(lots, orders):
    # 1. Validação
    seen_lot_ids = set()
    for lot in lots:
        if lot["qty"] < 0:
            raise ValueError(f"Quantidade negativa lote: {lot['qty']}")
        if lot["id"] in seen_lot_ids:
            raise ValueError(f"ID de lote duplicado: {lot['id']}")
        seen_lot_ids.add(lot["id"])

    seen_order_ids = set()
    for order in orders:
        if order["qty"] < 0:
            raise ValueError(f"Quantidade negativa de pedido: {order['qty']}")
        if order["id"] in seen_order_ids:
            raise ValueError(f"ID de pedido duplicado: {order['id']}")
        seen_order_ids.add(order["id"])

    # Inventário interno de lotes
    remaining = {lot["id"]: lot["qty"] for lot in lots}
    lots_meta = {lot["id"]: lot["expires"] for lot in lots}

    fills = {order["id"]: [] for order in orders}
    short = {}

    # Ordenar pedidos por dia (o Timsort do Python é estável, preservando a ordem de entrada em empates)
    sorted_orders = sorted(orders, key=lambda o: o["day"])

    for order in sorted_orders:
        oid = order["id"]
        req_qty = order["qty"]
        day = order["day"]
        aon = order.get("all_or_nothing", False)

        # Identificar e ordenar lotes utilizáveis
        usable_lots = [
            lid for lid, exp in lots_meta.items()
            if exp >= day and remaining[lid] > 0
        ]
        usable_lots.sort(key=lambda lid: (lots_meta[lid], lid))

        total_usable = sum(remaining[lid] for lid in usable_lots)

        # Tratar verificação de tudo-ou-nada
        if aon and req_qty > total_usable:
            if req_qty > 0:
                short[oid] = req_qty
            continue

        # Alocar estoque de acordo com FEFO
        unfilled = req_qty
        for lid in usable_lots:
            if unfilled == 0:
                break
            take = min(remaining[lid], unfilled)
            if take > 0:
                remaining[lid] -= take
                unfilled -= take
                fills[oid].append((lid, take))

        if unfilled > 0:
            short[oid] = unfilled

    return {
        "fills": fills,
        "short": short,
        "remaining": remaining,
    }
Complexidade e Explicação
  • Complexidade de Tempo: Seja $L$ o número de lotes e $O$ o número de pedidos. A validação das entradas leva $O(L + O)$. A ordenação dos pedidos leva $O(O \log O)$. Para cada pedido, filtrar e ordenar os lotes utilizáveis leva $O(L \log L)$, e a dedução do estoque leva $O(L)$. Assim, processar todos os pedidos leva $O(O \cdot L \log L)$. A complexidade de tempo geral é $\mathcal{O}(O \log O + O \cdot L \log L)$.
  • Complexidade de Espaço: $\mathcal{O}(L + O \cdot \min(L, \text{average fill splits}))$, pois o rastreamento de lotes, metadados de pedidos e históricos de preenchimento requer espaço auxiliar linear em relação às entradas.
Claude Opus 5.5 8.74

Comparando com o gabarito, a função passa nos seis testes: T1 a T5 para alocação e T6 para validação. Os pedidos são ordenados de forma estável por dia, e a validade é inclusiva. A verificação de tudo ou nada usa apenas o estoque utilizável naquele dia, e um pedido ignorado não consome nada. A validação termina antes de qualquer alocação, e o formato do retorno está correto. A principal fraqueza é a eficiência: os lotes utilizáveis são reconstruídos e reordenados a cada pedido, o que resulta em O(O·L log L), em vez de ordenar os lotes uma única vez. O código respeita os limites de tamanho e a explicação indica sua complexidade corretamente.

Nota por critério

Correção

90

Passa em T1 a T6 pela leitura. A ordenação por dia é estável, a verificação expires >= day é inclusiva, e os lotes são ordenados por (expires, id). Preenchimentos parciais funcionam para pedidos normais. A verificação de tudo ou nada é comparada ao estoque utilizável naquele dia, e um pedido ignorado não aloca nada. Um pedido de quantidade zero recebe um preenchimento vazio e nenhuma entrada em short. Nenhum erro de lógica foi encontrado.

Completude

90

Retorna exatamente fills, short e remaining. Todo id de pedido aparece em fills, short lista apenas faltas positivas, e remaining cobre todos os lotes. Quantidades negativas e ids duplicados tanto de lotes quanto de pedidos levantam ValueError antes de qualquer mudança de estado. Todas as partes exigidas estão presentes.

Qualidade do código

82

O código é limpo e legível, com nomes de variáveis claros e comentários úteis. Nunca faz loop por unidade de quantidade. No entanto, filtra e reordena todos os lotes a cada pedido, resultando em O(O·L log L), quando ordenar os lotes uma única vez no início seria mais limpo. A proteção `if take > 0` é um pouco redundante.

Valor prático

83

É diretamente utilizável para pequenos armazéns, e a reordenação por pedido não fará diferença em escala modesta. As mensagens de erro são informativas. É um pouco menos eficiente do que poderia ser para grandes quantidades de lotes.

Seguimento de instruções

90

Usa apenas a biblioteca padrão. O código tem 68 linhas, bem abaixo de 150, e a explicação tem 93 palavras, abaixo de 200. A declaração de complexidade, O(O log O + O·L log L), está correta para o código como escrito. A explicação trata principalmente de complexidade e diz pouco sobre a abordagem, mas todos os elementos exigidos estão presentes.

GPT-6.1 Sol 8.62

A função trata corretamente todos os seis casos de teste, valida as entradas antes da alocação e retorna a estrutura exigida sem modificar as entradas. A principal fraqueza é ordenar novamente os lotes utilizáveis a cada pedido, em vez de ordenar os lotes uma única vez. A declaração de complexidade de tempo reflete essa implementação, mas a declaração de complexidade de espaço omite o armazenamento inevitável por pedido quando os preenchimentos estão vazios.

Nota por critério

Correção

89

Passa em T1–T6 por inspeção: processamento cronológico estável, validade inclusiva, desempate por IDs em string, preenchimentos parciais e rejeição sem consumo nos pedidos de tudo ou nada estão todos corretos. A ordenação repetida por pedido tem um limite assintótico pior do que a condição de eficiência 9+ declarada na política.

Completude

89

Retorna exatamente fills, short e remaining, incluindo preenchimentos vazios e estoque vencido não utilizado. As verificações de IDs duplicados e de quantidades negativas ocorrem antes da alocação. Todos os componentes funcionais exigidos estão presentes; a condição compartilhada de 9+ não é plenamente atendida.

Qualidade do código

80

Código legível e autocontido, com fases claras de validação e alocação, nomes descritivos e sem alteração das entradas. Ordenar os lotes utilizáveis separadamente para cada pedido é desnecessário; ordenar os lotes uma única vez simplificaria o processamento e melhoraria o tempo de pior caso. O estoque utilizável também é somado para pedidos normais, embora apenas os pedidos de tudo ou nada precisem dessa verificação.

Valor prático

83

Diretamente utilizável para o pequeno armazém descrito e trata corretamente os casos de fronteira importantes. A ordenação repetida limita a escalabilidade, e a explicação de complexidade de espaço subestima o armazenamento quando muitos pedidos não recebem estoque.

Seguimento de instruções

88

Usa apenas funções integradas do Python, permanece dentro das 68 linhas de código e 93 palavras de explicação medidas, e inclui uma afirmação correta de complexidade de tempo para sua implementação. O limite adicional de espaço é impreciso: o armazenamento é O(L + O + F), onde F é o número total de tuplas de alocação, incluindo um termo O(O) mesmo quando nenhum pedido recebe estoque.

Gemini 3.8 Flash 10.00

A solução implementa de forma completa e precisa o algoritmo de alocação de estoque FEFO com restrições de tudo ou nada. Ela trata os casos extremos de maneira impecável (incluindo pedidos com quantidade zero, desempate estável por dias do pedido e IDs de lote, e validação rigorosa antes da alocação para quantidades negativas e duplicatas). O código é conciso, idiomático e respeita estritamente todas as restrições de número de linhas e limite de palavras, além de apresentar uma análise de complexidade precisa.

Nota por critério

Correção

100

Todos os testes T1–T6 passam na inspeção. A ordenação estável preserva a sequência dos pedidos em dias iguais, a comparação de validade usa '>=' corretamente, empates na validade dos lotes são desfeitos pelo ID em string, as verificações de tudo ou nada são feitas com base no estoque utilizável naquele dia, e o estoque é deduzido em blocos de quantidade mínima, e não unidade por unidade.

Completude

100

Todos os requisitos são atendidos. Todas as validações de lotes e pedidos são realizadas antes de qualquer alocação, lançando ValueError para quantidades negativas ou IDs duplicados. O dicionário de retorno corresponde exatamente à estrutura exigida e à semântica de 'fills', 'short' e 'remaining'.

Qualidade do código

100

O código é legível, modular, bem comentado e evita complexidade desnecessária. As alocações são feitas usando min(remaining, unfilled), o que torna a dedução do estoque eficiente.

Valor prático

100

A implementação é diretamente utilizável em ambientes de produção ou em sistemas de gestão de armazéns, com verificações defensivas adequadas e mapeamentos claros.

Seguimento de instruções

100

Aderência estrita às restrições: usa apenas a biblioteca padrão do Python, permanece bem abaixo do limite de 150 linhas (68 linhas), e a explicação está bem dentro do limite de 200 palavras (93 palavras), indicando corretamente a complexidade de tempo e de espaço.

6 Gemini 3.5 Flash-Lite

Média (de 0 a 10) 8.89

Função de Alocação FEFO

def allocate(lots, orders):
    if any(l["qty"] < 0 for l in lots) or any(o["qty"] < 0 for o in orders):
        raise ValueError("Negative quantity found")
    
    lot_ids = [l["id"] for l in lots]
    if len(lot_ids) != len(set(lot_ids)):
        raise ValueError("Duplicate lot ID")
    
    order_ids = [o["id"] for o in orders]
    if len(order_ids) != len(set(order_ids)):
        raise ValueError("Duplicate order ID")
    
    remaining = {l["id"]: l["qty"] for l in lots}
    lot_data = {l["id"]: {"expires": l["expires"], "id": l["id"]} for l in lots}
    
    sorted_orde...
Mostrar resposta completa ▼

Função de Alocação FEFO

def allocate(lots, orders):
    if any(l["qty"] < 0 for l in lots) or any(o["qty"] < 0 for o in orders):
        raise ValueError("Negative quantity found")
    
    lot_ids = [l["id"] for l in lots]
    if len(lot_ids) != len(set(lot_ids)):
        raise ValueError("Duplicate lot ID")
    
    order_ids = [o["id"] for o in orders]
    if len(order_ids) != len(set(order_ids)):
        raise ValueError("Duplicate order ID")
    
    remaining = {l["id"]: l["qty"] for l in lots}
    lot_data = {l["id"]: {"expires": l["expires"], "id": l["id"]} for l in lots}
    
    sorted_orders = sorted(enumerate(orders), key=lambda x: (x[1]["day"], x[0]))
    
    fills = {o["id"]: [] for o in orders}
    short = {}
    
    for _, order in sorted_orders:
        oid = order["id"]
        oday = order["day"]
        oqty = order["qty"]
        aon = order.get("all_or_nothing", False)
        
        usable_lots = [
            lid for lid, qty in remaining.items()
            if qty > 0 and lot_data[lid]["expires"] >= oday
        ]
        usable_lots.sort(key=lambda lid: (lot_data[lid]["expires"], lot_data[lid]["id"]))
        
        total_usable = sum(remaining[lid] for lid in usable_lots)
        
        if aon and oqty > total_usable:
            short[oid] = oqty
            continue
            
        allocated_for_order = []
        needed = oqty
        
        # Check if we can fulfill the order partially or fully
        temp_allocation = []
        for lid in usable_lots:
            if needed <= 0:
                break
            take = min(remaining[lid], needed)
            temp_allocation.append((lid, take))
            needed -= take
            
        if aon and needed > 0:
            short[oid] = oqty
            continue
            
        # Apply allocation
        for lid, take in temp_allocation:
            remaining[lid] -= take
            allocated_for_order.append((lid, take))
            
        fills[oid] = allocated_for_order
        if needed > 0:
            short[oid] = needed
            
    return {
        "fills": fills,
        "short": short,
        "remaining": remaining
    }

Explicação e Complexidade

A função allocate primeiro valida os dados de entrada quanto a quantidades negativas e IDs duplicados, levantando um ValueError caso alguma restrição seja violada. Ela preserva os índices originais dos pedidos para desempate no mesmo dia.

Para cada pedido, ordenado por dia, a função identifica os lotes utilizáveis, cuja data de validade é no mínimo o dia do pedido e cujo estoque é diferente de zero. Ela ordena esses lotes segundo as regras FEFO: expires crescente e, em seguida, id crescente. Se um pedido all_or_nothing não tiver estoque utilizável total suficiente, ele é ignorado. Caso contrário, o estoque é deduzido de forma gulosa até que o pedido seja atendido ou o estoque utilizável se esgote.

Complexidade de Tempo

Seja $L$ o número de lotes e $O$ o número de pedidos. Ordenar os pedidos custa $O(O \log O)$. Para cada um dos $O$ pedidos, filtramos e ordenamos os lotes em $O(L \log L)$. Assim, a complexidade de tempo total é $O(O \log O + O \cdot L \log L)$.

Claude Opus 5.5 8.07

Pela leitura, a função está correta em todos os seis casos do gabarito: usa uma ordenação estável por dia, validade inclusiva, ordenação dos lotes por (expires, id), verifica os pedidos all_or_nothing apenas em relação ao estoque utilizável, trata pedidos de quantidade zero, valida antes de alocar e retorna exatamente as três chaves. Os pontos fracos são a ineficiência e a redundância. Os lotes utilizáveis são filtrados e ordenados novamente a cada pedido (O·L log L), há uma segunda verificação de all_or_nothing que nunca é executada e o dicionário lot_data repete o id desnecessariamente. Isso a mantém fora da faixa 9+.

Nota por critério

Correção

85

Passa em T1 a T6 pela leitura. Os pedidos são ordenados por (day, index), expires >= day é inclusivo, empates são resolvidos pelo id do lote, e all_or_nothing é verificado somente contra o estoque utilizável. Um pedido all_or_nothing ignorado não consome nada, e um pedido de quantidade zero aparece em fills, mas não em short. Não é 9+ porque reordenar os lotes para cada pedido resulta em O·L log L em vez do mais limpo O·L.

Completude

87

O formato de retorno é exatamente fills, short e remaining. Cada id de pedido aparece em fills com listas de tuplas, e short contém apenas faltas positivas. ValueError é lançado para quantidades negativas e para ids de lote ou de pedido duplicados, antes de qualquer alocação.

Qualidade do código

68

O código é legível, mas tem redundância. O lot_data armazena o id novamente, a segunda verificação aon após a alocação temporária nunca pode disparar, e allocated_for_order duplica temp_allocation. Filtrar e reordenar todos os lotes a cada pedido é desperdício, quando uma única ordenação prévia bastaria.

Valor prático

75

Funciona corretamente para o cenário do armazém, e a validação é sensata. A ordenação por pedido escalaria mal com muitos lotes e pedidos, mas isso é aceitável para um armazém pequeno.

Seguimento de instruções

87

Usa apenas a biblioteca padrão. O código tem 68 linhas, dentro do limite de 150. A explicação tem 148 palavras, dentro do limite de 200, e informa uma complexidade de tempo que descreve corretamente esta implementação.

GPT-6.1 Sol 8.61

A implementação trata corretamente todos os seis casos de teste, valida as entradas antes da alocação e retorna a estrutura exigida. Ela respeita os limites de código e de explicação e descreve com precisão o seu principal custo de execução. Sua principal fraqueza é ordenar novamente os lotes utilizáveis a cada pedido, o que resulta em um limite mais lento do que ordenar os lotes uma única vez; além disso, parte do controle da alocação é redundante.

Nota por critério

Correção

89

Passa em T1–T6 por inspeção: o processamento cronológico preserva a ordem dentro do mesmo dia, a validade é inclusiva, os empates no FEFO usam os IDs dos lotes, e pedidos de tudo ou nada verificam apenas o estoque utilizável e não consomem nada quando são ignorados. Pedidos com quantidade zero são tratados corretamente. A ordenação repetida não atende ao limite de eficiência associado à condição 9+ da política.

Completude

89

Retorna exatamente fills, short e remaining, incluindo cada pedido e lote quando necessário. Quantidades negativas e IDs duplicados são rejeitados antes do início da alocação. Nenhuma funcionalidade obrigatória está ausente; a condição global de eficiência 9+ não é atendida.

Qualidade do código

78

Código legível e autocontido, com etapas claras de validação e alocação. No entanto, ordenar os lotes utilizáveis para cada pedido é desnecessário, lot_data armazena cada ID de forma redundante, e a alocação temporária somada à segunda verificação de tudo ou nada acrescenta contabilidade extra depois que a suficiência já foi estabelecida.

Valor prático

84

Pronta para uso em um pequeno armazém, com resultados determinísticos e sem alteração dos insumos fornecidos. A ordenação repetida por pedido limita a escalabilidade em comparação com ordenar os lotes uma única vez, mas não compromete sua utilidade para o cenário descrito.

Seguimento de instruções

89

Usa apenas funcionalidades nativas do Python, fornece a função solicitada e permanece dentro dos limites medidos de 68 linhas de código e 148 palavras de explicação. A explicação inclui um limite de complexidade principal preciso, mas esse limite é mais lento do que a meta de eficiência 9+ da política.

Gemini 3.8 Flash 10.00

A solução atende perfeitamente a todos os requisitos e passa em todos os casos de teste (T1–T6) descritos na política. A validação é feita logo no início, a ordenação dos pedidos é estável, o critério de desempate entre lotes e as condições de validade estão estritamente corretos, a lógica de tudo ou nada considera corretamente o estoque utilizável, e a estrutura de retorno é exata. O limite de linhas e o limite de palavras da explicação são rigorosamente respeitados, com uma análise precisa da complexidade de tempo.

Nota por critério

Correção

100

A implementação aplica corretamente a ordenação estável dos pedidos por dia, a seleção estrita de lotes FEFO com desempate por ID como string, a filtragem de validade (expires >= day) e a semântica exata de tudo ou nada, sem vazamento de estado.

Completude

100

Todos os casos extremos e requisitos são tratados: validação antecipada de quantidades negativas e IDs duplicados, formato correto do dicionário de retorno, omissão de pedidos com falta restante igual a zero em 'short' e inclusão de pedidos sem alocações em 'fills'.

Qualidade do código

100

O código é limpo, idiomático, legível e bem estruturado, evitando passagens redundantes sobre unidades individuais de quantidade.

Valor prático

100

A solução está pronta para produção em problemas padrão de alocação de estoque, com fluxo de execução claro e totalmente confiável.

Seguimento de instruções

100

Seguiu todas as restrições: somente biblioteca padrão, 68 linhas de código (bem abaixo do limite de 150 linhas) e uma explicação de 148 palavras (abaixo do limite de 200 palavras) que inclui uma análise precisa de complexidade de tempo.

Sobre este gênero

Neste gênero, as capacidades mais observadas são Correção, Completude, Qualidade do código.

Diferente de system design, aqui pesa mais se o código realmente funciona do que as decisões de arquitetura em alto nível.

Uma nota alta aqui não garante melhor julgamento de produto, melhor arquitetura nem explicações mais didáticas.

Para que servem modelos fortes neste gênero

implementação, depuração, refatoração e apoio prático ao programar.

O que este gênero sozinho não consegue mostrar

se o modelo é melhor para arquitetura, documentos para stakeholders ou ideação aberta.

O que é avaliado em Programação

Critérios e pesos usados neste ranking por gênero.

Correção

35.0%

Este critério foi incluído para verificar Correção na resposta. Ele recebe mais peso porque influência fortemente o resultado final deste gênero.

Completude

20.0%

Este critério foi incluído para verificar Completude na resposta. Ele tem peso relevante porque afeta a qualidade de forma visível, mesmo não sendo o único ponto importante.

Qualidade do código

20.0%

Este critério foi incluído para verificar Qualidade do código na resposta. Ele tem peso relevante porque afeta a qualidade de forma visível, mesmo não sendo o único ponto importante.

Valor prático

15.0%

Este critério foi incluído para verificar Valor prático na resposta. Ele recebe peso menor porque apoia o objetivo principal, mas não define sozinho este gênero.

Seguimento de instruções

10.0%

Este critério foi incluído para verificar Seguimento de instruções na resposta. Ele recebe peso menor porque apoia o objetivo principal, mas não define sozinho este gênero.

Links relacionados

X f L