Vecchio telefono cordless


9

Devo chiamare i miei amici ma i pulsanti del mio telefono cordless non funzionano correttamente. Gli unici pulsanti che posso premere sono [Su], [Giù] e [Chiama]. [Su] e [Giù] possono essere usati per navigare nelle mie ultime chiamate e [Chiama] può essere usato per chiamare il nome selezionato. Il mio telefono ha un elenco che contiene Nle chiamate recenti e so che tutti gli amici che devo chiamare sono in questo elenco.


Compito:

Riceverai un numero Ne un elenco di nomi L:

  • N è il numero di chiamate recenti che il mio telefono può ricordare;
  • L ha i nomi nell'ordine che devo chiamare.

È necessario emettere il numero di pressioni dei pulsanti che devo effettuare in una disposizione ottimale dell'elenco delle chiamate recenti.


Esempio:

-> Ingresso:

Chiamando di nuovo Anna, Bob e poi Anna. Con un elenco di chiamate recenti di dimensioni 5.

5
Anna
Bob
Anna

-> Uscita:

Possibile disposizione ottimale: Anna, Foo, Bar, Foobar, Bob

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

Altri casi di test:

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

Regole:

  • Il cursore inizierà sempre nella prima posizione dell'elenco;
  • Puoi prendere l'input Ne Lda qualsiasi fonte: tastiera, parametri, file, ecc;
  • I nomi nell'elenco possono essere in qualsiasi formato ragionevole come: stringhe, numeri interi, caratteri;
  • Quando si raggiunge la fine dell'elenco delle chiamate recenti e si preme di nuovo [Giù], il cursore si sposta intorno. Lo stesso accade quando si è all'inizio dell'elenco delle chiamate recenti e si preme [Su];
  • Quando chiami qualcuno, il nome di quella persona verrà spostato nella prima posizione dell'elenco delle chiamate recenti e il resto verrà spostato verso il basso;
  • Quando chiami qualcuno, il cursore verrà spostato nella prima posizione;
  • Il nome di un amico non può apparire più di una volta nell'elenco delle chiamate recenti;
  • È possibile compilare l'elenco delle chiamate recenti con voci fittizie (vedere esempio);
  • Il numero di amici da chiamare non sarà maggiore di N.

Risposte:


1

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

Provalo online!

In una disposizione ottimale, il nome richiederà una pressione ( Call). I nomi che non sono stati ancora chiamati prendono due presse ( Up Call), e i nomi che hanno preso numeri variabili a seconda di quanti altri nomi univoci sono stati chiamati da allora e se ciò li avvicina all'inizio o alla fine dell'elenco.

Penso che questa sia una strategia simile o identica a quella di WaffleCohn.


3

Python 3 , 195 185 164 164 byte

-4 byte grazie a @notjagan
-27 byte grazie a @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*

Provalo online!

L viene preso come un elenco di numeri interi da [0, N)



@notjagan Non funziona come si x=[x[a]]+x[:a]+x[a+1:]assegna xa un nuovo oggetto elenco. isarebbe ancora il indexmetodo sul vecchio oggetto elenco
ovs

@ovs -10 byte usando il suggerimento di Felipe e quelli che avevo altro x.index.
Notjagan,


@FelipeNardiBatista grazie mille
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)

Provalo online!

Genera una disposizione ottimale dei nomi indicati, quindi conta il numero di pressioni dei tasti.

Ha saltato la generazione e ha semplicemente contato quante pressioni di tasti avrebbe richiesto ciascun nome nella disposizione ottimale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.