Эта задача действительно проста (и предшествует более сложной!).
При наличии массива обращений к ресурсам (просто обозначаемых неотрицательными целыми числами) и параметра n
верните число пропущенных кешей, которое было бы при условии, что наш кеш имеет емкость n
и использует схему извлечения «первым пришел - первым обслужен» (FIFO), когда он полон ,
Пример:
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]
Таким образом, в этом примере было 9 промахов. Может быть, пример кода поможет объяснить это лучше. В 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
Еще несколько тестов (в которых есть подсказка к следующему вызову - замечаете что-нибудь любопытное?):
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
Самый короткий код в байтах побеждает.
notice anything curious?
какое-то время смотрел на последнее утверждение ... и только заметил, что увеличение емкости кеша не обязательно уменьшает количество пропусков ?!Ответы:
JavaScript (ES6), 55 байт
Способ № 1: кэш перезаписывает ввод
Принимает ввод в синтаксисе карри
(cache_size)(list)
.Попробуйте онлайн!
Как?
Мы перезаписываем входной массив a [] кешем, используя отдельный указатель k, инициализированный в 0 .
Мы используем,
a.indexOf(x, k > n && k - n) < k
чтобы проверить, есть ли х в кэше.Кэш не может расти быстрее, чем проходит исходный массив, поэтому каждое значение гарантированно будет найдено либо внутри, либо за пределами окна кэша (т.е.
indexOf()
никогда не вернет -1 ).Значение находится в кеше, если оно найдено в индексе между max (0, k - n) и k - 1 (включая обе границы), и в этом случае мы делаем [true] = x . Это влияет только на свойство базового объекта за [], но не изменяет массив a [] . В противном случае мы делаем [k ++] = x .
пример
Ниже приведены различные шаги для ввода
[1, 1, 2, 3, 3, 2, 1, 4]
с размером кэша 2 :JavaScript (ES6), 57 байт
Способ № 2: кеш добавляется в конце ввода
Принимает ввод в синтаксисе карри
(cache_size)(list)
.Попробуйте онлайн!
Как?
Поскольку входной массив a [] гарантированно содержит неотрицательные целые числа, мы можем безопасно добавить кэш в конец a [] , используя одно дополнение x каждого значения x .
Мы используем,
n * ~a.indexOf(~x, -n)
чтобы проверить, находится ли ~ x среди последних n значений. Всякий раз, когда этот тест заканчивается неудачей, мы добавляем ~ x к a [] и увеличиваем число промахов k .пример
Ниже приведены различные шаги для того же примера, что и выше, с использованием этого метода. Поскольку значения кеша просто добавляются в конец массива, явного указателя кеша нет.
источник
Haskell , 50 байтов
Попробуйте онлайн!
Основан на методе Линн для хранения всей истории кэша и определения его длины. Унарный вывод будет немного короче:
Haskell , 47 байтов
Попробуйте онлайн!
источник
Python 2 , 58 байт
Попробуйте онлайн!
Спасибо ovs за 3 байта и xnor за 3 больше.
источник
c+=
, так как по какой-то причине он преобразуется в список для вас.c+={i}-set(c[-n:])
работает, для позитиваn
. Но Ними указал, чтоc[-n:]
это неправильноn == 0
, поэтому я не могу использовать+=
, и, следовательно, этот трюк - слишком плохо.)reduce
все еще сохраняет байтыlambda n,a:len(reduce(lambda c,i:[i][i in c[:n]:]+c,a,[]))
.R ,
696462 байтПопробуйте онлайн!
Спасибо JayCe за предложение некоторых улучшений и DigEmAll за другую пару!
источник
+
передF
это дляf(0,{})
возврата 0?F
предварительно инициализированным значением возврата.q
но хорошая идея! ИспользованиеNA
менее полезно, чем использование,{}
так как я на самом деле беспокоюсь о длине здесь (и я на самом деле не извлекаю элементы из кэша)Haskell,
6158 байтПопробуйте онлайн!
Изменить: -3 байта благодаря @Lynn.
источник
05AB1E ,
1716 байтПопробуйте онлайн!
объяснение
источник
Котлин ,
8269 байтПринимает входной сигнал в виде
IntArray
, не типичныйList<Int>
(что не должно быть проблемой.) При этом используется подход «построить истории кэша и считать его длину».Попробуйте онлайн!
объяснение
Создание пустого списка
У Kotlin нет литералов коллекций, но есть некоторые функции для создания новых коллекций.
Правильный способ создать пустое
List<Int>
это просто:но это короче, если мы используем для этого аргументы size и initializer:
Поскольку лямбда-генератор возвращает 0, Kotlin определяет тип этого списка как
List<Int>
, а размер 0 означает, что этот список пуст.источник
Perl 6 , 48 байт
Попробуй это
источник
Java 8, 96 байт
Лямбда с карри, принимающая размер кэша (
int
) и список доступа (изменяемыйjava.util.List<Integer>
) и возвращающаяint
.Попробуйте онлайн
Ungolfed
При этом используются первые (до)
s
слоты в списке ввода для кэша.Подтверждения
источник
Pyth ,
16 15 18 1413 байтСохранено 1 байт благодаря isaacg .
Тестирование!
Этот вызов очень хорошо подходит для
u
структуры Pyth .Как это работает
источник
aW-H>QGGH
бьет?}H<GQG+HG
1+G*]H!}H>QG
, но когда я играл в гольф, я действительно не думал оW
... Хорошо !u
?u
- оператор сокращения с начальным значением. Так же, как у Jelly'sƒ
Wolfram Language (Mathematica) ,
6059 байтПопробуйте онлайн!
Использование сопоставления с шаблоном, 60 байтов
Мне действительно больше нравится этот, но он на 1 байт длиннее ...
Попробуйте онлайн!
источник
Japt, 16 байт
Попытайся
объяснение
источник
К4 ,
4240 байтРешение:
Примеры:
Объяснение:
Для внутренней функции y - это кэш, z - это запрос, а x - размер кеша.
Заметки:
Вероятно, есть более хороший способ сделать все это, но это первый способ, который приходит на ум.
Функция может быть запущена следующим образом для 36 байтов :
Альтернатива - использование глобальной переменной для хранения состояния (не очень K-подобного), 42 байта :
источник
Brain-Flak , 172 байта
Попробуйте онлайн!
источник
Желе , 18 байт
Попробуйте онлайн!
Принимает список в качестве первого аргумента и емкость кэша в качестве второго аргумента.
источник
Рубин ,
4340 байтПопробуйте онлайн!
Спасибо гистократу за бритье 3 байта.
источник
->s,a,*r
также предоставляет бонусную функцию, которая позволяет вызывающейx
в массив:.count{|*x|
C (gcc) ,
112 110108 байтовПопробуйте онлайн!
Немного меньше в гольф
источник
C (gcc) , 156 байт
Попробуйте онлайн!
Описание:
источник
wmemset(c,-1,x)
вместоn=m=0;for(i=0;i<x;++i)c[i]=-1
,n=m=i=s=0
вместоi=s=0
,for(j=x;j--;)
вместоfor(j=0;j<x;++j)
, иs||(c[n++]=_[i],m++,n%=x);
вместоif(!s){c[n++]=_[i];m++;n%=x;}
JavaScript (Node.js) , 44 байта
Попробуйте онлайн!
источник
Желе , 17 байт
Попробуйте онлайн!
Полная программа.
Аргумент 1: стек (Python 3
list
изint
egers)Аргумент 2:
n
(Python 3 изint
Eger)источник
Ржавчина , 129 байт
Попробуйте онлайн!
Ungolfed
источник
Stax , 15 байт
Запустите и отладьте его
источник