Telepon Nirkabel Tanpa Kabel

9

Saya perlu menelepon teman-teman saya tetapi tombol-tombol telepon nirkabel saya tidak berfungsi dengan baik. Satu-satunya tombol yang dapat saya tekan adalah [Atas], [Bawah] dan [Panggilan]. [Atas] dan [Bawah] dapat digunakan untuk menavigasi dalam panggilan terakhir saya dan [Panggilan] dapat digunakan untuk memanggil nama yang dipilih. Ponsel saya memiliki daftar yang menahan Npanggilan terakhir, dan saya tahu bahwa semua teman yang perlu saya hubungi ada dalam daftar ini.


Tugas:

Anda akan menerima nomor Ndan daftar nama L:

  • N apakah jumlah panggilan terakhir yang dapat diingat telepon saya;
  • L memiliki nama dalam urutan yang harus saya panggil.

Anda harus menampilkan jumlah penekanan tombol yang harus saya buat dalam pengaturan optimal dari daftar panggilan terakhir.


Contoh:

-> Input:

Memanggil Anna, Bob dan kemudian Anna lagi. Dengan daftar panggilan ukuran 5 terbaru.

5
Anna
Bob
Anna

-> Output:

Kemungkinan pengaturan optimal: Anna, Foo, Bar, Foobar, Bob

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

Lebih banyak kasus uji:

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

Aturan:

  • Kursor Anda akan selalu mulai di posisi pertama daftar;
  • Anda dapat mengambil input Ndan Ldari sumber apa pun: keyboard, parameter, file, dll;
  • Nama-nama dalam daftar dapat dalam format apa pun yang masuk akal seperti: string, integer, chars;
  • Saat Anda mencapai akhir daftar panggilan terakhir dan menekan [Bawah] lagi, kursor Anda akan berputar. Hal yang sama terjadi ketika Anda berada di awal daftar panggilan terakhir dan menekan [Atas];
  • Ketika Anda memanggil seseorang, nama orang itu akan dipindahkan ke posisi pertama dari daftar panggilan terakhir dan sisanya akan didorong ke bawah;
  • Saat Anda memanggil seseorang, kursor Anda akan dipindahkan ke posisi pertama;
  • Nama teman tidak dapat muncul lebih dari satu kali dalam daftar panggilan terakhir;
  • Anda dapat mengisi daftar panggilan terakhir dengan entri tiruan (lihat contoh);
  • Jumlah teman yang akan dihubungi tidak akan lebih dari N.
Felipe Nardi Batista
sumber

Jawaban:

1

Ruby , 97 95 94 byte

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

Cobalah online!

Dalam pengaturan yang optimal, nama depan akan mengambil satu tekan ( Call). Nama-nama yang belum dipanggil belum mengambil dua penekanan ( Up Call), dan nama-nama yang telah mengambil nomor yang bervariasi tergantung pada berapa banyak nama unik lainnya yang telah dipanggil sejak saat itu dan apakah itu menempatkan mereka lebih dekat ke atas atau ke bawah daftar.

Saya pikir ini adalah strategi yang mirip atau identik dengan WaffleCohn.

Nnnes
sumber
3

Python 3 , 195 185 164 byte

-4 byte terima kasih kepada @notjagan
-27 byte terima kasih kepada @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*

Cobalah online!

L diambil sebagai daftar bilangan bulat dari [0, N)

ovs
sumber
-4 byte .
notjagan
@ notjagan Ini tidak berfungsi sebagai x=[x[a]]+x[:a]+x[a+1:]ditugaskan xke objek daftar baru. imasih akan menjadi indexmetode pada objek daftar lama
ovs
@ovs -10 byte menggunakan saran Felipe dan yang saya punya selain x.index.
notjagan
164 byte
Felipe Nardi Batista
@FelipeNardiBatista terima kasih banyak
Ov
1

JavaScript (SpiderMonkey) , 213 143 byte

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

Cobalah online!

Menghasilkan pengaturan optimal dari nama-nama yang diberikan kemudian menghitung jumlah penekanan tombol.

Melewati generasi dan hanya menghitung berapa banyak penekanan tombol yang dibutuhkan setiap nama dalam pengaturan optimal

WaffleCohn
sumber