로봇이 실험실에서 탈출했습니다!


13

내 로봇이 어떻게 든 단락되었고 실험실 어딘가에서 무작위로 도망 쳤습니다!

운 좋게도이 작업을 수행 할 때마다 종료 시퀀스가 ​​시작되어 전원을 끄기 전에 5 라운드 동안 무작위로 향한 방향으로 회전하고 실행할 수있는 충분한 시간을줍니다. 그의 자이로 및 가속도계 기능은 여전히 ​​켜져있는 동안 데이터를 실험실로 다시 전달합니다.

예를 들어, 데이터는 항상 두 숫자의 다섯 세트의 형태로 제공됩니다.

12:234,-135:47,-68:230,140:324,127,87

당신의 임무는, 골프를 치는 로봇의 광란 실행을 시뮬레이션의 형태로 숫자 5 개 세트를 표시하여 순서를 설정)을하는 것입니다 a1:d1,a2:d2,a3:d3,a4:d4,a5:d5a)을 시계 방향으로 각도가 각도 (IS) (N하도록 -179<=a<=+180(로봇이 현재의 제목에서 설정됩니다 처음에는 d방향이 바뀔 때까지 0으로 향하고 처음으로 돌아갑니다.) (n) 다음 방향으로 변경하기 전에 발이 닿는 거리 (피트)입니다 0<=d<=500. b) 실험실에서 계산 된 제목 (제로 제목을 향함), 피트 거리 (소수점 3 자리까지의 정확성을 강력히 권장 함, 권장하는 경우 -5 바이트) 및 방향 제목 (도) 로봇이 꺼 졌을 때 로봇이 향하는 위치.

쉬운 예 :

Data: 0:1,45:1,90:1,90:1,90:1
Heading: 0
Distance: 1
Orientation: -45

무작위 회전과 거리는 그저 무작위입니다. 설정된 값을 하드 코딩해서는 안됩니다. 코드 내에서 임의의 동작이 작동해야합니다.

임의성 제한 : 시계 또는 날짜 기반 참조가 없으므로 random코드 내에서 기본 참조 가 필요 합니다. 이 코드를 실행할 때마다 임의성이 각 회전 라운드마다 360도 가능한 회전 각도 중 하나를 표시 할 수 있어야합니다. 따라서 로봇은 한 턴에 -36도 회전하고 다음 턴에 +157도 회전 한 다음 -2 도의 또 다른 회전 -116도, 마지막 턴에 +42 도의 마지막 회전을 수행 할 수 있습니다. 각 임의의 각도 생성에 대해 최소 360 개의 고유 한 값이 가능해야합니다 (-179 ~ +180도 사이).

거리 주행 제한 : 비슷하게 설정하면 로봇이 실행할 수있는 거리는 501 개 (0 ~ 500 피트 포함)이므로 로봇의 주행 거리를 결정할 때 임의성을 사용할 수있을 것으로 기대합니다. 로봇은 이론적으로 각각의 라운드에서 45, 117, 364, 27 및 6 피트를 실행할 수 있습니다 ...

당신에게 공급되는 데이터는 항상 정수 값이 될 것입니다 ... 로봇은 정수 범위의 각도로 회전하고 정수 범위의 거리에서 실행됩니다. 그러나 출력 값은 수레가됩니다 ...

이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다 ... 이제 로봇을 찾으십시오!

추신 : 내 "소수점 3 자리까지의 정확도"와 관련하여 제목 (소수점, 소수점 이하 3 자리)과 피트 거리 (최소 소수점 3 자리까지도)를 제공 할 수 있다면 -5 바이트 보너스를 얻습니다).


1
@IsmaelMiguel 및 @OP-아마 이것에 맞을 것입니다. 그러나 당신 은 AFAIK를 포함하지는 않지만 그 자체로 표시 -180 < a <= +180로 사용할 수 <없었습니다 ...
George

1
@GeorgeH 당신은 정확하지만 WallyWest의 말이 잘못되었습니다. "-179 <= a <= 180은 360 개의 가능한 정수 머리글을 만듭니다"-> 361 개의 머리말이 있기 때문에 잘못되었습니다. 아니면 로봇이 -180º로 갈 수 없습니까?
Ismael Miguel

1
@IsmaelMiguel -180 도가 될 수 있습니다. 180도 정확히 같습니다.
Doorknob

1
그건 잘못이야 + 180º는 시계 방향으로 반 바퀴를 의미합니다. -180º는 반 시계 방향 (또는 원하는대로 반 시계 방향)의 반 회전을 의미합니다. 범위가 -179 <= a <= + 180 인 경우 로봇은 시계 반대 방향으로 180º 회전 할 수 없습니다. 왜? 그는 -179º에 갇힐 것이다! 아마 그 이유는 그가 단락했다 ...
Ismael Miguel

1
@WallyWest 나는 바보가 아니며 당신의 의미를 이해합니다. 방금 범위를 고정해야한다고 말하고 있습니다.
Ismael Miguel

답변:


2

Perl 6 : 188184 자-5 = 180 점

$_=((-179..180).pick=>(^501).pick)xx 5;my$o;$/=([+] .map:{unpolar .value,$o+=.key/($!=180/pi)}).polar;say "Data: {.fmt("%d:%d",",")}
Heading: {$1*$!}
Distance: $0
Orientation: {$o*$!}"

공백이있는 골프 :

$_ = ((-179..180).pick => (^501).pick) xx 5;
my $o;
$/ = ([+] .map: {
    unpolar .value, $o += .key / ($!=180/pi)
}).polar;
say "Data: {.fmt("%d:%d", ",")}
Heading: {$1*$!}
Distance: $0
Orientation: {$o*$!}"

언 골프 드 :

my &postfix:<°>  = */180*pi; # Deg → Rad
my &postfix:<㎭> = */pi*180; # Rad → Deg

my @data = ((-179..180).pick => (0..500).pick) xx 5;
say "Data: @data.fmt("%d:%d", ",")";

my $cum-angle = 0;
my $complex = [+] @data.map: {unpolar .value, $cum-angle += .key°}
my ($dist, $ang) = $complex.polar;

say "Heading: ",     $ang.㎭;
say "Distance: ",    $dist;
say "Orientation: ", $cum-angle.㎭;

이것은 복잡한 숫자로 데이터를 회전 unpolar로의, 풋 합 $complex, 다음과 같은 극 좌표를 가져옵니다 $dist, $ang.

누적 각도 $cum-angle는 실험실을 통과 할 때 각도가 로봇을 기준으로하고 출력에 로봇의 최종 각도가 필요하기 때문에 수집됩니다.

샘플 출력 :

Data: -73:230,-144:453,-151:274,-52:232,88:322
Heading: -5.33408558001246
Distance: 378.74631610127
Orientation: -332

골프가 사용하는 유일한 트릭은 (실수) Perl 6의 특수 변수 3 개를 모두 효과적으로 사용한다는 것입니다.

  • $! 라디안 ↔도에 사용됩니다
  • $_데이터를 보유하고 외로운 것처럼 보이는 것은 .method()실제로 의미합니다 $_.method()( map {…}블록을 제외하고 $_실제로 데이터를 구성하는 숫자 쌍의 값을 취함)
  • $/ungolfed 버전에있는 내용을 보유합니다 ($dist, $ang). $0그리고 $1실제로 평균 $/[0], 즉 $dist, 및 $/[1], 즉,$ang

좋은! 여전히 다음과 같이 188에서 184로 내려갈 수 있습니다.$_=((-179..180).pick=>(^501).pick)xx 5;my$o;$/=([+] .map:{unpolar .value,$o+=.key/($!=180/pi)}).polar;say "Data: {.fmt("%d:%d",",")} Heading: {$1*$!} Distance: $0 Orientation: {$o*$!}"
Mathieu Rodic

@MathieuRodic 아, 좋아! 감사! 불행히도, 이후 공간 .map:은 필수입니다
Mouq

오, 나는 공간에 대해 틀렸다, 시원 :)
Mouq

10

루비 274 252 249 245 214 211 207 204 202 개 문자 (-5 = 197)

PHP는 문자 수면에서 루비를 어떻게 이겼습니까?! > : O 더 많은 골프를 즐길 수있는 방법을 찾아야합니다 ...

편집 : PHP 답변을 이겼지 만 그것을 작성한 사용자가 도움이되었습니다! 그를 찬양하라. 그는 가치가있다 :-P

또 다른 편집 : Gah! 그는 다시 나를 지나쳤다! 당신은 매우 가치있는 상대입니다, @MathieuRodic; 축하합니다, 당신이 이길 수 있도록해야합니다 ;-)

P=(M=Math)::PI
puts"Data: #{([x=y=a=0]*5).map{a+=o=rand -179..e=180;x+=M.sin(b=a*P/e)*d=rand 500;y+=d*M.cos b;"#{o}:#{d}"}*?,}
Heading: #{M.atan(y/x)/P*-e+90}
Distance: #{M.hypot x,y}
Orientation: #{a}"

ungolfed 코드 (그리고 약간 더 오래된 버전) :

data = Array.new(5) { [rand(-179..180), rand(0..500)] }
puts "Data: #{data.map{|x|"#{x[0]}:#{x[1]}"}.join ?,}"
x, y, a = [0] * 3
data.each do |o, d|
    a += o
    x += Math.sin(a * Math::PI / 180) * d
    y += Math.cos(a * Math::PI / 180) * d
end
puts "Heading: #{Math.atan(y / x) / Math::PI * -180 + 90}
Distance: #{Math.sqrt(x * x + y * y)}
Orientation: #{a}"

샘플 출력 :

c:\a\ruby>robotgolf
Data: 94:26,175:332,14:390,159:448,-45:20
Heading: 124.52305879195005
Distance: 279.5742334385328
Orientation: 397

로봇이 임의의 각도 5 개를 돌린 후 어떻게 북쪽을 향하고 있습니까?
WallyWest

@WallyWest 오리엔테이션이 로봇의 시작 각도를 표시한다는 인상을 받았습니다. 3 개의 추가 문자에 대해서만 종료 각도를 표시 할 수 있습니다.
Doorknob

아니요, 코드 실행시 항상 북쪽 (제목 0)을 향하고 있습니다. 그런 다음 종료하기 전에 회전, 실행, 회전, 실행, 회전, 실행, 회전, 실행 및 회전을 실행합니다. Orientation단면에서 마주 보는 최종 각도를 가져야합니다 .
WallyWest

@WallyWest 아, 편집했습니다. 방향이 0 ... 360이 아니면 괜찮습니까? 아니면 방향을 바꿔야 % 360합니까?
Doorknob

그에 따라 코드 를 선언 M=Math하고 P=M::PI교체하여 두 번째 문자와 공백을 제거하여 하나 이상의 문자를 사용하여 11자를 저장할 수 있습니다 puts.
David Herrmann

5

PHP - 238 개 232 221 212 203 199 문자

for(;$i<5;$h+=$a=rand(-179,181),$x+=cos($b=$a*$k=M_PI/180)*$l=rand(0,501),$y+=$l*sin($b),$d.=($i++?",":"")."$a:$l");echo"Data: $d
Heading: $h
Distance: ".hypot($x,$y)."
Orientation: ".atan2($y,$x)/$k

(여기서 테스트하십시오 : http://ideone.com/dNZnKX )

골프 용이 아닌 버전 :

$k = M_PI / 180;
$h = $x = $y = 0;
$d = "";

for ($i=5; $i--;){
    $h += $a = rand(-179,181);
    $x += ($l = rand(0, 501)) * cos($b = $k * $a);
    $y += $l * sin($b);
    $d .= ($d ? "," : "") . "$a:$l";
}

echo "Data: $d\nHeading: $h\nDistance: " . sqrt($x*$x + $y*$y) ."\nOrientation: " . atan2($y, $x)/$k . "\n";

(여기서 테스트하십시오 : http://ideone.com/1HzWH7 )


마지막 순간에 펄이 우리 둘을 좁히는 것 같아 : -O
Doorknob

@Doorknob Yup, 죄송합니다 :)
Mouq

명확히. Mouq, 당신은 우리의 모든 노력을 단 188로 지
웠습니다

3

파이썬 - 264 259 256 258-5 = 253 자

from math import*;import random as R;r,k,d=R.randint,pi/180,[];h=x=y=0;exec"a,l=r(-179,180),r(0,500);d+=[`a`+':'+`l`];h+=a;x+=l*cos(k*a);y+=l*sin(k*a);"*5;print('Data: %s\nHeading: %d\nDistance: %.3f\nOrientation: %d'%(','.join(d),h,hypot(x,y),atan2(y,x)/k))

( http://ideone.com/FicW6e 에서 테스트하십시오 )

언 골프 버전 :

from math import *
from random import randrange as r

k = pi / 180
h = x = y = 0
d = []
for i in range(5):
    a = r(-179,181)
    l = r(501)
    d += ['%d:%d' % (a, l)]
    h += a
    x += l * cos(k * a)
    y += l * sin(k * a)

print('Data: %s\nHeading: %d\nDistance: %.3f\nOrientation: %f' % (','.join(d), h, sqrt(x*x+y*y), atan2(y,x)/k))

( http://ideone.com/O3PP7T 에서 테스트하십시오 )

주의 : 많은 답변은 제목에 -5 를 포함 하지만 프로그램은 소수점 이하 세 자리까지 정확도로 거리를 나타내지 않습니다 ...


1

파이썬 301-5 = 296

from math import*
r=__import__("random").randint
o=x=y=0
s=[]
for i in[0]*5:a=r(-179,180);d=r(0,500);o+=a;o+=180*((o<-179)-(o>180));n=pi*o/180;x+=d*cos(n);y+=d*sin(n);s+=["%d:%d"%(a,d)]
print"Data: "+",".join(s)+"\nHeading: %d"%degrees(atan(y/x))+"\nDistance: %f"%sqrt(x**2+y**2)+"\nOrientation: %d"%o

여기서 너무 멋진 것은 아니지만 장황한 것입니다. 이것은 파이썬의 삼각 함수가 라디안에서 작동한다는 것이 행복하지 않은 한 가지 문제입니다.

> python robot.py
Data: 17:469,110:383,-146:240,-78:493,62:1
Heading: -17
Distance: 405.435748
Orientation: -35
> python robot.py
Data: -119:363,89:217,129:321,10:159,-56:109
Heading: -79
Distance: 130.754395
Orientation: 53

0

파이썬 2 = 376 319 자 (거리 = 314의 경우 -5)

import random,math
h=x=y=0
for i in range(5):
    a=random.randint(-179,180)
    d=random.randint(0,500)
    print '%d:%d,'%(a,d),
    h+=a
    if h>180:
        h-=360
    x+=d*math.cos(h)
    y+=d*math.sin(h)
t=math.sqrt(x**2+y**2)
o=math.atan2(y,x)
print
print 'Heading: %d\nDistance: %3f\nOrientation: %d' % (h,t,o)

샘플 출력

-141:245, 56:355, 145:223, -10:80, -38:253,
Heading: 12
Distance: 559.031404
Orientation: -2

파이썬은 각도가 아닌 라디안으로 삼각법을 계산합니다. 따라서 계산이 잘못되었을 수 있습니다.
Mathieu Rodic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.