Zickzacke diese Zeichenkette, indem du Duplikate zusammenlegst

16

Bei einer gegebenen Zeichenfolge besteht Ihre Aufgabe darin, sie wie unten beschrieben in eine zickzackartige Struktur zu reduzieren.

In einen Zickzack falten

Wir nehmen den String "Mississippi"als Beispiel:

  1. Geben Sie zunächst das längste Präfix aus, das nur aus eindeutigen Zeichen besteht:

    Mis
    
  2. Wenn Sie das erste doppelte Zeichen C erreichen , ignorieren Sie es und geben Sie das längste Präfix aus, das aus eindeutigen Zeichen der verbleibenden Zeichenfolge ( issippi) vertikal unterhalb des ersten Vorkommens von C besteht :

    Mis
      i
      s
    
  3. Wiederholen Sie den Vorgang im Wechsel zwischen horizontaler und vertikaler Fortsetzung. Aber seien Sie jetzt vorsichtig (in Schritt 1), um die horizontale Ausgabe nach dem letzten Auftreten des doppelten Zeichens fortzusetzen, das nicht unbedingt das letzte ist, wie in diesem Fall:

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

Regeln

  • Die Zeichenfolge enthält nur druckbare ASCII-Zeichen, jedoch keine Leerzeichen.
  • Sie können in jeder Programmiersprache antreten und Eingaben und Ausgaben mit jeder Standardmethode und in jedem vernünftigen Format 1 vornehmen, wobei zu beachten ist, dass diese Lücken standardmäßig verboten sind. Dies ist , daher gewinnt die kürzeste Übermittlung (in Bytes) für jede Sprache .
  • 1 Eingabe: Zeichenfolge / Liste der Zeichen / was auch immer Ihre Sprache zur Darstellung von Zeichenfolgen verwendet. Ausgabe: Mehrzeilige Zeichenfolge, Liste von Zeichenfolgen, die Zeilen darstellen, oder Liste von Zeichenlisten / Zeichenfolgen der Länge 1, aber fügen Sie Ihrer Antwort nach Möglichkeit eine hübsche Druckversion Ihres Codes bei.
  • In Bezug auf zusätzliche Leerzeichen kann die Ausgabe Folgendes enthalten:
    • Führende / nachfolgende Zeilenumbrüche
    • Leerzeichen in jeder Zeile / am Ende
    • Eine konsistente Anzahl von führenden Leerzeichen in jeder Zeile
  • Sie müssen mit der horizontalen Ausgabe beginnen. Möglicherweise beginnen Sie nicht vertikal.

Testfälle

Eingänge:

"Perfekt"
"Mississippi"
"Kuriositäten"
"Trivialitäten"
"Cthulhu"
PPCG
"pOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
"abca"
"AAAAAAAA"

Entsprechende Ausgänge:

Perf
 c
 t
Mis
  ich
  Schluck
    ich
Od
 ies
 t
Triv
  ein
  l
  ies
  t
Cthul
  u
P
C
G
pO 
OpO
Pop
 p
ABC
  C
  E
ABC
  CCE
  E EG
A B C D
  e
  b
  fg
ABC
EIN
AA
 EIN
Mr. Xcoder
quelle
@JungHwanMin Da Sie nicht zum ersten zurückspringen bsollten, da Sie nur Duplikate in der verbleibenden Zeichenfolge berücksichtigen sollten, dh nach "Verzweigung". Nach dem Erreichen der zweiten c, Sie gibt den längsten Präfix der einzigartigen Zeichen des restlichen Zeichenfolge , das ist ebffg(also die Ausgabe ebfvertikal und horizontal danach fort), so dass Sie von dem Teil der Zeichenfolge Sorge um die Zeichen nicht , dass wurde bereits vor dem Orientierungswechsel ausgegeben. Wenn es Ihnen immer noch unklar erscheint, werde ich mit diesem Testfall ein weiteres schrittweises Beispiel erstellen.
Mr. Xcoder
Wie sollen wir mit Groß- / Kleinschreibung umgehen? Zum BeispielABCcde
Rod
Sie sollten sie als verschiedene Charaktere behandeln. Eg "A" ≠ "a". Die Ausgabe für ABCcdewäre nurABCcde
Mr. Xcoder
Testfallvorschlag:AAAAAAAA
JungHwan Min 20.06.18
5
@JungHwanMin AAAAAAAAdded das auch.
Mr. Xcoder

Antworten:

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

Probieren Sie es online!

Enthält 0xF8FF, was dem \[Transpose]Operator entspricht.

Puh, es war schwer, das Ergebnis in eine Saite zu verwandeln. Es ist nicht so schwer, jeden Zweig zu bekommen:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan min
quelle
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

Probieren Sie es online!

-1 danke an Lynn .

Druckt als Tupel von Listen mit Zeichenfolgen der Länge 1. Hübsch gedruckte Ausgabe .

Erik der Outgolfer
quelle
1

Python 2 , 184 176 175 168 Bytes

-5 Bytes dank 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,]

Probieren Sie es online!

Stange
quelle
Ich glaube nicht, dass die letzte Speicherung gültig ist. Was ist, wenn die Eingabe enthält \? Sie können auch wie in meiner Lösung eine Liste mit Listen von Zeichenfolgen der Länge 1 pro OP ausgeben.
Erik der Outgolfer
@EriktheOutgolfer gleiche
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;}*}

Probieren Sie es online!

Erik der Outgolfer
quelle