文字列を広げる


27

正方形の文字列を指定すると、展開のすべての段階で文字列のすべての出力が生成されます。

弦は一度に4分の1回転だけ時計回りに展開する必要があります。

入力

A

出力

A

:また、この特定のテストケースで複製された入力は、これがバイト数の削減に役立つ場合にのみ受け入れます。

入力

DC
AB

出力

DC
AB

  D
ABC

ABCD

入力

GFE
HID
ABC

出力

GFE
HID
ABC

   HG
   IF
ABCDE

     IH
ABCDEFG

       I
ABCDEFGH

ABCDEFGHI

入力

JIHG
KPOF
LMNE
ABCD

出力

JIHG
KPOF
LMNE
ABCD

    LKJ
    MPI
    NOH
ABCDEFG

       NML
       OPK
ABCDEFGHIJ

          ON
          PM
ABCDEFGHIJKL

            PO
ABCDEFGHIJKLMN

              P
ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNOP

ルール

これはので、バイト単位の最短コードが勝ちです。

  • 一貫性があれば、I / Oに適切な形式を使用できます。
  • 出力の一番上の行を埋めるためにスペースを使用する必要があります。
  • (スペースを含む:すべての印刷可能文字の入力を処理できなければなりません\x20- \x7e):
 ! "#$%& '()* +、-。/ 0123456789:;?@ ABCDEFGHIJKLMNOPQRSTUVWXYZ [\] ^ _` abcdefghijklmnopqrstuvwxyz {|}〜
  • 先頭または末尾の空白は許可されます。
  • 文字列は常に正方形であると仮定できます。
  • すべての標準的な抜け穴は禁止されています。

インスピレーション:「展開」された回数を出力する正方形プログラムを書きます。


私たちは、出力月["A","A"]のための"A"私のプログラムが行うよう、(代わりに["A"])?開始位置と終了位置に過ぎず、展開するのは一度だけなので、私にとっては理にかなっているようです。
ミスターXcoder

@ Mr.Xcoder私は同意しますが、その特定のテストケースに対応するコードを追加することはバイトの無駄のようです。私はシングルバイト入力のためにそれを受け入れ、それに応じて質問を更新します!
ドムヘイスティングス

3
私からの+1、非常に興味深い挑戦。このサイトはこれらをさらに必要とします。なぜなら、難易度を上げ、ほとんどのソリューションの些細なことを取り除くからです。これは、私のお気に入りのチャレンジリストに直接行きます。私は、私も他の巧妙なアプローチを参照してくださいね本当に好きなのに、これはいくつかの答えを持っていることに失望しています
ミスターXcoderに

@ Mr.Xcoder気に入ってくれてうれしいです!アイデアを思いついただけでも功績はあると思いますが、@ HelkaHombaの挑戦のおかげです!
ドムヘイスティングス

回答:


9

SOGL V0.1221 20 19 18 17 バイト

ø;[;ο⁴№č▓┼№TJι;jI

ここで試してみてください!これはスタックへの入力を想定しているため追加されました)

説明:

ø;[;ο⁴№č▓┼№TJι;jI
ø;               push an empty string below the input           stack with the input GFE,HID,ABC
  [              while [ToS (the array) isn't empty] do       ["", [["G","F","E"],["H","I","D"],["A","B","C"]]]  
                                                                stack at the second time looping
   ;               duplicate 2nd from top                     [[[H,G], [I,F], [D,E]], "ABC"]
    ο              wrap it in an array                        [[[H,G], [I,F], [D,E]], ["ABC"]]
     ⁴             duplicate 2nd from top                     [[[H,G], [I,F], [D,E]], ["ABC"], [[H,G], [I,F], [D,E]]]
      №            reverse vertically                         [[[H,G], [I,F], [D,E]], ["ABC"], [[D,E], [I,F], [H,G]]]
       č▓          join the inner arrays (┼ fails otherwise)  [[[H,G], [I,F], [D,E]], ["ABC"], ["DE", "IF", "HG"]]
         ┼         add the 2 parts together                   [[[H,G], [I,F], [D,E]], ["ABCDE", "   IF", "   HG"]]
          №        reverse vertically again                   [[[H,G], [I,F], [D,E]], ["   HG", "   IF", "ABCDE"]]
           T       print that without popping                 [[[H,G], [I,F], [D,E]], ["   HG", "   IF", "ABCDE"]]
            J      take the last line off                     [[[H,G], [I,F], [D,E]], ["   HG", "   IF"], "ABCDE"]
             ι     remove the rest of the array               [[[H,G], [I,F], [D,E]], "ABCDE"]
              ;j   remove the last line of the original array ["ABCDE", [[H,G], [I,F]]]
                I  rotate it clockwise                        ["ABCDE", [[I,H], [F,G]]]

7

パイソン2209 207 205 203 202 201の200 196バイト

@Quelklefのおかげで-4バイト!

s=input();l=len;k=''.join;exec"print s;s=[x for x in[' '*l(s[0])+k(x[:-1]for x in s[-2::-1])[t::l(s[0])-1]for t in range(l(s[0]))][:-1]+[s[-1]+k(x[-1]for x in s)[-2::-1]]if x.strip()];"*(2*l(s)-1)

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

パイソン2219の217 215 213 212 211 207バイト

s=input();l=len;k=''.join;exec"print'\\n'.join(s);s=[x for x in[' '*l(s[0])+k(x[:-1]for x in s[-2::-1])[t::l(s[0])-1]for t in range(l(s[0]))][:-1]+[s[-1]+k(x[-1]for x in s)[-2::-1]]if x.strip()];"*(2*l(s)-1)

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

最初のものは文字列のリストとして出力し、2番目のものはASCII-artとして出力します。


Lynnの答えのように、そう[::-1][1:]なると思い[-2::-1]ます。
-Quelklef

@Quelklefどうもありがとう!
ミスターXcoder

4

42 35バイト

AEθSθW⊟θ«⪫θ¶AEι⮌⪫Eθ§μλωθ⊞υι↙←⮌⪫υωD⎚

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:文字配列から文字列に切り替えることにより、主に7バイトを保存しました。説明:

AEθSθ

入力正方形を文字列の配列として変数に読み込みますq

W⊟θ«

配列の最後の文字列は空ではありませんが、削除してください。

⪫θ¶

配列の残りを印刷します。

AEι⮌⪫Eθ§μλωθ

最後の文字列の各文字をループlし、逆の配列に残っているすべての文字列のth 文字を結合することにより、配列の残りの部分を回転させます。

⊞υι↙←⮌⪫υω

前に削除した最後の文字列をu、展開された値を保持するに追加し、印刷します。

D⎚

結果を出力し、次の反復に備えてキャンバスをクリアします。

このバージョンでは、最終的な展開が別の行に出力されることに注意してください。これが望ましくない場合は、38バイトです。

AEθSθW⊟θ«⊞υι←E⁺⟦⪫υω⟧⮌θ⮌κAEι⮌⪫Eθ§μλωθD⎚

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:←E⁺⟦⪫υω⟧⮌θ⮌κ現在の配列を反転し、展開された行を先頭に追加し、各行の文字を反転し、すべてを逆さまに印刷して、目的の結果を生成します。


私はもっ​​とチャコールの方法でそれをやろうとしましたがRotateTrimコマンドがカーソルから離れる場所を見つけることができませんでした...
ニール

3

Haskell127 120バイト

e=[]:e
i#[x]=[]
i#s|t<-foldl(flip$zipWith(:))e$init s,j<-i++last s=(map((j>>" ")++)(init t)++[j++last t]):j#t
f s=s:""#s

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

入力は行のリストです。たとえば["DC","AB"]、2番目のテストケースでは、出力は行のリストのリストです[["DC","AB"],[" D","ABC"],["ABCD"]]mapM (putStrLn . unlines)結果をきれいに印刷するために使用します。

編集:各転置を直接反転するように変更できるので、囲みが便利なときに見つけた短いものtransposeに気づいて7バイトを保存しました。


2

05AB1E、18バイト

[Dí.Bí»,¤UR¦ζŽ`Xì)

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

説明

[            Ž       # while stack is not empty, do:
 D                   # duplicate current list
  í                  # reverse each element
   .B                # pad with spaces to equal length
     í               # reverse each element again
      »,             # join with newlines and print
        ¤U           # store the last element in X
          R¦         # reverse the list and remove the first element
            ζ        # zip with spaces as filler
              `      # split elements separately to stack
               Xì    # prepend X to the last element
                 )   # join the stack to a list

2

J、62バイト

|."1@([:(#~[:-.[:*/"1' '=])|.@{:(}:@],{:@],[)|:@}:)^:(1<#)^:a:

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

これはたくさんゴルフできると確信しています。これは余分な空白を出力しますが、これは、Jが出力配列内に含まれる配列を同じ形状にフォーマットする方法のためだけです。

私がやっていることを正確にコメントアウトすると、これをゴルフする方法のより良いアイデアを得るかもしれません(今それをやったので、私は本当に知りません...)。ゴルフの目的のために、それは注目に値する

  • 特別な場合1行入力(ループのwhile部分)
  • 私は空白だけで構成されるすべての行を削除する必要があります(これには必ず組み込みまたはそれを行うためのより良い方法が必要です)、これは最後に近いフィルターです
  • 上限、アイデンティティ関数、および頂点がたくさんあります

説明

これを解いて、主な機能を3つに分割します。

unfurl_reversed   =. |.@{: (}:@] , {:@] , [) |:@}:
whitespace_filter =. #~ [: -. [: */"1 ' ' = ]
unfurl            =. |."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:

test_case         =. 3 3 $ 'GFEHIDABC'

2番目のテストケースで作業します。

unfurl_reversed

|.@{: (}:@] , {:@] , [) |:@}:

これにより、文字列が一度展開されますが、逆になります。これはすべて、逆に特定の順序で行われているため、Jが自動的に文字列をスペースで埋めて、配列の形状に合わせて適切な間隔を空けます。

|:@}: 入力の削減の転置です

   |:@}: test_case
GH
FI
ED

|.@{: 入力の末尾の逆です

   |.@{: test_case
CBA

私たちは何をしたいのかを見ることができると思います:テールの逆を、カーソルの転置の最後の部分に追加したいと思います(それは一口ですが、基本的CBAにの終わりに付けEDます)。これにより、逆の展開が1ステップ行われます。

(}:@],{:@],[) それだけです。

に追加CBAED、それを残りの配列と結合します。したがって、出力は

   unfurl_reversed test_case
GH   
FI   
EDCBA

whitespace_filter

#~ [: -. [: */"1 ' ' = ]
                 ' ' = ]  Equate each element to space
            */"1          Product of each row (all true?)
      -.                  Negate
#~                        Filter rows that are true

基本的に、これは行が完全にスペースであるかどうかをテストし、スペースがある場合は削除します。テストケースの最初の反復では何もしません。

そうしないと、最終的には出力文字列に空白が展開されるため、これは(少なくとも代替が見つかるまで)必要です。

広げる

|."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:

Unfurlは基本的に他の機能と特別な場合の単一文字入力をまとめます。

動詞の力(^:)に空のボックス()が与えられると、a:収束して結果を配列に収集するまで、入力に関数を適用します。

(1 < #) 行が常に1より大きいことを確認します(特別な場合1行入力)。

|."1は各行を反転するため、の結果を反転しますwhitespace_filter @: unfurl


1

パイソン2143の 132バイト

a=input()
while 1:print'\n'.join(a);b=map(''.join,zip(*map(str.strip,a[-2::-1])));a[-1]+=b.pop();a[:-1]=[len(a[0])*' '+x for x in b]

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

各反復では、b文字列(最初のn-1行)の「ヘッド」であり、90度回転以下の場合a[" NML", " OPK", "ABCDEFGHIJ"]、次にbです["ON", "PM", "KL"]

文字列を一度展開するには、bto の最後の行を追加しa[-1](を与える"ABCDEFGHIJKL"a[:-1]、の残りの文字列にスペースを追加して再計算しますb

b空になったときにポップを試みて終了します。

Python 2、132バイト

a=input()
while 1:s=str.strip;print'\n'.join(a);a[:-1]=[len(a[0])*' '+''.join(x)for x in zip(*map(s,a[-2::-1]))];a[-1]+=s(a.pop(-2))

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

同じアイデアで、異なる方法で記述されています。要素が1つしかないa.pop(-2)場合aを試みることで終了します。


1

Perl 5、155バイト

$"=$,;@a=map[/./g],<>;while(@a){say' 'x(length$s)."@$_"for@a[0..@a-2];say$s.="@{pop@a}";say@b=();for$i(0..$#a){$q=0;$b[$q++][$#a-$i]=$_ for@{$a[$i]}}@a=@b}

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

ロジックを実際に変更せずに数バイトを保存しました。以下のフローは基本的に正しいままです。

Perl 5の、163のバイト

$"=$,;@a=map[/./g],<>;while(@a){say' 'x(length$s)."@{$a[$_]}"for 0..@a-2;say$s.="@{pop@a}";say@b=();for$i(0..$#a){$b[$_][$#a-$i]=$a[$i][$_]for 0..$#{$a[$i]}}@a=@b}

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

どうやって?

$"=$,; #set the array output separator to null
@a=map[/./g],<>;   # take the input as a 2-D array @a
while(@a){         # repeat while there are still things to unfurl
  say' 'x(length$s)."@{$a[$_]}"for 0..@a-2; # output all but last
                                            # line of the remaining
                                            # square
  say$s.="@{pop@a}";  # remove bottom row, add it to the unfurled string $s
                      # and output it
  say@b=();           # clear temporary array; output empty array, causing
                      # a newline to output

                      # rotate remaining shape 90 degrees:
  for$i(0..$#a){$b[$_][$#a-$i]=$a[$i][$_]for 0..$#{$a[$i]}}
  @a=@b               # replace input with rotated array
}

良い方法ですが、展開の各段階で出力が終わったら、すべてのステップを印刷するように更新してもらえますか?ごめんなさい!
ドムヘイスティングス

1
OK、書き直しました。
-Xcali

パーフェクト、ありがとう!申し訳ありませんけれども、余分なバイトをさせるための...
ドムヘイスティングス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.