重複を折りたたみ、この文字列をジグザグにします


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」

対応する出力:

性能
 c
 t
ミス
  私
  一口
    私
Od
 ies
 t
トリヴ
  a
  l
  ies
  t
クトゥル
  あなたは
P
C
G
PO 
OpO
ポップ
 p
ABC
  C
  E
ABC
  CCE
  E EC
あいうえお
  e
  b
  fg
abc
A
AA
 A

@JungHwanMin最初のbに戻るべきではないのは、残りの文字列、つまり「分岐」の後の重複のみを考慮する必要があるためです。あなたは、第二に到達するとc、あなたの出力のユニークな文字の最長プレフィックス残りの文字列である、ebffg(したがって出力ebfは、文字列その一部から文字を心配する必要はありませんので、垂直その後水平継続)向きを切り替える前に既に出力されていました。それでも不明な場合は、このテストケースでステップバイステップの例をもう1つ作成します。
ミスターXcoder

小文字/大文字をどのように処理する必要がありますか?例えばABCcde
ロッド

それらを異なる文字として扱う必要があります。例"A" ≠ "a"。以下のための出力ABCcdeだけだろうABCcde
氏Xcoder

テストケースの提案:AAAAAAAA
ジョンファンミン

5
@JungHwanMin AAAAAAAもそれを追加しました。
Mr. Xcoder

回答:


2

Wolfram言語(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の2184の 176 175 168バイト

Mr. Xcoderのおかげで-5バイト

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

オンラインでお試しください!


最新の保存は有効ではないと思います。入力に次が含まれる場合はどうなります\か?また、ソリューションで行っているように、OPごとに長さ1の文字列のリストのリストとして出力できます。
エリックアウトゴルファー


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.