Doppia codifica di lunghezza


9

Tutti sanno cos'è la codifica run-length. È già stato oggetto di molte sfide di code-golf. Vedremo una certa variazione.

Esempio

Normal: 11222222222222222222233333111111111112333322
Run-length: 112(19)3(5)1(11)2333322

Il numero tra parentesi indica il numero di volte in cui si è verificato il simbolo precedente. Nell'esempio, sono state codificate solo sequenze di 5 o più caratteri. Questo perché la codifica di corse di 4 o meno non migliora il conteggio dei caratteri.

Sfida

Scrivi una funzione / programma che implementa questa variazione della codifica della lunghezza della corsa, ma può anche codificare le corse di due simboli. Anche le serie di due simboli devono essere racchiuse tra parentesi. Un gruppo verrà inoltre racchiuso tra parentesi. Il programma deve accettare una stringa come input e generare la stringa modificata con modifiche che accorciano la stringa.

Esempio

Normal: 111244411144411144411167676767222222277777222222277777123123123123
Double run-length: 1112((444111)(3))67676767((2(7)7(5))(2))123123123123

Appunti

  • 111non è stato codificato perché codificarlo ( 1(3)) non è più breve.
  • La stringa si 444111presenta 3 volte, quindi è codificata.
  • 676767non è stato codificato perché ((67)(4))è più lungo di prima.
  • 222222277777222222277777non è stato codificato come ((222222277777)(2)). Perché? Perché 222222277777se stesso può essere ridotto a 2(7)7(5).
  • 123123123123 non è codificato perché il tuo programma dovrebbe gestire corse di due simboli, non tre.

Questo è quindi vince il codice più breve. Il pareggio è una presentazione anticipata.


Se ho perso qualcosa o se non sei sicuro di qualcosa, ti preghiamo di avvisarmi nei commenti.


Ma ci sono 4 67s.
Leaky Nun,

Dovremo gestire 441444144414-> ((4414)(3))?
Leaky Nun,

L'ho risolto.
ericw31415,

@KennyLau No, non lo farai. 4414è tecnicamente una serie di 4. La mia formulazione è semplicemente pessima.
ericw31415,

Può 111111111essere codificato come (1)(9)?
CalculatorFeline

Risposte:


2

Retina, 162 byte

+{`((\d)\2*(?!\2)(\d)\3*|\d)(?<1>\1)+
<<$1><$#1>>
<<([^<>]{1,7})><2>>
$1$1
<<([^<>]{1,3})><3>>
$1$1$1
<<([^<>]{1,2})><4>>
$1$1$1$1
}`<<(.)><(\d+)>>
$1($2)
T`<>`()

Provalo online!


Se si immette 10101010100100100100100, l'output è ((10)(5))0((100)(4)), ma ((10)(4))((100)(5))sarebbe più breve di un carattere.
Marv,

Devi davvero usare tali test marginali ...
Leaky Nun

Sì, è tutto divertente! : ^)
Marv

È divertente come questa sia l'unica risposta attualmente qui.
ericw31415,
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.