Eski telsiz telefon


9

Arkadaşlarımı aramam gerekiyor, ancak telsiz telefonumun düğmeleri düzgün çalışmıyor. Basabildiğim tek düğme [Yukarı], [Aşağı] ve [Ara]. Son çağrılarımda gezinmek için [Yukarı] ve [Aşağı] kullanılabilir ve seçilen adı aramak için [Ara] kullanılabilir. Telefonumun Nson aramaları tutan bir listesi var ve aramam gereken tüm arkadaşların bu listede olduğunu biliyorum.


Görev:

Bir numara Nve bir ad listesi alırsınız L:

  • N telefonumun hatırlayabileceği son çağrı sayısı;
  • L aramam gereken sırayla isimleri var.

Son arama listesinin en uygun düzenlemesinde yapmam gereken düğme basma sayısını çıkarmalısınız.


Misal:

-> Giriş:

Anna, Bob ve Anna'yı tekrar çağırıyorum. Son aramalar 5 numara ile.

5
Anna
Bob
Anna

-> Çıktı:

Olası en uygun düzenleme: Anna, Foo, Bar, Foobar, Bob

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

Daha fazla test örneği:

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

Kurallar:

  • İmleciniz her zaman listenin ilk konumunda başlar;
  • Girişi Nve Lherhangi bir kaynaktan alabilirsiniz: klavye, parametreler, dosya, vb;
  • Listedeki adlar aşağıdaki gibi herhangi bir makul biçimde olabilir: dizeler, tamsayılar, karakterler;
  • Son aramalar listesinin sonuna geldiğinizde ve [Aşağı] tuşuna tekrar bastığınızda, imleciniz etrafını sarar. Aynı durum son aramalar listesinin başında olduğunuzda ve [Yukarı] tuşuna bastığınızda da olur;
  • Birini aradığınızda, o kişinin adı son aramalar listesinin ilk konumuna taşınır ve geri kalanı aşağı itilir;
  • Birini aradığınızda, imleciniz ilk konuma taşınır;
  • Bir arkadaş adı, son çağrılar listesinde birden çok kez görünemez;
  • Son arama listenizi sahte girişlerle doldurabilirsiniz (örneğe bakın);
  • Aranacak arkadaş sayısı daha fazla olmayacak N.

Yanıtlar:


1

Yakut , 97 95 94 bayt

->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}

Çevrimiçi deneyin!

Optimal bir düzenlemede, ilk ad bir kez basılacaktır ( Call). Henüz çağrılmamış isimler iki kez basar (Up Call isimler ) ve o zamandan bu yana kaç tane başka benzersiz ismin çağrıldığına ve bu listenin en üstüne veya en altına mı yerleştirildiğine bağlı olarak değişen sayılara sahip isimler alır.

Bu WaffleCohn ile benzer veya aynı bir strateji olduğunu düşünüyorum.


3

Python 3 , 195 185 164 bayt

@Notjagan sayesinde -4 bayt @FelipeNardiBatista
sayesinde -27 bayt

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*

Çevrimiçi deneyin!

L den gelen tam sayıların bir listesi olarak alınır [0, N)



Bu @notjagan gibi çalışmıyor x=[x[a]]+x[:a]+x[a+1:]atar xyeni bir liste nesnesine. ihala indexeski liste nesnesindeki yöntem olurdu
ovs

@ovs -10 bytes Felipe'nin önerisini ve bende olmayanları kullanarak x.index.
notjagan


@FelipeNardiBatista teşekkürler çok
ovs

1

JavaScript (SpiderMonkey'i) , 213 143 bayt

(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)

Çevrimiçi deneyin!

Verilen adların en uygun şekilde düzenlenmesini sağlar, ardından tuşa basma sayısını sayar.

Üretimi atladı ve en uygun düzenlemede her adı kaç tuşa basacağını saydı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.