In Vim, puoi ripetere un comando precedendolo con un numero, come 3dd
è equivalente a dd dd dd
. Bene, questo schema ripetuto non è limitato ai comandi di Vim. Anche la stringa può essere replicata in questo modo.
Specifica:
Data una stringa, composta solo da cifre, caratteri alfabetici (sia maiuscoli che minuscoli) e spazi, con una nuova riga finale facoltativa, come input, scrivere un programma che svolge il seguente lavoro:
Ogni "parola" è composta da cifre e alfabeti. Se una lettera è preceduta da un numero (potrebbe esserci più di una cifra in un numero o il numero è zero), ripeti quella lettera per i tempi indicati. Per esempio:
a2bc -> abbc 3xx1yz -> xxxxyz 10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero 2A2a2A2a -> AAaaAAaa
Le parole sono separate da spazi. C'è un massimo di uno spazio tra ogni due parole adiacenti.
Facile vero? Ecco le cose aggiuntive:
Se c'è un numero prima dello spazio, ripeti la parola successiva per i tempi indicati. Il numero verrà sempre associato alla fine della parola precedente o all'inizio della stringa. Esempio:
a2bc3 2d -> abbc dd dd dd 3 3a -> aaa aaa aaa 33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 abcd0 efgh3 2x -> xx xx xx a3 0xc b -> a c c c b
Se una parola vuota deve essere ripetuta, non generare più spazi di fila. Schiacciarli:
a3 0x2 b -> a b b # NOT 'a b b'
In altre parole, il tuo programma non dovrebbe mai generare due spazi insieme.
L'input non è mai vuoto, ma non è necessario che l'output sia non vuoto:
0 3x -> (empty)
Ingresso e uscita possono essere presi in qualsiasi modo preferito. È accettabile anche una funzione che accetta input da argomenti e fornisce output tramite valori di ritorno.
Se è un programma, non deve uscire con errori (ovvero il valore di ritorno è zero).
I numeri sono sempre decimali e non iniziano mai con uno zero, a meno che il numero stesso non sia zero, nel qual caso esiste solo uno zero. Cioè non è necessario considerare
077a
o000a
dati come input.Tutti i numeri sono inferiori a 2 ^ 31 (2.147.483.648). La lunghezza massima dell'output è inferiore a 2 ^ 32 (4.294.967.296) byte.
Il programma può facoltativamente generare uno spazio finale e / o una nuova riga finale. Lo spazio e la nuova riga non influiscono sulla validità dell'output. Anche se l'output corretto deve essere vuoto, si qualificherà un output di uno spazio seguito da una nuova riga.
In breve, un input valido corrisponde a questa espressione regolare:
([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)
E per un output valido:
([A-Za-z]+)( [A-Za-z]+)*( ?\n?)
Esempi di casi di test:
abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc
Questo è un codice-golf , quindi vince il programma più breve in byte in ogni lingua!
a3 0xc b
-> a c c c b
, poiché inizialmente avevo un codice che funzionava per tutti i casi di test sopra, ma non funzionava correttamente per quello.