Zigzag questa stringa comprimendo i duplicati


16

Data una stringa, il tuo compito è comprimerlo in una struttura a zig-zag come descritto di seguito.

Piegare in uno zigzag

Prenderemo la stringa "Mississippi"come esempio:

  1. Innanzitutto, genera il prefisso più lungo composto solo da caratteri univoci:

    Mis
    
  2. Quando si raggiunge il primo carattere duplicato C , ignorarlo e generare il prefisso più lungo costituito da caratteri univoci della stringa rimanente ( issippi) in verticale, sotto la prima occorrenza di C :

    Mis
      i
      s
    
  3. Ripetere il processo, alternando la continuazione orizzontale e verticale. Ma ora fai attenzione (al passaggio 1) per continuare a emettere in orizzontale dall'ultima occorrenza del carattere duplicato, che non è necessariamente l'ultimo, come in questo caso:

    Mis
      i
      sip
    -----
    Mis
      i
      sip
        i
    

Regole

  • La stringa conterrà solo caratteri ASCII stampabili, ma non conterrà alcun tipo di spazio bianco.
  • Puoi competere in qualsiasi linguaggio di programmazione e prendere input e fornire output attraverso qualsiasi metodo standard e in qualsiasi formato ragionevole 1 , tenendo presente che queste scappatoie sono vietate per impostazione predefinita. Questo è , quindi vince l'invio più breve (in byte) per ogni lingua .
  • 1 Input: String / Elenco di caratteri / qualunque altra cosa la tua lingua usi per rappresentare le stringhe. Output: stringa multilinea, elenco di stringhe che rappresentano linee o elenco di elenchi di caratteri / stringhe di lunghezza 1, ma, se possibile, includi una versione stampata del codice nella tua risposta.
  • Per quanto riguarda gli spazi aggiuntivi, l'output può contenere:
    • Newline leader / finali
    • Spazi finali su ogni riga / alla fine
    • Un numero consistente di spazi iniziali su ogni riga
  • Devi iniziare a produrre in orizzontale, potresti non iniziare in verticale.

Casi test

ingressi:

"Perfetto"
"Mississippi"
"stranezze"
"Trivialities"
"Cthulhu"
"PPCG"
"POpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"Abcdcebffg"
"ABCA"
"AAAAAAAA"

Uscite corrispondenti:

Perf
 c
 t
Mis
  io
  sorso
    io
od
 ies
 t
Triv
  un'
  l
  ies
  t
Cthul
  u
P
C
sol
pO 
Opo
pop
 p
ABC
  C
  E
ABC
  CCE
  E CE
abcd
  e
  B
  fg
abc
UN
aa
 UN

@JungHwanMin Perché non dovresti tornare al primo b, dato che dovresti considerare solo i duplicati nella stringa rimanente , cioè dopo "branching". Una volta raggiunto il secondo c, si genera il prefisso più lungo di caratteri univoci della stringa rimanente , che è ebffg(quindi in uscita in ebfverticale e proseguendo in senso orizzontale dopo quello), quindi non è necessario preoccuparsi dei caratteri della parte della stringa che era già stato emesso prima di cambiare orientamento. Se ti sembra ancora poco chiaro, farò un altro esempio dettagliato con questo test.
Mr. Xcoder,

Come dovremmo gestire le lettere minuscole / maiuscole? Ad esempioABCcde
Rod,

Dovresti trattarli come personaggi diversi. Es "A" ≠ "a". L'uscita per ABCcdesarebbe soloABCcde
Mr. Xcoder,

Suggerimento del test:AAAAAAAA
JungHwan Min

5
@JungHwanMin AAAAAAA Aggiunto anche quello.
Mr. Xcoder,

Risposte:


2

Wolfram Language (Mathematica) , 143 byte

{#}//.{q___,a_,r___,a_,Longest@s___}:>{q}~f@{a,r}~{{s}}//.{q_~f@a_~s_}/;s~FreeQ~f:>(PadLeft@{q~Join~#,##2}&)@@PadRight@Join[{a},s]/. 0->" "&

Provalo online!

Contiene 0xF8FF, che corrisponde \[Transpose]all'operatore.

Uff, è stato difficile trasformare il risultato in una stringa. Ottenere ogni ramo non è così difficile:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&



1

Python 2 , 184 176 175 168 byte

-5 byte grazie a Mr. Xcoder

def f(x):i,k=[p for p in enumerate(map(x.find,x+"z"))if cmp(*p)][0];return[x[:i]+' '*len(x)]+[' '*k+''.join(d)+i*' 'for d in zip(*f(x[i+1:]))]if x[len(set(x)):]else[x,]

Provalo online!


Non credo che l'ultimo salvataggio sia valido; cosa succede se l'input contiene \? Inoltre, è possibile produrre come un elenco di elenchi di stringhe di lunghezza 1, come faccio nella mia soluzione, per l'OP.
Erik the Outgolfer,

@EriktheOutgolfer stesso conteggio byte: c
Rod

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.