Orivel Orivel
Ouvrir le menu

Implémenter un magasin clé-valeur versionné avec requêtes historiques

Comparez les reponses des modeles pour cette tache benchmark en Programmation et consultez scores, commentaires et exemples lies.

Connectez-vous ou inscrivez-vous pour utiliser les likes et favoris. Inscription

X f L

Sommaire

Vue d ensemble de la tache

Genres de comparaison

Programmation

Modele createur de la tache

Modeles participants

Modeles evaluateurs

Consigne de la tache

Écrivez du code qui implémente un magasin clé-valeur versionné en mémoire prenant en charge les lectures historiques. Le magasin commence vide et traite une séquence de commandes. Chaque commande mutative réussie crée exactement un nouveau numéro de version global, en commençant par 1. Les commandes en lecture seule ne doivent pas créer de version. Les clés et valeurs sont des chaînes sensibles à la casse sans espaces. Les versions sont des entiers positifs. Commands: SET key value Create or overwrite key with va...

Afficher plus

Écrivez du code qui implémente un magasin clé-valeur versionné en mémoire prenant en charge les lectures historiques. Le magasin commence vide et traite une séquence de commandes. Chaque commande mutative réussie crée exactement un nouveau numéro de version global, en commençant par 1. Les commandes en lecture seule ne doivent pas créer de version. Les clés et valeurs sont des chaînes sensibles à la casse sans espaces. Les versions sont des entiers positifs. Commands: SET key value Create or overwrite key with value. DELETE key Remove key if it exists. GET key Return the current value for key, or NULL if the key does not exist. GET_VERSION key version Return the value associated with key immediately after the specified global version was created, or NULL if the key did not exist at that version. If version is greater than the latest existing version, treat it as invalid and return INVALID_VERSION. HISTORY key Return all historical states for the key in increasing version order, including deletions, formatted as version:value pairs separated by commas. Use NULL for deleted or absent-after-mutation states. If the key has never been affected by any mutating command, return EMPTY. Input format: The first line contains an integer N, the number of commands. The next N lines each contain one command. Output format: For every GET, GET_VERSION, and HISTORY command, print one line with the result. Behavior details and edge cases: - Every SET always creates a new version, even if the value is unchanged. - Every DELETE always creates a new version, even if the key does not exist. - Versions are global across all keys, not per key. - HISTORY for a key should include only versions where that key was directly affected by SET or DELETE. - If a key was deleted and later set again, both events must appear in HISTORY. - Efficiency matters: assume up to 200000 commands, with many historical queries. Your solution should read from standard input and write to standard output. Include the full working program in one file. You may use any mainstream programming language, but the code should be complete and executable as written.

Informations complementaires

Cette tâche est conçue pour tester la gestion attentive de la sémantique des versions, des cas limites et des choix de structures de données évolutives plutôt que seulement l'analyse syntaxique de base.

Politique d evaluation

Une bonne réponse fournit un programme exécutable complet qui suit correctement les règles de version globale, distingue les commandes en lecture seule des commandes mutatives, gère les versions invalides et les clés absentes exactement comme spécifié, et est capable de monter en charge pour de grandes entrées sans copier naïvement l'état complet à chaque version. Les bonnes solutions gardent également l'implémentation claire et robuste, avec un parsing correct et une recherche historique efficace.

Reponses

import sys import bisect def solve(): """ Implémente un magasin clé-valeur versionné qui lit les commandes depuis stdin et écrit les résultats sur stdout. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # La structure de données principale. # Un dictionnaire mappant chaque clé à une liste de ses états historiques. # Chaque état est un tuple : (version, valeur). # La liste pour chaque clé est triée par version. # Une valeur de None représente une suppre...

Afficher la reponse complete

import sys import bisect def solve(): """ Implémente un magasin clé-valeur versionné qui lit les commandes depuis stdin et écrit les résultats sur stdout. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # La structure de données principale. # Un dictionnaire mappant chaque clé à une liste de ses états historiques. # Chaque état est un tuple : (version, valeur). # La liste pour chaque clé est triée par version. # Une valeur de None représente une suppression. store = {} global_version = 0 for _ in range(n): line = sys.stdin.readline() if not line: continue parts = line.strip().split() command = parts[0] if command == "SET": # Crée ou écrase une clé avec une valeur, créant une nouvelle version. key, value = parts[1], parts[2] global_version += 1 if key not in store: store[key] = [] store[key].append((global_version, value)) elif command == "DELETE": # Supprime une clé, créant une nouvelle version. # Ceci s'applique même si la clé n'existe pas. key = parts[1] global_version += 1 if key not in store: store[key] = [] store[key].append((global_version, None)) elif command == "GET": # Renvoie la valeur actuelle d'une clé. key = parts[1] if key not in store or not store[key]: print("NULL") else: # La dernière entrée dans la liste d'historique est l'état actuel. _version, value = store[key][-1] print(value if value is not None else "NULL") elif command == "GET_VERSION": # Renvoie la valeur d'une clé à une version historique spécifique. key, version_str = parts[1], parts[2] version = int(version_str) if version <= 0 or version > global_version: print("INVALID_VERSION") elif key not in store or not store[key]: print("NULL") else: history = store[key] # Crée une liste des numéros de version uniquement pour une recherche efficace. versions = [v for v, _val in history] # Trouve le point d'insertion pour la version demandée. # bisect_right trouve l'indice où la version serait insérée # pour maintenir l'ordre. Cela signifie que tous les éléments à gauche de cet # indice ont des versions inférieures ou égales à la version demandée. idx = bisect.bisect_right(versions, version) if idx == 0: # Aucune version historique n'est <= à la version demandée. print("NULL") else: # L'état que nous voulons est à l'indice précédent (idx - 1). _v, value = history[idx - 1] print(value if value is not None else "NULL") elif command == "HISTORY": # Renvoie tous les états historiques d'une clé. key = parts[1] if key not in store or not store[key]: print("EMPTY") else: history = store[key] result_parts = [] for v, val in history: str_val = val if val is not None else "NULL" result_parts.append(f"{v}:{str_val}") print(",".join(result_parts)) if __name__ == "__main__": solve()

Resultat

#2

Votes gagnants

1 / 3

Score moyen

81
Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

79

Commentaire global

La réponse A fournit une implémentation correcte et complète du magasin clé-valeur versionné. Elle gère toutes les commandes correctement, utilise `bisect` pour des recherches historiques efficaces et inclut des commentaires et des docstrings clairs. Cependant, elle présente un problème de performance : dans `GET_VERSION`, elle crée une nouvelle liste de numéros de version à chaque appel de requête (`versions = [v for v, _val in history]`), ce qui est O(k) par requête où k est le nombre d'entrées d'historique pour cette clé. Pour 200 000 commandes avec de nombreuses requêtes historiques, cela pourrait constituer un goulot d'étranglement de performance important. Elle utilise également `readline()` dans une boucle, ce qui est plus lent que la lecture en bloc pour de grandes entrées. Le code ne gère pas correctement la vérification `version <= 0` pour `GET_VERSION` - la spécification indique que les versions sont des entiers positifs, et la version 0 ou négative devrait logiquement être `INVALID_VERSION`, ce que la réponse A gère. Dans l'ensemble, c'est une solution solide avec un problème d'efficacité notable.

Afficher le detail de l evaluation

Exactitude

Poids 35%
85

La réponse A gère correctement toutes les commandes : `SET`, `DELETE`, `GET`, `GET_VERSION`, `HISTORY`. Elle utilise correctement `bisect_right` pour les recherches historiques, gère `NULL` pour les clés supprimées, renvoie `EMPTY` pour les clés jamais affectées, et vérifie les versions invalides, y compris `version <= 0`. Tous les cas limites mentionnés dans la spécification semblent être gérés correctement.

Completude

Poids 20%
80

La réponse A implémente les cinq commandes comme spécifié, gère tous les cas limites mentionnés dans l'invite, y compris les valeurs `SET` inchangées créant de nouvelles versions, `DELETE` sur des clés inexistantes créant des versions, et le formatage correct de `HISTORY`. La solution est complète et exécutable.

Qualite du code

Poids 20%
75

La réponse A a une bonne qualité de code avec des noms de variables clairs, une docstring et des commentaires en ligne utiles expliquant la logique. Le code est bien structuré et facile à suivre. L'utilisation de `bisect` est propre, bien que la création de liste temporaire dans `GET_VERSION` soit un modèle inutile.

Valeur pratique

Poids 15%
65

La réponse A fonctionne correctement mais présente un problème de performance important : `GET_VERSION` crée une nouvelle liste de versions à chaque appel, la rendant O(k) par requête même avant la recherche binaire. Combinée à la lecture ligne par ligne et aux appels d'impression individuels, cette solution pourrait avoir du mal avec la limite de 200 000 commandes mentionnée avec de nombreuses requêtes historiques.

Respect des consignes

Poids 10%
80

La réponse A suit toutes les instructions : lit depuis `stdin`, écrit vers `stdout`, est un programme exécutable complet en un seul fichier, gère toutes les commandes et cas limites spécifiés, et utilise une approche de structure de données efficace (listes d'historique par clé avec recherche binaire).

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

90

Commentaire global

La réponse A fournit une solution robuste et bien structurée. Elle implémente correctement toutes les commandes, gère les cas limites tels que les clés inexistantes et les versions invalides (y compris les versions non positives pour GET_VERSION), et utilise des structures de données et des algorithmes efficaces (comme `bisect` pour les recherches historiques). L'analyse des entrées est standard et robuste pour un traitement ligne par ligne. Le code est clair, bien commenté et pythonique.

Afficher le detail de l evaluation

Exactitude

Poids 35%
95

La solution implémente correctement toutes les commandes et gère les cas limites spécifiés. Elle interprète également correctement 'Les versions sont des entiers positifs' en traitant les versions non positives dans GET_VERSION comme INVALID_VERSION, ce qui est une interprétation robuste des exigences implicites de l'énoncé.

Completude

Poids 20%
90

Le programme est entièrement complet, exécutable et couvre toutes les fonctionnalités requises ainsi que les formats d'entrée/sortie. La lecture des entrées est robuste pour un traitement ligne par ligne.

Qualite du code

Poids 20%
85

Le code est bien structuré, utilise des noms de variables clairs et inclut des commentaires utiles. Il exploite le module `bisect` pour une recherche binaire efficace et pythonique, contribuant à un code plus propre et plus maintenable.

Valeur pratique

Poids 15%
85

La solution utilise des structures de données efficaces (dictionnaire de listes de tuples) et des algorithmes (recherche binaire) pour les requêtes historiques, la rendant évolutive. Sa gestion robuste des entrées et ses vérifications d'erreurs complètes améliorent sa valeur pratique.

Respect des consignes

Poids 10%
90

La solution suit méticuleusement toutes les instructions explicites, y compris les règles de versionnement, les formats de sortie et les considérations d'efficacité. Elle interprète également correctement les exigences implicites, telles que la gestion des versions non positives comme invalides.

Modeles evaluateurs OpenAI GPT-5.4

Score total

75

Commentaire global

La réponse A est un programme exécutable complet qui capture correctement le modèle d'historique versionné principal pour SET, DELETE, GET, GET_VERSION et HISTORY. Sa sémantique est largement alignée sur l'invite, y compris le versionnement global et l'enregistrement des suppressions. Cependant, son implémentation GET_VERSION reconstruit une liste de numéros de version à chaque requête, ce qui ajoute une surcharge inutile et nuit à la scalabilité pour le paramètre d'entrée volumineuse indiqué. Elle traite également les versions non positives comme invalides, ce qui est raisonnable mais pas explicitement requis au-delà des versions étant des entiers positifs. Dans l'ensemble, elle est correcte dans les cas typiques mais moins efficace que prévu pour des requêtes historiques intensives.

Afficher le detail de l evaluation

Exactitude

Poids 35%
77

La logique pour SET, DELETE, GET, GET_VERSION et HISTORY est largement correcte, y compris les versions globales et les marqueurs de suppression. Les requêtes historiques renvoient l'état le plus récent à ou avant la version demandée, et les versions futures invalides sont gérées. La principale réserve de correction n'est pas fonctionnelle dans les cas normaux mais liée aux hypothèses de gestion des cas limites et au style d'implémentation des requêtes.

Completude

Poids 20%
83

La réponse fournit un programme complet et fonctionnel en un seul fichier, lit l'entrée standard, écrit la sortie standard et couvre toutes les commandes et sorties requises. Elle inclut également le comportement historique requis et l'historique des mutations uniquement. Elle est complète pour la tâche, avec seulement une légère ambiguïté sur les cas limites concernant les versions non positives invalides.

Qualite du code

Poids 20%
68

Le code est lisible et raisonnablement organisé, avec des commentaires clairs et un flux de contrôle simple. Cependant, la construction d'une nouvelle liste de versions dans chaque appel GET_VERSION est une faiblesse de conception évitable, et l'impression ligne par ligne est moins optimisée pour une sortie intensive. La qualité est solide mais pas particulièrement forte pour un benchmark sensible aux performances.

Valeur pratique

Poids 15%
61

Le programme fonctionnera pour de nombreuses entrées ordinaires, mais les appels répétés à GET_VERSION sur de longs historiques entraîneront une surcharge supplémentaire due à la reconstruction des tableaux de versions à chaque fois. Cela le rend moins adapté à la charge de travail à haut volume décrite dans l'invite. Il est pratique comme référence mais pas idéal pour les contraintes du benchmark.

Respect des consignes

Poids 10%
87

La réponse suit l'instruction de fournir un code exécutable complet et adhère étroitement à la sémantique des commandes et au format de sortie spécifiés. Elle respecte le versionnement global et la création de versions uniquement par mutation. La gestion mineure des cas limites autour des versions invalides ne nuit pas matériellement à la conformité.

import sys from bisect import bisect_right def main(): input_data = sys.stdin.buffer.read().split() idx = 0 n = int(input_data[idx]); idx += 1 # For each key, store a list of (version, value_or_None) sorted by version history = {} # key -> list of (version, value) current_version = 0 output = [] for _ in range(n): cmd = input_data[idx].decode(); idx += 1 if cmd == 'SET': key = input_data[idx].decode(); idx += 1 value = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history:...

Afficher la reponse complete

import sys from bisect import bisect_right def main(): input_data = sys.stdin.buffer.read().split() idx = 0 n = int(input_data[idx]); idx += 1 # For each key, store a list of (version, value_or_None) sorted by version history = {} # key -> list of (version, value) current_version = 0 output = [] for _ in range(n): cmd = input_data[idx].decode(); idx += 1 if cmd == 'SET': key = input_data[idx].decode(); idx += 1 value = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history: history[key] = [] history[key].append((current_version, value)) elif cmd == 'DELETE': key = input_data[idx].decode(); idx += 1 current_version += 1 if key not in history: history[key] = [] history[key].append((current_version, None)) elif cmd == 'GET': key = input_data[idx].decode(); idx += 1 if key not in history or not history[key]: output.append('NULL') else: val = history[key][-1][1] output.append(val if val is not None else 'NULL') elif cmd == 'GET_VERSION': key = input_data[idx].decode(); idx += 1 version = int(input_data[idx]); idx += 1 if version > current_version: output.append('INVALID_VERSION') else: if key not in history or not history[key]: output.append('NULL') else: h = history[key] # Find the last entry with version <= requested version # Binary search on versions lo, hi = 0, len(h) - 1 res_idx = -1 while lo <= hi: mid = (lo + hi) // 2 if h[mid][0] <= version: res_idx = mid lo = mid + 1 else: hi = mid - 1 if res_idx == -1: output.append('NULL') else: val = h[res_idx][1] output.append(val if val is not None else 'NULL') elif cmd == 'HISTORY': key = input_data[idx].decode(); idx += 1 if key not in history or not history[key]: output.append('EMPTY') else: parts = [] for ver, val in history[key]: parts.append(f"{ver}:{val if val is not None else 'NULL'}") output.append(','.join(parts)) print('\n'.join(output)) main()

Resultat

#1 | Gagnant

Votes gagnants

2 / 3

Score moyen

80
Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

81

Commentaire global

La réponse B fournit une implémentation correcte et complète avec de meilleures caractéristiques de performance. Elle lit toute l'entrée en une seule fois en utilisant sys.stdin.buffer.read(), ce qui est significativement plus rapide pour les grandes entrées. Elle implémente la recherche binaire manuellement au lieu d'utiliser bisect, évitant ainsi la nécessité de créer une liste temporaire de versions à chaque appel de GET_VERSION - elle recherche directement dans la liste d'historique. Elle collecte toutes les sorties et les imprime en une seule fois, ce qui est également plus efficace. Cependant, elle ne vérifie pas si la version est <= 0 dans GET_VERSION (bien que la spécification indique que les versions sont des entiers positifs, ce cas limite peut donc ne pas apparaître en pratique). Le code est légèrement moins lisible en raison du suivi manuel des index pour l'analyse, mais c'est un modèle courant pour la programmation compétitive et le code critique en termes de performance.

Afficher le detail de l evaluation

Exactitude

Poids 35%
85

La réponse B gère correctement toutes les commandes avec une logique appropriée. La recherche binaire manuelle trouve correctement la dernière entrée avec une version <= à la version demandée. Elle gère NULL pour les suppressions, EMPTY pour les clés non affectées, et INVALID_VERSION pour les versions au-delà de la version actuelle. Préoccupation mineure : elle ne vérifie pas explicitement la version <= 0, mais cela est peu probable d'apparaître dans des cas de test valides étant donné que la spécification indique que les versions sont des entiers positifs.

Completude

Poids 20%
80

La réponse B implémente les cinq commandes comme spécifié et gère les cas limites clés. C'est un programme complet et exécutable qui couvre la spécification complète. Le seul petit défaut est le manque de gestion explicite pour la version <= 0 dans GET_VERSION.

Qualite du code

Poids 20%
70

La réponse B utilise un style de programmation compétitive moins lisible mais courant avec un suivi manuel des index pour l'analyse. La recherche binaire manuelle est légèrement plus difficile à lire que l'utilisation de bisect. Cependant, le code reste raisonnablement clair et bien organisé. Il manque des commentaires et de la documentation par rapport à la réponse A.

Valeur pratique

Poids 15%
85

La réponse B est bien optimisée pour l'échelle indiquée : lecture d'entrée en bloc via buffer, recherche binaire directe sur la liste d'historique sans allocations temporaires, et sortie par lots. Ces optimisations la rendent pratique pour la contrainte de 200 000 commandes et représentent une bonne ingénierie pour les scénarios sensibles aux performances.

Respect des consignes

Poids 10%
80

La réponse B suit toutes les instructions : lit depuis stdin, écrit sur stdout, est un programme complet et exécutable en un seul fichier, gère toutes les commandes et cas limites spécifiés, et utilise des structures de données efficaces. La note d'efficacité dans l'invite est bien traitée par l'approche optimisée d'E/S et de recherche.

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

77

Commentaire global

La réponse B fournit une solution globalement correcte avec des structures de données efficaces. Cependant, elle présente un problème mineur de correction en ne gérant pas explicitement les versions non positives pour GET_VERSION comme invalides. La stratégie d'analyse des entrées (lecture de toutes les entrées en une seule fois) est moins robuste pour des entrées très volumineuses par rapport au traitement ligne par ligne, et l'implémentation manuelle de la recherche binaire est moins idiomatique que l'utilisation du module `bisect`. Le code manque également de commentaires, ce qui réduit sa lisibilité.

Afficher le detail de l evaluation

Exactitude

Poids 35%
80

La solution est globalement correcte mais ne parvient pas à gérer explicitement les versions non positives pour GET_VERSION. Bien que l'énoncé indique 'Les versions sont des entiers positifs', il ne définit pas explicitement le comportement pour les versions non positives. Cependant, les traiter comme INVALID_VERSION (comme le fait la réponse A) est le comportement le plus robuste et attendu pour une entrée invalide.

Completude

Poids 20%
85

Le programme est entièrement complet et exécutable. Cependant, sa stratégie de lecture des entrées (lecture de toutes les entrées en une seule fois) pourrait être moins efficace en mémoire et moins robuste pour des entrées extrêmement volumineuses par rapport au traitement ligne par ligne, bien que cela puisse être acceptable pour le nombre de commandes spécifié.

Qualite du code

Poids 20%
65

Le code manque de commentaires, ce qui le rend plus difficile à comprendre rapidement. Il implémente une recherche binaire manuelle au lieu d'utiliser le module `bisect`, ce qui est moins idiomatique en Python et potentiellement plus sujet aux erreurs. Le mécanisme d'analyse des entrées est également un peu moins propre.

Valeur pratique

Poids 15%
75

La solution utilise des structures de données et des algorithmes efficaces pour la scalabilité. Cependant, la gestion moins robuste des entrées et le contrôle manquant du cas limite pour GET_VERSION diminuent légèrement sa valeur pratique par rapport à la réponse A.

Respect des consignes

Poids 10%
75

La solution suit la plupart des instructions concernant l'implémentation des commandes et le format de sortie. Cependant, elle manque l'instruction implicite de traiter les versions non positives comme invalides pour GET_VERSION, ce qui est implicite par 'Les versions sont des entiers positifs'.

Modeles evaluateurs OpenAI GPT-5.4

Score total

84

Commentaire global

La réponse B est un programme exécutable complet qui implémente correctement la sémantique de version globale requise, les recherches historiques, le suivi des suppressions et le formatage de la sortie. Elle est notablement plus performante en termes de scalabilité grâce à l'utilisation d'une entrée tamponnée, d'une sortie accumulée et d'une recherche binaire directement sur l'historique de chaque clé sans recréer de tableaux auxiliaires par requête. La structure est concise et pratique pour un grand nombre de commandes. Un petit problème est qu'elle ne signale que les versions supérieures à la dernière comme invalides et ne rejette pas explicitement les versions non positives, mais il s'agit d'une lacune mineure dans un cas limite par rapport à une solution par ailleurs solide.

Afficher le detail de l evaluation

Exactitude

Poids 35%
84

L'implémentation modélise correctement les incréments de version globaux uniquement sur les mutations, suit l'historique par clé et renvoie les valeurs actuelles et historiques appropriées, y compris les suppressions. Le formatage de l'HISTORIQUE suit également le prompt. La principale lacune mineure est que les versions non positives ne sont pas explicitement traitées comme invalides, bien que les versions futures soient correctement gérées.

Completude

Poids 20%
85

La réponse est une solution exécutable complète en un seul fichier avec toutes les commandes requises implémentées et le comportement de sortie couvert. Elle gère les principaux cas limites du prompt, y compris les suppressions de clés manquantes et les versions futures invalides. Seul le cas limite des versions non positives n'est pas explicitement abordé.

Qualite du code

Poids 20%
78

Le code est concis, organisé et utilise une entrée tamponnée efficace et une sortie par lots. Sa recherche binaire manuelle fonctionne directement sur l'historique stocké et évite les allocations supplémentaires par requête. Il y a un petit import inutilisé car bisect_right est importé mais non utilisé, mais dans l'ensemble, la qualité de l'implémentation est plus solide et plus consciente des performances.

Valeur pratique

Poids 15%
86

La solution est bien adaptée à l'échelle indiquée, utilisant une entrée tamponnée tokenisée, une agrégation de sortie et une recherche historique logarithmique sans copie inutile. Ces choix la rendent beaucoup plus pratique pour des centaines de milliers de commandes avec de nombreuses requêtes historiques.

Respect des consignes

Poids 10%
88

La réponse suit le format demandé et fournit un programme exécutable complet qui correspond étroitement au comportement spécifié. Elle respecte les règles de version globale et la sémantique d'historique à effet direct. Le seul léger problème de conformité est de ne pas marquer explicitement les versions non positives comme invalides.

Resume comparatif

Pour chaque tache et discussion, le classement final est determine par agregation des rangs par evaluateur (rang moyen + departage Borda). Le score moyen est affiche a titre indicatif.

Evaluateurs: 3

Votes gagnants

1 / 3

Score moyen

81
Voir cette reponse

Votes gagnants

2 / 3

Score moyen

80
Voir cette reponse

Resultats de l evaluation

Modeles evaluateurs OpenAI GPT-5.4

Raison du gagnant

La réponse B l'emporte car elle correspond au comportement requis tout en étant plus évolutive et plus efficace en termes d'implémentation pour les contraintes d'entrée volumineuses du benchmark. Les deux réponses sont globalement correctes, mais B évite de reconstruire des tableaux de versions par requête, utilise des modèles d'E/S plus rapides et est donc plus pratique pour de nombreuses requêtes historiques. A est acceptable, mais son approche GET_VERSION est moins efficace et plus faible par rapport aux attentes de performance énoncées.

Modeles evaluateurs Google Gemini 2.5 Flash

Raison du gagnant

La réponse A est supérieure en raison de sa correction complète, en particulier dans la gestion du cas limite des versions non positives pour GET_VERSION, que la réponse B manque. La réponse A démontre également une meilleure qualité de code en utilisant le module `bisect` de la bibliothèque standard Python pour une recherche efficace et en fournissant des commentaires clairs. Sa méthode de gestion des entrées est également généralement plus robuste pour les grandes entrées.

Modeles evaluateurs Anthropic Claude Opus 4.6

Raison du gagnant

La réponse B l'emporte principalement pour sa valeur pratique et son efficacité. Les deux solutions sont fonctionnellement correctes et répondent aux exigences principales. Cependant, la réponse B est nettement plus efficace : (1) elle lit toutes les entrées en une seule fois via une lecture tamponnée, (2) elle effectue une recherche binaire directement sur la liste d'historique sans créer de listes temporaires, (3) elle regroupe toutes les sorties en un seul appel d'impression. Ces optimisations sont importantes compte tenu de la contrainte de 200 000 commandes avec de nombreuses requêtes historiques. Le GET_VERSION de la réponse A crée une nouvelle compréhension de liste à chaque appel, ce qui représente une surcharge O(k) par requête. Bien que la réponse A ait une lisibilité et une documentation légèrement meilleures, la différence de performance est significative pour les exigences d'échelle énoncées.

X f L