棋盘格!


18

介绍

来自维基百科

平面的细分是指使用一个或多个几何形状(称为图块)的平铺,没有重叠且没有间隙。

下面显示了一个众所周知的细分:

在此处输入图片说明

菱形的平铺方式不会导致重叠或间隙,并模拟了立方的互换列。

任务

您的任务是编写一个与上面的图像相同的镶嵌菱形的程序。程序的输入将为镶嵌的尺寸:height x width,其中width是列数,height是行数。

单个立方体1 x 1(菱形的3个图块)的表示方式如下:

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

因此,如果输入/尺寸为3 x 2,则应为输出:

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

如您所见,有3行(高度)和2列(宽度)。列上下互换。您的程序也应该这样做,并从头开始。例如,3 x 3将是:

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

规则

  • 必须输出结果,可以按照您喜欢的任何方式进行输入,但必须与高度和宽度相对应
  • 允许尾随换行符
  • 细分列始终从上方开始,然后上下交替
  • 镶嵌的侧面必须共享,并且镶嵌必须正确地放置在其他列之间,且不能有间隙
  • 您提交的内容可能是功能或完整程序
  • 在给定相同输入的情况下,您的程序必须完全打印上面的输出;换句话说,多维数据集/镶嵌的输出必须遵循相同的格式

假设条件

  • 您可以假设输入将始终大于1 x 1,因此您不需要输入零的情况

计分

这是,因此以字节为单位的最短代码获胜。也禁止使用标准漏洞

Answers:


4

JavaScript(ES6),243个字节

f=
(h,w)=>[...Array(h*6+4)].map((_,i)=>[...Array(w*9+3)].map((_,j)=>i&&(i+j+3)%6==0&&j%9<(i>3?6:3)&&(i>3|j<w*9)&&(j>2|i<h*6)?'/':i&&(i-j+2)%6==0&&j%9<(i>h*6?j<w*9?3:0:6)?'\\':i%3==0&&j>2&&(i*3+j+14)%18%(!i|i>h*6?18:12)<4?'_':' ').join``).join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

直接计算所有需要的字符。对于/

i&&                         Not on first row of output
(i+j+3)%6==0&&              Backward diagonals
j%9<                        Not on top (right) diamond of hexagons or
    (i>3?6:3)&&             empty spaces on top half row
(i>3|j<w*9)&&               Not on top right corner of output
(j>2|i<h*6)                 Not on bottom left corner of output

对于\

i&&                         Not on first row of output
(i-j+2)%6==0&&              Forward diagonals
j%9<                        Not on bottom (right) diamond of hexagons or
    (i>h*6?                 empty spaces on bottom half row or
        j<w*9?3:0:6)        bottom right corner of output

对于_

i%3==0&&                    Every third line
j>2&&                       Not on left two columns
(i*3+j+14)%18%              Every 18 characters
    (!i|i>h*6?18:12)<4      One or two groups

3

Befunge,277 269字节

&6*4+00p&:55+*3+10p2%20pv@
6+5:g03%*54:::<<0+55p03:<<v%*54++55:\p04:**`+3g03g00`\g01+*3!g02\-*84g+3+!\%
48*+,1+:10g`!#^_$,1+:00g-|>30g:2+6%\3-!+3+g48*-\:2`\20g3*+10g\`*30g2`**40g!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

在线尝试!

这个问题看似容易,但实际情况却比我最初预期的要复杂。我能想到的最好方法是将奇数和偶数列作为单独的渲染进行处理,然后仅合并结果。

因此,对于必须输出的每个x,y坐标,我们首先需要通过将xy输出坐标映射到多维数据集图中的uv坐标来确定应为奇数列呈现什么字符,如下所示:

u = x%20
v = (y+5)%6 + (y==0)

的添加(y==0)是为了处理第一行的特殊情况。但是,我们还需要确保没有在列的底部显示最后几行,而在每行的末尾不显示最后几个字符。这是通过将输出字符与表达式相乘来实现的:

(y > h-3) && (x > w-3*!(columns%2))

!(columns%2)宽度的计算是因为我们需要剪掉端的量取决于总列数是偶数还是奇数。

然后,我们进行第二次计算以确定应为偶数列呈现什么字符,并映射uv坐标,如下所示:

u = (x+10)%20
v = (y+2)%6 + (y==3)

这与用于奇数列的基本计算相同,但略有偏移。和以前一样,我们需要确保不在边界上呈现某些字符-这次是在列顶部的前几行,以及在每一行的开始和结束处的某些字符。在这种情况下,我们相乘的表达式是:

(y > 2) && (x > 2) && (x < w-3*(columns%2))

计算了这两个潜在的输出字符后,使用的最终值为:

char1 + (char2 * !char1) + 32

换句话说,如果char1为零,则需要输出char2,否则输出char1。如果两者都不为零,我们将仅输出char1,但这很好,因为它们无论如何都是相同的值。还要注意,这些字符值偏移32(因此加上32),因此零总是以空格结束。


2

批处理,590字节

@echo off
set c=call:c 
set b=\      \
set f=%b:\=/%
set s=       
set u=_____
set w=%2
%c%"   " " %u%" "%s%%s%"
%c%"  " "/%b%" "%s%    "
%c%" " "/  %b%" "%s%  "
%c%"" "/    \ %u%\" " %u% "
for /l %%i in (1,1,%1)do %c%"\" "    %f%" "%b%"&%c%" \" "  %f%" "  %b%"&%c%"  \" "/%u% /" "    \ %u%\"&if %%i lss %1 %c%"  /" "%b%" "    %f%"&%c%" /" "  %b%" "  %f%"&%c%"/" "    \ %u%\" "/%u% /"
%c%"   " "" "%s%\    %f%"
%c%"  " "" "  %s%\  %f%"
%c%" " "" "    %s%\/%u% /"
exit/b
:c
set o=%~1
for /l %%j in (%w%,-2,1)do call set o=%%o%%%~2&if %%j gtr 1 call set o=%%o%%%~3
echo(%o%

:c子例程具有三个参数;%3是1列和2列%2之间的差,是2列和3列之间的差,%1是第一列的额外前缀,所以一个列是%1%2,两列是%1%2%3,三列是%1%2%3%2,四列%1%2%3%2%3等等。


2

Python 2中329 326 319个字节

h,w=input()
a,R=[' '*10]*3,range
b='  /\      \  # /  \      \ #/    \ _____\#\    /      /# \  /      / #  \/_____ /  '.split('#')
c=['    _____    ']+b*h
e,o=c+a,a+c
k=len(e)
f=e[:]
o[3]=o[3][:10]
for x in R(1,w):
 for y in R(k):f[y]+=((e[y][3:],e[y])[y in R(4)],(o[y][3:],o[y])[y in R(k-3,k)])[x%2]
print'\n'.join(f)

在线尝试!

实际上比我以前的错误帖子短21 24 31字节。为奇数和偶数列创建列表,然后针对宽度中的每一列将它们连接起来。


做得好,打高尔夫球祝您好运
Andrew Li

1
您的提交存在一个问题。列交替上下移动,而不是连续向下
Andrew Li

1
我已经编辑了问题,以包括3x3的示例。
安德鲁·李

当然,很好的答案!
安德鲁·李
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.