Ho un contatore. È un piccolo dispositivo che assomiglia a questo:
Il display passa da 0000
a 9999
. Ha un piccolo pulsante in alto che aumenta il conteggio di 1 e una piccola manopola a destra il cui scopo è di ripristinare il contatore a 0.
Ora, la cosa sulla piccola manopola è che se la giri all'indietro, puoi farla aumentare qualsiasi cifra desiderata una volta che la giri di nuovo in avanti. Quindi, se premo il pulsante del contatore 10 volte in modo che il contatore mostri 0010
, posso quindi ruotare la manopola all'indietro fino a quando sento un piccolo clic, quindi ruotarlo di nuovo in avanti e farlo andare dritto 0090
.
Tuttavia, la manopola aumenterà sempre tutte le occorrenze della stessa cifra di 1 ogni volta che spinge i numeri in avanti. Quindi, se il contatore mostra 6060
, puoi solo farlo aumentare a 7070
, non a 6070
o 7060
. Inoltre, la manopola ruoterà 9
su 0
senza trasportare, quindi 0990
avanzerà al 0000
posto di 1000
o 1100
.
Voglio sapere il modo più efficiente per impostare il contatore su un certo numero. Il tuo compito è scrivere un programma o una funzione che determinerà la sequenza più breve di pressioni di pulsanti e avanzamenti della manopola necessari per farlo.
Il programma prenderà come input un numero di 4 cifre da 0000
a 9999
e restituirà una serie di passaggi nel seguente formato:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Dove C
sta per "premere il pulsante contatore" e qualsiasi cifra D
da 0 a 9 sta per "utilizzare la manopola per far avanzare tutte le occorrenze di D
1".
Il programma deve produrre una sequenza valida di passaggi per tutte le possibili combinazioni di quattro cifre e verrà assegnato un punteggio in base al numero totale di passaggi richiesti per tutti i 10.000 casi. In caso di pareggio (molto probabilmente quando viene trovato l'algoritmo ottimale), vincerà il codice più breve.
0010
in0020
quel caso? Oppure puoi solo ruotare la manopola all'indietro? Inoltre, ogni "D" conta come "D" numero di avanzamenti della manopola (ad esempio,1234567
significa ruotare la manopola 1 volta, quindi 2 volte, quindi 3 volte, e così via)? Oppure significa solo ogni giro di manopola separato (per esempio, significa1234567
solo ruotare la manopola 7 volte)?