Code Golf:复活节螺旋

Gab*_*ona 22 language-agnostic code-golf spiral rosetta-stone

什么比复活节代码高尔夫球场的Spiral更合适?
好吧,我猜几乎一切.

挑战

字符数最短的代码显示由星号('*')组成的漂亮的ASCII螺旋.

输入是一个数字,R它将是Spiral的x大小.另一个维度(y)总是如此R-2.该程序可以假定R总是奇数并且> = 5.

一些例子:

Input
    7
Output

*******
*     *
* *** *
*   * *
***** *                   

Input
    9
Output

*********
*       *
* ***** *
* *   * *
* *** * *
*     * *
******* *

Input
   11
Output

***********
*         *
* ******* *
* *     * *
* * *** * *
* *   * * *
* ***** * *
*       * *
********* *
Run Code Online (Sandbox Code Playgroud)

代码计数包括输入/​​输出(即完整程序).允许使用任何语言.

我轻松击败303个字符长的Python示例:

import sys;
d=int(sys.argv[1]);
a=[d*[' '] for i in range(d-2)];
r=[0,-1,0,1];
x=d-1;y=x-2;z=0;pz=d-2;v=2;
while d>2:
    while v>0:
        while pz>0:
            a[y][x]='*';
            pz-=1;
            if pz>0:
                x+=r[z];
                y+=r[(z+1)%4];
        z=(z+1)%4; pz=d; v-=1;
    v=2;d-=2;pz=d;
for w in a:
    print ''.join(w);
Run Code Online (Sandbox Code Playgroud)

现在,进入螺旋......

Wee*_*ble 15

Python(2.6):156个字符

r=input()
def p(r,s):x=(i+1)/2;print "* "*x+("*" if~i%2 else" ")*(r-4*x)+" *"*x+s
for i in range(r/2):p(r,"")
for i in range((r-1)/2-1)[::-1]:p(r-2," *")
Run Code Online (Sandbox Code Playgroud)

感谢您的评论.我删除了无关的空格并使用了input().我仍然更喜欢在命令行中使用其参数的程序,所以这里的版本仍在176个字符处使用sys.argv:

import sys
r=int(sys.argv[1])
def p(r,s):x=(i+1)/2;print "* "*x+("*" if~i%2 else" ")*(r-4*x)+" *"*x+s
for i in range(r/2):p(r,"")
for i in range((r-1)/2-1)[::-1]:p(r-2," *")
Run Code Online (Sandbox Code Playgroud)

说明

取螺旋并将其切成两个几乎相等的部分,顶部和底部,顶部一排比底部大:

***********
*         *
* ******* *
* *     * *
* * *** * *

* *   * * *
* ***** * *
*       * *
********* *
Run Code Online (Sandbox Code Playgroud)

观察顶部是如何美观和对称的.观察底部如何在右侧有一条垂直线,但在其他方面与顶部非常相似.注意顶部每隔一行的图案:每边的星数越来越多.请注意,每个插入的行与之前的行完全相同,只是它用星星填充中间区域.

函数p(r,s)打印出宽度为r的螺旋顶部的第i行,并在后面粘贴后缀s.请注意,我是一个全局变量,即使它可能不是很明显!当我是偶数时它用空格填充行的中间,否则用星星填充.(〜%2是一种令人讨厌的方式来获得i%2 == 0的效果,但实际上根本不需要,因为我应该简单地交换"*"和"".)我们首先画出顶部随着i增加螺旋行,然后我们绘制底部行减少i.我们将r降低2并使用后缀"*"来获得右侧的星列.

  • R,S =输入() '' DEF P(I):X = I + 1 >> 1;打印'*'*X +'*'[则i%2]*(R-4*X)+'*'*X + S地图(p,范围(R/2))R- = 2 S ='*"地图(p,范围(R/2)[:: - 1])>> 126个字符 (2认同)

sfu*_*ger 6

Java的

328个字符

class S{
public static void main(String[]a){
int n=Integer.parseInt(a[0]),i=n*(n-2)/2-1,j=0,t=2,k;
char[]c=new char[n*n];
java.util.Arrays.fill(c,' ');
int[]d={1,n,-1,-n};
if(n/2%2==0){j=2;i+=1+n;}
c[i]='*';
while(t<n){
for(k=0;k<t;k++)c[i+=d[j]]='*';
j=(j+1)%4;
if(j%2==0)t+=2;
}
for(i=0;i<n-2;i++)System.out.println(new String(c,i*n,n));
}
}
Run Code Online (Sandbox Code Playgroud)

只比Python多1/6似乎不太糟糕;)

这里有适当的缩进:

class S {
    public static void main(String[] a) {
        int n = Integer.parseInt(a[0]), i = n * (n - 2) / 2 - 1, j = 0, t = 2, k;
        char[] c = new char[n * n];
        java.util.Arrays.fill(c, ' ');
        int[] d = { 1, n, -1, -n };
        if (n / 2 % 2 == 0) {
            j = 2;
            i += 1 + n;
        }
        c[i] = '*';
        while (t < n) {
            for (k = 0; k < t; k++)
                c[i += d[j]] = '*';
            j = (j + 1) % 4;
            if (j % 2 == 0)
                t += 2;
        }
        for (i = 0; i < n - 2; i++)
            System.out.println(new String(c, i * n, n));
    }
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 6

F#,267个字符

很多答案都是以空白和添加*s 开头的,但我认为从星空开始并添加空格可能更容易.

let n=int(System.Console.ReadLine())-2
let mutable x,y,d,A=n,n,[|1;0;-1;0|],
 Array.init(n)(fun _->System.Text.StringBuilder(String.replicate(n+2)"*"))
for i=1 to n do for j=1 to(n-i+1)-i%2 do x<-x+d.[i%4];y<-y+d.[(i+1)%4];A.[y].[x]<-' '
Seq.iter(printfn"%O")A
Run Code Online (Sandbox Code Playgroud)

对于那些希望了解我如何打高尔夫球的人来说,我碰巧在此过程中节省了很多进步,我在这里提出了评论.并非每个项目都是正确的,但他们都在研究更短的解决方案.

首先,我找了一个如何画白色的图案:

********* 
*       * 
* ***** * 
* *   * * 
* *** * * 
*     * * 
******* * 

********* 
*6543216* 
*1*****5* 
*2*212*4* 
*3***1*3* 
*41234*2* 
*******1* 

*********** 
*         * 
* ******* * 
* *     * * 
* * *** * * 
* *   * * * 
* ***** * * 
*       * * 
********* *

*********** 
*876543218* 
*1*******7* 
*2*43214*6* 
*3*1***3*5* 
*4*212*2*4* 
*5*****1*3* 
*6123456*2* 
*********1*
Run Code Online (Sandbox Code Playgroud)

好的,我明白了.第一个项目:

let Main() =
    let n=int(System.Console.ReadLine())
    let A=Array2D.create(n-2)n '*'
    let mutable x,y,z,i=n-2,n-2,0,n-2
    let d=[|0,-1;-1,0;0,1;1,0|]  // TODO
    while i>0 do
     for j in 1..i-(if i%2=1 then 1 else 0)do
      x<-x+fst d.[z]
      y<-y+snd d.[z]
      A.[y,x]<-'0'+char j
     z<-(z+1)%4
     i<-i-1
    printfn"%A"A
Main()
Run Code Online (Sandbox Code Playgroud)

我知道,d(x,y)-diffs-modulo-4的元组数组后来可以被x和y减少,它们都索引到同一个int数组的不同部分,因此是TODO.其余的基于对'空白绘画'的视觉洞察力是直截了当的.我正在打印一个2D数组,这是不对的,需要一个字符串数组,所以:

let n=int(System.Console.ReadLine())
let s=String.replicate n "*"
let A=Array.init(n-2)(fun _->System.Text.StringBuilder(s))
let mutable x,y,z,i=n-2,n-2,0,n-2
let d=[|0,-1;-1,0;0,1;1,0|]
while i>0 do
 for j in 1..i-(if i%2=1 then 1 else 0)do
  x<-x+fst d.[z]
  y<-y+snd d.[z]
  A.[y].[x]<-' '
 z<-(z+1)%4
 i<-i-1
for i in 0..n-3 do
 printfn"%O"A.[i]
Run Code Online (Sandbox Code Playgroud)

好的,现在让我们将元组数组更改为int数组:

let n=int(System.Console.ReadLine())-2
let mutable x,y,z,i,d=n,n,0,n,[|0;-1;0;1;0|]
let A=Array.init(n)(fun _->System.Text.StringBuilder(String.replicate(n+2)"*"))
while i>0 do
 for j in 1..i-i%2 do x<-x+d.[z];y<-y+d.[z+1];A.[y].[x]<-' '
 z<-(z+1)%4;i<-i-1
A|>Seq.iter(printfn"%O")
Run Code Online (Sandbox Code Playgroud)

let对A可以是前行的一部分.并且z并且i大多数是冗余的,我可以根据另一个来计算一个.

let n=int(System.Console.ReadLine())-2
let mutable x,y,d,A=n,n,[|0;-1;0;1|],
 Array.init(n)(fun _->System.Text.StringBuilder(String.replicate(n+2)"*"))
for i=n downto 1 do for j in 1..i-i%2 do x<-x+d.[(n-i)%4];y<-y+d.[(n-i+1)%4];A.[y].[x]<-' '
Seq.iter(printfn"%O")A
Run Code Online (Sandbox Code Playgroud)

downto很长,重新做数学,所以我可以to在循环中(上).

let n=int(System.Console.ReadLine())-2
let mutable x,y,d,A=n,n,[|1;0;-1;0|],
 Array.init(n)(fun _->System.Text.StringBuilder(String.replicate(n+2)"*"))
for i=1 to n do for j in 1..(n-i+1)-i%2 do x<-x+d.[i%4];y<-y+d.[(i+1)%4];A.[y].[x]<-' '
Seq.iter(printfn"%O")A
Run Code Online (Sandbox Code Playgroud)

稍微收紧会产生最终的解决方案.