Zigzag string ini dengan menciutkan duplikat

16

Diberikan string, tugas Anda adalah merobohkannya menjadi struktur seperti zig-zag seperti dijelaskan di bawah ini.

Lipat menjadi Zigzag

Kami akan mengambil string "Mississippi"sebagai contoh:

  1. Pertama, hasilkan awalan terpanjang yang terdiri dari karakter unik saja:

    Mis
    
  2. Saat Anda mencapai karakter duplikat C pertama , abaikan saja, dan hasilkan awalan terpanjang yang terdiri dari karakter unik dari string yang tersisa ( issippi) secara vertikal, di bawah kemunculan pertama C :

    Mis
      i
      s
    
  3. Ulangi proses ini, bergantian antara kelanjutan horizontal dan vertikal. Tetapi sekarang berhati-hatilah (pada langkah 1) untuk terus mengeluarkan secara horizontal dari kemunculan terbaru karakter duplikat, yang belum tentu yang terakhir, seperti dalam kasus ini:

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

Aturan

  • String hanya akan berisi karakter ASCII yang dapat dicetak, tetapi tidak akan berisi spasi apa pun.
  • Anda dapat bersaing dalam bahasa pemrograman apa pun dan dapat mengambil input dan memberikan output melalui metode standar apa pun dan dalam format apa pun yang masuk akal 1 , sambil memperhatikan bahwa celah ini dilarang secara default. Ini adalah , jadi pengiriman terpendek (dalam byte) untuk setiap bahasa menang.
  • 1 Input: String / Daftar karakter / apa pun yang digunakan bahasa Anda untuk mewakili string. Output: Multiline tali, daftar string yang mewakili garis atau daftar daftar karakter / panjang-1 string, tapi tolong termasuk versi yang cukup cetak kode Anda dalam jawaban Anda, jika memungkinkan.
  • Mengenai ruang tambahan, output mungkin berisi:
    • Terkemuka / Trailing baris
    • Membuntuti spasi pada setiap baris / di akhir
    • Sebuah konsisten jumlah ruang terkemuka pada setiap baris
  • Anda harus mulai menghasilkan secara horizontal, Anda mungkin tidak memulai secara vertikal.

Uji kasus

Input:

"Sempurna"
"Mississippi"
"Aneh tapi nyata"
"Hal-hal sepele"
"Cthulhu"
"PPCG"
"pOpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
"abca"
"AAAAAAAA"

Output yang sesuai:

Perf
 c
 t
Salah
  saya
  menyesap
    saya
Od
 ies
 t
Triv
  Sebuah
  l
  ies
  t
Cthul
  kamu
P
C
G
PO 
OpO
pOp
 hal
ABC
  C
  E
ABC
  CCE
  E EC
abcd
  e
  b
  fg
abc
SEBUAH
A A
 SEBUAH
Tuan Xcoder
sumber
@JungHwanMin Karena Anda tidak boleh melompat kembali ke yang pertama b, karena Anda hanya harus mempertimbangkan duplikat dalam string yang tersisa , yaitu, setelah "bercabang". Setelah Anda mencapai yang kedua c, Anda menghasilkan awalan terpanjang dari karakter unik dari string yang tersisa , yaitu ebffg(dengan demikian mengeluarkan ebfsecara vertikal dan melanjutkan secara horizontal setelah itu), sehingga Anda tidak perlu khawatir tentang karakter dari bagian string yang sudah dikeluarkan sebelum beralih orientasi. Jika masih terasa tidak jelas bagi Anda, saya akan membuat contoh langkah-demi-langkah lain dengan test case ini.
Tn. Xcoder
Bagaimana kita harus menangani huruf kecil / huruf besar? MisalnyaABCcde
Rod
Anda harus memperlakukan mereka sebagai karakter yang berbeda. Misalnya "A" ≠ "a". Output untuk ABCcdehanyaABCcde
Tn. Xcoder
Saran uji kasus:AAAAAAAA
JungHwan Min
5
@JungHwanMin AAAAAAAAambahkan itu juga.
Tn. Xcoder

Jawaban:

2

Wolfram Bahasa (Mathematica) , 143 byte

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

Cobalah online!

Berisi 0xF8FF, yang sesuai dengan \[Transpose]operator.

Fiuh, sulit membuat hasilnya menjadi string. Mendapatkan setiap cabang tidak begitu sulit:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&

JungHwan Min
sumber
2

Python 2 , 131 byte

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

Cobalah online!

-1 berkat Lynn .

Mencetak sebagai tupel daftar panjang-1 string. Output tercetak cantik .

Erik the Outgolfer
sumber
1

Python 2 , 184 176 175 168 byte

-5 byte terima kasih kepada Tn. 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,]

Cobalah online!

tongkat
sumber
Saya pikir hemat terbaru tidak valid; bagaimana jika inputnya berisi \? Juga, Anda dapat menampilkan sebagai daftar senar panjang-1, seperti yang saya lakukan dalam solusi saya, per OP.
Erik the Outgolfer
@EriktheOutgolfer jumlah byte yang sama: c
Rod
0

CJam , 81 byte

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

Cobalah online!

Erik the Outgolfer
sumber