一部のテキストをダイヤモンド化する


20

長さの入力文字列が与えられた2以上のアルファベット文字のみからなる[A-Z]か、[a-z](あなたの選択、それらはすべて大文字またはすべて小文字なら)、出力ダブルダイヤモンドパターンを形成する文字の連続文字列を。

入力文字列は中心線から始まり、入力文字列の最後に到達するまで対角線で上下に伸びます。次に、入力文字列の長さから1を引いた値まで中心線から遠く離れるまで、パターンは斜めに上下に続きます。左、次に上下(中央の文字の「後ろ」に移動)、最後に左下に移動して開始文字に戻ります。

それは少し冗長であり、いくつかの例でより良く示されています:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

どのように参照してくださいYOU、それが戻って最初にループするまで、など、中心線から始まり、次のダウンと右、そしてアップと右。特に、Y左上部分が「背後」にあるOため表示されていないことに注意してください。

さらにいくつかの例:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • 入力と出力は、任意の便利な方法で指定できます。
  • 入力は少なくとも2文字以上であることが保証されています(つまり、""入力として受け取ることはありません)。
  • STDOUTに出力するか、関数の結果として返すことができます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 文字が適切に並んでいる限り、任意の量の余分な空白を使用できます(たとえば、長方形として自由に埋めることができます)。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

本当に重要かどうかはわかりませんが、なぜ2番目(左上)のパスが1番目(右上)のパスの後ろにあるのですか?直感的ではなく、その手紙をスキップしたり再描画したりするのは少し面倒です。
BradC

2
@BradCチャレンジを思いついたとき、私は自分の机でメビウスの帯で遊んでいたのですが、帯がちょっと「後ろに」行くので、それが理由です。他の理由はありません。
AdmBorkBork

視覚化に役立つように、矢印文字を使用したパスの「描画」を含めることをお勧めします。
シャギー

@Shaggy図面を追加しました。
AdmBorkBork

ニースの一つは、この1つはより多くのそして一見に挑戦..です
booshlinux

回答:


10

、17バイト

GH<↗↘>↖↙LθθGH<Lθθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

GH

パスに沿って描画します。

<↗↘>↖↙

directionsの方向に描画します(<>はこれらの2つのペアの短縮形ですが、他のペアには短縮形はありません。)

Lθ

各パスセグメントの長さは、入力の長さと同じです(両端を含む)。

θ

パスに沿って書き込まれるテキストとして入力を使用します。

GH<Lθθ

中間文字が正しいように、パスの最初の2つの部分を再度印刷します。


3
この挑戦はチャコールのために作られたようです
ジョナ

@Jonah悲しいことに、パスが閉じている場合、テキストパスコマンドは最後の文字を描画しません。そのため、ここで逆描画のトリックを使用することはできません。(そうだとしても、文字列のローテーションには6バイトかかるため、とにかく同じバイト数になります。)
Neil

9

05AB1E、12バイト

gIR7._•Íη•Λ

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

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

という意味1, 3, 3, 1, 7, 5, 5, 7ですか?
ニール

ああ、あなたは正しい。数字を少し混同しました
ドリアン

6

JavaScript(ES6)、 157 155  154バイト

文字のマトリックスを返します。

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

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

どうやって?

nw×h

  • w=4n3
  • h=2n1

0n1

ひし形でスキップする必要がある中心文字の0から始まるインデックスは次のとおりです。

p=6n6

n=4

ここに画像の説明を入力してください

コメント済み

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

私はあなたのソリューションに触発された136バイトのソリューションを持っていますが、今では別の答えとして修飾するのに十分異なるかもしれないと思います。
ニール

@Neil新しい回答として投稿する必要があります。
アーナルド

3

JavaScript(ES6)、136バイト

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

2次元配列を返します。中央のセルが自動的に上書きされるように、文字列を配列に描画して、最後から逆方向に移動する宛先座標を直接計算します。説明:

(s

入力文字列。

,l=s.length-1

「バウンス」間の距離。最後の行インデックスの半分で、長さよりも1つ小さい。

,z=l*4

最後の列インデックス、描画するテキストの長さの半分。

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

スペースの配列。

,g=x=>x--

最後のセルから最初のセルまでカウントダウンします。

  ?g(x

残りのセルを処理するための再帰呼び出し。

    ,a[a[y=(x+l)%z]?y:z-y]

このセルの行を計算します。

      [x>z?z+z-x:x]=s[x%-~l])

このセルの列とそこに属する文字を計算します。

  :a

配列を返すことで終了します。

)=>g(z+z)

テキストの最後から開始します。





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