旋出字母!


13

看下面的字符串。注意到模式吗?

ABEFNOPEFGH
直流GQI
人力资源部
陆纪SK
DTL
暨
BAZYXWV N
环氧乙烷
DP
CQ
BAZYXWVUTSR

正如某些人可能已经注意到的那样,它基本上是字母的螺旋形,行/列之间的距离逐渐增加1个空格/换行符。

严谨的定义

  • 让我们有一个计数器c,它最初是0。
  • 我们从左到右写出字母表的前c + 1个字母:A
  • 然后,从顶部到底部的下一个(C + 1)(C + 2)/ 2字母(附加B): AB

  • 从左到右,下一个(c +1)(c + 2)/ 2(加C):

    AB
     C
    
  • 从下至上,接下来的c +1个字母(加D):

    AB
    DC
    
  • 到达周期的终点。因此,让我们增加c(变为1)。然后,它从第一步开始,唯一的区别是,从本循环的最后一个元素开始,我们使用下一个c + 1个字母,而不是使用字母表的c + 1个字母(在这种情况下,因此,我们继续进行)。当到达,它的周期从后。DEFG...ZA

任务

给定整数N(对于1索引为正数,对于0索引为负数),输出螺旋的前N个循环。

规则

  • 您可以使用小写字母或大写字母,但是您的选择必须一致(只能使用其中之一,不允许混用)。

  • 您可以输入和通过任何提供输出的标准方法,在任何编程语言,但同时指出,这些漏洞被默认禁止的。

  • 可接受的输出格式:多行字符串,代表行的字符串列表,包含多个字符列表的列表(每个字符代表一行)或其他您认为合适的格式。如果您不选择第一种格式,最好包含漂亮的代码版本。

  • 这是,因此满足要求的最短代码(以字节为单位)(每种语言)将获胜!


测试用例

输入整数将通过换行符与其对应的输出分开,并且测试将使用破折号分隔。请注意,这些是1索引的。

1个

AB
直流电

--------

2

ABEF
直流
MH
立志 

--------

3

阿贝诺夫
DC GQ
人力资源部
LKJI S
DT
铜
BAZYXWV

-------

4

ABEFNOPEFGH
直流GQI
人力资源部
陆纪SK
DTL
暨
BAZYXWV N
环氧乙烷
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
直流GQIK
吉尔吉斯斯坦
LKJI SKM
DTLN
酷摩
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
牛
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
HR
LKJI SKMA
DTLNB
CUMOC
BAZYXWV NPD
EOQE
DPRF
中国质量监督总局
BAZYXWVUTSR TH
瑞
QVJ
密码
OXL
NMLKJIHGFEDCBAZY M
序号
反渗透
合格品
PQ
要么 
NMLKJIHGFEDCBAZYXWVUTS

我认为测试用例应该为n = 1,2,3,5,6。
TFeld

Answers:


9

木炭,31字节

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

在线尝试!链接是详细版本的代码。注意:由于某些原因,去混响器输出尾随分隔符。说明:

F⮌…⁰NB

以相反的顺序绘制框(从大到小)。

⁺²⊘×ι⁺³ι

计算盒子的大小。

⭆α§α⁺λ

使用旋转的字母绘制框的边框。

÷×ι⊕×ι⁺⁹⊗ι⁶

计算将出现在框左上角的字母(0索引)。


6

Python 2,176个字节

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

在线尝试!

说明

我们构建一个大小合适的空数组,然后像这样从左上角开始在其上移动:

  • 1步→,1步↓,1步←,1步↑

  • 3步→,3步↓,3步←,3步↑

  • 6步→,6步↓,6步←,6步↑

  • 10步→,10步↓,10步←,10步↑

每次找到一个空白单元格时,我们都会在该位置放置一个字母,然后循环到字母表中的下一个字母。

在代码中,s%4是方向(→↓←↑),我们执行了多次:

TriangularNumber(s/4) = s/4*(s/4+1)/2.

高尔夫机会

  • 是否有一个更短的方式映射s%41,0,-1,0abs(2-s%4)-1

  • 是否有一个更短的方式映射s%40,1,0,-1s%2-s%4/3*2

学分

  • Xcoder先生保存了一个字节。

2
+1哇,这真是太好了。花了我一段时间来弄清楚它是如何工作的。我发现了一个速记21/(s%4+3)%3-1s%2-2*(s%4>2)179个字节)。虽然它可能仍然可以打高尔夫球
Xcoder先生17年

4

C, 305281 字节

感谢@先生。Xcoder可节省四个字节!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

在线尝试!


1
第一次看到#definefor for((实际上节省了字节)。向我+1。:)
凯文·克鲁伊森

2

Python 2中262个 260 254 245字节

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

在线尝试!

具有更多数学功能的新方法!

返回字符列表。


旧版本:

Python 2中322个 321 308 298字节

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

在线尝试!


@ Mr.Xcoder .49在这种情况下是否还不够,还是在输入大量内容时失败?
凯文·克鲁伊森

1
@KevinCruijssen不确定,但这可以确保260个字节
Xcoder先生17年

我不太了解Python,但是是否可以为制作一个内联变量i<j,因为您使用了四次?
凯文·克鲁伊森

1
+1==1+我以前的方法是打高尔夫球245个字节
Xcoder先生,2017年

1

Perl 5,177 +2(-nl)= 179字节

Xcali节省了2个字节

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

在线尝试


您可以使用-1代替来保存一个字节$#O。同时使用$,代替$n可以让您for$_.=$"x$n for@O
Xcali

谢谢,我一直在寻找其他改进,但暂时找不到
Nahuel Fouilleul

保存了2个字节,将正则表达式更改s/ (?=\S)/n/es/.*\K /n/e
Nahuel Fouilleul '17

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.