Мій робот втік із лабораторії!


13

Мій робот якось коротко замикається і випадково біжить кудись із моєї лабораторії!

На щастя, кожен раз, коли він це робить, його послідовність відключення ініціює, даючи йому достатньо часу для випадкового повороту та бігу в напрямку, що його стикається протягом п'яти раундів, перш ніж він вимикається. Його функції гіроскопа та акселерометра досі переносять дані в лабораторію, поки він все ще ввімкнений.

Дані завжди будуть надходити у вигляді п'яти наборів з двох чисел, наприклад.

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

Ваша місія, гравці в гольф: а) імітувати шалену послідовність бігу та повороту робота, показуючи п’ять наборів чисел у вигляді a1:d1,a2:d2,a3:d3,a4:d4,a5:d5де a(n) кут за годинниковою стрілкою (у градусах) таким чином, -179<=a<=+180що робот повернеться від свого поточного заголовка ( спочатку він знаходиться на нульовому заголовку до того, як він запустить amok і повернеться вперше), і 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 футів з кожним із відповідних раундів ...

Дані, які вам подаються, завжди будуть в цілих значеннях ... робот повернеться в цілі діапазони градусів і буде працювати в цілих діапазонах відстані. Вихідні значення, однак, будуть поплавцями ...

Це код-гольф. Найкоротший виграш коду ... Тепер знайди мого робота!

PS: Посилаючись на мою "Точність до 3 знаків після коми", якщо ви можете вказати заголовок (у градусах, до МІНІМУМУ з 3 знаків після коми) та відстань у футах (також точно також до МІНІМУМУ 3 десяткових знаків) ви отримає бонус -5 байт).


1
@IsmaelMiguel і @OP - я, мабуть, буду застрелений для цього, але ви не зможете використовувати -180 < a <= +180як <знак самостійно менше, але не включаючи AFAIK ...
Джордж

1
@GeorgeH Ви маєте рацію, але те, що говорить WallyWest, є неправильним. "-179 <= a <= 180 призводить до всіх 360 можливих цілих заголовків" -> це неправильно, оскільки є 361 заголовка. Або роботові заборонено переходити до -180º?
Ісмаїл Мігель

1
@IsmaelMiguel Дозволено ходити на -180 градусів, тому що це точно так само, як 180.
Дверна ручка

1
Це неправильно. + 180º означає половину повороту за годинниковою стрілкою. -180º означає половину повороту проти годинникової стрілки (або, як вам зручніше). якщо діапазон дорівнює -179 <= a <= + 180, робот не може повернути 180 ° проти годинникової стрілки. Чому? Він застрягне на -179º! Можливо, тому у нього було коротке замикання ...
Ісмаель Мігель

1
@WallyWest Я не дурний і розумію, що ти маєш на увазі. Я просто кажу, що діапазон слід фіксувати.
Ісмаїл Мігель

Відповіді:


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

Єдиний справжній трюк, який гольф використовує, це те, що він (помилково) використовує всі 3 спеціальні змінні 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*$!}"
Матьє Родік

@MathieuRodic О, приємна знахідка! Спасибі! На жаль, місце після цього .map:є обов'язковим
Mouq

Ой, я помилявся про космос, класно :)
Mouq

10

Рубі, 274 252 249 245 214 211 207 204 202 символи (-5 = 197)

Як PHP переміг Рубі в лічильниках ?! >: O Потрібно знайти шлях до гольфу більше ...

Редагувати: Я переміг відповідь PHP, але користувач, який її написав, допоміг мені це зробити! Іди, піднеси його; він на це заслуговує :-П

Ще одна редакція: 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 додаткових знаків.
Дверна ручка

Ні, при виконанні коду він завжди стикається через північ (заголовок 0) ... Потім він повертається, бігає, обертається, бігає, обертається, бігає, обертається, біжить, перевертається, а потім біжить ... перед тим, як він закривається. Він повинен мати кінцевий кут, з яким він стикається вперерізі Orientation.
WallyWest

@WallyWest Ах, добре, відредаговано. Чи добре, якщо орієнтація не в 0 ... 360, чи ми повинні робити % 360на ній?
Дверна ручка

Ви можете зберегти 11 символів, оголосивши M=Mathта P=M::PIзамінивши кодом відповідно - і ще один символ, позбувшись місця після другого puts.
Девід Геррман

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 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 у своєму заголовку, тоді як їх програма не представляє відстань з точністю до 3 знаків після коми ...


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 символів (-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 робить обчислення тригонометрії радіанами, а не градусами. Отже, ваші розрахунки, ймовірно, помиляються ...
Матьє Родік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.