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
格式的标准输入,并具有以下保证:

  • 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
    的角度由
    \
  • 由两条线包围的多边形区域用非空白字符填充
如果输入无效,程序不需要产生有意义的输出。任何语言的解决方案都是允许的,当然,专门为此挑战编写的语言或不公平使用外部实用程序的语言除外。如果输出的格式保持正确,则输出中允许使用无关的水平和垂直空白

打高尔夫快乐

无数的例子 输入:

0-45 8 0-135 4 180-360 2 45-90 0 0-315 2 0-45 8 输出:

/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- --o-- xxxxx xxxxx o xxxxx xxxxx xxo-- xxx\ xxxx\ / /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- 输入:

0-45 8 0-135 4 180-360 2 45-90 0 0-315 2 0-135 4 输出:

/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- --o-- xxxxx xxxxx o xxxxx xxxxx xxo-- xxx\ xxxx\ \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- 输入:

0-45 8 0-135 4 180-360 2 45-90 0 0-315 2 180-360 2 输出:

/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- --o-- xxxxx xxxxx o xxxxx xxxxx xxo-- xxx\ xxxx\ --o-- xxxxx xxxxx 输入:

0-45 8 0-135 4 180-360 2 45-90 0 0-315 2 45-90 0 输出:

/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- --o-- xxxxx xxxxx o xxxxx xxxxx xxo-- xxx\ xxxx\ o 输入:

0-45 8 0-135 4 180-360 2 45-90 0 0-315 2 0-315 2 输出:

/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o-------- \xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o---- --o-- xxxxx xxxxx o xxxxx xxxxx xxo-- xxx\ xxxx\ xxxxx xxxxx 三十-- xxx\ xxxx\ Perl,235 211 225 211 207 196 179 177 175 168 160 156 146个字符
=~/-\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])