Мой робот сбежал из лаборатории!


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что робот будет поворачиваться с текущего курса ( изначально он движется с нулевым курсом до того, как он выйдет из-под контроля и повернется в первый раз), и 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
@WallWest Я не дурак и понимаю, что ты имеешь в виду. Я просто говорю, что диапазон должен быть фиксированным.
Исмаэль Мигель

Ответы:


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

Единственный реальный трюк, который использует гольф, состоит в том, что он (неправильно) использует все 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

Ruby, 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

@WallWest У меня сложилось впечатление, что ориентация обозначает начальный угол робота, верно? Я мог сделать это, чтобы отметить конечный угол только для 3 дополнительных символов.
Дверная ручка

Нет, он всегда обращен к северу (заголовок 0) при выполнении кода ... Затем он поворачивается, бежит, поворачивается, бежит, поворачивается, бежит, поворачивается, бежит, поворачивается и затем бежит ... прежде чем он выключится. У него должен быть последний угол, с которым он сталкивается в Orientationсекции.
WallyWest

@WallWest А, ладно, отредактировано. Это нормально, если ориентация не в 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 Да, извините :)
Mouq

Определенно. Мок, ты как бы уничтожил все наши усилия только с 188 ...
Матье Родик

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 работают в радианах.

> 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 выполняет вычисления тригонометрии с радианами, а не с градусами. Следовательно, ваши расчеты, вероятно, неверны ...
Матье Родик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.