将字母滚动成螺旋形


22

编写一个程序或函数,如果给出n,将打印一个螺旋n字符,该螺旋字符由拉丁字母组成,并ABCDEFGHIJKLMNOPQRSTUVWXYZ根据需要重复。此螺旋应仅向前穿过字母。

字母螺旋有关,尽管螺旋向前和向后贯穿字母,并且螺旋是恒定的。

测试用例

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

规则

  • 您的输入将是一个非负整数0 <= n <= 1000,但理论上您的代码应处理任何非负整数。
  • 您的输出格式可以是任何理智的格式,必要时可以使用定界符。
  • 旋转和反射是等效的。
  • 您的字母可以是大写或小写。
  • 螺旋中的空白区域可能会填充您认为合适的所有非字母空值。
  • 螺旋本身可以是您认为合适的任何形状。矩形螺旋与ASCII解决方案效果最佳,但图形解决方案与圆形螺旋相比可能更短。
  • 允许前后空格和换行符。
  • 这是代码高尔夫。以字节(或等效值)为单位的最短答案为准。

与往常一样,如果有任何不清楚或不正确的地方,请在评论中告知我。祝你好运,打高尔夫球!


大多数编辑器不允许打印那么长的字符串
t-clausen.dk '16

@ t-clausen.dk我选择了标准的带符号的32位整数最大值。如果你有一个上限值,更好的建议,我很乐意在编辑它。
Sherlock9

好棘手的:-)
乔芬(Joffan)

Answers:


12

徽标,129 87字节

图形化解决方案,实现为功能

这是基于Calormen.com的徽标解释器构建。该S函数将字符数作为参数并将其绘制成螺旋形。 T功能可垂直输出字母,以防止其随螺旋旋转。。我认为忽略校正字母方向看起来更好(并且打了42个字节)。我还拉紧了间隔,但没有改变字节数。如果您实际上要汇总一个字母,无论如何它看起来都更像这样。

更新版本(字母册)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

调用方式

调用如下:S 迭代

样品输出

S 1000

1000次迭代的样本输出

旧版本(字母始终直立)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

删除旧的输出以节省空间。 在这里看到它


不要问我是怎么想到数学的。我尝试在线搜索公式,但是大多数方法是通过保持转弯角恒定并增加线段长度来解决该问题,而我想保持线段长度恒定并更改角度。反复试验似乎导致了一个稳定的公式。调整95会改变螺旋的紧密度,而改变15会改变字母的线性间距。
GuitarPicker

9

使用Javascript(ES6),203个 201字节

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

演示版

下面的演示最好在整页中运行。


7

R,46或51个字节,取决于间距

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

在此处输入图片说明

(绘图的更新版本:默认情况下不绘制灰色螺旋线,但我在添加后显示字母确实位于螺旋线上。)

螺旋线的间距不是恒定的,所以我希望这是可以的。如果需要恒定的间距,请s=(1:scan())^.5改用开始,然后在总数中增加5个字节。然后输出如下(n = 150):

在此处输入图片说明


3
螺旋的间距完全取决于您。不过,我确实有两个建议:1)保持第二个螺旋。即使它不太打高尔夫球,它也会增加您的答案;2)您可以画出一条螺旋线穿过第一个螺旋图中的字母吗?只是为了使字母螺旋更清晰。
Sherlock

6

蟒3.5,180个 157 152 147 141字节

-6由于Sherlock9

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

-5由于Kap。

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

修订版解决方案,python 3.x:

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

先前的解决方案:

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

说明

r是包含螺旋的列表的列表。基本思想是将新字母添加到螺旋(r[-1].append(chr(x%26+65)))的底部。当底部排满时,将螺旋线顺时针旋转90度,并将新的空排添加到底部(r = list(zip(*r[::-1]))+[[]])。

诀窍是弄清楚何时旋转螺旋。在第一个解决方案中,生成器(j<1for i in R(n)for j in R(i//2+1))生成一个True / False值序列,该值指示何时旋转螺旋线。在修订的解决方案中,我更改了r初始化方式。现在,当底行的长度等于顶行的长度时,需要旋转螺旋线。


您可以替换if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]使用if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]],以节省5个字节。
R. Kap

由于只使用range一次,因此可以删除R以保存字节。您也可以通过将答案转换为完整的程序来节省字节,尽管要保留的使用[*zip(*r[::-1]),[]],您需要使用range(int(input()))
Sherlock

另外,for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]由于您正在检查最后一行何时等于或大于第一行。
Sherlock

两件事:1)您可以通过用分号分隔语句来使for循环长一行;和2)您尚未n在此版本中定义。您需要使用int(input())或包装成一个函数。
Sherlock16年

2个字节来自压缩for循环:for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
Sherlock9'9

5

MATL21 18字节

X^Xk1YL1Y2y)wG>~*c

输入0错误退出(默认情况下允许)。

在线尝试!

说明

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1 
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

5

Python 2,84 82字节

我再次使用Turtle。好有趣!:D

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

在线尝试

不幸的是,Trinket.io的画布很小。我改变了9+i9+i/9和调整龟对屏幕捕捉这一形象,让更多的输出将适合的目的出发点:

输出


如果从导入中删除空格,则一个字节:from turtle import*另一个字节从更改whilefor i in range(input())
Sherlock9'9

4

Pyth,32个字节

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

一个打印矩形小写ASCII螺旋的程序。根据输入,可能存在一行或一列前导或尾随空白。

在线尝试

怎么运行的

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print

3

TSQL,386个 362 358 306字节

请注意,TSQL没有旋转文本的方法。该脚本从A开始,计算下一个字母应放在哪个方向。(右,下,左,左,左,上,上,右...)

该脚本最多可以处理7744个字母。

打高尔夫球:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

取消高尔夫:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

小提琴


2

Python 2,243字节

r=range(input())
a=[1j**int((4*i+1)**.5)for i in r]
b=[map(int,(-sum(a[:i]).real,sum(a[:i]).imag))for i in r]
c,d=zip(*b)
for i in range(min(c),max(c)+1):print''.join([i,j]in b and chr(b.index([i,j])%26+65)or' 'for j in range(min(d),max(d)+1))

伊迪恩!


0

PHP,219字节

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

在线尝试!

PHP,260字节

旧版

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\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.