오래 된 무선 전화기


9

친구에게 전화를 걸어야하지만 무선 전화기의 버튼이 제대로 작동하지 않습니다. 누를 수있는 유일한 버튼은 [위로], [아래로] 및 [통화]입니다. [위로] 및 [아래로]를 사용하여 최근 통화를 탐색하고 [통화]를 사용하여 선택한 이름으로 전화를 걸 수 있습니다. 내 전화에는 N최근 통화 가 포함 된 목록이 있으며 전화해야하는 모든 친구가이 목록에 있음을 알고 있습니다.


직무:

당신은 숫자 N와 이름의 목록을 받게 됩니다 L:

  • N 내 전화가 기억할 수있는 최근 통화 수입니다.
  • L 전화해야 할 순서대로 이름이 있습니다.

최근 통화 목록을 최적으로 배열하기 위해 필요한 버튼 누름 수를 출력해야합니다.


예:

-> 입력 :

Anna, Bob, Anna에게 다시 전화하십시오. 크기가 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

규칙 :

  • 커서는 항상 목록의 첫 번째 위치에서 시작합니다.
  • 당신은 입력을 취할 수 NL모든 소스 : 키보드, 매개 변수, 파일 등;
  • 목록의 이름은 다음과 같은 합리적인 형식 일 수 있습니다. 문자열, 정수, 문자;
  • 최근 통화 목록의 끝에 도달하고 [아래로]를 다시 누르면 커서가 줄 바꿈됩니다. 최근 통화 목록을 시작할 때 [위로]를 누를 때도 마찬가지입니다.
  • 누군가에게 전화를 걸면 그 사람의 이름이 최근 통화 목록의 첫 번째 위치로 이동하고 나머지는 푸시 다운됩니다.
  • 누군가에게 전화하면 커서가 첫 번째 위치로 이동합니다.
  • 최근 통화 목록에 친구 이름이 두 번 이상 나타날 수 없습니다.
  • 최근 통화 목록을 더미 항목으로 채울 수 있습니다 (예 참조).
  • 전화를 거는 친구의 수는 개를 초과하지 않습니다 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

파이썬 3 , 195 185 164 바이트

@notjagan 덕분에 -4 바이트 @FelipeNardiBatista 덕분에
-27 바이트

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. 이전 목록 객체 iindex메소드 일 것입니다
ovs

Felipe의 제안과 내가 이외의 것을 사용하여 @ovs -10 바이트x.index .
notjagan


@FelipeNardiBatista 감사합니다
ovs

1

자바 스크립트 (의 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)

온라인으로 사용해보십시오!

주어진 이름의 최적 배열을 생성 한 다음 키 누름 수를 계산합니다.

세대를 건너 뛰고 최적의 배열로 각 이름을 취하는 키 누르기 횟수를 계산했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.