Esse desafio é realmente simples (e precursor de um mais difícil!).
Dada uma variedade de acessos a recursos (simplesmente indicados por números inteiros não negativos) e um parâmetro n
, retorne o número de erros de cache que eles teriam, assumindo que nosso cache tenha capacidade n
e usando um esquema de ejeção de FIFO quando estiver cheio .
Exemplo:
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]
Portanto, neste exemplo, houve 9 erros. Talvez um exemplo de código ajude a explicar melhor. Em 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
Alguns outros casos de teste (que contêm uma dica para o próximo desafio - notam 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
O menor código em bytes vence.
notice anything curious?
por um tempo agora ... e apenas notei que aumentar a capacidade do cache não necessariamente diminui o número de erros ?!Respostas:
JavaScript (ES6), 55 bytes
Método # 1: o cache substitui a entrada
Recebe entrada na sintaxe de currying
(cache_size)(list)
.Experimente online!
Quão?
Sobrescrevemos a matriz de entrada a [] com o cache, usando um ponteiro separado k inicializado em 0 .
Usamos
a.indexOf(x, k > n && k - n) < k
para testar se x está no cache.O cache não pode crescer mais rápido do que a matriz original é percorrida; portanto, é garantido que cada valor seja encontrado, dentro ou fora da janela do cache (ou seja
indexOf()
, nunca retornará -1 ).Um valor está no cache se for encontrado em um índice entre max (0, k - n) e k - 1 (ambos os limites incluídos); nesse caso, fazemos um [verdadeiro] = x . Isso afeta apenas uma propriedade do objeto subjacente atrás de um [], mas não altera a matriz a [] . Caso contrário, fazemos um [k ++] = x .
Exemplo
Abaixo estão as diferentes etapas da entrada
[1, 1, 2, 3, 3, 2, 1, 4]
com um tamanho de cache 2 :JavaScript (ES6), 57 bytes
Método # 2: o cache é anexado no final da entrada
Recebe entrada na sintaxe de currying
(cache_size)(list)
.Experimente online!
Quão?
Como a matriz de entrada a [] tem garantia de conter números inteiros não negativos, podemos anexar com segurança o cache no final de [] usando o complemento de um ~ x de cada valor x .
Usamos
n * ~a.indexOf(~x, -n)
para testar se ~ x é encontrado entre os últimos n valores. Sempre que esse teste falha, anexamos ~ x a [] e incrementamos o número de erros k .Exemplo
Abaixo estão as diferentes etapas para o mesmo exemplo acima, usando este método. Como os valores do cache são simplesmente anexados no final da matriz, não há ponteiro explícito do cache.
fonte
Haskell , 50 bytes
Experimente online!
Com base no método de Lynn de armazenar todo o histórico do cache e levar seu tamanho. Saída unária seria um pouco menor:
Haskell , 47 bytes
Experimente online!
fonte
Python 2 , 58 bytes
Experimente online!
Graças a ovs por 3 bytes e xnor por mais 3.
fonte
c+=
, pois, por algum motivo, ele será convertido em uma lista para você.c+={i}-set(c[-n:])
obras, para positivan
Mas nimi apontou que.c[-n:]
é erradon == 0
, então eu não pode usar+=
, e, portanto, esse truque -. muito ruim)reduce
ainda economiza bytes:lambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 bytesExperimente online!
Agradecemos a JayCe por sugerir algumas melhorias e a DigEmAll por mais um casal!
fonte
+
na frenteF
é paraf(0,{})
retornar 0?F
um valor de retorno pré-inicializado.q
idéia, mas ainda assim uma boa! UsarNA
é menos bom do que usar,{}
pois eu realmente me importo com o tamanho aqui (e na verdade não estou removendo elementos do cache).Haskell,
6158 bytesExperimente online!
Edit: -3 bytes graças a @Lynn.
fonte
05AB1E ,
1716 bytesExperimente online!
Explicação
fonte
Kotlin ,
8269 bytesAceita a entrada como um
IntArray
, não o típicoList<Int>
(o que não deve ser um problema.) Isso usa a abordagem de "criar um histórico de cache e contar seu comprimento".Experimente online!
Explicação
Criando uma lista vazia
O Kotlin não possui literais de coleção, mas possui algumas funções para criar novas coleções.
A maneira correta de criar um vazio
List<Int>
é simplesmente:mas é mais curto se abusarmos dos argumentos de tamanho e inicializador para fazer isso:
Como o gerador lambda retorna 0, o Kotlin deduz o tipo dessa lista como
List<Int>
, e o tamanho de 0 significa que esta lista está vazia.fonte
Perl 6 , 48 bytes
Teste-o
fonte
Java 8, 96 bytes
Um lambda ao curry obtendo um tamanho de cache (
int
) e lista de acesso (mutáveljava.util.List<Integer>
) e retornando umint
.Experimente Online
Ungolfed
Isso usa os primeiros (até)
s
slots na lista de entrada para o cache.Agradecimentos
fonte
Pitão ,
16 15 18 1413 bytesGuardado 1 byte graças a isaacg .
Suíte de teste!
Esse desafio é muito adequado à
u
estrutura de Pyth .Como funciona
fonte
aW-H>QGGH
beats?}H<GQG+HG
por 1+G*]H!}H>QG
, mas quando jogava golfe eu realmente não pensava emW
... Legal!u
?u
é um operador de redução com valor inicial. Assim como o de Jellyƒ
Wolfram Language (Mathematica) ,
6059 bytesExperimente online!
Usando correspondência de padrões, 60 bytes
Eu realmente gosto mais deste, mas é 1 byte a mais ...
Experimente online!
fonte
Japonês, 16 bytes
Tente
Explicação
fonte
K4 ,
4240 bytesSolução:
Exemplos:
Explicação:
Para a função interna, y é o cache, z é a solicitação e x é o tamanho do cache.
Notas:
Provavelmente existe uma maneira melhor de fazer tudo isso, mas essa é a primeira maneira que veio à mente.
A função pode ser executada assim por 36 bytes :
Alternativa - usando uma variável global para armazenar estado (não muito parecido com K), 42 bytes :
fonte
Flak cerebral , 172 bytes
Experimente online!
fonte
Gelatina , 18 bytes
Experimente online!
Leva a lista como o primeiro argumento e a capacidade de cache como segundo argumento.
fonte
Ruby ,
4340 bytesExperimente online!
Obrigado histocrat por raspar 3 bytes.
fonte
->s,a,*r
que também fornece o recurso de bônus que o chamador pode preparar o cache passando argumentos extras :)x
em uma matriz:.count{|*x|
C (gcc) ,
112 110108 bytesExperimente online!
Um pouco menos golfe
fonte
C (gcc) , 156 bytes
Experimente online!
Descrição:
fonte
wmemset(c,-1,x)
vez den=m=0;for(i=0;i<x;++i)c[i]=-1
, emn=m=i=s=0
vez dei=s=0
, emfor(j=x;j--;)
vez defor(j=0;j<x;++j)
e ems||(c[n++]=_[i],m++,n%=x);
vez deif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 bytes
Experimente online!
fonte
Geléia , 17 bytes
Experimente online!
Programa completo.
Argumento 1: pilha (Python 3
list
deint
egers)Argumento 2:
n
(Python 3int
eger)fonte
Ferrugem , 129 bytes
Experimente online!
Ungolfed
fonte
Stax , 15 bytes
Execute e depure
fonte