扩大六角形


24

给定ASCII艺术六边形作为输入,输出边长都长一个单位的一个。

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

输入六边形将具有180度对称性,但否则边的长度可以全部不同。在上方,边长(2,4,3)扩大为(3,5,4)。边长将为非零。

六边形由下划线_,斜线/和反斜线组成\。请注意,在水平边缘(带下划线)中,顶部边缘位于其自己的线上,而底部边缘则不在。

输入输出

我将成为一个粘糊糊的人,在这里需要使用格式:输入和输出应该是一个包含换行符的字符串,该字符串代表图像,而不是行列表。当然,您的代码可以依次打印每一行以产生图像,或者,如果您的语言可以做到的话,您也可以读一次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。
ElPedro

我们可以返回一个IEnumerable字符数组吗?
的无知的体现

@EmbodimentofIgnorance是的,只要具有必需的换行符,这些都很好。
xnor

Answers:



5

视网膜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层和左右的2层包围

{⊃0~⍨1⌷⍵,⍨⍉⍵}⌺3 3 对于每个单元格,请从以其为中心的3x3邻域中的第一个非0中选择:上,下,左,右

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行重复了第二行和最后一行,但没有_字符。

第3行在第2行中需要的地方添加空格。

第4行将一个_的两个___边加宽,并将@l行数组作为一个多行字符串返回。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.