Zigzaguea esta cadena contrayendo duplicados

16

Dada una cadena, su tarea es contraerla en una estructura en zigzag como se describe a continuación.

Doblar en un zigzag

Tomaremos la cadena "Mississippi"como ejemplo:

  1. Primero, muestre el prefijo más largo que consta solo de caracteres únicos:

    Mis
    
  2. Cuando llegue al primer carácter duplicado C , ignórelo y genere el prefijo más largo que consta de caracteres únicos de la cadena restante ( issippi) verticalmente, debajo de la primera aparición de C :

    Mis
      i
      s
    
  3. Repita el proceso, alternando entre continuación horizontal y vertical. Pero ahora tenga cuidado (en el paso 1) para continuar generando horizontalmente desde la última aparición del carácter duplicado, que no es necesariamente el último, como en este caso:

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

Reglas

  • La cadena solo contendrá caracteres ASCII imprimibles, pero no contendrá ningún tipo de espacio en blanco.
  • Puede competir en cualquier lenguaje de programación y puede recibir información y proporcionar resultados a través de cualquier método estándar y en cualquier formato razonable 1 , mientras toma nota de que estas lagunas están prohibidas por defecto. Este es el , por lo que gana el envío más corto (en bytes) para cada idioma .
  • 1 Entrada: Cadena / Lista de caracteres / cualquier otra cosa que su idioma use para representar cadenas. Salida: cadena multilínea, lista de cadenas que representan líneas o lista de listas de caracteres / cadenas de longitud 1, pero, si es posible, incluya una versión impresa bonita de su código en su respuesta.
  • En cuanto a espacios adicionales, la salida puede contener:
    • Nuevas líneas iniciales / finales
    • Espacios finales en cada línea / al final
    • Un número constante de espacios iniciales en cada línea
  • Usted debe comenzar a la salida horizontal, es posible que no empezar verticalmente.

Casos de prueba

Entradas:

"Perfecto"
"Misisipí"
"Rarezas"
"Trivialidades"
"Cthulhu"
"PPCG"
"pOpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
abca
"AAAAAAAA"

Salidas correspondientes:

Perf
 C
 t
Mal
  yo
  sorbo
    yo
Sobredosis
 ies
 t
Triv
  un
  l
  ies
  t
Cthul
  tu
PAG
C
sol
correos 
OpO
popular
 pag
A B C
  C
  mi
A B C
  CCE
  E CE
a B C D
  mi
  si
  fg
a B C
UN
Automóvil club británico
 UN
Sr. Xcoder
fuente
@JungHwanMin Debido a que no debes volver al primero b, ya que solo debes considerar los duplicados en la cadena restante , es decir, después de "ramificar". Una vez que alcanza el segundo c, genera el prefijo más largo de caracteres únicos de la cadena restante , que es ebffg(por lo tanto, genera ebfverticalmente y continúa horizontalmente después de eso), por lo que no tiene que preocuparse por los caracteres de la parte de la cadena que ya se emitió antes de cambiar de orientación. Si todavía no te queda claro, haré otro ejemplo paso a paso con este caso de prueba.
Sr. Xcoder
¿Cómo debemos manejar minúsculas / mayúsculas? Por ejemploABCcde
Rod
Debes tratarlos como personajes diferentes. Por ej "A" ≠ "a". La salida para ABCcdeseríaABCcde
Sr. Xcoder
Sugerencia de caso de prueba:AAAAAAAA
JungHwan Min
55
@JungHwanMin AAAAAAAAñadió ese también.
Sr. Xcoder

Respuestas:

2

Wolfram Language (Mathematica) , 143 bytes

{#}//.{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->" "&

Pruébalo en línea!

Contiene 0xF8FF, que corresponde al \[Transpose]operador.

Uf, fue difícil convertir el resultado en una cuerda. Obtener cada rama no es tan difícil:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan Min
fuente
2

Python 2 , 131 bytes

X=Y=y=0
s=input()
o=()
l={}
for i in s:o+=[' ']*len(s),;exec('l[i]=X,Y','y^=1;X,Y=l[i];l={}')[i in l];o[Y][X]=i;X+=y<1;Y+=y
print o

Pruébalo en línea!

-1 gracias a Lynn .

Imprime como una tupla de listas de cadenas de longitud 1. Salida bastante impresa .

Erik el Outgolfer
fuente
1

Python 2 , 184 176 175 168 bytes

-5 bytes gracias al Sr. 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,]

Pruébalo en línea!

varilla
fuente
No creo que el último guardado sea válido; ¿Qué pasa si la entrada contiene \? Además, puede generar una lista de listas de cadenas de longitud 1, como lo hago en mi solución, según el OP.
Erik the Outgolfer
@EriktheOutgolfer mismo recuento de bytes: c
Rod