六角形を展開する


24

ASCIIアートの六角形を入力として指定し、辺がすべて1単位長い出力1

                     _____
  ____              /     \
 /    \            /       \
/      \          /         \
\       \   =>    \          \
 \      /          \         /
  \____/            \       /
                     \_____/

入力六角形は180度の対称性を持ちますが、それ以外の場合、辺はすべて異なる長さにできます。上記では、辺の長さ(2、4、3)は(3、5、4)に拡大されます。辺の長さはゼロ以外になります。

六角形は、アンダースコア_、スラッシュ/、およびバックスラッシュで構成されています\。(アンダースコアで作成された)水平エッジのうち、上端は独自の線上にありますが、下端はそうではありません。

I / O

ここではスティッカーになりますが、ここでは書式設定が必要です。入力と出力は、行のリストではなく、イメージを表す改行を含む文字列にする必要があります。もちろん、コードは各行を順番に印刷して画像を生成するか、言語がそれを行うことができる場合は入力のために1行ずつSTDINを読み取ることができます。

詳細

入力には、必要に応じてオプションの末尾の改行を含めることができますが、それ以外の場合は空の行はありません。入力に末尾のスペースがないようにするか、各行を同じ長さ(最長の行)に埋め込むスペースを選択できます。

出力は、入力と同様に画面の左端と同じ高さにする必要があります。上下に余分な改行があり、末尾にスペースがある場合があります。

テストケース

入力に続いて出力。

 _
/ \
\_/

  __
 /  \
/    \
\    /
 \__/

  ____
 /    \
/      \
\       \
 \      /
  \____/

   _____
  /     \
 /       \
/         \
\          \
 \         /
  \       /
   \_____/

     _
    / \
   /  /
  /  /
 /  /
/  /
\_/

      __  
     /  \
    /    \
   /     /
  /     /
 /     /
/     /
\    /
 \__/

リーダーボード

<iframe src="https://xmikee1.github.io/ppcg-leaderboard/?id=185760" width="100%" height="100%" style="border: none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>


出力六角形は同じである必要がありますが、それより大きいか、適切な辺の長さの六角形にすることができますか?
スティーブン

1
@Stephenそれは同じものである必要がありますが、同じ方向でより大きくなければなりません。
xnor

2
これは、本当によく書かれた課題の素晴らしい例です。短く、明確で要点まで。ちょっとした提案をしてもいいですか?「Stickler」は、英語を母国語としないすべての人にとって明確ではない場合があります。「私は...を受け入れるだけです」または同様のものが理解しやすいかもしれないと提案できますか?とにかく+1。
エルペドロ

IEnumerable文字の配列/を返すことができますか?
無知の具現化

@EmbodimentofIgnoranceはい、必要な改行文字が含まれている限り、それらは問題ありません。
xnor

回答:



5

Retina 0.8.2、84バイト

m`(¶.*)( .)$
$1   $2
(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2
( *.)(_+/)$
$1$.2$*   /¶ $1_$2

オンラインでお試しください!不規則な六角形で動作します。I / Oはパディングされていません。説明:

m`(¶.*)( .)$
$1   $2

六角形の内部を広げます。

(_+¶)(( */)  ( *.))
 _$1 $3$4¶$2

上部を修正します。

( *.)(_+/)$
$1$.2$*   /¶ $1_$2

下を修正します。


5

JavaScript(ES6)、 159 156 153  150バイト

s=>s[r='replace'](/\S /g,'$&   ')[r](/.*/,s=>s[r](e=/_+/,` $&_
`+s[r](e,'/$& \\')[r](e=/_/g,' ')))[r](/ *\\_+/,s=>s[r](e,' ')+`   /
 `+s[r](/_/,'__'))

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

コメント済み

注意:SE構文ハイライターが凶暴になるのを防ぐために、正規表現の区切り文字に代替文字が使用されています。

s =>                       // s = input
  s[r = 'replace'](        // r = alias for 'replace'
                           // STEP #1
    \S g,                // insert two middle spaces for all lines
    '$&   '                // that contain a border, followed by a space
  )                        // (i.e. all lines except the first and the last one)
  [r](                     // STEP #2
    ∕.*∕,                  // isolate the first line
    s =>                   // let s be this first line
      s[r](                //
        e = _+∕,          // find the sequence of underscores and replace it with:
        ` $&_\n` +         //   the same sequence preceded by a space and followed by '_'
        s[r](              //   followed by a linefeed and:
          e,               //     the same sequence preceded by '/' and followed by ' \'
          '/$& \\'         //     
        )                  //     with:
        [r](e = _g, ' ') //     all underscores replaced with spaces
  ))                       //
  [r](                     // STEP #3
     *\\_+∕,              // isolate the last line, without the trailing '/'
    s =>                   // let s be this last line
      s[r](e, ' ') +       // replace all underscores with spaces
      `   /\n ` +          // append 3 spaces and a trailing '/', followed by a linefeed
      s[r](∕_∕, '__')      // append s with an extra underscore
  )                        //

2

、48バイト

SθW¬№ω_≔⁺ωSω≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ↗ζθ↓↘η←↙ζ↑←θ↖η

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

SθW¬№ω_≔⁺ωSω

最初の行を除くすべての行を入力および連結します。(JSON形式で入力すると、11バイトの節約でこのほとんどが不要になります。)

≔⊕⊘№ω\η≔⊕⊘№ω/ζ≔×_⊕№ω_θ

文字列内の/s、/s、および_s の数をカウントし、それを使用して新しい辺の長さを計算します(_s の場合_、その長さのsの文字列として)。

↗ζθ↓↘η←↙ζ↑←θ↖η

拡大した六角形を描きます。

代替ソリューション、48バイト:

SθW¬№ω_≔⁺ωSω≔⁺θωθF²«≔E\/_⊕⊘№θκη×_⊟ηM⁰¬ιFη«↷¹κ↷¹¶

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

SθW¬№ω_≔⁺ωSω≔⁺θωθ

すべての行を入力します。(JSON形式で入力すると、17バイトの節約でこれが不要になります。)

F²«

六角形の右上と左下のセクションを個別に描画します。

≔E\/_⊕⊘№θκ

文字列内の/s、/s、および_s の数をカウントし、それを使用して新しい辺の長さを計算します。

η×_⊟ηM⁰¬ι

一番上または一番下を出力し、これが一番上の行である場合は下に移動します。

Fη«↷¹κ↷¹¶

右側または左側の両方を描きます。


2

APL(Dyalog Unicode)75 74バイトSBCS

' /\_'∘{⍺[a×1=(+⍀×a)⌊⊖+⍀⊖×a2⌈/{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3(0,0,⍨⍉)⍣3⍉⍺⍳↑⍵]}'.+'s'&'

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

'.+'⎕s'&' 入力を行に分割する

↑⍵ 行を行列に混ぜる

⍺⍳ 取り替える ' /\_'0 1 2 3

(0,0,⍨⍉)⍣3⍉ 上下に0のレイヤーと左右に0の2つのレイヤーで囲む

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 各セルに対して、最初の非0を選択します:中心にある3x3近傍か​​ら上、下、左、右

2⌈/ 水平方向のペアで最大

a×1=(+⍀×a)⌊⊖+⍀⊖×a← 0以外の外側の境界のみを保持する

⍺[ ]置き換える0 1 2 3' /\_'



0

Perl 5の177の 156 145バイト

@l=pop=~/.+/g;splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;join("\n",@l)=~s,_+,$&_,gr

短くできますか?まだまだわからない。コメントと追加された改行とヘッダー+フッター付き:

sub f {
@l=pop=~/.+/g;                                                      #1
splice@l,$_,0,$l[$_]=~s,_, ,gr for-1,1;                             #2
$l[$_]=~s, (\S)( +)(\S),$_<2?" $1$2 $3":"$1$2   $3",e for 1..@l-2;  #3
join("\n",@l)=~s,_+,$&_,gr                                          #4
}

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

行#1は、複数行の入力文字列を@l配列に分割します。

行#2は、_文字なしで2行目と最後の行を複製します。

行#3は、行2の必要に応じて最後から2番目にスペースを追加します。

行#4は、1つの_で2つの___側を広げ、1行の@l配列を1つの複数行文字列として返します。

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