Este desafío es realmente simple (¡y un precursor de uno más difícil!).
Dada una matriz de accesos a recursos (simplemente denotada por enteros no negativos) y un parámetro n
, devuelve el número de fallos de caché que supondría si nuestra caché tiene capacidad n
y utiliza un esquema de expulsión de primero en entrar, primero en salir (FIFO) cuando está lleno .
Ejemplo:
4, [0, 1, 2, 3, 0, 1, 2, 3, 4, 0, 0, 1, 2, 3]
0 = not in cache (miss), insert, cache is now [0]
1 = not in cache (miss), insert, cache is now [0, 1]
2 = not in cache (miss), insert, cache is now [0, 1, 2]
3 = not in cache (miss), insert, cache is now [0, 1, 2, 3]
0 = in cache (hit), cache unchanged
1 = in cache (hit), cache unchanged
2 = in cache (hit), cache unchanged
3 = in cache (hit), cache unchanged
4 = not in cache (miss), insert and eject oldest, cache is now [1, 2, 3, 4]
0 = not in cache (miss), insert and eject oldest, cache is now [2, 3, 4, 0]
0 = in cache (hit), cache unchanged
1 = not in cache (miss), insert and eject oldest, cache is now [3, 4, 0, 1]
2 = not in cache (miss), insert and eject oldest, cache is now [4, 0, 1, 2]
3 = not in cache (miss), insert and eject oldest, cache is now [0, 1, 2, 3]
Entonces, en este ejemplo hubo 9 fallas. Tal vez un ejemplo de código ayude a explicarlo mejor. En Python:
def num_misses(n, arr):
misses = 0
cache = []
for access in arr:
if access not in cache:
misses += 1
cache.append(access)
if len(cache) > n:
cache.pop(0)
return misses
Algunos casos de prueba adicionales (que contienen una pista hacia el próximo desafío, ¿notas algo curioso?):
0, [] -> 0
0, [1, 2, 3, 4, 1, 2, 3, 4] -> 8
2, [0, 0, 0, 0, 0, 0, 0] -> 1
3, [3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4] -> 9
4, [3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4] -> 10
El código más corto en bytes gana.
notice anything curious?
por un tiempo ahora ... y me di cuenta, ¿aumentar la capacidad de caché no necesariamente disminuye la cantidad de fallas?Respuestas:
JavaScript (ES6), 55 bytes
Método # 1: el caché sobrescribe la entrada
Toma entrada en la sintaxis de curry
(cache_size)(list)
.Pruébalo en línea!
¿Cómo?
Sobrescribimos la matriz de entrada a [] con el caché, usando un puntero separado k inicializado a 0 .
Usamos
a.indexOf(x, k > n && k - n) < k
para probar si x está en el caché.El caché no puede crecer más rápido de lo que se recorre la matriz original, por lo que se garantiza que cada valor se encontrará, ya sea dentro o más allá de la ventana del caché (es decir
indexOf()
, nunca devolverá -1 ).Un valor está en la memoria caché si se encuentra en un índice entre max (0, k - n) y k - 1 (ambos límites incluidos), en cuyo caso hacemos un [verdadero] = x . Esto solo afecta a una propiedad del objeto subyacente detrás de [] pero no altera la matriz a [] . De lo contrario, hacemos un [k ++] = x .
Ejemplo
A continuación se detallan los diferentes pasos para la entrada
[1, 1, 2, 3, 3, 2, 1, 4]
con un tamaño de caché de 2 :JavaScript (ES6), 57 bytes
Método # 2: el caché se agrega al final de la entrada
Toma entrada en la sintaxis de curry
(cache_size)(list)
.Pruébalo en línea!
¿Cómo?
Debido a que se garantiza que la matriz de entrada a [] contiene enteros no negativos, podemos agregar de forma segura la caché al final de a [] utilizando el complemento único ~ x de cada valor x .
Usamos
n * ~a.indexOf(~x, -n)
para probar si ~ x se encuentra entre los últimos n valores. Cuando esta prueba falla, agregamos ~ x a a [] e incrementamos el número de errores k .Ejemplo
A continuación se muestran los diferentes pasos para el mismo ejemplo anterior, utilizando este método. Debido a que los valores de caché simplemente se agregan al final de la matriz, no hay un puntero de caché explícito.
fuente
Haskell , 50 bytes
Pruébalo en línea!
Basado en el método de Lynn de almacenar todo el historial de caché y tomar su longitud. La salida unaria sería un poco más corta:
Haskell , 47 bytes
Pruébalo en línea!
fuente
Python 2 , 58 bytes
Pruébalo en línea!
Gracias a ovs por 3 bytes, y xnor por 3 más.
fuente
c+=
, ya que por alguna razón se convierte en una lista para usted.c+={i}-set(c[-n:])
funciona, es positivon
. Pero Nimi señaló que esoc[-n:]
está maln == 0
, así que no puedo usar+=
, y por lo tanto ese truco - muy mal.)reduce
Todavía guarda bytes:lambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 bytesPruébalo en línea!
¡Gracias a JayCe por sugerir algunas mejoras, y DigEmAll por otra pareja!
fuente
+
frenteF
es paraf(0,{})
devolver 0?F
un valor de retorno preinicializado.q
pero sigue siendo una buena idea UsarNA
es menos bueno que usar{}
ya que realmente me importa la longitud aquí (y en realidad no estoy sacando elementos del caché).Haskell,
6158 bytesPruébalo en línea!
Editar: -3 bytes gracias a @Lynn.
fuente
05AB1E ,
1716 bytesPruébalo en línea!
Explicación
fuente
Kotlin ,
8269 bytesToma la entrada como un
IntArray
, no el típicoList<Int>
(que no debería ser un problema). Esto utiliza el enfoque de "construir un historial de caché y contar su longitud".Pruébalo en línea!
Explicación
Crear una lista vacía
Kotlin no tiene literales de colección, pero tiene algunas funciones para crear nuevas colecciones.
La forma correcta de crear un vacío
List<Int>
es simplemente:pero es más corto si abusamos del tamaño y los argumentos del inicializador para hacer esto:
Como el generador lambda devuelve 0, Kotlin infiere el tipo de esta lista como
List<Int>
, y el tamaño de 0 significa que esta lista está vacía.fuente
Perl 6 , 48 bytes
Pruébalo
fuente
Java 8, 96 bytes
Una lambda al curry que toma un tamaño de caché (
int
) y una lista de acceso (mutablejava.util.List<Integer>
) y devuelve unint
.Pruébalo en línea
Sin golf
Esto usa los primeros (hasta)
s
espacios en la lista de entrada para el caché.Expresiones de gratitud
fuente
Pyth ,
16 15 18 1413 bytesGuardado 1 byte gracias a isaacg .
¡Banco de pruebas!
Este desafío se adapta muy bien a la
u
estructura de Pyth .Cómo funciona
fuente
aW-H>QGGH
late?}H<GQG+HG
por 1+G*]H!}H>QG
, pero cuando jugué al golf no pensé enW
... ¡ Bien !u
?u
es un operador de reducción con valor inicial . Como Jelly'sƒ
Wolfram Language (Mathematica) ,
6059 bytesPruébalo en línea!
Uso de coincidencia de patrones, 60 bytes
Realmente me gusta más, pero es 1 byte más largo ...
Pruébalo en línea!
fuente
Japt, 16 bytes
Intentalo
Explicación
fuente
K4 ,
4240 bytesSolución:
Ejemplos:
Explicación:
Para la función interna, y es el caché, z es la solicitud y x es el tamaño del caché.
Notas:
Probablemente haya una mejor manera de hacer todo esto, pero esta es la primera forma en que se me ocurrió.
La función se puede ejecutar así para 36 bytes :
Alternativa: usar una variable global para almacenar el estado (no muy similar a K), 42 bytes :
fuente
Brain-Flak , 172 bytes
Pruébalo en línea!
fuente
Jalea , 18 bytes
Pruébalo en línea!
Toma la lista como primer argumento y la capacidad de caché como segundo argumento.
fuente
Ruby ,
4340 bytesPruébalo en línea!
Gracias histocrat por afeitar 3 bytes.
fuente
->s,a,*r
que también proporciona la característica adicional de que la persona que llama puede cebar el caché al pasar argumentos adicionales :)x
en una matriz:.count{|*x|
C (gcc) ,
112 110108 bytesPruébalo en línea!
Ligeramente menos golfizado
fuente
C (gcc) , 156 bytes
Pruébalo en línea!
Descripción:
fuente
wmemset(c,-1,x)
lugar den=m=0;for(i=0;i<x;++i)c[i]=-1
, enn=m=i=s=0
lugar dei=s=0
, enfor(j=x;j--;)
lugar defor(j=0;j<x;++j)
y ens||(c[n++]=_[i],m++,n%=x);
lugar deif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 bytes
Pruébalo en línea!
fuente
Jalea , 17 bytes
Pruébalo en línea!
Programa completo
Argumento 1: pila (Python 3
list
deint
egers)Argumento 2:
n
(Python 3int
eger)fuente
Óxido , 129 bytes
Pruébalo en línea!
Sin golf
fuente
Stax , 15 bytes
Ejecutar y depurarlo
fuente