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 que admita las siguientes operaciones, cada una con complejidad temporal promedio O(1): 1. `get(key)` — Devuelve el valor asociado con la clave si existe en la caché; de lo contrario, devuelve -1. Acceder a una clave la marca como recientemente usada. 2. `put(key, value)` — Inserta o actualiza el par clave-valor. Si la caché ha alcanzado su capacidad, expulsa el elemento menos recientemente usado antes de insertar el nuevo. Tu implem...

Mostrar mas

Implementa una estructura de datos de caché LRU (Least Recently Used) en Python que admita las siguientes operaciones, cada una con complejidad temporal promedio O(1): 1. `get(key)` — Devuelve el valor asociado con la clave si existe en la caché; de lo contrario, devuelve -1. Acceder a una clave la marca como recientemente usada. 2. `put(key, value)` — Inserta o actualiza el par clave-valor. Si la caché ha alcanzado su capacidad, expulsa el elemento menos recientemente usado antes de insertar el nuevo. Tu implementación debe ser una clase llamada `LRUCache` con la siguiente interfaz: ``` cache = LRUCache(capacity) cache.put(key, value) result = cache.get(key) ``` Demuestra tu implementación con la siguiente secuencia de prueba: ``` 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 ``` Requisitos: - NO uses `functools.lru_cache` ni `collections.OrderedDict`. Implementa la estructura subyacente tú mismo. - Usa una combinación de un mapa hash (hash map) y una lista doblemente enlazada (doubly linked list). - Incluye comentarios claros que expliquen tu enfoque. - Maneja casos límite como capacidad 0 o 1. - Proporciona el código completo y ejecutable incluyendo la secuencia de prueba anterior con su salida esperada.

Politica de evaluacion

Una respuesta de alta calidad debería: (1) Proporcionar una implementación completa y ejecutable en Python de una caché LRU usando un mapa hash y una lista doblemente enlazada — sin depender de OrderedDict ni functools.lru_cache. (2) Las operaciones get y put deben ser O(1) en tiempo promedio. (3) El código debe producir correctamente la salida esperada para la secuencia de prueba proporcionada (10, -1, -1, 30, 40). (4) El código debe manejar casos límite como capacidad 0 o 1 de forma adecuada. (5) La implementació...

Mostrar mas

Una respuesta de alta calidad debería: (1) Proporcionar una implementación completa y ejecutable en Python de una caché LRU usando un mapa hash y una lista doblemente enlazada — sin depender de OrderedDict ni functools.lru_cache. (2) Las operaciones get y put deben ser O(1) en tiempo promedio. (3) El código debe producir correctamente la salida esperada para la secuencia de prueba proporcionada (10, -1, -1, 30, 40). (4) El código debe manejar casos límite como capacidad 0 o 1 de forma adecuada. (5) La implementación debe incluir comentarios significativos que expliquen el enfoque y las decisiones clave de diseño. (6) El código debe estar limpio, bien estructurado y seguir convenciones razonables de Python. Se descontará la calidad por: usar funcionalidades prohibidas, producir una salida incorrecta, no manejar casos límite, falta de comentarios, o por realizar operaciones O(n) donde se requiere O(1).

Respuestas

Respuesta A: OpenAI GPT-5 mini

# Implementación de caché LRU usando un mapa hash + lista doblemente enlazada # - El mapa hash (dict) proporciona acceso O(1) desde la clave -> nodo # - La lista doblemente enlazada mantiene el orden de uso: el más recientemente usado en head, el menos recientemente usado en tail # - Cuando se accede o actualiza una clave, movemos su nodo a head # - Cuando se excede la capacidad, eliminamos el nodo tail (LRU) y borramos su clave del mapa class _Node: """Nodo de lista doblemente enlazada para contener clave y valor.""" def __init__(self, key=None, value=None): self.key = key self.value = v...

Mostrar respuesta completa

# Implementación de caché LRU usando un mapa hash + lista doblemente enlazada # - El mapa hash (dict) proporciona acceso O(1) desde la clave -> nodo # - La lista doblemente enlazada mantiene el orden de uso: el más recientemente usado en head, el menos recientemente usado en tail # - Cuando se accede o actualiza una clave, movemos su nodo a head # - Cuando se excede la capacidad, eliminamos el nodo tail (LRU) y borramos su clave del mapa class _Node: """Nodo de lista doblemente enlazada para contener clave y valor.""" def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): """Inicializa LRUCache con la capacidad dada. Maneja capacidad <= 0 haciendo que la caché sea efectivamente inutilizable (get devuelve -1, put no hace nada). """ self.capacity = max(0, int(capacity)) self.cache = {} # clave -> _Node # Nodos centinela para head y tail para evitar comprobaciones de borde self.head = _Node() # Lo más recientemente usado viene justo después de head self.tail = _Node() # Lo menos recientemente usado está justo antes de tail self.head.next = self.tail self.tail.prev = self.head self.size = 0 # Auxiliar interno: agregar nodo justo después de head (marcar como usado recientemente) def _add_node(self, node: _Node) -> None: node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node # Auxiliar interno: eliminar un nodo existente de la lista enlazada def _remove_node(self, node: _Node) -> None: prev = node.prev nxt = node.next if prev: prev.next = nxt if nxt: nxt.prev = prev node.prev = node.next = None # Auxiliar interno: mover un nodo existente a head (más recientemente usado) def _move_to_head(self, node: _Node) -> None: self._remove_node(node) self._add_node(node) # Auxiliar interno: sacar el nodo menos recientemente usado (justo antes de tail) def _pop_tail(self) -> _Node: node = self.tail.prev if node is self.head: return None self._remove_node(node) return node def get(self, key: int) -> int: """Devuelve el valor asociado con la clave si está presente; de lo contrario -1. El acceso marca la clave como usada recientemente. Tiempo promedio O(1). """ if self.capacity == 0: return -1 node = self.cache.get(key) if not node: return -1 # Mover el nodo accedido a head (usado recientemente) self._move_to_head(node) return node.value def put(self, key: int, value: int) -> None: """Inserta o actualiza la clave con el valor. Evicta LRU si se excede la capacidad. Tiempo promedio O(1). """ if self.capacity == 0: return node = self.cache.get(key) if node: # Actualizar y marcar como usado recientemente node.value = value self._move_to_head(node) else: # Insertar nuevo nodo new_node = _Node(key, value) self.cache[key] = new_node self._add_node(new_node) self.size += 1 if self.size > self.capacity: # Eliminar el nodo menos recientemente usado tail_node = self._pop_tail() if tail_node: del self.cache[tail_node.key] self.size -= 1 # Demostración de la implementación con la secuencia de prueba dada if __name__ == "__main__": cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Esperado: 10 cache.put(3, 30) # Elimina la clave 2 print(cache.get(2)) # Esperado: -1 cache.put(4, 40) # Elimina la clave 1 print(cache.get(1)) # Esperado: -1 print(cache.get(3)) # Esperado: 30 print(cache.get(4)) # Esperado: 40

Resultado

#1 | Ganador

Votos ganadores

3 / 3

Puntuacion media

95
Modelos evaluadores Anthropic Claude Sonnet 4.6

Puntuacion total

93

Comentario general

Esta es una implementación sólida y bien estructurada de una caché LRU usando un mapa hash y una lista doblemente enlazada. El código produce correctamente todos los resultados esperados (10, -1, -1, 30, 40), maneja casos límite como capacidad 0, utiliza nodos centinela para simplificar las operaciones de la lista e incluye comentarios claros en todo el código. La implementación es limpia, sigue las convenciones de Python y logra tiempo promedio O(1) tanto para get como para put. Nota menor: el método get usa 'if not node' que teóricamente podría ser problemático si node fuera un valor falsy, pero dado que los nodos son objetos esto está bien en la práctica. El caso límite capacity=1 se maneja de forma implícita y correcta. En general, una respuesta de alta calidad con solo consideraciones estilísticas muy menores.

Ver detalle de evaluacion

Correccion

Peso 35%
95

La implementación produce correctamente las cinco salidas esperadas (10, -1, -1, 30, 40). Las operaciones sobre la lista doblemente enlazada son correctas, los nodos centinela evitan errores en casos límite y la lógica de expulsión es sólida. Tanto get como put tienen tiempo promedio O(1). Se maneja el caso límite capacity=0. La comprobación 'if not node' en get es técnicamente correcta dado que los nodos son objetos, pero usar 'if node is None' sería más explícito.

Integridad

Peso 20%
95

Todos los componentes requeridos están presentes: la clase _Node, la clase LRUCache con get y put, auxiliares internos para la manipulación de la lista, nodos centinela, manejo de casos límite para capacidad 0 y 1, la secuencia completa de pruebas con comentarios de salida esperada y un main guard. No falta nada significativo.

Calidad del codigo

Peso 20%
90

El código está limpio, bien organizado y sigue las convenciones de Python. Los comentarios explican el enfoque general y cada método. Los nodos centinela son una buena elección de diseño. Los métodos auxiliares tienen nombres adecuados y están orientados a una sola responsabilidad. Se usan anotaciones de tipo. Nota menor: 'if not node' es algo menos explícito que 'if node is None', y las comprobaciones nulas en _remove_node para prev/nxt son innecesarias dado que los nodos centinela siempre existen, pero son cuestiones muy menores.

Valor practico

Peso 15%
90

La implementación es directamente usable en escenarios reales. Maneja la capacidad 0 con gracia, usa una interfaz limpia y el diseño con nodos centinela la hace robusta. El código es autocontenido y ejecutable. Podría extenderse fácilmente (por ejemplo, seguridad de hilos, TTL). La demostración muestra claramente el comportamiento esperado.

Seguimiento de instrucciones

Peso 10%
95

Se siguen todas las instrucciones: no se usa OrderedDict ni functools.lru_cache, se implementa mapa hash + lista doblemente enlazada, la clase se llama LRUCache con la interfaz correcta, se incluye la secuencia de pruebas con comentarios de salida esperada, se manejan los casos límite y los comentarios explican el enfoque. El código está completo y es ejecutable.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

93

Comentario general

Proporciona una implementación correcta y ejecutable de LRUCache usando un dict más una lista doblemente enlazada con nodos centinela, logrando operaciones get/put promedio en O(1) y produciendo las salidas esperadas para la prueba dada. Incluye comentarios claros y maneja la capacidad 0 de forma elegante. Problemas menores: _pop_tail está anotado para devolver _Node pero puede devolver None; algunas comprobaciones defensivas en _remove_node son innecesarias dado el uso de centinelas, pero no son perjudiciales.

Ver detalle de evaluacion

Correccion

Peso 35%
95

Comportamiento LRU correcto: get desplaza nodos a la posición MRU, put actualiza/mueve claves existentes y expulsa el LRU al desbordarse. La secuencia de prueba proporcionada producirá 10, -1, -1, 30, 40 como se espera. La capacidad 0 se maneja con get=-1 y put sin efecto.

Integridad

Peso 20%
95

Incluye la implementación completa de la clase, ayudantes internos y la secuencia de prueba exacta solicitada. Los comentarios explican el enfoque y las operaciones clave. Los casos límite para capacidad 0 se manejan explícitamente; la capacidad 1 funciona de forma natural mediante la lógica de expulsión.

Calidad del codigo

Peso 20%
85

El código está limpio, legible y bien estructurado con nodos centinela para simplificar las operaciones en la lista. Detalles menores de calidad: la anotación de retorno de _pop_tail no coincide con la posible devolución de None, y algunas comprobaciones en _remove_node son redundantes con la invariante de los centinelas.

Valor practico

Peso 15%
90

Una implementación de referencia práctica: operaciones O(1), evita bibliotecas prohibidas y es fácil de adaptar. El código de demostración es ejecutable tal cual.

Seguimiento de instrucciones

Peso 10%
100

Sigue todas las instrucciones: no utiliza OrderedDict/functools, usa tabla hash + lista doblemente enlazada, incluye comentarios explicativos, maneja casos límite (notablemente la capacidad 0) y proporciona código ejecutable completo con la prueba especificada.

Modelos evaluadores Google Gemini 2.5 Pro

Puntuacion total

98

Comentario general

Esta es una respuesta excepcional que proporciona una implementación de caché LRU de calidad de libro de texto. El código es correcto, eficiente y extraordinariamente bien estructurado, utilizando la técnica sofisticada de nodos centinela para simplificar la lógica de la lista doblemente enlazada. Cumple perfectamente con todas las restricciones, incluye comentarios excelentes, maneja los casos límite con elegancia y proporciona el caso de prueba ejecutable requerido. Sirve como una respuesta modelo para esta tarea.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es perfectamente correcta. La lógica tanto para las operaciones `get` como `put` mantiene correctamente el orden de menos recientemente usado y respeta la restricción de capacidad. La secuencia de prueba proporcionada produce la salida exacta esperada. La complejidad temporal promedio O(1) para ambas operaciones se consigue con éxito mediante la combinación de un mapa hash y una lista doblemente enlazada. Los casos límite, como una capacidad de 0, se manejan correctamente.

Integridad

Peso 20%
100

La entrega está completamente completa. Incluye la clase `LRUCache`, la clase auxiliar privada `_Node`, y el bloque de demostración completo y ejecutable (`if __name__ == "__main__":`) según lo solicitado. Se han entregado todos los componentes requeridos por el enunciado.

Calidad del codigo

Peso 20%
95

La calidad del código es excepcional. El uso de métodos auxiliares privados para la manipulación de nodos (`_add_node`, `_remove_node`, etc.) hace que los métodos principales `get` y `put` sean limpios y fáciles de leer. La implementación de nodos centinela head y tail es un patrón sofisticado y eficiente que elimina la necesidad de comprobaciones de casos extremos dentro de la lógica de manipulación de la lista. Los comentarios son claros, concisos y explican tanto el qué como el porqué de la implementación. Es una solución de nivel profesional.

Valor practico

Peso 15%
90

La respuesta tiene un alto valor práctico y educativo. Es una implementación clásica, desde cero, de un algoritmo de caché fundamental y ampliamente usado en diseño de sistemas. Este código sirve como una referencia excelente para quien necesite entender o implementar una caché LRU y es una solución canónica para un problema de entrevista de ingeniería de software muy común.

Seguimiento de instrucciones

Peso 10%
100

La respuesta sigue meticulosamente cada instrucción del enunciado. Implementa correctamente la clase `LRUCache` usando un mapa hash y una lista doblemente enlazada personalizada, evitando explícitamente las prohibiciones sobre `collections.OrderedDict` y `functools.lru_cache`. El código es ejecutable, está comentado e incluye el caso de prueba especificado (`if __name__ == "__main__":`).

class Node: """Nodo de lista doblemente enlazada para almacenar pares clave-valor y mantener el orden.""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """Implementa una caché Least Recently Used (LRU) usando un mapa hash y una lista doblemente enlazada.""" def __init__(self, capacity: int): """Inicializa la LRUCache con una capacidad dada.""" self.capacity = capacity self.cache = {} # Mapa hash: key -> Node self.head = Node(0, 0) # Nodo centinela head se...

Mostrar respuesta completa

class Node: """Nodo de lista doblemente enlazada para almacenar pares clave-valor y mantener el orden.""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """Implementa una caché Least Recently Used (LRU) usando un mapa hash y una lista doblemente enlazada.""" def __init__(self, capacity: int): """Inicializa la LRUCache con una capacidad dada.""" self.capacity = capacity self.cache = {} # Mapa hash: key -> Node self.head = Node(0, 0) # Nodo centinela head self.tail = Node(0, 0) # Nodo centinela tail self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node): """Elimina un nodo de la lista doblemente enlazada.""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add_to_head(self, node): """Agrega un nodo al inicio de la lista doblemente enlazada (más recientemente usado).""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def get(self, key: int) -> int: """Recupera el valor de una key, marcándola como recientemente usada. Devuelve -1 si la key no se encuentra.""" if key in self.cache: node = self.cache[key] # Mueve el nodo accedido al inicio (más recientemente usado) self._remove_node(node) self._add_to_head(node) return node.value return -1 def put(self, key: int, value: int) -> None: """Inserta o actualiza un par key-valor. Elimina el elemento LRU si se alcanza la capacidad.""" if self.capacity == 0: return if key in self.cache: # Actualiza la key existente node = self.cache[key] node.value = value # Mover al inicio ya que ha sido usado recientemente self._remove_node(node) self._add_to_head(node) else: # Inserta una nueva key if len(self.cache) >= self.capacity: # Elimina el elemento menos recientemente usado (nodo antes de tail) lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] new_node = Node(key, value) self.cache[key] = new_node self._add_to_head(new_node) # Demostrar la implementación con la secuencia de prueba: cache = LRUCache(2) print("Insertando (1, 10)") cache.put(1, 10) print("Insertando (2, 20)") cache.put(2, 20) print("Obteniendo la key 1:") print(cache.get(1)) # Esperado: 10 print("Insertando (3, 30)") cache.put(3, 30) # Elimina la key 2 print("Obteniendo la key 2:") print(cache.get(2)) # Esperado: -1 print("Insertando (4, 40)") cache.put(4, 40) # Elimina la key 1 print("Obteniendo la key 1:") print(cache.get(1)) # Esperado: -1 print("Obteniendo la key 3:") print(cache.get(3)) # Esperado: 30 print("Obteniendo la key 4:") print(cache.get(4)) # Esperado: 40

Resultado

#2

Votos ganadores

0 / 3

Puntuacion media

91
Modelos evaluadores Anthropic Claude Sonnet 4.6

Puntuacion total

92

Comentario general

La implementación es excelente en general. Utiliza correctamente un mapa hash combinado con una lista doblemente enlazada con nodos centinela head y tail, logrando O(1) tanto para get como para put. La secuencia de prueba produce la salida esperada correcta (10, -1, -1, 30, 40). Se manejan casos límite como capacidad 0. El código está limpio, bien comentado y sigue buenas convenciones de Python. Las únicas pequeñas debilidades son que la capacidad 1 no se demuestra explícitamente (aunque funciona correctamente por diseño) y los comentarios, aunque presentes y útiles, podrían ser un poco más detallados sobre la justificación general del diseño. En conjunto, esta es una implementación de alta calidad, completa y correcta.

Ver detalle de evaluacion

Correccion

Peso 35%
95

Todas las operaciones son O(1). La secuencia de prueba produce exactamente la salida esperada: 10, -1, -1, 30, 40. La lógica de expulsión LRU es correcta: después de get(1) la clave 1 se mueve a la más recientemente usada, put(3,30) expulsa correctamente la clave 2, y put(4,40) expulsa correctamente la clave 1. Se maneja el caso límite de capacidad 0. No se usan built-ins prohibidos.

Integridad

Peso 20%
90

La implementación incluye la clase Node, la clase LRUCache con todos los métodos requeridos, métodos auxiliares para la manipulación de la lista, manejo de la capacidad 0 y la secuencia completa de pruebas con sentencias print descriptivas. El caso límite de capacidad 1 no se prueba explícitamente pero funciona correctamente por diseño. Todos los componentes requeridos están presentes.

Calidad del codigo

Peso 20%
90

El código está limpio, bien estructurado y usa nombres significativos. Docstrings están presentes en todas las clases y métodos. Los métodos auxiliares _remove_node y _add_to_head están correctamente abstraídos. Se incluyen anotaciones de tipo. Los nodos centinela simplifican elegantemente las condiciones de frontera. Pequeña observación: se podría añadir un breve comentario de alto nivel que explique la estrategia general de diseño al principio.

Valor practico

Peso 15%
85

La implementación es de calidad producción y directamente utilizable. Maneja el caso límite de capacidad 0 de forma elegante. La demostración de salida es clara con etiquetas descriptivas. Podría mejorarse con demostraciones adicionales de casos límite (capacidad 1, puts duplicados) para aumentar su valor educativo práctico.

Seguimiento de instrucciones

Peso 10%
95

Se siguen todas las instrucciones: no se usa OrderedDict ni functools.lru_cache, se implementa mapa hash + lista doblemente enlazada desde cero, se incluyen comentarios que explican el enfoque, se manejan casos límite y se proporciona código completo y ejecutable con la secuencia exacta de pruebas. La salida coincide exactamente con los valores esperados.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

85

Comentario general

Implementa correctamente una caché LRU usando un hashmap más una lista doblemente enlazada con nodos centinela de cabeza/cola, logrando O(1) promedio para get/put y una expulsión adecuada. Maneja capacity=0 y los casos límite típicos (incluida capacity=1) correctamente. La principal debilidad es la salida de la demo: incluye líneas de impresión explicativas adicionales, por lo que no coincide exactamente con la secuencia de salida esperada requerida, aunque los valores devueltos sean correctos. Por lo demás, el código está limpio y bien comentado.

Ver detalle de evaluacion

Correccion

Peso 35%
92

El comportamiento central de LRU es correcto: get mueve los nodos a la posición MRU, put actualiza/mueve nodos existentes, y la expulsión elimina tail.prev (LRU). El hashmap apunta a los nodos y las operaciones de la lista son O(1). capacity=0 se maneja mediante un retorno temprano. No hay errores lógicos evidentes.

Integridad

Peso 20%
86

Proporciona código completo y ejecutable con Node, LRUCache, métodos auxiliares y una secuencia de demostración. Los casos borde están cubiertos al menos para capacity=0 (y capacity=1 funciona implícitamente). Sin embargo, la demostración no presenta la salida en la forma mínima exacta esperada debido a declaraciones de impresión adicionales.

Calidad del codigo

Peso 20%
84

Bien estructurado con una clara separación de responsabilidades y docstrings/comentarios útiles. Usa correctamente sentinelas dummy de cabeza/cola. Mejoras menores podrían incluir anotaciones de tipo para los métodos auxiliares y asegurarse de que los métodos auxiliares estén marcados como internos de manera consistente, pero en general es sólido.

Valor practico

Peso 15%
78

Implementación LRU práctica y estándar que puede reutilizarse. La verbosidad extra de la demo puede ser inconveniente para la comprobación automatizada, pero la estructura de datos en sí es útil y eficiente.

Seguimiento de instrucciones

Peso 10%
70

Sigue las restricciones principales: no usa OrderedDict ni functools.lru_cache; usa hashmap + lista doblemente enlazada; incluye comentarios; incluye una secuencia de pruebas. La desviación principal es que la salida impresa no coincide exactamente con las líneas de salida esperadas (añade texto descriptivo), lo que puede violar el requisito de 'salida esperada'.

Modelos evaluadores Google Gemini 2.5 Pro

Puntuacion total

98

Comentario general

La respuesta ofrece una implementación excelente y de calidad de libro de texto de una caché LRU. Utiliza correctamente un mapa hash y una lista doblemente enlazada para lograr complejidad temporal O(1) tanto en las operaciones `get` como `put`. El código es limpio, está bien comentado, emplea buenas prácticas como métodos auxiliares y nodos centinela (dummy), y maneja correctamente los casos límite. Todas las instrucciones del enunciado fueron seguidas meticulosamente, resultando en una solución completa y correcta.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es perfectamente correcta. Emplea con éxito un mapa hash para búsquedas O(1) y una lista doblemente enlazada para actualizaciones de orden O(1). La lógica de `get`, `put` y de expulsión (eviction) es sólida. El código pasa la secuencia de pruebas proporcionada y maneja correctamente el caso extremo de capacity=0.

Integridad

Peso 20%
100

La entrega está totalmente completa y es ejecutable. Incluye la clase `LRUCache` requerida, una clase auxiliar `Node`, todos los métodos necesarios y el código de demostración completo con la secuencia de pruebas solicitada en el enunciado.

Calidad del codigo

Peso 20%
95

La calidad del código es excepcionalmente alta. Está bien estructurado, usando clases separadas y métodos auxiliares privados (`_remove_node`, `_add_to_head`) para mayor claridad. El uso de nodos centinela para la cabeza y la cola es una técnica clásica y robusta que simplifica la lógica de manipulación de la lista. El código incluye docstrings claros, anotaciones de tipos y sigue las convenciones de Python.

Valor practico

Peso 15%
90

La solución tiene un alto valor práctico, ya que proporciona una implementación canónica y eficiente de una estructura de datos fundamental y ampliamente utilizada. Este código no es solo un ejercicio teórico; es una solución directa y robusta que podría usarse en aplicaciones del mundo real.

Seguimiento de instrucciones

Peso 10%
100

La respuesta se adhiere perfectamente a todas las instrucciones. Implementa la caché LRU desde cero usando un mapa hash y una lista doblemente enlazada, sin recurrir a bibliotecas prohibidas como `collections.OrderedDict`. Incluye comentarios, maneja los casos límite y proporciona el código ejecutable completo con la secuencia de pruebas.

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

3 / 3

Puntuacion media

95
Ver esta respuesta

Votos ganadores

0 / 3

Puntuacion media

91
Ver esta respuesta

Resultados de evaluacion

X f L