嵌入式六边形!


18

您的任务:给定一个整数n,按照以下规则生成一个嵌入的六角形图案,直到第n个深度。

嵌入的六边形具有以下基本形状:(n=0

 __      
/  \
\__/

嵌入式六边形n=1n=2

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

每侧的长度是先前深度中同一侧的长度的2倍乘以2。顶部和底部的长度为2个字符n=0,其余部分以1个字符的长度开头。非上下边的长度应2^n较长(OEIS:A000079),上下边应遵循规则2^(n+1)(相同的OEIS)。

当前的六边形是0索引的,如果需要,您可以选择使用1索引。

这是,所以最短的答案会成功!


@LuisMendo好的,我将更改名称。
“ SparklePony同志” 17年

可能很难处理大量输入(例如64)。有限制n吗?
马修·罗

@SIGSEGV n不受限制。
“ SparklePony同志” 17年

1
会很高兴看到Hexagony中的答案:))
Xcoder先生17年

1
呵呵,我的Koch曲线提交中的乌龟图形也可以做到这一点(仅更改了第一个功能)。当然太久这一点,虽然:)
与Orjan约翰森

Answers:


10

木炭40 29字节

@Neil通过将while循环更改为for循环以及其他技巧而节省了11个字节

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

在线尝试!

说明(过时)

该程序首先生成最大的六边形,然后在while循环(1索引)中一对一地做较小的六边形。作为参考,α是输入数字,β是包含的变量,2^(α-1)并且ι是循环中的迭代变量。

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

我注意到没有“你好,世界!” 木炭程序。您应该添加它。
mbomb007 '17

@ mbomb007难道不是简单的“如果该语言不包含任何命令,它将打印其源文件”的副本吗?
尼尔

当我意识到×_X²ι与相同时×__β,我保存了一些字节,并通过将your转换为来保存了更多字节,这也避免了必须存储输入数字。在线尝试!
尼尔

@Neil谢谢,这很整洁:)
Kritixi Lithos

5

Haskell中230个 217 207字节

编辑:

  • -13个字节:@xnor看到了我的 #可能只是max
  • -10个字节:而且也是zipWithp可以合并成一个?操作符,我会(在某种程度上!)重新实现replicate

mInteger并返回String

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

在线尝试!

怎么运行的

  • m是主要功能。它用于&生成具有适当填充的六边形,然后将其折叠在一起o
  • l&t生成一个边长较小的六边形t,填充在边长较大的一个内部l,作为String线的列表。
    • a 是六边形的顶线,并带有下划线。
    • b是六边形上半部分其他行的列表。的线b在矩形的填充中居中;这可以使下一步工作。
    • 六边形的下半部是a重叠的顶部bo,然后反转(线的顺序和每行之内)。
  • c接受两个参数,一个长度列表和一个字符串,并生成一个字符串,该字符串具有原始字符中每个字符的副本与相应长度一样多,例如c[1,3,2]"abc" == "abbbcc"。用于&生成线。
  • o 接受两个表示图片的参数作为行列表,并将第一个较小的参数覆盖在第二个参数的顶部。
    • 它既可用于组合六边形,也可用于将底部添加到每个六边形。
    • 它的工作原理基本上是使用?两次,在第一张图片的上下左右都填充无数个空格,然后使用max,将相应的字符压缩在一起,如果有,则选择非空格字符。
  • (f?e)l m焊盘的列表l通过附加无限多的“e”的元素,那么拉链结果列表和该列表mf功能。

1
不错的解决方案!我认为(#)可以max
xnor

1
可以与zip合并p以节省字节:o=max?' '?"";f?e=z f.(++repeat e)。可能会更短一点。
xnor

2
(\n->(<$[1..n]))replicate
xnor

@xnor replicate吗?现在,这真令人尴尬。我只是太习惯了<$[1..n]或者[1..n]>>几乎总是赢。但是,我不知道如何?进一步缩短。我已经尝试过使ppointpoint 变得无意义,而++正是在错误的地方,用炸毁了东西flip
与Orjan约翰森

3

JavaScript(ES6),258个字节

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

说明:对于第一个六边形之后的六边形,首先生成前一个六边形并将其填充到每一侧(这取决于输出是矩形)。(对于第一个标题,将创建一些虚拟填充。)将生成六边形的顶部和顶部,并将所有空间与先前的六边形合并。(为了使六边形对齐而进行一些技巧;如果允许额外的边距,这会更容易。)六边形的底边类似于顶边生成,然后填充六边形的底部。必须注意返回矩形输出(包括尾随换行符),以便递归起作用。


所以,您要证明这是铁氟龙(Teflon)和深盘披萨(Deep Dish Pizza),都是真正相似的结构吗?有点整洁。
AdmBorkBork

1
@AdmBorkBork我还有其他答案可以做到这一点;这些对角线/在ASCII艺术中很流行,并且该replace方法是在JavaScript中生成它们的相对便宜的方法。
尼尔

1<<n>>1:对称性好;-)
路加福音

@Luke我可以将变量更改为,例如,v但是不幸的1是,我的任何常用字体中的变量都不对称。
尼尔,

2

PHP,337字节

0索引

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

在线尝试!

展开式

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
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.