Ce défi est vraiment simple (et un précurseur d'un plus difficile!).
Étant donné un tableau d'accès aux ressources (simplement désigné par des entiers non négatifs) et un paramètre n
, renvoie le nombre d'occurrences manquées dans le cache, à supposer que notre cache ait une capacité suffisante n
et utilise un schéma d'éjection premier entré premier sorti (FIFO) lorsqu'il est plein. .
Exemple:
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]
Donc, dans cet exemple, il y a eu 9 ratés. Peut-être qu'un exemple de code aide à mieux l'expliquer. 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
Quelques autres cas de test (qui contiennent un indice pour le prochain défi - rien de curieux?):
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
Le code le plus court en octets gagne.
notice anything curious?
depuis un moment ... et je viens de remarquer que l'augmentation de la capacité de la mémoire cache ne diminue pas nécessairement le nombre de ratés?!Réponses:
JavaScript (ES6), 55 octets
Méthode n ° 1: le cache écrase l'entrée
Prend la syntaxe de currying
(cache_size)(list)
.Essayez-le en ligne!
Comment?
Nous écrasons le tableau d'entrée a [] avec le cache, en utilisant un pointeur séparé k initialisé à 0 .
Nous utilisons
a.indexOf(x, k > n && k - n) < k
pour tester si x est dans le cache.Le cache ne peut pas croître plus rapidement que le tableau d'origine n'est parcouru. Par conséquent, chaque valeur est garantie, que ce soit dans ou au-delà de la fenêtre du cache (c'est
indexOf()
-à- dire qu'elle ne renverra jamais -1 ).Une valeur est dans le cache si elle se trouve à un index compris entre max (0, k - n) et k - 1 (les deux bornes étant incluses), auquel cas on fait un [true] = x . Ceci n'affecte que la propriété de l'objet sous-jacent derrière un [] mais ne modifie pas le tableau a [] . Sinon, on fait un [k ++] = x .
Exemple
Voici les différentes étapes pour l’entrée
[1, 1, 2, 3, 3, 2, 1, 4]
avec une taille de cache de 2 :JavaScript (ES6), 57 octets
Méthode n ° 2: le cache est ajouté à la fin de l'entrée
Prend la syntaxe de currying
(cache_size)(list)
.Essayez-le en ligne!
Comment?
Etant donné que le tableau d'entrée a [] contient des entiers non négatifs, nous pouvons ajouter en toute sécurité le cache à la fin d' un [] en utilisant le complément à un x de chaque valeur x .
Nous utilisons
n * ~a.indexOf(~x, -n)
pour tester si ~ x est trouvé parmi les n dernières valeurs. Chaque fois que ce test échoue, nous ajoutons ~ x à un [] et incrémentons le nombre de ratés k .Exemple
Voici les différentes étapes pour le même exemple que ci-dessus, en utilisant cette méthode. Comme les valeurs de cache sont simplement ajoutées à la fin du tableau, il n'y a pas de pointeur de cache explicite.
la source
Haskell , 50 octets
Essayez-le en ligne!
Basé sur la méthode de Lynn pour stocker la totalité de l'historique de cache et prendre sa longueur. La sortie unaire serait un peu plus courte:
Haskell , 47 octets
Essayez-le en ligne!
la source
Python 2 , 58 octets
Essayez-le en ligne!
Merci à ovs pour 3 octets et à xnor pour 3 autres.
la source
c+=
, car pour une raison quelconque, il est converti en liste pour vous.c+={i}-set(c[-n:])
marche, pour le positifn
. Mais Nimi a fait remarquer que ce n'était pasc[-n:]
bonn == 0
, alors je ne peux pas utiliser+=
, et par conséquent, cette astuce - tant pis.)reduce
enregistre encore octets:lambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 octetsEssayez-le en ligne!
Merci à JayCe d’avoir suggéré quelques améliorations et à DigEmAll pour un autre couple!
la source
+
devantF
est pourf(0,{})
retourner 0?F
une valeur de retour pré-initialisée.q
mais c'est quand même une bonne idée! L'utilisationNA
est moins bonne que l'utilisation,{}
car la longueur est importante pour moi (et je ne fais pas ressortir d'éléments du cache).Haskell,
6158 octetsEssayez-le en ligne!
Edit: -3 octets grâce à @Lynn.
la source
05AB1E ,
1716 octetsEssayez-le en ligne!
Explication
la source
Kotlin ,
8269 octetsPrend les entrées comme un type
IntArray
, pas comme le typeList<Int>
(ce qui ne devrait pas poser de problème). Il utilise l'approche suivante: "créer un historique du cache et compter sa longueur".Essayez-le en ligne!
Explication
Créer une liste vide
Kotlin n'a pas de littéraux de collection, mais certaines fonctions lui permettent de créer de nouvelles collections.
La bonne façon de créer un vide
List<Int>
est simplement:mais il est plus court si nous abusons de la taille et des arguments de l'initialiseur pour le faire:
Comme le générateur lambda renvoie 0, Kotlin en déduit le type
List<Int>
, et sa taille égale à 0 signifie que cette liste est vide.la source
Perl 6 , 48 octets
Essaye-le
la source
Java 8, 96 octets
Un lambda au curry prenant une taille de cache (
int
) et une liste d’accès (mutablejava.util.List<Integer>
) et retournant unint
.Essayez-le en ligne
Ungolfed
Ceci utilise les premiers (au maximum)
s
emplacements de la liste d'entrée pour le cache.Remerciements
la source
Pyth ,
16 15 18 1413 octetsEnregistré 1 octet grâce à isaacg .
Suite de tests!
Ce défi est très bien adapté à la
u
structure de Pyth .Comment ça marche
la source
aW-H>QGGH
bat?}H<GQG+HG
par 1+G*]H!}H>QG
, je l’ai fait , mais quand j’ai joué au golf, je n’y avais vraiment pas penséW
... Bien!u
?u
est un opérateur de réduction avec valeur initiale. Tout comme Jellyƒ
Wolfram Language (Mathematica) ,
6059 octetsEssayez-le en ligne!
Utilisation de la correspondance de modèle, 60 octets
J'aime beaucoup mieux celui-ci, mais c'est 1 octet de plus ...
Essayez-le en ligne!
la source
Japt, 16 octets
L'essayer
Explication
la source
K4 ,
42 à40 octetsSolution:
Exemples:
Explication:
Pour la fonction interne, y est le cache, z est la demande et x est la taille du cache.
Remarques:
Il y a probablement une meilleure façon de faire tout cela, mais c'est la première façon qui m'est venue à l'esprit.
La fonction peut être exécutée comme ceci pour 36 octets :
Alternative - utilisation d'une variable globale pour stocker l'état (très peu similaire à K), 42 octets :
la source
Brain-Flak , 172 octets
Essayez-le en ligne!
la source
Gelée , 18 octets
Essayez-le en ligne!
Prend la liste comme premier argument et la capacité de cache comme second argument.
la source
Ruby ,
43 à40 octetsEssayez-le en ligne!
Merci histocrat pour avoir rasé 3 octets.
la source
->s,a,*r
ce qui fournit également à l'appelant la fonction de bonus qui lui permet d'amorcer la cache en lui passant des arguments supplémentaires :)x
dans un tableau:.count{|*x|
C (gcc) ,
112 110108 octetsEssayez-le en ligne!
Un peu moins golfé
la source
C (gcc) , 156 octets
Essayez-le en ligne!
La description:
la source
wmemset(c,-1,x)
au lieu den=m=0;for(i=0;i<x;++i)c[i]=-1
,n=m=i=s=0
au lieu dei=s=0
,for(j=x;j--;)
au lieufor(j=0;j<x;++j)
ets||(c[n++]=_[i],m++,n%=x);
au lieu deif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 octets
Essayez-le en ligne!
la source
Gelée , 17 octets
Essayez-le en ligne!
Programme complet.
Argument 1: pile (Python 3
list
d'int
egers)Argument 2:
n
(Python 3int
eger)la source
Rouille , 129 octets
Essayez-le en ligne!
Ungolfed
la source
Stax , 15 octets
Exécuter et déboguer
la source