Старий бездротовий телефон


9

Мені потрібно зателефонувати друзям, але кнопки бездротового телефону не працюють належним чином. Єдині кнопки, які я можу натиснути, - це [Вгору], [Вниз] та [Дзвінок]. [Вгору] та [Вниз] можна використовувати для навігації в останніх дзвінках, а [Виклик] можна використовувати для виклику обраного імені. У моєму телефоні є список, в якому приймаються Nостанні дзвінки, і я знаю, що всі друзі, яким мені потрібно дзвонити, є у цьому списку.


Завдання:

Ви отримаєте номер Nта список імен L:

  • N - кількість останніх дзвінків, які мій телефон може запам'ятати;
  • L має імена в тому порядку, який мені потрібно зателефонувати.

Ви повинні вивести кількість натискань кнопок, які мені потрібно зробити, щоб оптимально розташувати список останніх дзвінків.


Приклад:

-> Введення:

Подзвонив Ганні, Бобу, а потім знову Анні. З останніми списками дзвінків розміром 5.

5
Anna
Bob
Anna

-> Вихід:

Можливе оптимальне розташування: Anna, Foo, Bar, Foobar, Bob

5    # Key presses: [Call] Anna, [Up] + [Call] Bob, [Down] + [Call] Anna

Більше тестових випадків:

Input: 5, Anna, Bob, Carl
Output: 5

Input: 5, Anna, Bob, Carl, Anna
Output: 8

Input: 5, A, B, C, D, E, A
Output: 11

Input: 6, A, B, C, D, E, A
Output: 12

Input: 4, A, B, C, B, A
Output: 10

Правила:

  • Ваш курсор завжди починатиметься в першій позиції списку;
  • Ви можете взяти дані Nта Lз будь-якого джерела: клавіатури, параметрів, файлу тощо;
  • Імена у списку можуть бути у будь-якому розумному форматі, такі як: рядки, цілі числа, символи;
  • Коли ви доходите до кінця списку останніх дзвінків і знову натискаєте [Вниз], курсор загортається. Те саме відбувається, коли ви перебуваєте на початку списку останніх дзвінків і натискаєте [Вгору];
  • Коли ви зателефонуєте комусь, ім’я цієї особи буде перенесено на перше місце у списку останніх дзвінків, а решта буде натиснуто вниз;
  • Коли ви телефонуєте комусь, ваш курсор буде переміщений на перше місце;
  • Ім'я друга не може з’являтися не один раз у списку останніх дзвінків;
  • Ви можете заповнити список останніх дзвінків фіктивними записами (див. Приклад);
  • Кількість друзів для дзвінків не буде більше N.

Відповіді:


1

Рубі , 97 95 94 байт

->n,a{r=a.size;1.upto(r-1){|i|r+=[p=a[(a[0,i].rindex(a[i])||i-2)+1...i].uniq.size,n-p].min};r}

Спробуйте в Інтернеті!

В оптимальному розташуванні ім'я буде мати одну натискання ( Call). Імена, які ще не були названі, виконують два натискання ( Up Call), а імена, які приймають різну кількість, залежно від того, скільки інших унікальних імен було названо з тих пір і чи це розміщує їх ближче до початку чи внизу списку.

Я думаю, що це стратегія, аналогічна або ідентична стратегії WaffleCohn.


3

Python 3 , 195 185 164 байт

-4 байти завдяки @notjagan
-27 байт завдяки @FelipeNardiBatista

lambda n,l:min(g([*x],l,n)for x in permutations(range(n)))
def g(x,l,n,r=0):
 for p in l:a=x.index(p);x=[x.pop(a)]+x;r-=~min(a,n-a)
 return r
from itertools import*

Спробуйте в Інтернеті!

L приймається як список цілих чисел від [0, N)



@notjagan Це не працює, оскільки x=[x[a]]+x[:a]+x[a+1:]призначається xновому об'єкту списку. iвсе ще буде indexметодом на старому об'єкті списку
вів

@ovs -10 байт, використовуючи пропозицію Феліпе та ті, які у мене були інші x.index.
notjagan


@FelipeNardiBatista велике спасибі
ов

1

JavaScript (SpiderMonkey) , 213 143 байт

(N,L)=>L.reduce((t,v,i)=>{x=0,a=[v]
for(j=i;j-->=0&!~a.indexOf(L[j]);x++)a+=L[j]+","
return i?t+((x=L.indexOf(v)-i?x:1)<N-x?x:N-x):t},L.length)

Спробуйте в Інтернеті!

Створює оптимальне розташування заданих імен, а потім підраховує кількість натискань клавіш.

Пропустив покоління і просто порахував, скільки натискань клавіш зайняє кожне ім'я в оптимальному розташуванні

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.