全方向に展開


14

入力:

文字列

出力:

1)まず、正方形の長さ(つまり、1、4、9、16、25、36など)が残るまで、入力文字列の末尾の文字を削除します。
したがって、abcdefghijklmnopqrstuvwxyz(長さ26)はabcdefghijklmnopqrstuvwxy(長さ25)。

2)次に、これを正方形に、一度に1行ずつ、左から右に配置します。

abcde
fghij
klmno
pqrst
uvwxy

3)次のように4方向すべてに折ります(外側に折りたたまれた「ブロック」に展開する内側の文字がなくなるまで展開を続けます)。

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

外側に折りたたむと、基本的にこのようにミラーリングされます(これらの例の「インデックス」を表す明確化として数字が追加されています)。

左側を広げると:

 123    to:   321 123
fghij         ihgf   j

右側を折り畳むとき:

 123    to:    123 321
fghij         f   jihg

上に折り畳むとき:

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

下に折るとき:

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

チャレンジルール:

  • 入力には常に少なくとも1文字が含まれると想定できます(これも出力になります)。
  • 出力形式は柔軟であるため、STDOUTまたはSTDERRに出力できます。文字列配列/リストまたは文字2D配列として返します。改行を含む単一の文字列。等
  • 入力には英数字(a-zA-Z0-9)のみが含まれます
  • また、英数字以外の文字を使用して、ドットのように、ASCIIアート出力内またはその周囲のスペースを埋めることもでき.ます。
  • 末尾のスペースと単一の末尾の改行はオプションです。
  • 外側に折りたたまれた「ブロック」に展開する中心がなくなるまで展開を続けます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準的な規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a

「HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars」のテストに誤りがあります:出力の下部近くにある 'h'-> 'i'
ngn

回答:


5

SOGL V0.12、75のバイト

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

ここで試してみてください!

これはスタック上の入力を想定しているため、使いやすさのために,最初に追加しました。入力に数字のみが含まれている場合、問題が発生する可能性があるため、ここに テストスイートがあります。

70バイトでも√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚機能しますが、文字列に実装しただけなので、ドキュメントでは長さを埋めることについて言及していなかったため、数えません。

説明:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically

非競合はもはや問題ではないため、 70バイトバージョンは有効です。
シャギー

@Shaggy 75バイトバージョンが有効なのは、以前のようにこのチャレンジが数字に対してのみ有効だったためです。それはビルトインちょうど挑戦のための追加の抜け穴に該当するように私は感じるので、私は75バイトのバージョンを数えていないよ理由がある
dzaima

4

120 109バイト

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κꧧεκ⁺μκ↷A⮌EεEε§ξν嶻A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

オンラインでお試しください!変更されており、リンクがこれを反映していることに注意してください。説明:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

計算しh = int(sqrt(len(q)))ます。(Floorまだ実装されていません...)

Fη⊞υ✂θ×ιη

入力からh長さのスライスを抽出しhます。(実際、スライスを切り詰める必要はありませんh。)のfor代わりにループを使用します。どこかの結果がMap必要なためです。AssignMapSlice

F⁴«

展開は4回、各方向に1回(コーディングされたとおり、下、右、上、左)行われます。このループのループ変数はiです。

   Aυε

スライスされた文字列のコピーを取ります。

   J⁰¦⁰

ようにキャンバスの原点に戻ってジャンプして、各展開]開始h行列のh同じ場所での正方形。

   F÷⁺¹η²«

繰り返し(h+1)/2回数; 展開ごとに1回、元の正方形に1回。このループのループ変数はkです。

          F⁴«

展開された正方形の各辺に1回ずつ、4回繰り返します。(ループ変数は使用しませんl。)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

展開された正方形の片側を印刷します。これがkthの展開であるため、正方形の辺はh-2kでありk、元の正方形の端から文字を取り除きます。

正方形の次の辺を印刷する準備ができました。

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

スライスした文字列を回転させます。(はい、それはξです。私はそれを頻繁に使用することはありません!)Eηアウターでも動作しMapます。回転には、配列の幅をに切り捨てるという便利な副作用もありhます。

             ¶»

辺を印刷した後、カーソルは正方形の端から移動します。サイド1の正方形で1文字少なく印刷すると失敗し、とにかくゴルフが少なくなります。以前はピボットされていたので、改行を印刷すると、カーソルが便利にコーナーに戻ります。

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

必要に応じて、正方形を上下または左右に反転します。

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

次の展開までの変位を計算します。

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

必要に応じて次の展開に水平または垂直に移動します。

ここでは木炭を含む特徴のすべての最新の利用することによって得られた97バイトのバージョンへのリンクですFloorオンラインそれをお試しくださいが!リンクは、コードの詳細バージョンです。


これは機能しますか?TIOはエラーを発生させるようです。
LyricLy

@LyricLy Bah、私は賢いと思っていたが、実際に動作したかどうかを確認できなかった。変更を元に戻します。
ニール

1
クラップはおっとのスライスに仕事を浮くようにするには忘れてしまった
ASCIIのみ

@ ASCII-only役に立たないので、とにかく乗算する前に整数に切り捨てる必要があります。
ニール

正しい。まあ、私はすぐにフロアを追加するので、それほど問題にはなりません:P
ASCIIのみ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.