Robot Saya Telah Lolos dari Lab!

13

Robot saya mengalami hubungan pendek entah bagaimana dan secara acak lari ke suatu tempat dari lab saya!

Untungnya, setiap kali dia melakukan ini, urutan pemadamannya dimulai, memberinya cukup waktu untuk secara acak berbalik dan berlari ke arah yang menghadapnya selama lima putaran sebelum dia mematikan. Fungsi gyro dan akselerometernya masih menyampaikan data kembali ke lab saat dia masih aktif.

Data akan selalu datang dalam bentuk lima set dua angka, misalnya.

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

Misi Anda, pegolf adalah untuk a) mensimulasikan gerakan panik dan memutar urutan robot dengan menampilkan lima set angka dalam bentuk di a1:d1,a2:d2,a3:d3,a4:d4,a5:d5mana a(n) adalah sudut searah jarum jam (dalam derajat) sedemikian rupa -179<=a<=+180sehingga robot akan berubah dari pos saat ini ( pada awalnya ia berada di nol arah sebelum berjalan mengamuk dan berbelok untuk pertama kalinya), dan d(n) adalah jarak di kaki yang telah berjalan sebelum perubahan pos berikutnya yang sedemikian rupa sehingga 0<=d<=500kaki; dan b) Pos yang dihitung dari lab (yang juga menghadap ke pos nol), jarak dalam kaki (akurasi hingga 3 tempat desimal sangat dianjurkan, -5 byte jika Anda melakukannya), dan pos orientasi (dalam derajat) dari tempat robot saya menghadap ketika telah dimatikan.

Contoh mudah:

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

Putaran dan jarak acak hanyalah itu, acak. Tidak ada nilai yang ditetapkan yang akan dikodekan secara keras, kita harus melihat keacakan dalam tindakan dalam kode.

Batasan ke keacakan: Tidak ada referensi berbasis jam atau tanggal, kita perlu melihat randomreferensi asli dalam kode. Setiap kali Anda menjalankan kode ini, keacakan harus muncul dengan kemungkinan menunjukkan 1 dari 360 kemungkinan sudut berbelok dengan setiap putaran turn-run. Jadi robot dapat berputar -36 derajat pada satu belokan dan dapat berbalik +157 derajat di tikungan berikutnya, diikuti oleh putaran lain +2 derajat dengan putaran lain -116 derajat dan putaran terakhir +42 derajat pada belokan terakhir. Setidaknya 360 nilai yang berbeda harus dimungkinkan (antara -179 hingga +180 derajat inklusif) dengan setiap generasi sudut acak.

Batasan untuk lari jarak: Sama halnya, ada 501 jarak yang mungkin dijalankan robot, (antara 0 dan 500 kaki inklusif), jadi saya berharap keacakan juga tersedia saat menentukan jarak lari robot. Robot secara teoritis dapat menjalankan 45, 117, 364, 27 dan 6 kaki dengan masing-masing putaran masing-masing ...

Data yang diumpankan kepada Anda akan selalu dalam nilai integer ... robot akan berubah dalam rentang derajat integer, dan akan berjalan dalam rentang jarak integer. Nilai output bagaimanapun, akan mengapung ...

Ini adalah kode-golf. Kemenangan kode terpendek ... Sekarang cari robot saya!

PS: Mengacu pada "Akurasi hingga 3 tempat desimal" saya, jika Anda dapat memberikan tajuk (dalam derajat, ke MINIMUM 3 tempat desimal) dan jarak dalam kaki (juga akurat juga ke MINIMUM 3 tempat desimal) Anda akan mendapatkan bonus -5 byte).

WallyWest
sumber
1
@IsmaelMiguel dan @OP - aku mungkin akan mendapatkan ditembak untuk ini, tapi tidak bisa Anda gunakan -180 < a <= +180sebagai <tanda pada cara sendiri kurang dari tetapi tidak termasuk AFAIK ...
George
1
@ GeorgeH Anda benar, tetapi apa yang dikatakan WallyWest salah. "-179 <= a <= 180 menghasilkan semua 360 kemungkinan judul bilangan bulat" -> ini salah karena ada 361 judul. Atau robot tidak diizinkan pergi ke -180º?
Ismael Miguel
1
@IsmaelMiguel Hal ini diperbolehkan untuk pergi -180 derajat, karena itulah persis sama dengan 180.
Doorknob
1
Itu salah. + 180º berarti setengah putaran searah jarum jam. -180º berarti setengah belok berlawanan arah jarum jam (atau berlawanan arah jarum jam, seperti yang Anda inginkan). jika rentang -179 <= a <= + 180, robot tidak dapat memutar 180º berlawanan arah jarum jam. Mengapa? Dia akan mandek di -179º! Mungkin itu sebabnya dia mengalami hubungan pendek ...
Ismael Miguel
1
@WallyWest Saya tidak bodoh dan saya mengerti maksud Anda. Saya hanya mengatakan bahwa kisaran harus diperbaiki.
Ismael Miguel

Jawaban:

2

Perl 6: 188 184 karakter - 5 = 180 poin

$_=((-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*$!}"

Golf dengan ruang putih:

$_ = ((-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*$!}"

Tidak Disatukan:

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.㎭;

Ini mengubah data menjadi angka yang kompleks dengan unpolar, menempatkan jumlah mereka ke dalam $complex, dan kemudian mendapat koordinat kutub sebagai $dist, $ang.

Sudut kumulatif, $cum-angledikumpulkan karena sudut relatif terhadap robot saat bergerak melalui lab dan karena kita membutuhkan sudut akhir robot dalam output kami.

Output sampel:

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

Satu-satunya trik nyata yang digunakan golf adalah bahwa ia (salah) menggunakan ketiga variabel khusus Perl 6 dengan efek yang baik:

  • $! digunakan untuk radian ↔ derajat
  • $_memegang data, dan segala sesuatu yang tampak seperti kesepian .method()sebenarnya berarti $_.method()(kecuali di dalam map {…}blok, di mana $_sebenarnya mengambil nilai dari pasangan angka yang membentuk data)
  • $/memegang apa yang ada di versi tanpa ungolfed ($dist, $ang). $0dan $1sebenarnya berarti $/[0], yaitu $dist, dan $/[1], yaitu,$ang
Mouq
sumber
Bagus! Anda masih bisa turun dari 188 ke 184 seperti ini:$_=((-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 Oh, temukan bagus! Terima kasih! Sayangnya, ruang setelahnya .map:adalah wajib
Mouq
Oh, saya salah tentang ruang, keren :)
Mouq
10

Ruby, 274 252 249 245 214 211 207 204 202 karakter (-5 = 197)

Bagaimana PHP mengalahkan Ruby dalam hitungan char ?! >: O Harus menemukan cara untuk bermain golf lagi ...

Sunting: Saya mengalahkan jawaban PHP, tetapi pengguna yang menulisnya membantu saya melakukannya! Pergilah angkat dia; dia layak mendapatkannya :-P

Suntingan lain: Gah! Dia melewati saya lagi! Anda adalah lawan yang sangat berharga, @MathieuRodic; selamat, saya harus membiarkan kamu menang ;-)

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}"

Kode tidak digabungkan (dan versi yang sedikit lebih lama):

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}"

Output sampel:

c:\a\ruby>robotgolf
Data: 94:26,175:332,14:390,159:448,-45:20
Heading: 124.52305879195005
Distance: 279.5742334385328
Orientation: 397
Gagang pintu
sumber
Bagaimana robot menghadap ke utara setelah memutar lima sudut acak?
WallyWest
@WallyWest Saya mendapat kesan bahwa orientasi menandai sudut awal robot, benar? Saya bisa membuatnya menandai sudut akhir hanya untuk 3 karakter tambahan.
Gagang Pintu
Tidak, selalu menghadap ke utara (pos 0) pada eksekusi kode ... Kemudian berubah, berjalan, berputar, berjalan, berputar, berlari, berputar, berlari, berputar dan kemudian berlari ... sebelum ditutup. Ini harus memiliki sudut akhir yang dihadapinya di Orientationbagian tersebut.
WallyWest
@WallyWest Ah, oke, diedit. Apakah boleh jika orientasi tidak dalam 0 ... 360, atau haruskah kita lakukan % 360di atasnya?
Gagang Pintu
Anda dapat menyimpan 11 karakter dengan mendeklarasikan M=Mathdan P=M::PImengganti kode yang sesuai - dan satu karakter lagi dengan menghilangkan spasi setelah yang kedua puts.
David Herrmann
5

PHP - 238 232 221 212 203 199 199 karakter

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

(uji di sini: http://ideone.com/dNZnKX )

Versi non-golf:

$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";

(uji di sini: http://ideone.com/1HzWH7 )

Mathieu Rodic
sumber
Sepertinya Perl baru saja mengalahkan kami berdua pada menit terakhir. : -O
Gagang Pintu
@Doorknob Yup, maaf :)
Mouq
Pastinya. Mouq, Anda agak menghapus semua upaya kami hanya dengan 188 ...
Mathieu Rodic
3

Python - 264 259 256 258 - 5 = 253 karakter

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))

(coba di http://ideone.com/FicW6e )

Versi tidak disatukan:

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))

(uji di http://ideone.com/O3PP7T )

NB: banyak jawaban termasuk -5 dalam judul mereka, sementara program mereka tidak mewakili jarak dengan akurasi hingga 3 tempat desimal ...

Mathieu Rodic
sumber
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

Tidak ada yang terlalu mewah di sini, lebih tepatnya bertele-tele. Ini adalah salah satu masalah yang saya tidak senang bahwa fungsi trigonon python bekerja di radian.

> 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
Kaya
sumber
0

Python 2 = 376 319 karakter (-5 untuk jarak = 314)

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)

output sampel

-141:245, 56:355, 145:223, -10:80, -38:253,
Heading: 12
Distance: 559.031404
Orientation: -2
Brian
sumber
Python melakukan perhitungan trigonometri dengan radian, bukan dengan derajat. Karenanya, perhitungan Anda mungkin salah ...
Mathieu Rodic