私のロボットは実験室を脱出しました!


13

私のロボットはどういうわけか短絡し、研究室のどこかからランダムに飛び出しました!

幸いなことに、彼がこれを行うたびにシャットダウンシーケンスが開始され、スイッチを切る前にランダムに5ラウンドにわたって向きを変えて走る十分な時間が与えられます。彼のジャイロと加速度計の機能は、彼がまだ活動している間、データを研究室に送り返しています。

たとえば、データは常に2つの数値の5つのセットの形式で提供されます。

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

あなたの使命は、ゴルファーは、a)ロボットがその現在の方位から回転するようにa1:d1,a2:d2,a3:d3,a4:d4,a5:d5a(n)が時計回りの角度(度)の形式で5セットの数字を表示することにより、ロボットの必死の走りとターンシーケンスをシミュレートすること-179<=a<=+180です最初は、首をかがめて最初に回転する前にヘッディングがゼロになります)、およびd(n)は、次のヘディングが変わる前に実行したフィート単位の距離0<=d<=500です。およびb)ラボから計算された見出し(見出しも0に直面している)、フィート単位の距離(小数点以下3桁までの精度が強く推奨されます、もしあれば-5バイト)、および向きの見出し(度)オフになったときにロボットが向いている場所の

簡単な例:

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

ランダムなターンと距離は、ランダムです。設定値をハードコーディングする必要はありません。コード内でランダムな動作を確認する必要があります。

ランダム性の制限:クロックまたは日付ベースの参照はありませんrandom。コード内にネイティブ参照を表示する必要があります。このコードを実行するときはいつでも、ランダム性は、各ターンランラウンドで360の可能な角度のうち1つを示す可能性を提示する必要があります。そのため、ロボットは1回転で-36度回転し、次の回転で+157度回転し、さらに-116度でさらに2度回転し、最後の回転で最後に+42度回転します。ランダムな角度の生成ごとに、少なくとも360の異なる値(-179〜+180度を含む)が可能でなければなりません。

走行距離の制限:同様に設定すると、ロボットが走行できる距離は0〜500フィート(0〜500フィート)であるため、ロボットの走行距離を決定するときにランダム性も利用できると考えています。ロボットは、理論的には、それぞれのラウンドで45、117、364、27、6フィートを実行できます...

あなたに供給されるデータは常に整数値になります...ロボットは度の整数範囲で回転し、距離の整数範囲で実行されます。ただし、出力値は浮動小数点数になります...

これはコードゴルフです。最短のコードが勝ちます...さあ、私のロボットを見つけに行きましょう!

PS:私の「小数点以下3桁までの精度」に関連して、見出し(度で、小数点以下3桁の最小値まで)とフィート単位の距離(小数点以下3桁まで正確)を提供できる場合-5バイトのボーナスが得られます)。


1
@IsmaelMiguelと@OP -私はおそらく、このためのショットを取得しようとしていますが、使用couldntのだ-180 < a <= +180<...未満、独自の手段サインオンが、私の知る限りは含まない
ジョージ

1
@GeorgeHあなたは正しいですが、WallyWestが言っていることは間違っています。「-179 <= a <= 180の結果、360個すべての整数の見出しが表示されます」-> 361個の見出しがあるため、これは間違っています。または、ロボットが-180ºに到達することを許可されていませんか?
イスマエルミゲル14年

1
それは180と全く同じですので、-180度を行くことを許され@IsmaelMiguel
ドアノブ

1
それは間違いです。+180ºは時計回りに半回転することを意味します。-180ºは、反時計回りに(または、必要に応じて反時計回りに)半回転することを意味します。範囲が-179 <= a <= + 180の場合、ロボットは180度反時計回りに回転できません。どうして?彼は-179ºで立ち往生します!たぶんそれが彼が短絡を起こした理由です…
イスマエル・ミゲル

1
@WallyWest私は愚かではない、私はあなたの意味を理解しています。範囲を修正する必要があると言っているだけです。
イスマエルミゲル14年

回答:


2

Perl 6:188 184文字-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*$!}"
マチューRodic

@MathieuRodicああ、素敵な発見!ありがとう!残念ながら、スペースが後に.map:必須である
Mouq

ああ、私はスペースについて間違っていました、クール:)
Mouq 14年

10

ルビー、274 252 249 245 214 211 207 204 202文字(-5 = 197)

PHPはcharカウントでRubyをどのように倒しましたか?!>: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}"

ゴルフされていないコード(および少し古いバージョン):

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つの余分な文字の終了角度をマークすることができました。
ドアノブ

いいえ、コードの実行時に常に真北(見出し0)を向いています...その後、ターン、ラン、ターン、ラン、ターン、ラン、ターン、ラン、ターン、そしてラン...シャットダウンする前に。それはOrientationセクションで直面している最終的な角度を持っている必要があります。
WallyWest 14年

@WallyWestああ、わかりました、編集しました。オリエンテーションが0 ... 360にない場合でも大丈夫% 360ですか?
ドアノブ

それに応じてコードを宣言M=MathP=M::PIて置換することで11文字を保存できますputs
デビッド・ハーマン14年

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 14年

間違いなく。Mouq、あなたのようなもの...唯一の188で、すべての努力を一掃する
マチューRodic

3

Pythonの- 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のトリガー関数がラジアンで機能することを喜ばない1つの問題です。

> 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は、度ではなくラジアンで三角法計算を行います。したがって、あなたの計算が...おそらく間違っている
マチューRodic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.