Ziguezague essa sequência recolhendo duplicatas

16

Dada uma sequência, sua tarefa é recolhê-la em uma estrutura em zigue-zague, conforme descrito abaixo.

Dobrando em ziguezague

Tomaremos a string "Mississippi"como exemplo:

  1. Primeiro, imprima o prefixo mais longo, composto apenas por caracteres únicos:

    Mis
    
  2. Quando você alcança o primeiro caractere duplicado C , ignore-o e gere o prefixo mais longo que consiste em caracteres únicos da string restante ( issippi) verticalmente, abaixo da primeira ocorrência de C :

    Mis
      i
      s
    
  3. Repita o processo, alternando entre a continuação horizontal e vertical. Mas agora tenha cuidado (na etapa 1) para continuar produzindo horizontalmente a partir da ocorrência mais recente do caractere duplicado, que não é necessariamente o último, como neste caso:

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

Regras

  • A sequência conterá apenas caracteres ASCII imprimíveis, mas não conterá nenhum tipo de espaço em branco.
  • Você pode competir em qualquer linguagem de programação e pode receber e fornecer saída por qualquer método padrão e em qualquer formato razoável 1 , observando que essas brechas são proibidas por padrão. Isso é , então a submissão mais curta (em bytes) para todos os idiomas vence.
  • 1 Entrada: String / Lista de caracteres / qualquer outra coisa que seu idioma use para representar strings. Saída: sequência de linhas múltiplas, lista de sequências que representam linhas ou lista de listas de caracteres / sequências de comprimento 1, mas inclua uma versão bonita do seu código na sua resposta, se possível.
  • Em relação a espaços adicionais, a saída pode conter:
    • Novas linhas iniciais / finais
    • Espaços finais em cada linha / no final
    • Um número consistente de espaços à esquerda em cada linha
  • Você deve começar a produzir horizontalmente, talvez não seja iniciado verticalmente.

Casos de teste

Entradas:

"Perfeito"
"Mississippi"
"Extravagâncias"
"Trivialidades"
"Cthulhu"
"PPCG"
"pOpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
"abca"
"AAAAAAAA"

Saídas correspondentes:

Perf
 c
 t
Mis
  Eu
  trago
    Eu
Od
 ies
 t
Triv
  uma
  eu
  ies
  t
Cthul
  você
P
C
G
pO 
OpO
pOp
 p
abc
  C
  E
abc
  CCE
  E CE
abcd
  e
  b
  fg
abc
UMA
AA
 UMA
Mr. Xcoder
fonte
@JungHwanMin Como você não deve pular de volta para o primeiro b, pois só deve considerar duplicatas na string restante , ou seja, depois de "ramificar". Quando você alcança o segundo c, gera o prefixo mais longo de caracteres únicos da string restante , que é ebffg(assim, produzindo ebfverticalmente e continuando horizontalmente depois disso), para que você não precise se preocupar com os caracteres da parte da string que já foi emitido antes de mudar de orientação. Se ainda não está claro para você, farei outro exemplo passo a passo com este caso de teste.
Mr. Xcoder
Como devemos lidar com maiúsculas / minúsculas? Por exemploABCcde
Rod
Você deve tratá-los como personagens diferentes. Por exemplo "A" ≠ "a". A saída para ABCcdeapenas seriaABCcde
Mr. Xcoder
Sugestão de caso de teste:AAAAAAAA
JungHwan Min 20/06
5
@JungHwanMin AAAAAAAAdicionou esse também.
Mr. Xcoder

Respostas:

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->" "&

Experimente online!

Contém 0xF8FF, o que corresponde ao \[Transpose]operador.

Ufa, foi difícil transformar o resultado em uma sequência. Obter cada ramo não é tão difícil:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan Min
fonte
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

Experimente online!

-1 graças a Lynn .

Imprime como uma tupla de listas de cadeias de comprimento 1. Saída bonita impressa .

Erik, o Outgolfer
fonte
1

Python 2 , 184 176 175 168 bytes

-5 bytes graças ao 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,]

Experimente online!

Cajado
fonte
Não acho que o último salvamento seja válido; e se a entrada contiver \? Além disso, você pode exibir como uma lista de listas de cadeias de comprimento 1, como eu faço na minha solução, pelo OP.
Erik the Outgolfer
@EriktheOutgolfer mesma contagem de bytes: c
Rod
0

CJam , 81 bytes

{_,_S*a*a\+{__L#){V!:V;L#)LM:L;=~:U;:T}{[TU]a+L+:L}?;U@_U=T4$tt\;TV!+:T;UV+:U;}*}

Experimente online!

Erik, o Outgolfer
fonte