ASCII螺旋线间隔良好


13

考虑这个螺旋

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

从中心出发:

  • 第一行(向上)包含3个字符。
  • 第二行的字符数相同(3)
  • 接下来,在接下来的两边添加两个字符(5)。
  • 此模式继续,两个边的长度相同,然后将长度增加2。

我想为N条线生成此螺旋线。

  • 用任何语言写。
  • 输入/参数等是螺旋中的行数。
  • 每行以上一行的顺时针方向90度方向从上一行的结束字符开始。
  • 我不在乎每行之前或之后有多少空格,只要螺旋的元素排成一行即可。
  • 输出文本以使用您选择的任何非空白字符绘制螺旋。
  • 尝试以最少的字节数执行此操作。

测试用例(使用哈希作为输出):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy“输出文本以使用您选择的任何非空白字符绘制螺旋。” 是的,随便你。
AJFaraday


3
初始图片使用*代替#。预期?
Wernisch

@Wernisch本来打算是一个有用的起点,但我认为它具有误导性。您可以使用任何喜欢的字符。
AJFaraday

Answers:


11

05AB1E13 11字节

码:

感谢Emigna节省了两个字节!

LDÈ-Ì'#3Ý·Λ

使用05AB1E编码。在线尝试!

说明

螺旋上每个边的长度从长度3开始,然后每两步逐渐增加2:

3,3,5,5,7,7,9,

对于具有边的螺旋,我们只需要将该列表修剪为。这是通过以下代码完成的:nnn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

这基本上给了我们所需的长度列表。

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

canvas的功能是弹出三个参数(首先弹出最右边的参数):<length(s)><char(s)><direction(s)>。directions参数在这种情况下是数字列表。与方向相对应的数字是:

[70162543]

在这种情况下,[0,2,4,6]对应于方向列表[↑, →, ↓, ←]。画布在从长度列表中检索的每个长度上进行迭代,使用'#'字符并在方向列表上进行循环迭代。


0246S=3Ý·
艾米娜(Emigna)

@Emigna啊,我没想到,谢谢!
阿德南(Adnan)

6

Python 2中176个 170 165 161 157字节

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

在线尝试!

重复:用于将螺旋线gn第n次迭代旋转到“规范”位置(类似于N = 3或N = 7),通过在每个现有行的左侧添加2个空格,然后替换最后一行来添加新分段与所有'#'s(结果的位置可与N = 4或N = 8相比较),最后g再次使用将其旋转回正确的位置。泡沫,冲洗,重复。


4

木炭16 15 14 字节

↶FN«¶×#⁺³⊗÷ι²↷

-2个字节感谢@Neil

在线尝试(详细)在线尝试(纯)

说明:

默认情况下,打印方向是向右,我们要向上开始,因此我们从逆时针旋转45度开始:

PivotLeft();
↶

然后i在范围内循环[0, input)

For(InputNumber()){ ... }
FN« ...

打印换行符来模拟向后移动一个位置的效果:

Print("\n");
¶

x在当前方向上打印“#” 次:

Print(Times("#", ... ));
×# ...

哪里x3 + i // 2 * 2

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

然后顺时针旋转45度,以进行下一次循环:

PivotRight();
↷

我认为木炭中没有向后移动的命令?
Emigna

@Emigna不确定,但我也找不到。当我编写此答案时,确实是在寻找自己。有一个具有给定方向的移动,以及一个具有给定坐标的跳转,但不幸的是没有MoveBack。
凯文·克鲁伊森

1
⊗÷ι²⁻ι﹪ι²。短一个字节。另外,通过\n#s 之前打印a可以获得返回的效果,这将使您删除»#可以节省更多的总字节。
尼尔

@Neil感谢您⊗÷ι²,但是\n#s 之前打印a将有什么变化?如果添加,螺旋线是不正确的Print("\n")
凯文·克鲁伊森

因为现在手臂重叠了,所以您需要使其#更长一些。
尼尔

3

Python 2中179个 178字节

感谢Kevin Cruijssen的-1个字节。

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

在线尝试!


Python 2,179字节

在这种方法中,公式用于xy增量,而不是查找列表。

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

在线尝试!


n+1+n%2n%2-~n-1个字节。而且我需要记住0--n/4*2比短1 -(-n/4*2)。好的回答,我+1。
凯文·克鲁伊森

1

JavaScript(ES6),185个字节

当然这可以打更多的球,也许是用弯弯曲曲的,但这是我非常谦虚的尝试。添加了换行符以便于阅读,倒数第二个字符除外

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

用法:d(10)根据N = 10挑战示例返回字符串。

定义了一个函数r(a,n)来旋转的阵列an匝数; 通过递归旋转并添加间距和线(不旋转回到起始位置)s(n)来生成表示尺寸螺旋的二维数组的功能n;以及d(n)绘制大小螺旋的函数,n根据挑战一致旋转,并呈现为返回的字符串。

这是一个非常有趣的挑战:¬)

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.