Điện thoại không dây cũ


9

Tôi cần gọi cho bạn bè nhưng các nút trên điện thoại không dây của tôi không hoạt động bình thường. Các nút duy nhất tôi có thể nhấn là [Lên], [Xuống] và [Gọi]. [Lên] và [Xuống] có thể được sử dụng để điều hướng trong các cuộc gọi gần đây của tôi và [Gọi] có thể được sử dụng để gọi tên đã chọn. Điện thoại của tôi có một danh sách chứa Ncác cuộc gọi gần đây và tôi biết rằng tất cả bạn bè tôi cần gọi đều nằm trong danh sách này.


Bài tập:

Bạn sẽ nhận được một số Nvà một danh sách các tên L:

  • N là số cuộc gọi gần đây mà điện thoại của tôi có thể nhớ;
  • L có tên theo thứ tự tôi cần gọi.

Bạn phải xuất số lần nhấn nút tôi cần để sắp xếp tối ưu danh sách cuộc gọi gần đây.


Thí dụ:

-> Đầu vào:

Gọi Anna, Bob và sau đó Anna một lần nữa. Với một danh sách cuộc gọi gần đây của kích thước 5.

5
Anna
Bob
Anna

-> Đầu ra:

Sắp xếp tối ưu có thể: Anna, Foo, Bar, Foobar, Bob

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

Nhiều trường hợp thử nghiệm:

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

Quy tắc:

  • Con trỏ của bạn sẽ luôn bắt đầu ở vị trí đầu tiên của danh sách;
  • Bạn có thể lấy đầu vào NLtừ bất kỳ nguồn nào: bàn phím, tham số, tệp, v.v;
  • Các tên trong danh sách có thể ở bất kỳ định dạng hợp lý nào như: chuỗi, số nguyên, ký tự;
  • Khi bạn đến cuối danh sách cuộc gọi gần đây và nhấn [Xuống] lần nữa, con trỏ của bạn sẽ bao quanh. Điều tương tự cũng xảy ra khi bạn bắt đầu danh sách các cuộc gọi gần đây và nhấn [Lên];
  • Khi bạn gọi cho ai đó, tên của người đó sẽ được chuyển đến vị trí đầu tiên của danh sách cuộc gọi gần đây và phần còn lại sẽ bị đẩy xuống;
  • Khi bạn gọi cho ai đó, con trỏ của bạn sẽ được chuyển đến vị trí đầu tiên;
  • Tên bạn bè không thể xuất hiện nhiều hơn một lần trong danh sách cuộc gọi gần đây;
  • Bạn có thể điền vào danh sách các cuộc gọi gần đây của bạn với các mục giả (xem ví dụ);
  • Số lượng bạn bè để gọi sẽ không nhiều hơn N.

Câu trả lời:


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}

Hãy thử trực tuyến!

Trong một sắp xếp tối ưu, tên đầu tiên sẽ mất một lần nhấn ( Call). Các tên chưa được gọi có hai lần nhấn ( Up Call) và các tên có số khác nhau tùy thuộc vào số lượng tên duy nhất khác đã được gọi kể từ đó và liệu chúng có đặt gần đầu hoặc cuối danh sách hay không.

Tôi nghĩ rằng đây là một chiến lược tương tự hoặc giống hệt với Waffein.


3

Python 3 , 195 185 164 byte

-4 byte nhờ @notjagan
-27 byte nhờ @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*

Hãy thử trực tuyến!

L được lấy làm danh sách các số nguyên từ [0, N)



@notjagan Điều này không hoạt động như x=[x[a]]+x[:a]+x[a+1:]gán xcho một đối tượng danh sách mới. ivẫn sẽ là indexphương thức trong đối tượng danh sách cũ
ovs 19/07/17

@ovs -10 byte sử dụng đề xuất của Felipe và những cái tôi có khác x.index.
notjagan


@FelipeNardiBatista thanks a lot
OVS

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)

Hãy thử trực tuyến!

Tạo ra sự sắp xếp tối ưu của các tên đã cho, sau đó đếm số lần nhấn phím.

Bỏ qua thế hệ và chỉ tính có bao nhiêu lần nhấn phím, mỗi tên sẽ được sắp xếp tối ưu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.