Zigzaguez cette chaîne en réduisant les doublons

16

Étant donné une chaîne, votre tâche consiste à la réduire en une structure de type zigzag comme décrit ci-dessous.

Pliage en zigzag

Nous prendrons la chaîne "Mississippi"comme exemple:

  1. Tout d'abord, affichez le préfixe le plus long composé uniquement de caractères uniques:

    Mis
    
  2. Lorsque vous atteignez le premier caractère en double C , ignorez-le et affichez le préfixe le plus long composé de caractères uniques de la chaîne restante ( issippi) verticalement, sous la première occurrence de C :

    Mis
      i
      s
    
  3. Répétez le processus, en alternant entre la continuation horizontale et verticale. Mais maintenant, faites attention (à l'étape 1) de continuer à sortir horizontalement à partir de la dernière occurrence du caractère en double, qui n'est pas nécessairement le dernier, comme dans ce cas:

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

Règles

  • La chaîne ne contiendra que des caractères ASCII imprimables, mais ne contiendra aucun type d'espace blanc.
  • Vous pouvez concurrencer dans n'importe quel langage de programmation et pouvez prendre des entrées et fournir des sorties par n'importe quelle méthode standard et dans n'importe quel format raisonnable 1 , tout en prenant note que ces failles sont interdites par défaut. Il s'agit de , donc la soumission la plus courte (en octets) pour chaque langue l' emporte.
  • 1 entrée: chaîne / liste de caractères / tout ce que votre langue utilise pour représenter des chaînes. Sortie: chaîne multiligne, liste de chaînes représentant des lignes ou liste de listes de caractères / chaînes de longueur 1, mais veuillez inclure une version jolie impression de votre code dans votre réponse, si possible.
  • Concernant les espaces supplémentaires, la sortie peut contenir:
    • Nouvelles lignes principales / finales
    • Espaces de fin sur chaque ligne / à la fin
    • Un nombre cohérent d'espaces de tête sur chaque ligne
  • Vous devez commencer à produire horizontalement, vous ne pouvez pas démarrer verticalement.

Cas de test

Contributions:

"Parfait"
"Mississippi"
"Bizarreries"
"Anecdotes"
"Cthulhu"
"PPCG"
"pOpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
"abca"
"AAAAAAAA"

Sorties correspondantes:

Perf
 c
 t
Mis
  je
  siroter
    je
Od
 ies
 t
Triv
  une
  l
  ies
  t
Cthul
  u
P
C
g
pO 
OpO
pop
 p
abc
  C
  E
abc
  CCE
  E EC
a B c d
  e
  b
  fg
abc
UNE
AA
 UNE
M. Xcoder
la source
@JungHwanMin Parce que vous ne devez pas revenir à la première b, car vous ne devez considérer que les doublons dans la chaîne restante , c'est-à-dire après la "ramification". Une fois que vous atteignez la seconde c, vous affichez le préfixe le plus long des caractères uniques de la chaîne restante , qui est ebffg(produisant ainsi ebfverticalement et continuant horizontalement après cela), vous n'avez donc pas à vous soucier des caractères de la partie de la chaîne qui était déjà sorti avant de changer d'orientation. Si cela ne vous semble toujours pas clair, je vais faire un autre exemple étape par étape avec ce cas de test.
M. Xcoder
Comment gérer les minuscules / majuscules? Par exempleABCcde
Rod
Vous devez les traiter comme des personnages différents. Par exemple "A" ≠ "a". La sortie pour ABCcdeserait justeABCcde
M. Xcoder
Suggestion de cas de test:AAAAAAAA
JungHwan Min
5
@JungHwanMin AAAAAAAAjouté celui-là aussi.
M. Xcoder

Réponses:

2

Wolfram Language (Mathematica) , 143 octets

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

Essayez-le en ligne!

Contient 0xF8FF, ce qui correspond à l' \[Transpose]opérateur.

Ouf, c'était difficile de transformer le résultat en une chaîne. Obtenir chaque branche n'est pas si difficile:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan Min
la source
2

Python 2 , 131 octets

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

Essayez-le en ligne!

-1 merci à Lynn .

S'imprime comme un tuple de listes de chaînes de longueur 1. Sortie assez imprimée .

Erik le Outgolfer
la source
1

Python 2 , 184 176 175 175 168 octets

-5 octets grâce à M. 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,]

Essayez-le en ligne!

Barre
la source
Je ne pense pas que la dernière sauvegarde soit valide; que faire si l'entrée contient \? En outre, vous pouvez produire une liste de listes de chaînes de longueur 1, comme je le fais dans ma solution, par l'OP.
Erik the Outgolfer
@EriktheOutgolfer même nombre d'octets: c
Rod
0

CJam , 81 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source