Зигзаг этой строки, свернув дубликаты


16

По заданной строке ваша задача - свернуть ее в зигзагообразную структуру, как описано ниже.

Складывание в зигзаг

Мы возьмем строку "Mississippi"в качестве примера:

  1. Сначала выведите самый длинный префикс, состоящий только из уникальных символов:

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

    Mis
      i
      s
    
  3. Повторите процесс, чередуя горизонтальное и вертикальное продолжение. Но теперь будьте осторожны (на шаге 1), чтобы продолжить вывод по горизонтали из последнего появления дублированного символа, который не обязательно является последним, как в этом случае:

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

правила

  • Строка будет содержать только печатные символы ASCII, но не будет содержать пробелов.
  • Вы можете соревноваться на любом языке программирования и можете принимать и выводить данные любым стандартным методом и в любом приемлемом формате 1 , при этом отмечая, что эти лазейки по умолчанию запрещены. Это , поэтому выигрывает самое короткое представление (в байтах) для каждого языка .
  • 1 Ввод: строка / список символов / все, что ваш язык использует для представления строк. Вывод: многострочная строка, список строк, представляющих строки, или список списков символов / строк длины 1, но, если возможно, включите в свой вариант довольно печатную версию своего кода.
  • Что касается дополнительных пробелов, вывод может содержать:
    • Ведущие / конечные переводы строк
    • Конечные пробелы в каждой строке / в конце
    • Последовательное число ведущих пробелов в каждой строке
  • Вы должны начать выводить горизонтально, вы не можете начать вертикально.

Контрольные примеры

Входы:

"Отлично"
"Миссисипи"
«Странность»
«пустяки»
«Ктулху»
"PPCG"
"POpOpOpOpOpOp"
"ABCCCE"
"ABCCCECCEEEEC"
"Abcdcebffg"
"ABCA"
"AAAAAAAA"

Соответствующие выводы:

Perf
 с
 T
Mis
  я
  глоток
    я
Od
 х годов
 T
Triv
  
  L
  х годов
  T
Cthul
  U
п
С
грамм
рО 
ОРО
эстрадный
 п
азбука
  С
  Е
азбука
  CCE
  E EC
ABCD
  е
  б
  фг
азбука
A
А.А.
 

@JungHwanMin Потому что вы не должны возвращаться к первому b, поскольку вы должны рассматривать только дубликаты в оставшейся строке , то есть после «ветвления». Как только вы достигнете второго c, вы выводите самый длинный префикс уникальных символов оставшейся строки , который ebffg(таким образом, выводится по ebfвертикали и продолжается по горизонтали после этого), поэтому вам не нужно беспокоиться о символах из той части строки, которая был уже выведен до переключения ориентации. Если вам все еще неясно, я приведу еще один пошаговый пример с этим контрольным примером.
г-н Xcoder

Как мы должны обращаться с нижним / верхним регистром? НапримерABCcde
Род

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

Тестовый пример:AAAAAAAA
JungHwan Мин.

5
@JungHwanMin AAAAAAAДобавил это тоже.
Мистер Кскодер

Ответы:


2

Wolfram Language (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

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

Попробуйте онлайн!


I don't think the latest save is valid; what if the input contains \? Also, you can output as a list of lists of length-1 strings, as I do in my solution, per the OP.
Erik the Outgolfer


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.