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
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并使用后缀"*"来获得右侧的星列.
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)
很多答案都是以空白和添加*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)
稍微收紧会产生最终的解决方案.