按字符数计算的最短程序,接受X-Y R
形式的标准输入,并具有以下保证:
R
是小于或等于8 X
和Y
是十进制的非负角度,为45°的倍数(0
,45
,90
,{{1}等等。)135
小于X
Y
为Y
,则360
不是X
并在标准输出上生成ASCII“弧”,从起始角度0
到半径X
的结束角度Y
,其中:
R
o
和0
的角度由180
-
和45
的角度由225
/
和90
的角度由270
|
和135
的角度由315
如果给出无效输入,则程序不需要产生有意义的输出。允许使用任何语言的解决方案,当然除了专门针对此挑战而编写的语言,或者不公平地使用外部实用程序的语言。如果输出的格式保持正确,则输出中允许使用 外部水平和垂直空格。
快乐打高尔夫球!
输入:
0-45 8
输出:
/ /x /xx /xxx /xxxx /xxxxx /xxxxxx /xxxxxxx o--------
输入:
0-135 4
输出:
\xxxxxxxx \xxxxxxx \xxxxxx \xxxxx o----
输入:
180-360 2
输出:
--o-- xxxxx xxxxx
输入:
45-90 0
输出:
o
输入:
0-315 2
输出:
xxxxx xxxxx xxo-- xxx\ xxxx\
答案 0 :(得分:15)
<>=~/-\d+/;for$y(@a=-$'..$'){print+(map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a),$/}
$ echo -n '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}' | wc -c
139
$ perl -E '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}'
<>=~/-\d+/;for$y(@a=-$'..$'){print$/,map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}
原始版本评论:
$_=<>;m/(\d+)-(\d+) (\d+)/;$e=$1/45;$f=$2/45; # parse angles and radius, angles are 0-8
for$y(-$3..$3){ # loop for each row and col
for$x(-$3..$3){
$t=atan2(-$y,$x)/atan2 1,1; # angle of this point
$t+=8if($t<0); # normalize negative angles
@w=split//,"-/|\\"x2; # array of ASCII symbols for enclosing lines
$s.=!$x&&!$y?"o":$t==$e||$t==$f?$w[$t]:$t>$e&&$t<$f?"x":$";
# if it's origin -> "o", if it's enclosing line, get symbol from array
# if it's between enclosing angles "x", otherwise space
}
$s.=$/;
}
print$s;
编辑1:内联的子,关系和相等运算符返回0或1。
编辑2:添加了评论版本。
编辑3:固定360º的封闭线。字数显着增加。
编辑4:添加了更短的版本,弯曲了规则。
编辑5:360º封闭线的更智能修复。另外,使用数字作为填充。这两件事都很明显。嗯,我应该睡得更多:/
编辑6:从匹配运算符中删除了不需要的m
。删除了一些分号。
编辑7:更智能的正则表达式。不到200个字符!
编辑8:许多小改进:
split
字符串的符号数组 - &gt; qw(3个字符)
编辑9:条件运算符中的一点重新排序可以节省2个字符。
编辑10:对字符使用裸字。
编辑11:在Lowjacker的回答的启发下,在循环中移动了打印。
编辑12:使用say
添加了版本。
编辑13:重复使用填充字符的角度字符,正如Gwell的答案所做的那样。输出不如Gwell那么好,这将需要5个额外的字符:)此外,..运算符不需要括号。
编辑14 :将正则表达式直接应用于&lt;&gt ;.根据Adrian对bta答案的建议,将范围运算符分配给变量。添加没有最终换行符的版本。更新了say
版本。
编辑15:更多内联。 map {block} @a - &gt; map expr,@ a。
答案 1 :(得分:12)
稍微滥用non-whitespace character
子句以产生炫目的显示效果,更重要的是保存笔画。
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
输入:45-360 4
\\\|||/// \\\|||// \\\\|// --\\|/ ----o---- --//|\\-- ////|\\\\ ///|||\\\ ///|||\\\
输入:15-75 8
|///// |////// |////// |////// /////// |//////- ////--- //- o
答案 2 :(得分:8)
input '';[w x r]=strread(ans,'%d-%d%d');l='-/|\-/|\-';[X Y]=meshgrid(-r:r);T=atan2(-Y,X)/pi*180;T=T+(T<=0)*360;T(T>w&T<x)=-42;T(T==w)=-l(1+w/45);T(T==x)=-l(1+x/45);T(r+1,r+1)=-'o';char(-T)
%%# Get the string variable (enclose in quotes, e.g. '45-315 4')
input ''
%%# Extract angles and length
[w x r]=strread(ans,'%d-%d%d');
%%# Store characters
l='-/|\-/|\-';
%%# Create the grid
[X Y]=meshgrid(-r:r);
%%# Compute the angles in degrees
T=atan2(-Y,X)/pi*180;
%%# Get all the angles
T=T+(T<=0)*360;
%# Negative numbers indicate valid characters
%%# Add the characters
T(T>w&T<x)=-42;
T(T==w)=-l(1+w/45);
T(T==x)=-l(1+x/45);
%%# Add the origin
T(r+1,r+1)=-'o';
%%# Display
char(-T)
答案 3 :(得分:8)
竞争激烈因为图形太完美了:)
f[x_-y_ z_]:=Graphics@Table[
{EdgeForm@Red,Disk[{0,0},r,{x °,y °}],{r,z,1,-1}]
SetAttributes[f,HoldAll]
调用 f [30-70 5]
结果
alt text http://a.imageshack.us/img80/4294/angulosgolf.png
alt text http://a.imageshack.us/img59/7892/angulos2.png
在 SetAttributes [f,HoldAll];
需要因为输入
f[a-b c]
另有解释为
f[(a-b*c)]
答案 4 :(得分:7)
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
答案 5 :(得分:7)
从Jacob's answer开始并受gwell's use任何非空格字符的启发来填充弧线,我设法完成以下解决方案:
[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)))
一些测试输出:
>> arc
0-135 4
\||||////
\|||///-
\||//--
\|/---
o----
我可以通过删除对disp
的调用将其进一步减少到 156个字符,但这会在输出之前添加额外的ans =
(这可能会违反输出格式规则)。
即便如此,我觉得有一些方法可以进一步减少这种情况。 ;)
答案 6 :(得分:6)
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}
更加格式化的版本:
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 params(感谢澄清Jon),取消了数组,支持直接输出,修复bug结束360的角度不会显示一条线,删除了一些不需要的括号,使用除法进行舍入而不是.round
,使用modulo而不是条件add
答案 7 :(得分:4)
需要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}
可读版本:
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
}
答案 8 :(得分:3)
由于提出挑战是不公平的,我无法解决自己,这里是一个使用字符串替换而不是三角函数的解决方案,并且大量使用友好邻域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
)和底部($b
)部分。$_
)。sub A
以获取角度的填充字符。sub B
以获取区域的填充字符。@a
和A
构建一个替换字符数组(B
)。生成的格式如下所示,R
= 4:
DKKKCJJJB LDKKCJJBI LLDKCJBII LLLDCBIII EEEEoAAAA MMMFGHPPP MMFNGOHPP MFNNGOOHP FNNNGOOOH
A-H
表示角度,I-P
表示区域。
(不可否认,这可能会进一步打高尔夫。@a
上的操作在写为一个列表时给出了错误的输出,可能与map
与$_
的播放方式有关。)
答案 9 :(得分:3)
using System;class P{static void Main(){var s=Console.ReadLine().Split(' ');
var d=s[0].Split('-');int l=s[1][0]-48,x,y,r,a=int.Parse(d[0]),b=int.Parse(d[1]);
for(y=l;y>=-l;y--)for(x=-l;x<=l;)Console.Write((x==0&&y==0?'o':a<=(r=((int)
(Math.Atan2(y,x)*57.3)+360)%360)&&r<b||r==b%360?
@"-/|\"[r/45%4]:' ')+(x++==l?"\n":""));}}
Newlines并不重要。
示例输入/输出
45-180 8 \||||||||//////// \\|||||||/////// \\\||||||////// \\\\|||||///// \\\\\||||//// \\\\\\|||/// \\\\\\\||// \\\\\\\\|/ --------o
135-360 5 \ \\ \\\ \\\\ \\\\\ -----o----- ----/|\\\\\ ---//||\\\\ --///|||\\\ -////||||\\ /////|||||\
答案 10 :(得分:2)
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"));}}
更易阅读的版本:
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"));
}
}
答案 11 :(得分:2)
这不使用三角函数(就像原始的perl版本一样),因此它非常“膨胀”。无论如何,这是我的第一个代码 - 高尔夫提交:
#define V(r) (4*r*r+6*r+3)
#define F for(i=0;i<r;i++)
#define C ;break;case
#define U p-=2*r+2,
#define D p+=2*r+2,
#define R *++p=
#define L *--p=
#define H *p='|';
#define E else if
#define G(a) for(j=0;j<V(r)-1;j++)if(f[j]==i+'0')f[j]=a;
#define O(i) for(i=0;i<2*r+1;i++){
main(int i,char**v){char*p,f[V(8)];
int j,m,e,s,x,y,r;p=*++v;x=atoi(p);while(*p!=45)p++;
char*h="0123";y=atoi(p+1);r=atoi(*++v);
for(p=f+2*r+1;p<f+V(r);p+=2*r+2)*p=10;
*(p-2*r-2)=0;x=x?x/45:x;y/=45;s=0;e=2*r;m=r;p=f;O(i)O(j)
if(j>e)*p=h[0];E(j>m)*p=h[1];E(j>s)*p=h[2];else*p=h[3];p++;}
if(i+1==r){h="7654";m--;e--;}E(i==r){s--;}E(i>r){s--;e++;}
else{s++;e--;}p++;}for(p=f+V(r)/2-1,i=0;i<r;i++)*++p=48;
for(i=0;i<8;i++)if(i>=x&&i<y){G(64);}else G(32);
y=y==8?0:y;q:p=f+V(r)/2-1;*p='o';switch(x){
C 0:F R 45 C 1:F U R 47 C 2:F U H C 3:F U L 92
C 4:F L 45 C 5:F D L 47 C 6:F D H C 7:F D R 92;}
if(y!=8){x=y;y=8;goto q;}puts(f);}
另外,#define
看起来相当丑陋,但它们节省了大约200个字节,所以无论如何我保留了它们。它是有效的ANSI C89 / C90并且只编写很少的警告(两个关于atoi
和puts
,两个关于main
的残缺形式。