我的机器人逃脱了实验室!


13

我的机器人由于某种原因短路,并从实验室随机逃逸!

幸运的是,每当他这样做时,他的关闭顺序都会启动,这给了他足够的时间在关闭前随机旋转并朝着其朝向运行五轮。他的陀螺仪和加速度计功能仍在将数据传回实验室的过程中。

例如,数据将始终以五组两个数字的形式出现。

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

高尔夫球手的任务是:a)通过显示五组数字来模拟机器人的疯狂奔跑和转弯顺序,a1:d1,a2:d2,a3:d3,a4:d4,a5:d5其中a(n)是顺时针角度(以度为单位),-179<=a<=+180以便机器人从当前航向转弯(最初,它处于零方位,然后才开始惯性旋转并第一次转弯。)d(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英尺...

馈给您的数据将始终为整数值……机器人将以度数的整数范围旋转,并将以距离的整数范围运行。但是输出值将是浮点数...

这是代码高尔夫球。最短的代码胜出...现在去寻找我的机器人!

PS:关于我的“精度最多3个小数位”,如果您可以提供航向(以度为单位,最小为3个小数位)和以英尺为单位的距离(也可以精确到最小3个小数位),将获得-5字节的奖励)。


1
@IsmaelMiguel和@OP-我可能会为此被枪杀,但是您不能单独使用它-180 < a <= +180作为<标志,但不包括AFAIK ...
乔治

1
@GeorgeH您是正确的,但WallyWest所说的是错误的。“ -179 <= a <= 180表示所有360个可能的整数标题”->这是错误的,因为有361个标题。还是不允许机器人到达-180º?
Ismael Miguel

1
@IsmaelMiguel它允许去-180度,因为这是完全一样的180
门把手

1
那是错的。+180º表示顺时针旋转半圈。-180º表示逆时针(或根据您的喜好逆时针)旋转半圈。如果范围是-179 <= a <= + 180,则机器人无法逆时针旋转180º。为什么?他将被困在-179º!也许这就是他短路的原因...
Ismael Miguel

1
@WallyWest我并不傻,我明白你的意思。我只是说范围应该是固定的。
Ismael Miguel

Answers:


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 {…}块内部,$_实际上是构成数据的数字对的值)
  • $/保留非高尔夫版本中的内容($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 2014年

@MathieuRodic哦,很高兴找到!谢谢!不幸的是,后面的空间.map:是强制性的
Mouq 2014年

哦,我错了空间,很酷:)
Mouq

10

红宝石,274 252 249 245 214 211 207 204 202个字符(-5 = 197)

PHP如何在字符计数方面击败Ruby?>:O必须找到更多打高尔夫球的方法...

编辑:我击败了PHP的答案,但写它的用户帮助我做到了!去投票给他;他应得的:-P

另一个编辑:加!他又通过了我!你是一个非常值得的对手,@ 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}"

未经处理的代码(和旧的版本):

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

旋转了五个随机角度后,机器人如何朝北?
WallyWest 2014年

@WallyWest我的印象是方向标记了机器人的起始角度,对吗?我可以只用3个额外字符来标记结束角度。
门把手

不,在执行代码时,它始终面朝正北(标题0)...然后在关闭之前,先转弯,运行,转弯,运行,转弯,运行,转弯,运行,然后再运行...。它需要具有该Orientation部分中面对的最终角度。
WallyWest 2014年

@WallyWest嗯,好的,已编辑。如果方向不在0 ... 360范围内还可以,还是我们必须对此进行% 360处理?
门把手

您可以通过声明M=MathP=M::PI替换相应的代码来保存11个字符-并通过删除第二个空格后的空格来保存一个字符puts
David Herrmann 2014年

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


看起来Perl在最后一刻差点击败了我们俩。:-O
门把手

@Doorknob是的,对不起:)
Mouq 2014年

绝对是 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,而他们的程序却不能精确表示小数点后3位的距离...


1

Python 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的trig函数以弧度工作的问题。

> 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

Python 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

Python用弧度而不是度数进行三角计算。因此,您的计算可能是错误的……
Mathieu Rodic 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.