Orivel Orivel
Abrir menu

Implementar una Caché LRU (Least Recently Used)

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

Implementa una estructura de datos de caché LRU (Least Recently Used) en Python. Tu implementación debe ser una clase llamada `LRUCache` que soporte las siguientes operaciones: 1. `__init__(self, capacity: int)` — Inicializa la caché con una capacidad de entero positivo. 2. `get(self, key: int) -> int` — Devuelve el valor asociado a la clave si existe en la caché, de lo contrario devuelve -1. Acceder a una clave cuenta como un "uso". 3. `put(self, key: int, value: int) -> None` — Inserta o actualiza el par clave-v...

Mostrar mas

Implementa una estructura de datos de caché LRU (Least Recently Used) en Python. Tu implementación debe ser una clase llamada `LRUCache` que soporte las siguientes operaciones: 1. `__init__(self, capacity: int)` — Inicializa la caché con una capacidad de entero positivo. 2. `get(self, key: int) -> int` — Devuelve el valor asociado a la clave si existe en la caché, de lo contrario devuelve -1. Acceder a una clave cuenta como un "uso". 3. `put(self, key: int, value: int) -> None` — Inserta o actualiza el par clave-valor. Si la caché excede su capacidad después de la inserción, expulsa la clave menos usada recientemente. Ambas `get` y `put` deben ejecutarse en complejidad de tiempo O(1) en promedio. Proporciona la implementación completa de la clase. Luego, demuestra su corrección mostrando la salida de la siguiente secuencia de operaciones: ``` cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Esperado: 10 cache.put(3, 30) # Evicciona la clave 2 print(cache.get(2)) # Esperado: -1 cache.put(4, 40) # Evicciona la clave 1 print(cache.get(1)) # Esperado: -1 print(cache.get(3)) # Esperado: 30 print(cache.get(4)) # Esperado: 40 ``` Explica brevemente cómo tu implementación logra la complejidad de tiempo O(1) para ambas operaciones.

Politica de evaluacion

Una buena respuesta debe: (1) Proporcionar una clase Python completa y ejecutable llamada `LRUCache` con los métodos `__init__`, `get` y `put` correctos. (2) Utilizar una combinación de estructuras de datos apropiada (por ejemplo, un mapa hash más una lista doblemente enlazada, o `OrderedDict` de Python) para lograr O(1) promedio de tiempo para `get` y `put`. (3) Manejar correctamente la expulsión del elemento menos usado recientemente cuando se excede la capacidad. (4) Producir la salida correcta para la secuencia...

Mostrar mas

Una buena respuesta debe: (1) Proporcionar una clase Python completa y ejecutable llamada `LRUCache` con los métodos `__init__`, `get` y `put` correctos. (2) Utilizar una combinación de estructuras de datos apropiada (por ejemplo, un mapa hash más una lista doblemente enlazada, o `OrderedDict` de Python) para lograr O(1) promedio de tiempo para `get` y `put`. (3) Manejar correctamente la expulsión del elemento menos usado recientemente cuando se excede la capacidad. (4) Producir la salida correcta para la secuencia de demostración: 10, -1, -1, 30, 40. (5) Incluir una explicación clara y precisa de por qué las estructuras de datos elegidas producen complejidad de tiempo O(1). Deducir calidad por: salida incorrecta, manejo de casos límite faltante (por ejemplo, actualizar una clave existente), uso de estructuras de datos que no logran O(1) (por ejemplo, escanear una lista), o código incompleto/no ejecutable.

Respuestas

Respuesta A: OpenAI GPT-5.2

class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Doubly-linked list with sentinels: # head <-> ... <-> tail # Most recently used is right after head. # Least recently used is right before tai...

Mostrar respuesta completa

class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Doubly-linked list with sentinels: # head <-> ... <-> tail # Most recently used is right after head. # Least recently used is right before tail. self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove(self, node: _Node) -> None: p, n = node.prev, node.next p.next = n n.prev = p def _add_to_front(self, node: _Node) -> None: # Insert right after head (mark as most recently used) first = self.head.next node.prev = self.head node.next = first self.head.next = node first.prev = node def _move_to_front(self, node: _Node) -> None: self._remove(node) self._add_to_front(node) def _evict_lru(self) -> None: # Remove node before tail lru = self.tail.prev if lru is self.head: return self._remove(lru) del self.map[lru.key] def get(self, key: int) -> int: node = self.map.get(key) if node is None: return -1 self._move_to_front(node) return node.val def put(self, key: int, value: int) -> None: node = self.map.get(key) if node is not None: node.val = value self._move_to_front(node) return new_node = self._Node(key, value) self.map[key] = new_node self._add_to_front(new_node) if len(self.map) > self.capacity: self._evict_lru() # Demonstration of correctness cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Expected: 10 cache.put(3, 30) # Evicts key 2 print(cache.get(2)) # Expected: -1 cache.put(4, 40) # Evicts key 1 print(cache.get(1)) # Expected: -1 print(cache.get(3)) # Expected: 30 print(cache.get(4)) # Expected: 40 # Output: # 10 # -1 # -1 # 30 # 40 # Brief O(1) explanation: # - A dictionary (hash map) maps keys to nodes, giving O(1) average lookup for get/put. # - A doubly linked list maintains recency order; moving a node to the front, # inserting a new node, and removing the LRU node are all O(1) pointer updates. # Combining these gives O(1) average time for both get and put.

Resultado

#1 | Ganador

Votos ganadores

2 / 3

Puntuacion media

98
Modelos evaluadores Anthropic Claude Haiku 4.5

Puntuacion total

98

Comentario general

Excelente implementación de una caché LRU que cumple plenamente con todos los requisitos. La solución utiliza una combinación bien diseñada de un mapa hash y una lista doblemente enlazada con nodos centinela para lograr una complejidad de tiempo O(1) tanto para las operaciones get como put. El código es limpio, está bien estructurado y maneja correctamente todos los casos extremos, incluida la actualización de claves existentes y la expulsión adecuada. La demostración produce la salida esperada exacta (10, -1, -1, 30, 40), y la explicación de la complejidad O(1) es precisa y clara. El uso de __slots__ en la clase Node demuestra atención a la eficiencia de la memoria. Observaciones menores: el ValueError para una capacidad no positiva es un buen toque defensivo pero no se requería explícitamente; la explicación podría haber sido un poco más detallada sobre por qué las búsquedas en el diccionario son O(1) en promedio. En general, esta es una implementación de calidad de producción.

Ver detalle de evaluacion

Correccion

Peso 35%
98

La implementación es correcta y produce la secuencia de salida esperada exacta (10, -1, -1, 30, 40). Todas las operaciones principales funcionan correctamente: get devuelve los valores correctos y marca los elementos como usados recientemente, put inserta correctamente nuevos elementos y actualiza los existentes, y la expulsión elimina correctamente el elemento menos usado recientemente cuando se excede la capacidad. La lista doblemente enlazada con centinelas mantiene correctamente el orden de recentidad. Se manejan correctamente casos extremos como la actualización de una clave existente. La única deducción menor es que el ValueError para una capacidad no positiva, aunque es una buena práctica, no fue explícitamente requerido por la tarea.

Integridad

Peso 20%
100

La respuesta está completamente completa. Proporciona la clase LRUCache completa con todos los métodos requeridos (__init__, get, put), incluye una demostración completa y funcional con la secuencia de prueba exacta especificada, produce todas las salidas esperadas y concluye con una explicación clara de la complejidad de tiempo O(1). La implementación incluye métodos auxiliares (_remove, _add_to_front, _move_to_front, _evict_lru) que están bien organizados y son necesarios para la solución. Nada falta o está incompleto.

Calidad del codigo

Peso 20%
95

El código es de alta calidad con excelente estructura y legibilidad. El uso de una clase anidada _Node con __slots__ demuestra conciencia de la eficiencia de la memoria. Los nombres de los métodos son descriptivos y siguen las convenciones de Python. La implementación de la lista doblemente enlazada con nodos centinela es elegante y evita casos extremos de comprobación de nulos. Los comentarios explican claramente la disposición de la estructura de datos y el propósito de cada método. El código está bien organizado con una separación lógica de responsabilidades. Menor: el comentario explicativo al final podría ser un poco más detallado sobre la complejidad del caso promedio del mapa hash, pero este es un punto muy menor.

Valor practico

Peso 15%
95

Esta implementación tiene un alto valor práctico como solución de referencia. Demuestra las mejores prácticas para implementar cachés LRU: usar estructuras de datos apropiadas (mapa hash + lista doblemente enlazada), uso adecuado de nodos centinela para eliminar casos extremos y una separación limpia de métodos auxiliares. El código está listo para producción y podría usarse directamente en aplicaciones reales. La comprobación defensiva de ValueError añade robustez. La implementación serviría como un excelente ejemplo educativo para comprender cómo combinar estructuras de datos para lograr requisitos específicos de complejidad de tiempo.

Seguimiento de instrucciones

Peso 10%
100

La respuesta sigue todas las instrucciones con precisión. Proporciona una clase completa llamada exactamente 'LRUCache' con los tres métodos requeridos que tienen las firmas correctas. Tanto get como put logran una complejidad de tiempo promedio O(1) utilizando estructuras de datos apropiadas. La secuencia de demostración se ejecuta exactamente como se especifica con la salida correcta. Se incluye la explicación de la complejidad O(1) y es precisa. Se cumplen todos los requisitos de la política de evaluación: salida correcta, manejo adecuado de casos extremos (actualización de claves existentes), uso de estructuras de datos O(1) y código completo y ejecutable.

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

100

Comentario general

La implementación de LRUCache proporcionada está excepcionalmente bien estructurada, es correcta y altamente eficiente. Utiliza correctamente una combinación de un mapa hash y una lista doblemente enlazada personalizada con nodos centinela para lograr la complejidad de tiempo promedio O(1) requerida tanto para las operaciones `get` como `put`. El código demuestra una excelente atención al detalle, incluido el uso de `__slots__` para la clase nodo y un manejo robusto de varias operaciones de caché como la actualización de claves existentes y la eliminación del elemento menos utilizado recientemente. La salida de la demostración es perfectamente correcta y la explicación de la complejidad temporal es clara y precisa.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es completamente correcta. Toda la lógica de la caché LRU, incluida la recuperación de claves, las actualizaciones, las inserciones y la eliminación del elemento menos utilizado recientemente, funciona como se espera. La secuencia de demostración proporcionada produce la salida correcta exacta.

Integridad

Peso 20%
100

La respuesta proporciona una clase `LRUCache` completa con todos los métodos requeridos (`__init__`, `get`, `put`), una demostración clara de su uso y una explicación concisa de su complejidad temporal. No faltaba nada de lo solicitado.

Calidad del codigo

Peso 20%
100

La calidad del código es excelente. Está bien organizado con métodos auxiliares para operaciones de lista enlazada, utiliza nodos centinela para una manipulación de lista más limpia e incluye `__slots__` para la eficiencia de memoria en la clase `_Node`. Los nombres de las variables son descriptivos y la estructura general es muy legible y mantenible.

Valor practico

Peso 15%
100

Esta implementación es muy práctica y está lista para producción. Demuestra una profunda comprensión de las estructuras de datos necesarias para una caché LRU, proporcionando una solución robusta y eficiente. La implementación explícita de una lista doblemente enlazada personalizada ofrece control total y conocimiento del mecanismo subyacente, lo que la hace valiosa en escenarios donde `collections.OrderedDict` podría no ser adecuado o se necesita una comprensión más profunda.

Seguimiento de instrucciones

Peso 10%
100

Se siguieron todas las instrucciones al pie de la letra. La clase se llama `LRUCache`, los métodos se ajustan a las firmas especificadas, se logra y explica la complejidad de tiempo promedio O(1), está presente la validación de capacidad y la secuencia de demostración, junto con su salida, coincide exactamente con los requisitos.

Modelos evaluadores OpenAI GPT-5 mini

Puntuacion total

97

Comentario general

Caché LRU bien implementada: comportamiento correcto, operaciones eficientes O(1) usando un mapa hash + lista doblemente enlazada, y la demostración proporcionada produce la salida esperada. El código es claro y ejecutable, con pequeñas mejoras de estilo/anotación posibles (ej. más anotaciones de tipo o docstrings) pero nada que afecte la corrección o el rendimiento.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es correcta: get y put se comportan como se especifica, las actualizaciones mueven los elementos a MRU, la expulsión elimina el LRU cuando se excede la capacidad, y la demostración imprime la secuencia esperada (10, -1, -1, 30, 40). Se manejan casos extremos como la actualización de una clave existente y la capacidad cero/negativa (ValueError).

Integridad

Peso 20%
100

La solución incluye una clase LRUCache completa y ejecutable con __init__, get y put, una demostración de la secuencia de operaciones requerida y una explicación concisa de la complejidad O(1). Todos los comportamientos requeridos del prompt están presentes.

Calidad del codigo

Peso 20%
90

El código es limpio y está bien estructurado: clase Node interna con __slots__, nodos centinela head/tail y métodos auxiliares claros para operaciones de lista. Las mejoras menores de estilo podrían incluir anotaciones de tipo adicionales (ej. para self.map) y docstrings/comentarios para métodos públicos, pero estos no afectan la corrección.

Valor practico

Peso 15%
90

La implementación es eficiente y práctica para uso real: operaciones promedio O(1), diseño de nodo de baja sobrecarga y semántica clara. Para uso en producción, se podrían agregar consideraciones de seguridad de hilos o tipos/documentos más ricos, pero la funcionalidad principal es sólida.

Seguimiento de instrucciones

Peso 10%
100

Se siguieron todas las instrucciones: se proporcionó la clase llamada LRUCache, se implementaron los métodos requeridos con las firmas correctas, se incluyó la demostración y la explicación de la complejidad O(1) es precisa.

```python import collections class LRUCache: """ Una implementación de una caché LRU (Least Recently Used). Esta caché utiliza un diccionario para búsquedas de claves O(1) y una lista doblemente enlazada para mantener el orden de uso. El diccionario mapea claves a nodos en la lista enlazada. """ # Clase interna para representar un nodo en la lista doblemente enlazada class _Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None def __init__(self, capacity: int):...

Mostrar respuesta completa

```python import collections class LRUCache: """ Una implementación de una caché LRU (Least Recently Used). Esta caché utiliza un diccionario para búsquedas de claves O(1) y una lista doblemente enlazada para mantener el orden de uso. El diccionario mapea claves a nodos en la lista enlazada. """ # Clase interna para representar un nodo en la lista doblemente enlazada class _Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None def __init__(self, capacity: int): """ Inicializa la caché con una capacidad de entero positivo. """ if capacity <= 0: raise ValueError("La capacidad debe ser un entero positivo.") self.capacity = capacity self.cache = {} # Nodos centinela para cabeza y cola para simplificar las operaciones de lista self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node: _Node): """Elimina un nodo de la lista enlazada.""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add_to_front(self, node: _Node): """Añade un nodo al frente de la lista enlazada (el más reciente).""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _move_to_front(self, node: _Node): """Mueve un nodo existente al frente de la lista.""" self._remove_node(node) self._add_to_front(node) def get(self, key: int) -> int: """ Devuelve el valor asociado con la clave si existe, de lo contrario -1. Acceder a una clave la marca como la más recientemente utilizada. """ if key in self.cache: node = self.cache[key] # Mueve el nodo accedido al frente para marcarlo como recientemente usado self._move_to_front(node) return node.value return -1 def put(self, key: int, value: int) -> None: """ Inserta o actualiza un par clave-valor. Si se excede la capacidad, expulsa la clave menos recientemente utilizada. """ if key in self.cache: # La clave existe, actualiza su valor y muévela al frente node = self.cache[key] node.value = value self._move_to_front(node) else: # La clave es nueva, crea un nuevo nodo new_node = self._Node(key, value) self.cache[key] = new_node self._add_to_front(new_node) # Si la caché excede la capacidad, expulsa el elemento menos recientemente usado if len(self.cache) > self.capacity: # El elemento LRU es el que está justo antes de la cola centinela lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] # --- Demostración --- print("Demostrando la funcionalidad de LRUCache:") cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(f"get(1): {cache.get(1)}") # Esperado: 10 cache.put(3, 30) # Expulsa la clave 2 print(f"get(2): {cache.get(2)}") # Esperado: -1 cache.put(4, 40) # Expulsa la clave 1 print(f"get(1): {cache.get(1)}") # Esperado: -1 print(f"get(3): {cache.get(3)}") # Esperado: 30 print(f"get(4): {cache.get(4)}") # Esperado: 40 # --- Salida Esperada de la Demostración --- # Demostrando la funcionalidad de LRUCache: # get(1): 10 # get(2): -1 # get(1): -1 # get(3): 30 # get(4): 40 # --- Explicación de la Complejidad Temporal O(1) --- # La complejidad temporal promedio O(1) tanto para `get` como para `put` se logra combinando dos estructuras de datos: # 1. **Un Mapa Hash (Diccionario):** El `dict` de Python proporciona complejidad temporal promedio O(1) para inserciones, eliminaciones y búsquedas. En esta implementación, el diccionario `self.cache` almacena claves y las mapea directamente a sus nodos correspondientes en la lista doblemente enlazada. Esto nos permite localizar instantáneamente cualquier nodo en la caché por su clave. # 2. **Una Lista Doblemente Enlazada:** Esta estructura de datos mantiene el orden de uso. Añadir un nuevo nodo al frente (el más reciente) o eliminar el último nodo (el menos reciente) son operaciones O(1) porque solo requieren actualizar algunos punteros. Cuando se accede o actualiza un elemento, su nodo correspondiente (encontrado en O(1) a través del mapa hash) puede moverse al frente de la lista en O(1) simplemente volviendo a enlazar sus vecinos. # Al usar ambas estructuras juntas, todas las partes de las operaciones `get` y `put` —buscar una clave, actualizar un valor, mover un nodo y eliminar el nodo LRU— se pueden realizar en tiempo promedio constante. ```

Resultado

#2

Votos ganadores

1 / 3

Puntuacion media

97
Modelos evaluadores Anthropic Claude Haiku 4.5

Puntuacion total

98

Comentario general

Esta es una excelente implementación de una caché LRU que satisface completamente todos los requisitos. El código utiliza una combinación bien diseñada de un hash map y una lista doblemente enlazada con nodos centinela para lograr una complejidad de tiempo O(1) tanto para las operaciones get como put. La implementación maneja correctamente todos los casos extremos, incluida la actualización de claves existentes y la eliminación del elemento menos utilizado recientemente. La demostración produce la salida esperada exacta (10, -1, -1, 30, 40), y la explicación de la complejidad del tiempo es clara y precisa. El código es limpio, está bien documentado y listo para producción.

Ver detalle de evaluacion

Correccion

Peso 35%
98

La implementación es funcionalmente correcta y produce la secuencia de salida esperada exacta. Todas las operaciones (get, put, eviction) funcionan según lo especificado. Los casos extremos se manejan adecuadamente: la actualización de claves existentes las mueve al frente, las nuevas claves se agregan correctamente y la eliminación LRU elimina el nodo correcto. La única observación menor es que el ValueError para una capacidad no positiva, aunque es una buena práctica, no fue explícitamente requerido por la especificación de la tarea.

Integridad

Peso 20%
100

La respuesta está completamente completa. Proporciona la clase LRUCache completa con todos los métodos requeridos (__init__, get, put), incluye una demostración completa y funcional con la secuencia de prueba exacta, produce todas las salidas esperadas y proporciona una explicación exhaustiva de la complejidad del tiempo O(1). Los métodos auxiliares (_remove_node, _add_to_front, _move_to_front) están bien implementados y son necesarios para la solución.

Calidad del codigo

Peso 20%
95

El código está bien estructurado y es muy legible. Incluye docstrings claras para la clase y todos los métodos, utiliza nombres de variables significativos y emplea nodos centinela de manera elegante para simplificar las condiciones de borde. La clase interna _Node está definida apropiadamente. El código sigue las convenciones de Python y es mantenible. Menor: se podría eliminar la importación no utilizada de `collections`, aunque esto es insignificante.

Valor practico

Peso 15%
98

Esta implementación es inmediatamente práctica y lista para producción. El enfoque de lista doblemente enlazada con nodos centinela es un patrón estándar y probado para las cachés LRU. El código maneja correctamente escenarios del mundo real (actualización de claves existentes, gestión de capacidad). La explicación demuestra una profunda comprensión de por qué este diseño funciona, lo que lo hace valioso para el aprendizaje y como referencia de implementación.

Seguimiento de instrucciones

Peso 10%
100

La respuesta sigue precisamente todas las instrucciones. Proporciona una clase Python completa y ejecutable llamada LRUCache con firmas de métodos correctas. Utiliza estructuras de datos apropiadas (hash map + lista doblemente enlazada) logrando una complejidad O(1). Maneja correctamente la eliminación, produce la secuencia de salida esperada exacta (10, -1, -1, 30, 40) e incluye una explicación clara y precisa del logro de la complejidad de tiempo O(1).

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

98

Comentario general

La implementación de LRUCache proporcionada es excelente. Implementa correctamente la lógica LRU utilizando un diccionario para búsquedas O(1) y una lista doblemente enlazada personalizada para la gestión del orden O(1). El código está bien estructurado, incluye buenas cadenas de documentación (docstrings) y maneja de manera robusta casos extremos como la validación de capacidad y la actualización de claves existentes. La demostración coincide perfectamente con la salida esperada, y la explicación de la complejidad temporal O(1) es clara y precisa. La única mejora menor podría ser eliminar la importación no utilizada de 'collections', pero esto no resta calidad general alta.

Ver detalle de evaluacion

Correccion

Peso 35%
98

La implementación de LRUCache es funcionalmente correcta. Maneja con precisión las operaciones `get` y `put`, incluyendo la actualización de claves existentes, la eliminación del elemento menos utilizado recientemente cuando se excede la capacidad y la devolución de -1 para claves inexistentes. El uso de un diccionario y una lista doblemente enlazada personalizada logra correctamente una complejidad temporal promedio O(1) para ambas operaciones. La salida de la demostración coincide perfectamente con la salida esperada.

Integridad

Peso 20%
100

La respuesta está completamente completa. Proporciona la implementación completa de la clase `LRUCache`, incluyendo los métodos `__init__`, `get` y `put`. Se incluye una demostración exhaustiva de su funcionalidad con la secuencia de operaciones especificada, junto con una explicación clara y precisa de la complejidad temporal O(1).

Calidad del codigo

Peso 20%
95

La calidad del código es muy alta. La clase `LRUCache` está bien estructurada con una clase interna `_Node` y métodos auxiliares para operaciones de lista enlazada (`_remove_node`, `_add_to_front`, `_move_to_front`), lo que mejora la legibilidad y el mantenimiento. Hay cadenas de documentación para la clase y los métodos principales. El uso de nodos centinela (cabeza y cola) para la lista doblemente enlazada simplifica la manipulación de la lista y mejora la robustez. Se incluye la validación de capacidad. El único punto menor es una importación no utilizada (`collections`).

Valor practico

Peso 15%
97

La caché LRU implementada es muy práctica y eficiente. Utiliza la combinación estándar y más performante de un mapa hash y una lista doblemente enlazada, asegurando operaciones O(1). El diseño es robusto y sería adecuado para escenarios de caché del mundo real donde el rendimiento es crítico. Maneja correctamente varios escenarios operativos, lo que la hace confiable.

Seguimiento de instrucciones

Peso 10%
100

Todas las instrucciones de la solicitud se siguieron meticulosamente. La clase se llama `LRUCache`, y los métodos `__init__`, `get` y `put` tienen las firmas y el comportamiento correctos. La capacidad se maneja como un entero positivo, se logra y se explica la complejidad O(1), la lógica de expulsión es correcta, y la secuencia de demostración y su salida son exactamente como se especificaron.

Modelos evaluadores OpenAI GPT-5 mini

Puntuacion total

96

Comentario general

Implementación correcta y bien estructurada de LRUCache utilizando un mapa hash más una lista doblemente enlazada. La clase implementa get y put en tiempo promedio O(1), incluye una demostración que produce los resultados esperados y explica claramente la complejidad. Problemas menores: una importación no utilizada (collections) y pequeños detalles estilísticos, pero estos no afectan la corrección ni el rendimiento.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es funcionalmente correcta: get y put se comportan según lo especificado, la evacuación elimina el elemento menos utilizado recientemente, la actualización de una clave existente funciona y la demostración produce las salidas esperadas (10, -1, -1, 30, 40). Se manejan casos extremos como la aplicación de la capacidad.

Integridad

Peso 20%
95

Proporciona una clase LRUCache completa y ejecutable con __init__, get y put, métodos auxiliares, una demostración de la secuencia requerida y una explicación de la complejidad. Deducciones leves solo por incluir una importación innecesaria y no mostrar las líneas de salida brutas exactamente como en el prompt (se agregan etiquetas), pero la funcionalidad está completa.

Calidad del codigo

Peso 20%
90

El código es limpio, legible y bien documentado con métodos auxiliares y nodos centinela para simplificar las operaciones de la lista. Problemas menores: una importación no utilizada 'collections' y pequeñas elecciones de estilo en las anotaciones de tipo para la clase interna; por lo demás, buena estructura y nombres.

Valor practico

Peso 15%
90

La implementación es práctica y eficiente para uso real: operaciones promedio O(1), gestión clara de memoria y API sencilla. El ValueError en capacidad no positiva es sensato. No hay trampas de rendimiento en el diseño principal.

Seguimiento de instrucciones

Peso 10%
100

Sigue las instrucciones con precisión: clase llamada LRUCache, firmas de métodos correctas, complejidad promedio O(1) lograda con diccionario + lista doblemente enlazada, comportamiento correcto de evacuación, demostración incluida y una explicación concisa de por qué las operaciones son O(1).

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

2 / 3

Puntuacion media

98
Ver esta respuesta

Votos ganadores

1 / 3

Puntuacion media

97
Ver esta respuesta

Resultados de evaluacion

X f L