Zygzak ten ciąg, zwijając duplikaty

16

Biorąc pod uwagę ciąg, Twoim zadaniem jest zwinięcie go w strukturę zygzakowatą, jak opisano poniżej.

Składany w zygzak

Weźmy ciąg "Mississippi"jako przykład:

  1. Najpierw wypisz najdłuższy prefiks składający się tylko z unikalnych znaków:

    Mis
    
  2. Kiedy dojdziesz do pierwszego zduplikowanego znaku C , zignoruj ​​go i wypisz najdłuższy prefiks składający się z unikalnych znaków pozostałego ciągu ( issippi) pionowo, poniżej pierwszego wystąpienia C :

    Mis
      i
      s
    
  3. Powtórz proces, naprzemiennie z kontynuacją poziomą i pionową. Ale teraz uważaj (w kroku 1), aby kontynuować wyświetlanie w poziomie od ostatniego wystąpienia zduplikowanego znaku, który niekoniecznie jest ostatnim, jak w tym przypadku:

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

Zasady

  • Ciąg będzie zawierał tylko znaki ASCII do wydruku, ale nie będzie zawierał żadnych białych znaków.
  • Możesz konkurować w dowolnym języku programowania i przyjmować dane wejściowe i dostarczać dane wyjściowe dowolną standardową metodą w dowolnym rozsądnym formacie 1 , zwracając uwagę, że te luki są domyślnie zabronione. To jest , więc wygrywa najkrótsze przesłanie (w bajtach) dla każdego języka .
  • 1 Dane wejściowe: Ciąg / Lista znaków / cokolwiek innego, jakiego używa Twój język do reprezentowania ciągów. Dane wyjściowe: Ciąg wielowierszowy, lista ciągów reprezentujących wiersze lub lista list ciągów znaków / długość-1, ale w miarę możliwości prosimy o dołączenie do odpowiedzi ładnej wersji kodu.
  • Jeśli chodzi o dodatkowe spacje, dane wyjściowe mogą zawierać:
    • Wiodące / końcowe znaki nowej linii
    • Końcowe spacje na każdej linii / na końcu
    • Zgodne liczba czołowych miejsc na każdej linii
  • Musisz zacząć wyjścia poziomo, może nie uruchomić w pionie.

Przypadki testowe

Wejścia:

"Doskonały"
„Mississippi”
„Dziwactwa”
"Fidrygałki"
„Cthulhu”
„PPCG”
„pOpOpOpOpOpOp”
„ABCCCE”
„ABCCCECCEEEEC”
„abcdcebffg”
„abca”
„AAAAAAAA”

Odpowiednie wyniki:

Perf
 do
 t
Mis
  ja
  łyk
    ja
Od
 ies
 t
Triv
  za
  l
  ies
  t
Cthul
  u
P.
do
sol
pO 
OpO
Muzyka pop
 p
ABC
  do
  mi
ABC
  CCE
  E EC
abcd
  mi
  b
  fg
ABC
ZA
AA
 ZA
Pan Xcoder
źródło
@JungHwanMin Ponieważ nie powinieneś skakać z powrotem do pierwszego b, ponieważ powinieneś brać pod uwagę tylko duplikaty w pozostałym ciągu , to znaczy po „rozgałęzieniu”. Po osiągnięciu drugiego c, wypisujesz najdłuższy prefiks unikatowych znaków pozostałego ciągu , który jest ebffg(w ten sposób wypisując w ebfpionie i kontynuując poziomo po nim), więc nie musisz się martwić o znaki z części ciągu, która został już wyprowadzony przed zmianą orientacji. Jeśli nadal wydaje ci się to niejasne, dam kolejny krok po kroku przykład z tym przypadkiem testowym.
Pan Xcoder,
Jak powinniśmy obsługiwać małe / duże litery? Na przykładABCcde
Rod
Powinieneś traktować je jak różne postacie. Np "A" ≠ "a". Wyjściem ABCcdebyłoby po prostuABCcde
Mr. Xcoder,
Sugestia przypadku testowego:AAAAAAAA
JungHwan Min
5
@JungHwanMin AAAAAAADodano również to.
Pan Xcoder,

Odpowiedzi:

2

Wolfram Language (Mathematica) , 143 bajty

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

Wypróbuj online!

Zawiera 0xF8FF, co odpowiada \[Transpose]operatorowi.

Uff, ciężko było przekształcić wynik w strunę. Uzyskanie każdej gałęzi nie jest takie trudne:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan Min
źródło
2

Python 2 , 131 bajtów

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

Wypróbuj online!

-1 dzięki Lynn .

Drukuje jako krotkę list ciągów o długości-1. Ładnie wydrukowane wydruki .

Erik the Outgolfer
źródło
1

Python 2 , 184 176 175 168 bajtów

-5 bajtów dzięki 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,]

Wypróbuj online!

Pręt
źródło
Nie sądzę, aby ostatni zapis był ważny; co jeśli wejście zawiera \? Możesz również wyprowadzać jako listę list ciągów o długości 1, tak jak robię to w moim rozwiązaniu, dla OP.
Erik the Outgolfer,
@EriktheOutgolfer liczba takich samych bajtów: c
Rod
0

CJam , 81 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło