หุ่นยนต์ของฉันหลบหนีจากแล็บ!


13

หุ่นยนต์ของฉันลัดวงจรและวิ่งออกจากห้องแล็บของฉันแบบสุ่ม!

โชคดีที่เมื่อใดก็ตามที่เขาทำสิ่งนี้ลำดับการปิดของเขาจะเริ่มต้นทำให้เขามีเวลามากพอที่จะหมุนและวิ่งไปในทิศทางที่หันหน้าไปทางห้ารอบก่อนที่เขาจะปิด ฟังก์ชั่น gyro และ accelerometer ของเขายังคงส่งข้อมูลกลับไปที่ห้องแล็บในขณะที่เขายังอยู่

ข้อมูลจะมาในรูปของตัวเลขสองชุดห้าชุดเสมอ

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อ้างอิงดั้งเดิมภายในโค้ด เมื่อใดก็ตามที่คุณเรียกใช้รหัสนี้การสุ่มต้องนำเสนอตัวเองด้วยความเป็นไปได้ที่จะแสดงมุมที่เป็นไปได้ 1 ใน 360 ของการหมุนในแต่ละรอบการหมุน ดังนั้นหุ่นยนต์อาจหมุน -36 องศาในคราวเดียวและอาจเลี้ยว +157 องศาต่อไปตามด้วยอีกเทิร์น +2 องศาอีกเทิร์น -116 องศาและรอบสุดท้ายของ +42 องศาในเทิร์นสุดท้าย ต้องมีค่าที่แตกต่างอย่างน้อย 360 ค่า (ระหว่าง -179 ถึง +180 องศา) กับการสร้างมุมแบบสุ่มแต่ละอัน

ข้อ จำกัด สำหรับการวิ่งทางไกล: ตั้งค่าในทำนองเดียวกันมีระยะทางที่เป็นไปได้ 501 จุดที่หุ่นยนต์สามารถวิ่งได้ (รวมตั้งแต่ 0 ถึง 500 ฟุต) ดังนั้นฉันคาดว่าการสุ่มจะพร้อมใช้งานเมื่อพิจารณาระยะการวิ่งของหุ่นยนต์ หุ่นยนต์สามารถวิ่ง 45, 117, 364, 27 และ 6 ฟุตในแต่ละรอบของมัน ...

ข้อมูลที่ป้อนให้กับคุณจะเป็นค่าจำนวนเต็มเสมอ ... หุ่นยนต์จะเปลี่ยนเป็นช่วงจำนวนเต็มขององศาและจะทำงานในช่วงจำนวนเต็มของระยะทาง อย่างไรก็ตามค่าที่ส่งออกจะลอย ...

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ ... ตอนนี้ไปหาหุ่นยนต์ของฉัน!

ป.ล. : อ้างอิงถึง "ความแม่นยำสูงสุดทศนิยม 3 ตำแหน่ง" ของฉันหากคุณสามารถระบุหัวเรื่อง (ในหน่วยองศาให้ถึงตำแหน่งทศนิยมขั้นต่ำ 3 ตำแหน่ง) และระยะทางเป็นฟุต (และแม่นยำเช่นกันกับตำแหน่งทศนิยมขั้นต่ำ 3) จะได้รับโบนัส -5 ไบต์)


1
@IsmaelMiguel และ @OP - ฉันอาจจะได้รับการยิงนี้ แต่ couldnt คุณใช้-180 < a <= +180เป็น<เครื่องหมายในวิธีการของตัวเองน้อยกว่า แต่ไม่รวมถึง AFAIK ...
จอร์จ

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: 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*$!}"

Ungolfed:

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

เคล็ดลับที่แท้จริงเพียงอย่างเดียวที่นักกอล์ฟใช้คือมัน (mis) ใช้ตัวแปรพิเศษทั้งหมดของ Perl 6 เพื่อผลที่ดี:

  • $! ใช้สำหรับเรเดียน↔องศา
  • $_เก็บข้อมูลและสิ่งที่ดูเหมือนว่าโดดเดี่ยว.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

@MathieuRodic โอ้หาดี! ขอบคุณ! น่าเสียดายที่ต้องเว้นวรรคหลังจาก.map:นั้น
Mouq

โอ้ผมผิดเกี่ยวกับพื้นที่อากาศเย็น :)
Mouq

10

Ruby, 274 252 249 245 214 211 207 204 202 ตัวอักษร (-5 = 197)

PHP เอาชนะ 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

หุ่นยนต์หันหน้าไปทางทิศเหนืออย่างไรหลังจากหมุนมุมห้ามุมแล้ว?
WallyWest

@WallyWest ฉันรู้สึกว่าการวางแนวทำเครื่องหมายมุมเริ่มต้นของหุ่นยนต์ถูกต้องหรือไม่ ฉันสามารถทำให้มันเป็นเครื่องหมายของมุมสิ้นสุดได้เพียง 3 ตัวอักษรพิเศษ
Doorknob

ไม่มันหันหน้าไปทางทิศเหนือเสมอ (ส่วนหัว 0) ที่การประมวลผลของรหัส ... จากนั้นก็จะเปิดรันเปิดหมุนวิ่งหมุนเปลี่ยนวิ่งวิ่งแล้วเปลี่ยน ... ก่อนที่จะปิดตัวลง มันจะต้องมีมุมสุดท้ายที่มันหันเข้าหาOrientationส่วนนี้
WallyWest

@WallyWest อ่าโอเคแก้ไขแล้ว มันไม่เป็นไรถ้าการวางแนวไม่ได้อยู่ใน 0 ... 360 หรือเราต้องทำ% 360ต่อหรือไม่?
Doorknob

คุณสามารถบันทึก 11 ตัวด้วยการประกาศM=MathและP=M::PIและการเปลี่ยนรหัสตาม - 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 )


ดูเหมือนว่า Perl จะเอาชนะเราทั้งคู่ได้อย่างหวุดหวิดในนาทีสุดท้าย : -O
Doorknob

@Doorknob Yup, เสียใจ :)
Mouq

อย่างแน่นอน. Mouq คุณกำจัดความพยายามทั้งหมดของเราด้วยเพียง 188 ...
Mathieu 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 )

NB: คำตอบมากมายรวมถึง-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 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 ตัวอักษร (-5 สำหรับระยะทาง = 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)

ตัวอย่างผลลัพธ์

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

Python ทำการคำนวณตรีโกณมิติด้วยเรเดียนไม่ใช่กับองศา ดังนั้นการคำนวณของคุณอาจผิด ...
Mathieu Rodic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.