Зігзагуйте цей рядок шляхом згортання дублікатів


16

Враховуючи рядок, ваше завдання - згорнути її в зигзагоподібну структуру, як описано нижче.

Складання в зигзаг

Візьмемо рядок "Mississippi"як приклад:

  1. По-перше, виведіть найдовший префікс, що складається лише з унікальних символів:

    Mis
    
  2. Коли ви дістанетесь до першого дублюючого символу C , проігноруйте його та виведіть найдовший префікс, що складається з унікальних символів решти рядка ( issippi) по вертикалі, під першим виникненням C :

    Mis
      i
      s
    
  3. Повторіть процес, чергуючи горизонтальне та вертикальне продовження. Але тепер будьте обережні (на кроці 1), щоб продовжувати виводити горизонтально від останнього появи дублюючого символу, який не обов'язково є останнім, як у цьому випадку:

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

Правила

  • Рядок містить лише символи для друку ASCII, але не містить пробілів.
  • Ви можете змагатися з будь-якою мовою програмування і можете приймати введення та надавати вихід будь-яким стандартним методом та у будь-якому розумному форматі 1 , беручи до уваги, що ці лазівки за замовчуванням заборонені. Це , тому найкоротше подання (у байтах) на кожну мову виграє.
  • 1 Введення: Рядок / Список символів / все, що ваша мова використовує для представлення рядків. Вихід: рядок з рядком, список рядків, що представляють рядки або список списків символів / рядки довжиною-1, але, будь-ласка, включіть у свою відповідь симпатичну версію коду, якщо це можливо.
  • Щодо додаткових пробілів, вихід може містити:
    • Провідні / трейлінг нових рядків
    • Пробіли в кожному рядку / в кінці
    • Послідовне число провідних прогалин в кожному рядку
  • Ви повинні почати виводити горизонтально, ви не можете починати вертикально.

Тестові справи

Вхідні дані:

"Ідеально"
"Міссісіпі"
"Дивацтва"
"Дрібниці"
"Cthulhu"
"PPCG"
"pOpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"abcdcebffg"
"abca"
"AAAAAAAA"

Відповідні результати:

Перф
 c
 т
Міс
  i
  ковток
    i
Од
 е
 т
Трив
  а
  л
  е
  т
Cthul
  у
П
С
Г
пО 
OpO
pOp
 p
ABC
  С
  Е
ABC
  CCE
  E EC
а Б В Г
  е
  б
  fg
абс
А
АА
 А

@JungHwanMin Оскільки ви не повинні переходити до першого b, так як ви повинні розглядати лише дублікати в рядку , що залишився , тобто після "розгалуження". Як тільки ви досягнете другого c, ви виводите найдовший префікс унікальних символів решти рядка , який є ebffg(таким чином виводячи ebfвертикально і продовжуючи горизонтально після цього), тому вам не доведеться турбуватися про символи з тієї частини рядка, яка вже було виведено перед перемиканням орієнтації. Якщо вам все ще здається незрозумілим, я зроблю ще покроковий приклад із цим тестовим прикладом.
Містер Xcoder

Як нам поводитися з нижнього / верхнього регістру? НаприкладABCcde
стрижень

Ви повинні ставитися до них як до різних персонажів. Напр "A" ≠ "a". Вихід для цього ABCcdeбув би простоABCcde
містер Xcoder

Пропозиція тестового прикладу:AAAAAAAA
JungHwan Min

5
@JungHwanMin AAAAAAAДодав і цей.
Містер Xcoder

Відповіді:


2

Мова Вольфрама (Mathematica) , 143 байти

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

Спробуйте в Інтернеті!

Містить 0xF8FF, що відповідає \[Transpose]оператору.

Фу, було важко перетворити результат на рядок. Отримати кожну гілку не так складно:#//.{q___,a_,r___,a_,Longest@s___}:>{q,a,{r},{s}}&



1

Пітон 2 , 184 176 175 168 байт

-5 байт завдяки спадару 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,]

Спробуйте в Інтернеті!


Я не думаю, що останнє збереження є дійсним; що якщо вхід містить \? Крім того, ви можете виводити як список списків рядків довжиною-1, як я роблю в своєму рішенні, за ОП.
Ерік Аутгольфер

@EriktheOutgolfer те ж число байтів: c
Rod

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.