Yinelenenleri daraltarak bu dizeyi zikzak yapın


16

Bir dize verildiğinde, göreviniz onu aşağıda açıklandığı gibi zikzak benzeri bir yapıya daraltmaktır.

Zikzak içine katlanır

Dizeyi "Mississippi"örnek olarak alacağız :

  1. İlk olarak, yalnızca benzersiz karakterlerden oluşan en uzun öneki çıkarın:

    Mis
    
  2. İlk yinelenen C karakterine ulaştığınızda , yoksayın ve C'ninissippi ilk oluşumunun altında, dikey olarak kalan dizenin ( ) benzersiz karakterlerinden oluşan en uzun öneki çıktılayın :

    Mis
      i
      s
    
  3. Yatay ve dikey devam arasında geçiş yaparak işlemi tekrarlayın. Ancak şimdi, bu durumda olduğu gibi mutlaka sonuncusu olmayan yinelenen karakterin son oluşumundan yatay olarak çıktı almaya devam etmeye dikkat edin (1. adımda):

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

kurallar

  • Dize yalnızca yazdırılabilir ASCII karakterlerini içerecektir, ancak herhangi bir boşluk içermeyecektir.
  • Herhangi bir programlama dilinde rekabet edebilir ve herhangi bir standart yöntemle ve herhangi bir makul formatta 1 girdi alabilir ve çıktı sağlayabilirsiniz , bu boşlukların varsayılan olarak yasak olduğunu unutmayın . Bu , bu nedenle her dil için en kısa gönderme (bayt cinsinden) kazanır.
  • 1 Giriş: Dize / Karakter listesi / dilinizin dizeleri temsil etmek için kullandığı her şey. Çıktı: Çok satırlı dize, satırları temsil eden dize listesi veya karakter / uzunluk-1 dize listesi listesi, ancak mümkünse cevabınıza lütfen kodunuzun güzel basılı bir sürümünü ekleyin.
  • Ek boşluklarla ilgili olarak, çıktı şunları içerebilir:
    • Öncü / sondaki yeni satırlar
    • Her satırdaki / sondaki boşluklar
    • Bir tutarlı , her satırda gelen boşlukların sayısı
  • Sen olabilir, yatay çıkışa başlamalıdır değil dikey olarak başlar.

Test senaryoları

girişler:

"Mükemmel"
"Mississippi"
"Tuhaflıklar"
"Trivialities"
"Cthulhu"
"PPCG"
"POpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"Abcdcebffg"
"Abca"
"AAAAAAAA"

Karşılık gelen çıktılar:

perf
 c
 t
Mis
  ben
  Yudumlamak
    ben
Od
 ies
 t
Triv
  bir
  l
  ies
  t
Cthul
  u
P
C
G,
po 
OPO
pop
 p
ABC
  C
  E
ABC
  CCE
  E EC
abcd
  e
  b
  fg
ABC
bir
AA
 bir

@JungHwanMin Birincisine geri atlamamanız bgerektiğinden, yalnızca kalan dizede , yani "dallanmadan" sonra yinelenenleri düşünmelisiniz . İkinciye ulaştığınızda, kalan dizeninc benzersiz karakterlerinin en uzun önekini çıkarırsınız , bu da (böylece dikey olarak çıkış yapar ve bundan sonra yatay olarak devam eder), böylece dizenin, yön değiştirilmeden önce zaten çıktı. Hala size açık gelmiyorsa, bu test senaryosuyla adım adım bir örnek daha vereceğim. ebffgebf
Bay Xcoder

Küçük / büyük harfleri nasıl ele almalıyız? ÖrneğinABCcde
Rod

Onlara farklı karakterler gibi davranmalısınız. Örn "A" ≠ "a". Çıktı ABCcdesadece olurduABCcde
Bay Xcoder

Test AAAAAAAA
senaryosu

5
@JungHwanMin AAAAAAA Bunu da ekledim.
Bay Xcoder

Yanıtlar:


2

Wolfram Dili (Mathematica) , 143 bayt

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

Çevrimiçi deneyin!

Operatöre 0xF8FFkarşılık gelen içerir \[Transpose].

Vay be, sonucu bir ip haline getirmek zordu. Her şubeyi almak o kadar da zor değil:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&



1

Python 2 , 184 176 175 168 bayt

Bay Xcoder sayesinde -5 bayt

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,]

Çevrimiçi deneyin!


En son tasarrufun geçerli olduğunu düşünmüyorum; giriş içeriyorsa ne olur \? Ayrıca, OP başına benim çözümümde yaptığım gibi, uzunluk-1 dizelerinin bir listesi olarak çıktı alabilirsiniz.
Outgolfer Erik

@EriktheOutgolfer aynı bayt sayısı: c
Rod

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.