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

@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}}&



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!


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.