Diese Herausforderung ist wirklich einfach (und ein Vorläufer einer schwierigeren!).
Bei einem Array von Ressourcenzugriffen (einfach durch nichtnegative Ganzzahlen angegeben) und einem Parameter n
geben Sie die Anzahl der Cachefehler zurück, sofern der Cache über Kapazität verfügt n
und ein FIFO-Auswurfschema (First-In-First-Out) verwendet, wenn er voll ist .
Beispiel:
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]
In diesem Beispiel gab es also 9 Fehler. Vielleicht hilft ein Codebeispiel, es besser zu erklären. In 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
Einige weitere Testfälle (die einen Hinweis auf die nächste Herausforderung enthalten - etwas Merkwürdiges feststellen?):
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
Kürzester Code in Bytes gewinnt.
notice anything curious?
eine Weile angesehen ... und gerade bemerkt, dass das Erhöhen der Cache-Kapazität nicht unbedingt die Anzahl der Fehler verringert ?!Antworten:
JavaScript (ES6), 55 Byte
Methode 1: Der Cache überschreibt die Eingabe
Übernimmt Eingaben in der Currying-Syntax
(cache_size)(list)
.Probieren Sie es online!
Wie?
Wir überschreiben das Eingabearray a [] mit dem Cache unter Verwendung eines separaten Zeigers k, der auf 0 initialisiert ist .
Wir
a.indexOf(x, k > n && k - n) < k
testen, ob sich x im Cache befindet.Der Cache kann nicht schneller wachsen, als das ursprüngliche Array durchlaufen wurde. Daher wird garantiert jeder Wert innerhalb oder außerhalb des Cache-Fensters gefunden (dh er
indexOf()
gibt niemals -1 zurück ).Ein Wert befindet sich im Cache, wenn er an einem Index zwischen max (0, k - n) und k - 1 (beide Grenzen eingeschlossen) gefunden wird. In diesem Fall ist a [true] = x . Dies betrifft nur eine Eigenschaft des zugrunde liegenden Objekts hinter einem [] , ändert jedoch nicht das Array a [] . Ansonsten machen wir a [k ++] = x .
Beispiel
Nachfolgend sind die verschiedenen Schritte für die Eingabe
[1, 1, 2, 3, 3, 2, 1, 4]
mit einer Cache-Größe von 2 aufgeführt :JavaScript (ES6), 57 Byte
Methode 2: Der Cache wird am Ende der Eingabe angehängt
Übernimmt Eingaben in der Currying-Syntax
(cache_size)(list)
.Probieren Sie es online!
Wie?
Da das Eingabearray a [] garantiert nicht negative Ganzzahlen enthält, können wir den Cache sicher am Ende von a [] anhängen, indem wir das Ein-Komplement ~ x jedes Werts x verwenden .
Wir
n * ~a.indexOf(~x, -n)
testen, ob ~ x unter den letzten n Werten gefunden wird. Wenn dieser Test fehlschlägt, hängen wir ~ x an a [] an und erhöhen die Anzahl der Fehler k .Beispiel
Nachfolgend sind die verschiedenen Schritte für dasselbe Beispiel wie oben unter Verwendung dieser Methode aufgeführt. Da Cache-Werte einfach am Ende des Arrays angehängt werden, gibt es keinen expliziten Cache-Zeiger.
quelle
Haskell , 50 Bytes
Probieren Sie es online!
Basierend auf Lynns Methode, den gesamten Cache-Verlauf zu speichern und seine Länge zu bestimmen. Unäre Ausgabe wäre etwas kürzer:
Haskell , 47 Bytes
Probieren Sie es online!
quelle
Python 2 , 58 Bytes
Probieren Sie es online!
Danke an ovs für 3 Bytes und xnor für 3 weitere.
quelle
c+=
, da dieser aus irgendeinem Grund in eine Liste für Sie konvertiert wird.c+={i}-set(c[-n:])
funktioniert, zum Positivenn
. Aber nimi wies darauf hin, dassc[-n:]
das falsch istn == 0
, also kann ich nicht+=
und daher diesen Trick - schade.)reduce
noch speichert Bytes:lambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 BytesProbieren Sie es online!
Vielen Dank an JayCe für die Verbesserungsvorschläge und DigEmAll für ein weiteres Paar!
quelle
+
vorF
ist fürf(0,{})
0 zurückzugeben?F
einem vorinitialisierten Rückgabewert.q
aber trotzdem eine nette idee! Die VerwendungNA
ist weniger gut als die Verwendung,{}
da mir die Länge hier wirklich wichtig ist (und ich keine Elemente aus dem Cache lösche).Haskell,
61-58BytesProbieren Sie es online!
Edit: -3 Bytes dank @Lynn.
quelle
05AB1E ,
1716 BytesProbieren Sie es online!
Erläuterung
quelle
Kotlin ,
82-69BytesNimmt Eingaben als ein
IntArray
, nicht das typischeList<Int>
(was kein Problem sein sollte.) Dies verwendet den Ansatz "Erstellen eines Cache-Verlaufs und Zählen seiner Länge".Probieren Sie es online!
Erläuterung
Eine leere Liste erstellen
Kotlin verfügt nicht über Sammlungsliterale, hat jedoch einige Funktionen zum Erstellen neuer Sammlungen.
Der richtige Weg, um eine leere zu erstellen,
List<Int>
ist einfach:Es ist jedoch kürzer, wenn wir die Argumente size und initializer dazu missbrauchen:
Da der Generator lambda 0 zurück, folgert Kotlin den Typ dieser Liste als
List<Int>
und die Größe von 0 bedeutet diese Liste leer ist .quelle
Perl 6 , 48 Bytes
Probier es aus
quelle
Java 8, 96 Bytes
Ein Curry-Lambda, das eine Cache-Größe (
int
) und eine Zugriffsliste (veränderlichjava.util.List<Integer>
) annimmt und ein zurückgibtint
.Probieren Sie es online
Ungolfed
Dies verwendet die ersten (bis zu)
s
Slots in der Eingabeliste für den Cache.Danksagung
quelle
Pyth ,
16 15 18 1413 BytesDank isaacg 1 Byte gespeichert .
Testsuite!
Diese Herausforderung passt sehr gut zu Pyths
u
Struktur.Wie es funktioniert
quelle
aW-H>QGGH
schlägt?}H<GQG+HG
um 1+G*]H!}H>QG
, aber als ich Golf gespielt habe, habe ich wirklich nicht daran gedachtW
... Schön!u
das?u
ist ein Reduktionsoperator mit Anfangswert. Genau wie bei Jelly'sƒ
Wolfram Language (Mathematica) ,
6059 BytesProbieren Sie es online!
Bei Verwendung der Mustererkennung 60 Byte
Ich mag das hier wirklich besser, aber es ist 1 Byte länger ...
Probieren Sie es online!
quelle
Japt, 16 Bytes
Versuch es
Erläuterung
quelle
K4 ,
4240 BytesLösung:
Beispiele:
Erläuterung:
Für die innere Funktion ist y der Cache, z ist die Anforderung und x ist die Cache-Größe.
Anmerkungen:
Es gibt wahrscheinlich einen schöneren Weg, dies alles zu tun, aber dies ist der erste Weg, der mir in den Sinn gekommen ist.
Die Funktion kann für 36 Bytes so ausgeführt werden :
Alternative - Verwendung einer globalen Variablen zum Speichern des Zustands (nicht sehr K-ähnlich), 42 Bytes :
quelle
Brain-Flak , 172 Bytes
Probieren Sie es online!
quelle
Jelly , 18 Bytes
Probieren Sie es online!
Nimmt die Liste als erstes Argument und die Cache-Kapazität als zweites Argument.
quelle
Ruby ,
4340 BytesProbieren Sie es online!
Vielen Dank, Histocrat, für das Rasieren von 3 Bytes.
quelle
->s,a,*r
:x
in eine Reihe zu werfen :.count{|*x|
C (GCC) ,
112 110108 BytesProbieren Sie es online!
Etwas weniger golfen
quelle
C (gcc) , 156 Bytes
Probieren Sie es online!
Beschreibung:
quelle
wmemset(c,-1,x)
anstelle vonn=m=0;for(i=0;i<x;++i)c[i]=-1
,n=m=i=s=0
anstelle voni=s=0
,for(j=x;j--;)
anstelle vonfor(j=0;j<x;++j)
unds||(c[n++]=_[i],m++,n%=x);
anstelle vonif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 Byte
Probieren Sie es online!
quelle
Gelee , 17 Bytes
Probieren Sie es online!
Volles Programm.
Argument 1: Stapel (Python 3
list
vonint
egers)Argument 2:
n
(Python 3 von egersint
)quelle
Rust , 129 Bytes
Probieren Sie es online!
Ungolfed
quelle
Stax , 15 Bytes
Führen Sie es aus und debuggen Sie es
quelle