Language agnostic 代码高尔夫:给我建一个弧线 挑战
按字符数计算的最短程序,可接受Language agnostic 代码高尔夫:给我建一个弧线 挑战,language-agnostic,geometry,code-golf,rosetta-stone,Language Agnostic,Geometry,Code Golf,Rosetta Stone,按字符数计算的最短程序,可接受X-Y R格式的标准输入,并具有以下保证: R是小于或等于8的非负十进制数 X和Y是十进制的非负角度,以45°的倍数表示(0,45,90,135等) X小于Y Y不是360如果X是0 并在标准输出上产生一个ASCII“弧”,从半径R的起始角度X到结束角度Y,其中: 弧的顶点由o 0和180的角度由- 45和225的角度由/ 90和270的角度由| 135和315的角度由\ 由两条线包围的多边形区域用非空白字符填充 如果输入无效,程序不需要产生有意义的输出。任
X-Y R
格式的标准输入,并具有以下保证:
是小于或等于8的非负十进制数R
和X
是十进制的非负角度,以45°的倍数表示(Y
,0
,45
,90
等)135
小于X
Y
不是Y
如果360
是X
0
R
的起始角度X
到结束角度Y
,其中:
- 弧的顶点由
o
和0
的角度由180
-
和45
的角度由225
/
和90
的角度由270
|
和135
的角度由315
\
- 由两条线包围的多边形区域用非空白字符填充
=~/-\d+/;对于$y(@a=-$'..$'){print+(map$$$$$y?!($t=8*($y>0)+atan2($y,$)/atan2 1,1)&-$&/45==8$$t>=$`/45&$t0)+atan2($y,$)/atan2 1,1)&-$&/45==8$$t>=/45&$tRuby,292 276个字符
更好的格式版本:
x, y, r = gets.scan(/\d+/).map{|z| z.to_i}
s = (-r..r)
s.each {|a|
s.each {|b|
g = (((Math::atan2(-a,b) / Math::PI) * 180) / 1) % 360
print ((a | b) == 0) ? 'o' :
(g == x || g == (y % 360)) ? '-/|\\'[(g / 45) % 4].chr :
((x..y) === g) ? '*' : ' '
}
puts
}
我相信那些比我睡得更多的人可以把这些浓缩得更多
编辑1:将内部循环中的if
语句切换为嵌套的?:
运算符
编辑2:存储到中间变量的范围(感谢Adrian),使用stdin而不是CLI参数(感谢Jon的澄清),消除了数组而支持直接输出,修复了终止角为360时无法显示一条线的错误,删除了一些不需要的括号,使用除法取整而不是。取整
,使用模而不是条件加法MATLAB,188个字符:)
input';[w x r]=strread(ans,'%d-%d%d');l='-/\-/\-/\-';[x Y]=meshgrid(-r:r);T=atan2(-Y,x)/pi*180;T=T+(Tw&TPerl-388个字符)
由于这是一个我自己无法解决的挑战,因此这是一个不公平的解决方案,它使用字符串替换而不是三角函数,并充分利用您的友好邻居Perl将裸字视为字符串的能力。它一定有点长,但出于唯一性的考虑,可能很有趣:
($x,$y,$r)=split/\D/,<>;for(0..$r-1){$t=$r-1-$_;
$a.=L x$_.D.K x$t.C.J x$t.B.I x$_."\n";
$b.=M x$t.F.N x$_.G.O x$_.H.P x$t."\n"}
$_=$a.E x$r.o.A x$r."\n".$b;$x/=45;$y/=45;$S=' ';
sub A{$v=$_[0];$x==$v||$y==$v?$_[1]:$x<$v&&$y>$v?x:$S}
sub B{$x<=$_[0]&&$y>$_[0]?x:$S}
@a=!$x||$y==8?'-':$S;
push@a,map{A$_,'\\'.qw(- / | \\)[$_%4]}1..7;
push@a,!$x?x:$S,map{B$_}1..7;
eval"y/A-P/".(join'',@a)."/";print
其中,A-H
表示角度,I-p
表示区域
(不可否认,这可能还需要进一步研究。@a
上的操作在作为一个列表编写时给了我不正确的输出,可能与map
如何使用$\u
有关)Ruby,168个字符
需要Ruby 1.9才能工作
s,e,r=gets.scan(/\d+/).map &:to_i;s/=45;e/=45;G=-r..r;G.map{|y|G.map{|x|a=Math.atan2(-y,x)/Math::PI*4%8;print x|y!=0?a==s||a==e%8?'-/|\\'[a%4]:a<s||a>e ?' ':8:?o};puts}
s,e,r=gets.scan(/\d+/).map&:to_i;s/=45;e/=45;G=-r..r;G.map{y}G.map{x}a=Math.atan2(-y,x)/Math::PI*4%8;print x | y!=0?a==s | a==e%8'-/\\\\[a%4]:ae 8:'o}
可读版本:
start, _end, radius = gets.scan(/\d+/).map &:to_i
start /= 45
_end /= 45
(-radius..radius).each {|y|
(-radius..radius).each {|x|
angle = Math.atan2(-y, x)/Math::PI * 4 % 8
print x|y != 0 ? angle==start || angle==_end%8 ? '-/|\\'[angle%4] : angle<start || angle>_end ? ' ' : 8 : ?o
}
puts
}
class A{
public static void main(String[]a){
String[]b=a[0].split("-");
int e=new Integer(b[1]),r=new Integer(a[1]),g,x,y=r;
for(;y>=-r;y--)for(x=-r;x<=r;)System.out.print((
x==0&y==0
?'o'
:new Integer(b[0])<=(g=((int)(Math.atan2(y,x)*57.3)+360)%360)&g<e|g==e%360
?"-/|\\".charAt(g/45%4)
:' '
)+(x++<r?"":"\n"));
}
}
start、\u end、radius=get.scan(/\d+/).map&:to\u i
开始/=45
_完/=45
(-radius..radius)|
(-radius..radius)|
角度=Math.atan2(-y,x)/Math::PI*4%8
打印x | y!=0?角度==开始| |角度==|U结束%8?'-/| \'[角度%4]:角度|结束?'':8:?o
}
放
}
GNU BC,339个字符
Gnu bc是由于read()
、else
和逻辑运算符
scale=A
a=read()/45
b=read()/45
c=read()
for(y=c;y>=-c;y--){for(x=-c;x<=c;x++){if(x==0)if(y<0)t=-2else t=2else if(x>0)t=a(y/x)/a(1)else if(y<0)t=a(y/x)/a(1)-4else t=a(y/x)/a(1)+4
if(y<0)t+=8
if(x||y)if(t==a||t==b||t==b-8){scale=0;u=(t%4);scale=A;if(u==0)"-";if(u==1)"/";if(u==2)"|";if(u==3)"\"}else if(t>a&&t<b)"x"else" "else"o"};"
"}
quit
scale=A
a=读取()/45
b=读取()/45
c=读取()
for(y=c;y>=-c;y--){for(x=-c;xLua,259个字符
稍微滥用非空白字符
子句以产生令人眼花缭乱的显示,更重要的是保存笔划
m=math i=io.read():gmatch("%d+")a=i()/45 b=i()/45 r=i()for y=r,-r,-1 do for x=-r,r do c=m.atan2(y,x)/m.pi*4 c=c<0 and c+8 or c k=1+m.modf(c+.5)io.write(x==0 and y==0 and'o'or c>=a and c<=b and('-/|\\-/|\\-'):sub(k,k)or c==0 and b==8 and'-'or' ')end print()end
能够处理奇怪的角度
输入:15-75 8
|/////
|//////
|//////
|//////
///////
|//////-
////---
//-
o
|/////
|//////
|//////
|//////
///////
|//////-
////---
//-
o
Mathematica 100 Chars
因图形过于完美而退出竞争:)
援引
f[30-70 5]
结果
注
SetAttributes[f,HoldAll]
是必需的,因为输入
f[a-b c]
否则解释为
f[(a-b*c)]
MATLAB 7.8.0(R2009a)-168 163 162个字符
从任何非空白字符填充弧开始,并受其启发,我管理了以下解决方案:
[w x r]=strread(input('','s'),'%d-%d%d');
l='o -/|\-/|\-';
X=meshgrid(-r:r);
T=atan2(-X',X)*180/pi;
T=T+(T<=-~w)*360;
T(T>x|T<w)=-1;
T(r+1,r+1)=-90;
disp(l(fix(3+T/45)))
我可以通过删除对disp
的调用将其进一步减少到156个字符,但这会在输出之前添加额外的ans=
(这可能违反输出格式规则)
即使如此,我还是觉得有一些方法可以进一步减少这种情况。C#-325319个字符
使用系统;类P{static void Main(){var s=Console.ReadLine().Split(“”);
变量d=s[0]。拆分('-');int l=s[1][0]-48,x,y,r,a=int.Parse(d[0]),b=int.Parse(d[1])