C, 415 430
편집 : @Winny 언급 한 것처럼 255 이상의 종료 값을 사용할 수 없으므로 값을 최대 360까지 인쇄하려면이 코드 크기를 늘려야했습니다.
2 (및 2) 명령 줄 입력 (xy)을 정수로 가정합니다. 도 단위의 답변이 인쇄되거나 도가없는 경우 -1이 인쇄됩니다.
#include <math.h>
#define E(z) {if((e-=5)<0)break;q=n/sqrt(n*n+pow(m-z,2));w=(m-z)/sqrt(n*n+pow(m-z,2));d=(t=d)*(1-2*q*q)-2*f*q*w;f=f*(1-2*w*w)-2*t*q*w;}
main(a,v)char**v;{float D=.01,e,d,f,n,m,p=.0174,q,t,w;a-=4;while(++a<360){n=0,m=-8,d=D*cos(a*p),f=D*sin(a*p),e=50;while(e>0){if((pow(n-atoi(v[1]),2)+pow(m-atoi(v[2]),2)<1)&(e<10)&&printf("%d",a))return;n+=d,m+=f,e-=D;if(n*n+m*m>100)E(0)if(n*n+pow(m-5,2)<9)E(5)}}puts("-1");}
전의.
>./golfed 0 2; echo $?
90
>./golfed 0 10; echo $?
0
>./golfed -2 -7; echo $?
12
처음으로 골퍼; 아마 상당히 개선 될 수 있습니다. 더 정밀 해야하는 경우 xy를 사용하고 449 자에서 .01도 정밀도로 작업하는 복식으로 각도를 반환하는 버전이 있습니다.
읽을 수있는 버전 :
#include <math.h>
int main(int argc, char** argv)
{
// p is roughly pi/180 and q, t, and w are temp vars
float Delta=.01, energy, delta_x, f(delta_y), n(cur_x), m(cur_y), p=.0174, q, t, w;
argc -= 4; /*using argc as int for angle*/
// iterate through each degree
while (++argc < 360)
{
n=0, m=-8, d=D*cos(a*p), f=D*sin(a*p), e=50;
// then move in discrete .01 steps
while (e > 0)
{
// check to see if we're inside the hole
if ((pow(n-atoi(v[1]),2) + pow(m-atoi(v[2]),2) < 1)
& (e<10) && printf("%d",a)) return;
// move forward
n += d, m += f, e -= D;
// check if we've hit the outer wall
if (n * n + m * m > 100)
{
// if too slow, finish this iteration
// if not, find reflection vector
if ((e -= 5) < 0) break;
q = n / sqrt(n * n + pow(m,2));
w = (m) / sqrt(n * n + pow(m,2));
d = (t = d) * (1 - 2 * q * q) - 2 * f * q * w;
f = f * (1 - 2 * w * w) - 2 * t * q * w;
}
// check inner wall collision
if (n * n + pow(m - 5,2) < 9)
{
// if too slow, finish this iteration
// if not, find reflection vector
if ((e -= 5) < 0) break;
q = n / sqrt(n * n + pow(m - 5,2));
w = (m - 5) / sqrt(n * n + pow(m - 5,2));
d = (t = d) * (1 - 2 * q * q) - 2 * f * q * w;
f = f * (1 - 2 * w * w) - 2 * t * q * w;
}
}
}
// if an angle not found, return -1
puts("-1");
}