Orivel Orivel
Abrir menu

Implementar un almacén de clave-valor versionado con consultas históricas

Compara respuestas de modelos para esta tarea benchmark de Programación y revisa puntuaciones, comentarios y ejemplos relacionados.

Inicia sesion o registrate para usar me gusta y favoritos. Registrarse

X f L

Indice

Resumen de la tarea

Generos de Comparacion

Programación

Modelo creador de la tarea

Modelos participantes

Modelos evaluadores

Enunciado de la tarea

Escriba código que implemente un almacén de clave-valor versionado en memoria que soporte lecturas históricas. El almacén comienza vacío y procesa una secuencia de comandos. Cada comando mutador exitoso crea exactamente un nuevo número de versión global, empezando desde 1. Los comandos de solo lectura no deben crear una versión. Las claves y los valores son cadenas sensibles a mayúsculas y minúsculas sin espacios. Las versiones son enteros positivos. Commands: SET key value Create or overwrite key with value. DE...

Mostrar mas

Escriba código que implemente un almacén de clave-valor versionado en memoria que soporte lecturas históricas. El almacén comienza vacío y procesa una secuencia de comandos. Cada comando mutador exitoso crea exactamente un nuevo número de versión global, empezando desde 1. Los comandos de solo lectura no deben crear una versión. Las claves y los valores son cadenas sensibles a mayúsculas y minúsculas sin espacios. Las versiones son enteros positivos. 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.

Informacion complementaria

Esta tarea está diseñada para evaluar el manejo cuidadoso de la semántica de versiones, los casos límite y la elección de estructuras de datos escalables en lugar de solo el análisis sintáctico básico.

Politica de evaluacion

Una buena respuesta proporciona un programa ejecutable completo que sigue correctamente las reglas de versiones globales, distingue los comandos de solo lectura de los mutadores, maneja versiones inválidas y claves ausentes exactamente como se especifica, y escala a entradas grandes sin copiar ingenuamente todo el estado por versión. Las respuestas sólidas también mantienen la implementación clara y robusta, con un parseo correcto y una búsqueda histórica eficiente.

Respuestas

import sys import bisect def solve(): """ Implementa una tienda de clave-valor versionada que lee comandos de stdin y escribe resultados en stdout. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # La estructura de datos principal. # Un diccionario que mapea cada clave a una lista de sus estados históricos. # Cada estado es una tupla: (versión, valor). # La lista para cada clave se mantiene ordenada por versión. # Un valor de None representa una elimin...

Mostrar respuesta completa

import sys import bisect def solve(): """ Implementa una tienda de clave-valor versionada que lee comandos de stdin y escribe resultados en stdout. """ try: n_str = sys.stdin.readline() if not n_str: return n = int(n_str.strip()) except (ValueError, IndexError): return # La estructura de datos principal. # Un diccionario que mapea cada clave a una lista de sus estados históricos. # Cada estado es una tupla: (versión, valor). # La lista para cada clave se mantiene ordenada por versión. # Un valor de None representa una eliminación. 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": # Crea o sobrescribe una clave con un valor, creando una nueva versión. 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": # Elimina una clave, creando una nueva versión. # Esto se aplica incluso si la clave no existe. key = parts[1] global_version += 1 if key not in store: store[key] = [] store[key].append((global_version, None)) elif command == "GET": # Devuelve el valor actual de una clave. key = parts[1] if key not in store or not store[key]: print("NULL") else: # La última entrada en la lista de historial es el estado actual. _version, value = store[key][-1] print(value if value is not None else "NULL") elif command == "GET_VERSION": # Devuelve el valor de una clave en una versión histórica específica. 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] # Crea una lista solo con los números de versión para una búsqueda eficiente. versions = [v for v, _val in history] # Encuentra el punto de inserción para la versión solicitada. # bisect_right encuentra el índice donde la versión se insertaría # para mantener el orden. Esto significa que todos los elementos a la izquierda de este # índice tienen versiones menores o iguales a la versión solicitada. idx = bisect.bisect_right(versions, version) if idx == 0: # Ninguna versión histórica es <= a la versión solicitada. print("NULL") else: # El estado que queremos está en el índice anterior (idx - 1). _v, value = history[idx - 1] print(value if value is not None else "NULL") elif command == "HISTORY": # Devuelve todos los estados históricos de una clave. 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()

Resultado

#2

Votos ganadores

1 / 3

Puntuacion media

81
Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

79

Comentario general

La respuesta A proporciona una implementación correcta y completa de la tienda clave-valor versionada. Maneja todos los comandos adecuadamente, utiliza bisect para búsquedas históricas eficientes e incluye comentarios y docstrings claros. Sin embargo, tiene un problema de rendimiento: en GET_VERSION, crea una nueva lista de números de versión en cada llamada de consulta (`versions = [v for v, _val in history]`), lo que es O(k) por consulta, donde k es el número de entradas de historial para esa clave. Para 200.000 comandos con muchas consultas históricas, esto podría ser un cuello de botella de rendimiento significativo. También utiliza readline() en un bucle, lo que es más lento que la lectura masiva para entradas grandes. El código tampoco maneja correctamente la verificación de versión <= 0 para GET_VERSION: la especificación dice que las versiones son enteros positivos, y la versión 0 o negativa debería ser argumentablemente INVALID_VERSION, lo que la Respuesta A sí maneja. En general, es una solución sólida con un problema de eficiencia notable.

Ver detalle de evaluacion

Correccion

Peso 35%
85

La respuesta A maneja correctamente todos los comandos: SET, DELETE, GET, GET_VERSION, HISTORY. Utiliza correctamente bisect_right para búsquedas históricas, maneja NULL para claves eliminadas, devuelve EMPTY para claves nunca afectadas y verifica versiones inválidas, incluidas versiones <= 0. Todos los casos extremos mencionados en la especificación parecen manejarse correctamente.

Integridad

Peso 20%
80

La respuesta A implementa los cinco comandos según lo especificado, maneja todos los casos extremos mencionados en el prompt, incluidos los valores SET no modificados que crean nuevas versiones, DELETE en claves inexistentes que crean versiones y el formato de historial adecuado. La solución está completa y es ejecutable.

Calidad del codigo

Peso 20%
75

La respuesta A tiene buena calidad de código con nombres de variables claros, un docstring y comentarios útiles en línea que explican la lógica. El código está bien estructurado y es fácil de seguir. El uso de bisect es limpio, aunque la creación de listas temporales en GET_VERSION es un patrón innecesario.

Valor practico

Peso 15%
65

La respuesta A funciona correctamente pero tiene un problema de rendimiento significativo: GET_VERSION crea una nueva lista de versiones en cada llamada, lo que la hace O(k) por consulta incluso antes de la búsqueda binaria. Combinado con la lectura línea por línea y las llamadas de impresión individuales, esta solución puede tener dificultades con el límite declarado de 200.000 comandos con muchas consultas históricas.

Seguimiento de instrucciones

Peso 10%
80

La respuesta A sigue todas las instrucciones: lee desde stdin, escribe en stdout, es un programa ejecutable completo en un solo archivo, maneja todos los comandos y casos extremos especificados, y utiliza un enfoque de estructura de datos eficiente (listas de historial por clave con búsqueda binaria).

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

90

Comentario general

La respuesta A proporciona una solución robusta y bien estructurada. Implementa correctamente todos los comandos, maneja casos extremos como claves inexistentes y versiones no válidas (incluidas versiones no positivas para GET_VERSION), y utiliza estructuras de datos y algoritmos eficientes (como `bisect` para búsquedas históricas). El análisis de entrada es estándar y robusto para el procesamiento línea por línea. El código es claro, bien comentado y 'Pythonic'.

Ver detalle de evaluacion

Correccion

Peso 35%
95

La solución implementa correctamente todos los comandos y maneja los casos extremos especificados. También interpreta correctamente 'Las versiones son enteros positivos' tratando las versiones no positivas en GET_VERSION como INVALID_VERSION, lo que es una interpretación robusta de los requisitos implícitos del prompt.

Integridad

Peso 20%
90

El programa está completamente completo, es ejecutable y cubre todas las funcionalidades y formatos de entrada/salida requeridos. La lectura de entrada es robusta para el procesamiento línea por línea.

Calidad del codigo

Peso 20%
85

El código está bien estructurado, utiliza nombres de variables claros e incluye comentarios útiles. Aprovecha el módulo `bisect` para una búsqueda binaria eficiente y 'Pythonic', lo que contribuye a un código más limpio y mantenible.

Valor practico

Peso 15%
85

La solución utiliza estructuras de datos eficientes (diccionario de listas de tuplas) y algoritmos (búsqueda binaria) para consultas históricas, lo que la hace escalable. Su manejo robusto de la entrada y sus completas comprobaciones de errores mejoran su utilidad práctica.

Seguimiento de instrucciones

Peso 10%
90

La solución sigue meticulosamente todas las instrucciones explícitas, incluidas las reglas de versionado, los formatos de salida y las consideraciones de eficiencia. También interpreta correctamente los requisitos implícitos, como el manejo de versiones no positivas como inválidas.

Modelos evaluadores OpenAI GPT-5.4

Puntuacion total

75

Comentario general

La respuesta A es un programa ejecutable completo y captura correctamente el modelo principal de historial versionado para SET, DELETE, GET, GET_VERSION e HISTORY. Sus semánticas están en gran medida alineadas con la indicación, incluyendo el versionado global y el registro de eliminaciones. Sin embargo, su implementación de GET_VERSION reconstruye una lista de números de versión en cada consulta, lo que añade una sobrecarga innecesaria y perjudica la escalabilidad para el entorno de entrada grande declarado. También trata las versiones no positivas como inválidas, lo cual es razonable pero no se requiere explícitamente más allá de que las versiones sean enteros positivos. En general, es correcto en casos típicos pero menos eficiente de lo esperado para consultas históricas intensivas.

Ver detalle de evaluacion

Correccion

Peso 35%
77

La lógica para SET, DELETE, GET, GET_VERSION e HISTORY es en gran medida correcta, incluyendo versiones globales y marcadores de eliminación. Las consultas históricas devuelven el último estado en o antes de la versión solicitada, y las versiones futuras inválidas se manejan. La principal advertencia de corrección no es funcional en casos normales sino que está ligada a suposiciones de manejo de casos extremos y al estilo de implementación de consultas.

Integridad

Peso 20%
83

La respuesta proporciona un programa completo y funcional de un solo archivo, lee desde stdin, escribe en stdout y cubre todos los comandos y salidas requeridos. También incluye el comportamiento histórico requerido y el historial de solo afectación directa. Está completo para la tarea, con solo una ambigüedad menor en casos extremos en torno a versiones no positivas inválidas.

Calidad del codigo

Peso 20%
68

El código es legible y está razonablemente organizado, con comentarios claros y un flujo de control sencillo. Sin embargo, la construcción de una lista de versiones fresca dentro de cada llamada a GET_VERSION es una debilidad de diseño evitable, y la impresión línea por línea está menos optimizada para salidas intensivas. La calidad es sólida pero no especialmente fuerte para un benchmark sensible al rendimiento.

Valor practico

Peso 15%
61

El programa funcionará para muchas entradas ordinarias, pero las llamadas repetidas a GET_VERSION en historiales grandes incurrirán en sobrecarga adicional al reconstruir los arrays de versiones cada vez. Eso lo hace menos adecuado para la carga de trabajo de alto volumen descrita en la indicación. Es práctico como línea base pero no ideal para las restricciones del benchmark.

Seguimiento de instrucciones

Peso 10%
87

La respuesta sigue la instrucción de proporcionar código ejecutable completo y se adhiere estrechamente a las semánticas de comandos y al formato de salida especificados. Respeta el versionado global y la creación de versiones solo por mutación. El manejo menor de casos extremos en torno a versiones inválidas no resta valor materialmente al cumplimiento.

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:...

Mostrar respuesta completa

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()

Resultado

#1 | Ganador

Votos ganadores

2 / 3

Puntuacion media

80
Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

81

Comentario general

La respuesta B proporciona una implementación correcta y completa con mejores características de rendimiento. Lee toda la entrada a la vez usando sys.stdin.buffer.read(), lo que es significativamente más rápido para entradas grandes. Implementa la búsqueda binaria manualmente en lugar de usar bisect, evitando la necesidad de crear una lista temporal de versiones en cada llamada a GET_VERSION; busca directamente en la lista de historial. Recopila toda la salida y la imprime a la vez, lo que también es más eficiente. Sin embargo, no verifica si la versión es <= 0 en GET_VERSION (aunque la especificación dice que las versiones son enteros positivos, por lo que este caso límite puede no aparecer en la práctica). El código es un poco menos legible debido al seguimiento manual del índice para el análisis, pero este es un patrón común para la programación competitiva y el código crítico para el rendimiento.

Ver detalle de evaluacion

Correccion

Peso 35%
85

La respuesta B maneja correctamente todos los comandos con la lógica adecuada. La búsqueda binaria manual encuentra correctamente la última entrada con versión <= a la versión solicitada. Maneja NULL para eliminaciones, VACÍO para claves no afectadas e INVALID_VERSION para versiones posteriores a la actual. Preocupación menor: no verifica explícitamente si la versión es <= 0, pero es poco probable que aparezca en casos de prueba válidos dado que la especificación dice que las versiones son enteros positivos.

Integridad

Peso 20%
80

La respuesta B implementa los cinco comandos según lo especificado y maneja los casos límite clave. Es un programa completo y ejecutable que cubre la especificación completa. La única pequeña deficiencia es la falta de manejo explícito para la versión <= 0 en GET_VERSION.

Calidad del codigo

Peso 20%
70

La respuesta B utiliza un estilo de programación competitiva menos legible pero común con seguimiento manual del índice para el análisis. La búsqueda binaria manual es un poco más difícil de leer que usar bisect. Sin embargo, el código sigue siendo razonablemente claro y bien organizado. Carece de comentarios y documentación en comparación con la respuesta A.

Valor practico

Peso 15%
85

La respuesta B está bien optimizada para la escala indicada: lectura de entrada masiva a través del búfer, búsqueda binaria directa en la lista de historial sin asignaciones temporales y salida por lotes. Estas optimizaciones la hacen práctica para la restricción de 200,000 comandos y representan una buena ingeniería para escenarios sensibles al rendimiento.

Seguimiento de instrucciones

Peso 10%
80

La respuesta B sigue todas las instrucciones: lee desde stdin, escribe en stdout, es un programa completo y ejecutable en un solo archivo, maneja todos los comandos y casos límite especificados, y utiliza estructuras de datos eficientes. La nota de eficiencia en el prompt está bien abordada por el enfoque optimizado de E/S y búsqueda.

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

77

Comentario general

La respuesta B proporciona una solución mayormente correcta con estructuras de datos eficientes. Sin embargo, tiene un pequeño problema de corrección al no manejar explícitamente las versiones no positivas para GET_VERSION como inválidas. La estrategia de análisis de entrada (leer toda la entrada a la vez) es menos robusta para entradas muy grandes en comparación con el procesamiento línea por línea, y la implementación manual de la búsqueda binaria es menos idiomática que el uso del módulo `bisect`. Al código también le faltan comentarios, lo que reduce su legibilidad.

Ver detalle de evaluacion

Correccion

Peso 35%
80

La solución es mayormente correcta pero no maneja explícitamente las versiones no positivas para GET_VERSION. Si bien la indicación dice 'Las versiones son enteros positivos', no define explícitamente el comportamiento para versiones no positivas. Sin embargo, tratarlas como INVALID_VERSION (como hace la Respuesta A) es el comportamiento más robusto y esperado para entradas inválidas.

Integridad

Peso 20%
85

El programa está completamente completo y es ejecutable. Sin embargo, su estrategia de lectura de entrada (leer toda la entrada a la vez) podría ser menos eficiente en memoria y robusta para entradas extremadamente grandes en comparación con el procesamiento línea por línea, aunque podría ser aceptable para el recuento de comandos especificado.

Calidad del codigo

Peso 20%
65

Al código le faltan comentarios, lo que dificulta su comprensión rápida. Implementa una búsqueda binaria manual en lugar de usar el módulo `bisect`, lo que es menos idiomático en Python y potencialmente más propenso a errores. El mecanismo de análisis de entrada también es un poco menos limpio.

Valor practico

Peso 15%
75

La solución utiliza estructuras de datos y algoritmos eficientes para la escalabilidad. Sin embargo, el manejo de entrada menos robusto y la falta de verificación de casos extremos para GET_VERSION disminuyen ligeramente su valor práctico en comparación con la Respuesta A.

Seguimiento de instrucciones

Peso 10%
75

La solución sigue la mayoría de las instrucciones con respecto a la implementación de comandos y el formato de salida. Sin embargo, omite la instrucción implícita de tratar las versiones no positivas como inválidas para GET_VERSION, lo cual está implícito en 'Las versiones son enteros positivos'.

Modelos evaluadores OpenAI GPT-5.4

Puntuacion total

84

Comentario general

La respuesta B es un programa ejecutable completo que implementa correctamente la semántica de versión global requerida, las búsquedas históricas, el seguimiento de eliminaciones y el formato de salida. Es notablemente más fuerte en escalabilidad al usar entrada en búfer, salida acumulada y búsqueda binaria directamente en el historial de cada clave sin recrear matrices auxiliares por consulta. La estructura es concisa y práctica para un gran número de comandos. Un pequeño problema es que solo marca las versiones mayores que la última como inválidas y no rechaza explícitamente las versiones no positivas, pero esta es una brecha menor de caso límite en comparación con una solución sólida en otros aspectos.

Ver detalle de evaluacion

Correccion

Peso 35%
84

La implementación modela correctamente los incrementos de versión global solo en mutaciones, rastrea el historial por clave y devuelve los valores actuales e históricos adecuados, incluidas las eliminaciones. El formato HISTORY también sigue el prompt. La principal brecha menor es que las versiones no positivas no se tratan explícitamente como inválidas, aunque las versiones futuras se manejan correctamente.

Integridad

Peso 20%
85

La respuesta es una solución ejecutable completa en un archivo con todos los comandos requeridos implementados y el comportamiento de salida cubierto. Maneja los casos límite principales del prompt, incluidas las eliminaciones de claves faltantes y las versiones futuras inválidas. Solo el caso límite de versiones no positivas no se aborda explícitamente.

Calidad del codigo

Peso 20%
78

El código es conciso, organizado y utiliza una entrada en búfer eficiente y una salida por lotes. Su búsqueda binaria manual funciona directamente en el historial almacenado y evita asignaciones adicionales por consulta. Hay una pequeña opción de importación no utilizada porque bisect_right se importa pero no se utiliza, pero en general la calidad de la implementación es más sólida y consciente del rendimiento.

Valor practico

Peso 15%
86

La solución está bien adaptada a la escala indicada, utilizando entrada en búfer tokenizada, agregación de salida y búsqueda histórica logarítmica sin copias innecesarias. Estas opciones la hacen mucho más práctica para cientos de miles de comandos con muchas consultas históricas.

Seguimiento de instrucciones

Peso 10%
88

La respuesta sigue el formato solicitado y proporciona un programa ejecutable completo que coincide estrechamente con el comportamiento especificado. Respeta las reglas de versión global y la semántica de historial de afectación directa. El único problema de cumplimiento menor es no marcar explícitamente las versiones no positivas como inválidas.

Resumen comparativo

Para cada tarea y discusion, el orden final se decide por agregacion de rangos por evaluador (rango promedio + desempate Borda). La puntuacion media se muestra como referencia.

Evaluadores: 3

Votos ganadores

1 / 3

Puntuacion media

81
Ver esta respuesta

Votos ganadores

2 / 3

Puntuacion media

80
Ver esta respuesta

Resultados de evaluacion

Modelos evaluadores OpenAI GPT-5.4

Motivo del ganador

La respuesta B gana porque coincide con el comportamiento requerido y es más escalable y eficiente en la implementación para las restricciones de entrada grande del benchmark. Ambas respuestas son en general correctas, pero B evita reconstruir matrices de versiones por consulta, utiliza patrones de E/S más rápidos y, por lo tanto, es más práctica para muchas consultas históricas. La respuesta A es aceptable, pero su enfoque GET_VERSION es menos eficiente y más débil para las expectativas de rendimiento declaradas.

Modelos evaluadores Google Gemini 2.5 Flash

Motivo del ganador

La respuesta A es superior debido a su completa corrección, particularmente en el manejo del caso límite de versiones no positivas para GET_VERSION, que la respuesta B omite. La respuesta A también demuestra una mejor calidad de código al utilizar el módulo `bisect` de la biblioteca estándar de Python para búsquedas eficientes y al proporcionar comentarios claros. Su método de manejo de entradas también es, en general, más robusto para entradas grandes.

Modelos evaluadores Anthropic Claude Opus 4.6

Motivo del ganador

La respuesta B gana principalmente por su valor práctico y eficiencia. Ambas soluciones son funcionalmente correctas y manejan los requisitos principales adecuadamente. Sin embargo, la respuesta B es significativamente más eficiente: (1) lee toda la entrada de una vez mediante lectura en búfer, (2) realiza una búsqueda binaria directamente en la lista de historial sin crear listas temporales, (3) agrupa toda la salida en una sola llamada de impresión. Estas optimizaciones son importantes dadas las restricciones de hasta 200.000 comandos con muchas consultas históricas. El GET_VERSION de la respuesta A crea una nueva comprensión de lista en cada llamada, lo que supone una sobrecarga de O(k) por consulta. Si bien la respuesta A tiene una legibilidad y documentación del código ligeramente mejores, la diferencia de rendimiento es significativa para los requisitos de escala indicados.

X f L