To wyzwanie jest naprawdę proste (i jest prekursorem trudniejszego!).
Biorąc pod uwagę tablicę dostępu do zasobów (po prostu oznaczoną nieujemnymi liczbami całkowitymi) i parametr n
, zwróć liczbę braków pamięci podręcznej, które miałoby przy założeniu, że nasza pamięć podręczna ma pojemność n
i korzysta ze schematu wyrzucania FIFO, gdy jest pełna .
Przykład:
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]
Tak więc w tym przykładzie było 9 nieudanych prób. Może przykład kodu pomaga lepiej to wyjaśnić. W Pythonie:
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
Kilka dalszych przypadków testowych (które zawierają wskazówkę do następnego wyzwania - czy zauważyłeś coś ciekawego?):
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
Najkrótszy kod w bajtach wygrywa.
notice anything curious?
Przez chwilę patrzyłem na ostatnie zdanie ... i właśnie zauważyłem, że zwiększenie pojemności pamięci podręcznej niekoniecznie zmniejsza liczbę braków ?!Odpowiedzi:
JavaScript (ES6), 55 bajtów
Metoda nr 1: pamięć podręczna zastępuje dane wejściowe
Pobiera dane wejściowe w składni curry
(cache_size)(list)
.Wypróbuj online!
W jaki sposób?
Nadpisujemy tablicę wejściową a [] pamięcią podręczną, używając osobnego wskaźnika k zainicjowanego na 0 .
Używamy
a.indexOf(x, k > n && k - n) < k
do testowania, czy x jest w pamięci podręcznej.Pamięć podręczna nie może rosnąć szybciej niż przeglądana jest oryginalna tablica, więc gwarantuje się, że każda wartość zostanie znaleziona w oknie pamięci podręcznej lub poza nim (tzn.
indexOf()
Nigdy nie zwróci -1 ).Wartość znajduje się w pamięci podręcznej, jeśli zostanie znaleziona przy indeksie między max (0, k - n) i k - 1 (obie granice włącznie), w którym to przypadku wykonujemy [prawda] = x . Wpływa to tylko na właściwość obiektu leżącego za [], ale nie zmienia tablicy a [] . W przeciwnym razie robimy [k ++] = x .
Przykład
Poniżej znajdują się różne kroki dla danych wejściowych
[1, 1, 2, 3, 3, 2, 1, 4]
o wielkości pamięci podręcznej 2 :JavaScript (ES6), 57 bajtów
Metoda nr 2: pamięć podręczna jest dodawana na końcu danych wejściowych
Pobiera dane wejściowe w składni curry
(cache_size)(list)
.Wypróbuj online!
W jaki sposób?
Ponieważ tablica wejściowa a [] zawiera nieujemne liczby całkowite, możemy bezpiecznie dołączyć pamięć podręczną na końcu [] , stosując uzupełnienie ~ x każdej wartości x .
Używamy
n * ~a.indexOf(~x, -n)
do sprawdzenia, czy ~ x znajduje się wśród ostatnich n wartości. Ilekroć ten test się nie powiedzie, dołączamy ~ x do [] i zwiększamy liczbę braków k .Przykład
Poniżej znajdują się różne kroki dla tego samego przykładu jak powyżej, przy użyciu tej metody. Ponieważ wartości pamięci podręcznej są po prostu dołączane na końcu tablicy, nie ma wyraźnego wskaźnika pamięci podręcznej.
źródło
Haskell , 50 bajtów
Wypróbuj online!
Oparty na metodzie Lynna przechowywania całej historii pamięci podręcznej i jej długości. Jednoargumentowy wynik byłby nieco krótszy:
Haskell , 47 bajtów
Wypróbuj online!
źródło
Python 2 , 58 bajtów
Wypróbuj online!
Dzięki ovs za 3 bajty i xnor za 3 kolejne.
źródło
c+=
, ponieważ z jakiegoś powodu konwertuje się on na listę dla ciebie.c+={i}-set(c[-n:])
działa pozytywnien
. Ale wskazali, żec[-n:]
jest to niewłaściwen == 0
, więc nie mogę użyć+=
, a więc ta sztuczka - szkoda.)reduce
nadal zapisuje bajtów:lambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 bajtówWypróbuj online!
Dzięki JayCe za zasugerowanie ulepszeń, a DigEmAll dla kolejnej pary!
źródło
+
przoduF
jest zaf(0,{})
0?F
wstępnie zainicjalizowaną wartością zwrotu.q
ale wciąż fajny pomysł! UżywanieNA
jest mniej dobre niż używanie,{}
ponieważ tak naprawdę zależy mi na długości (i tak naprawdę nie wyskakuję z pamięci podręcznej elementów).Haskell,
6158 bajtówWypróbuj online!
Edycja: -3 bajty dzięki @Lynn.
źródło
05AB1E ,
1716 bajtówWypróbuj online!
Wyjaśnienie
źródło
Kotlin ,
8269 bajtówStaje jako wejście
IntArray
, nie typoweList<Int>
(co nie powinno być problemem.) Ta wykorzystuje podejście „zbudować historię cache i liczyć jej długość”.Wypróbuj online!
Wyjaśnienie
Tworzenie pustej listy
Kotlin nie ma literałów kolekcji, ale ma pewne funkcje do tworzenia nowych kolekcji.
Właściwym sposobem utworzenia pustego
List<Int>
jest po prostu:ale jest krótszy, jeśli nadużywamy rozmiaru i argumentów inicjalizatora, aby to zrobić:
Ponieważ generator lambda zwraca 0, Kotlin określa typ tej listy jako
List<Int>
, a rozmiar 0 oznacza, że ta lista jest pusta.źródło
Perl 6 , 48 bajtów
Sprawdź to
źródło
Java 8, 96 bajtów
Curried lambda biorąc rozmiar pamięci podręcznej (
int
) i listę dostępu (zmiennąjava.util.List<Integer>
) i zwracającint
.Wypróbuj online
Bez golfa
Wykorzystuje pierwsze (maksymalnie)
s
miejsca na liście danych wejściowych dla pamięci podręcznej.Podziękowanie
źródło
Pyth ,
16 15 18 1413 bajtówOszczędność 1 bajtu dzięki isaacg .
Zestaw testowy!
To wyzwanie bardzo dobrze pasuje do Pytha
u
struktury .Jak to działa
źródło
aW-H>QGGH
uderzeń?}H<GQG+HG
o 1+G*]H!}H>QG
, ale kiedy grałem w golfa, naprawdę nie myślałem oW
... Fajnie!u
?u
jest operatorem redukcji z wartością początkową . Podobnie jak Jelly'sƒ
Wolfram Language (Mathematica) ,
6059 bajtówWypróbuj online!
Korzystanie z dopasowania wzorca, 60 bajtów
Naprawdę podoba mi się ten, ale jest o 1 bajt dłużej ...
Wypróbuj online!
źródło
Japt, 16 bajtów
Spróbuj
Wyjaśnienie
źródło
K4 ,
4240 bajtówRozwiązanie:
Przykłady:
Wyjaśnienie:
Dla funkcji wewnętrznej y jest pamięcią podręczną, z jest żądaniem, a x jest wielkością pamięci podręcznej.
Uwagi:
Jest prawdopodobnie lepszy sposób, aby to wszystko zrobić, ale to pierwszy sposób, jaki przyszedł mi do głowy.
Funkcję można uruchomić w następujący sposób dla 36 bajtów :
Alternatywnie - użycie zmiennej globalnej do przechowywania stanu (niezbyt podobny do K), 42 bajty :
źródło
Brain-Flak , 172 bajty
Wypróbuj online!
źródło
Galaretka , 18 bajtów
Wypróbuj online!
Traktuje listę jako pierwszy argument, a pojemność pamięci podręcznej jako drugi argument.
źródło
Rubinowy ,
4340 bajtówWypróbuj online!
Dzięki histocrat za golenie 3 bajtów.
źródło
->s,a,*r
co zapewnia także dodatkową funkcję, że osoba dzwoniąca możex
w tablicę:.count{|*x|
C (gcc) ,
112 110108 bajtówWypróbuj online!
Nieco mniej golfa
źródło
C (gcc) , 156 bajtów
Wypróbuj online!
Opis:
źródło
wmemset(c,-1,x)
zamiastn=m=0;for(i=0;i<x;++i)c[i]=-1
,n=m=i=s=0
zamiasti=s=0
,for(j=x;j--;)
zamiastfor(j=0;j<x;++j)
, as||(c[n++]=_[i],m++,n%=x);
zamiastif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 bajty
Wypróbuj online!
źródło
Galaretka , 17 bajtów
Wypróbuj online!
Pełny program
Argument 1: stos (Python 3
list
zint
egers)Argument 2:
n
(Python 3int
eger)źródło
Rdza , 129 bajtów
Wypróbuj online!
Bez golfa
źródło
Stax , 15 bajtów
Uruchom i debuguj
źródło