Robotum Laboratuardan Kaçtı!


13

Robotum bir şekilde kısa devre yaptı ve laboratuvarımdan bir yere rastgele çıktı!

Neyse ki, ne zaman bunu yaparsa, kapanma sırası başlar ve ona kapanmadan önce beş tur boyunca rastgele yönde dönmesi ve koşması için yeterli zaman verir. Cayro ve ivmeölçer fonksiyonları hala açıkken verileri laboratuvara geri aktarıyor.

Veriler her zaman iki sayıdan oluşan beş set şeklinde gelir.

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

Görevin, golfçüler robotun çılgınca koşmak taklit ve şeklinde sayıları beş set göstererek diziyi çevirmek) bir etmektir a1:d1,a2:d2,a3:d3,a4:d4,a5:d5nerede a) saat yönünde açısı derece olarak (is) (n böyle -179<=a<=+180(robot bugünkü başlığı dan dönecek başlangıçta, amok koşmadan ve ilk kez dönmeden önce sıfır istikametindedir) ve d(n) bir sonraki istikamet değişikliğinden önce koştuğu ayak cinsinden mesafedir 0<=d<=500; ve b) Laboratuardan hesaplanan bir başlık (sıfır başlığına da bakmaktadır), ayak cinsinden uzaklık (3 ondalık basamağa kadar doğruluk kuvvetle teşvik edilir, eğer yaparsanız -5 bayt) ve yönlendirme başlığı (derece olarak) kapandığında robotumun nereye baktığı.

Kolay örnek:

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

Rastgele dönüşler ve mesafeler sadece budur. Hiçbir sabit değer sabit olarak kodlanmayacaktır, kod içindeki rasgele davranışı görmeliyiz.

Rastgele kısıtlamalar: Saat veya tarihe dayalı referans yok random, kod içinde yerel bir referans görmemiz gerekiyor . Bu kodu her çalıştırdığınızda, rastgelelik her dönüş turunda 360 olası dönme açısının 1'ini gösterme olasılığı sunmalıdır. Böylece robot bir turda -36 derece dönebilir ve bir sonraki aşamada +157 derece dönebilir, ardından -116 derecelik bir başka dönüş ile +2 derecelik bir dönüş ve son dönüşte +42 derecelik bir son dönüş yapabilir. Her rastgele açı oluşturmada en az 360 farklı değer (-179 ila +180 derece dahil) mümkün olmalıdır.

Mesafe çalışmasına ilişkin kısıtlamalar: Benzer şekilde, robotun çalışabileceği 501 olası mesafe vardır (0 ila 500 fit dahil), bu yüzden robotun çalışma mesafesini belirlerken rasgele olmanın da mevcut olmasını bekliyorum. Robot teorik olarak 45, 117, 364, 27 ve 6 feet koşabiliyordu.

Size beslenen veriler her zaman tamsayı değerlerinde olacaktır ... robot tamsayı derece aralıklarında dönecek ve tamsayı mesafe aralıklarında çalışacaktır. Ancak çıktı değerleri değişken olacaktır ...

Bu kod golfü. En kısa kod kazanıyor ... Şimdi git robotumu bul!

Not: "3 ondalık basamağa kadar doğruluk" a referansla, eğer başlığı (derece olarak, 3 ondalık basamağın minimum bir derecesine kadar) ve ayak cinsinden bir mesafeyi (ayrıca MINIMUM 3 ondalık basamağa kadar da doğru) sağlayabiliyorsanız -5 bayt bonus kazanacaksınız).


1
@IsmaelMiguel ve @OP - Muhtemelen bunun için vurulacağım, ancak AFAIK dahil olmaktan daha az ama kendi yolunda işaret -180 < a <= +180olarak kullanamazdınız <...
George

1
@GeorgeH Haklısınız, ancak WallyWest'in söyledikleri yanlış. "-179 <= a <= 180, 360 olası tamsayı başlığının tümüyle sonuçlanır" -> bu yanlıştır, çünkü 361 başlık vardır. Yoksa robotun -180º'ye gitmesine izin verilmiyor mu?
Ismael Miguel

1
@IsmaelMiguel -180 dereceye kadar gitmesine izin verildi, çünkü bu tam olarak 180 ile aynı.
Kapı Tokmağı

1
Bu yanlış. + 180º saat yönünde yarım dönüş anlamına gelir. -180º saat yönünün tersine yarım tur (veya tercih ettiğiniz şekilde saat yönünün tersine) anlamına gelir. aralık -179 <= a <= + 180 ise, robot 180º saat yönünün tersine dönemez. Neden? -179º'da takılı kalacak! Belki de bu yüzden kısa devre yaptı ...
Ismael Miguel

1
@WallyWest Aptal değilim ve ne demek istediğini anlıyorum. Sadece menzilin sabitlenmesi gerektiğini söylüyorum.
Ismael Miguel

Yanıtlar:


2

Perl 6: 188184 karakter - 5 = 180 puan

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

Boşluklu Golf:

$_ = ((-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.㎭;

Bu karmaşık sayılar veri döner unpolariçine bunların, koyar toplamı $complexve polar koordinatları alır $dist, $ang.

Kümülatif açı, $cum-angleaçılar, laboratuvarda hareket ettikçe robota göre olduğu ve robotun çıktımızdaki son açısına ihtiyacımız olduğu için toplanır.

Örnek çıktı:

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

Golfün kullandığı tek gerçek hile, (mis) Perl 6'nın özel değişkenlerinin 3'ünün tamamını iyi bir etki için kullanmasıdır:

  • $! radyan for derece için kullanılır
  • $_verileri tutar ve yalnız görünen bir şey .method()aslında anlamına gelir $_.method()( verileri oluşturan sayı çiftlerinin değerini alan map {…}blok içinde hariç $_)
  • $/ungolfed versiyonda olanı tutar ($dist, $ang). $0ve $1aslında ortalama $/[0], yani $dist, ve $/[1], yani$ang

Güzel! Hala 188'den 184'e kadar bu şekilde gidebilirsiniz:$_=((-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, güzel bul! Teşekkürler! Ne yazık ki, sonraki boşluk .map:zorunludur
Mouq

Oh, uzay konusunda yanılmışım, havalı :)
Mouq

10

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

PHP char sayısında Ruby'yi nasıl yendi ?! >: O golf için daha fazla yol bulmalı ...

Düzenleme: Ben PHP cevabını yendi, ama bunu yazan kullanıcı bana yardımcı oldu! Git ona oy ver; hak ediyor: -P

Başka bir düzenleme: Gah! Beni yine geçti! Çok değerli bir rakipsiniz, @MathieuRodic; tebrikler, kazanmanıza izin vermeliyim ;-)

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

Kod çözülmemiş kod (ve biraz daha eski sürüm):

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

Örnek çıktı:

c:\a\ruby>robotgolf
Data: 94:26,175:332,14:390,159:448,-45:20
Heading: 124.52305879195005
Distance: 279.5742334385328
Orientation: 397

Beş rastgele açı döndükten sonra robot nasıl kuzeye bakacak?
WallyWest

Yönün robotun başlangıç ​​açısını işaret ettiği izlenimi altındaydım, doğru mu? Sadece 3 ekstra karakter için bitiş açısını işaretleyebilirim.
Kapı tokmağı

Hayır, kodun yürütülmesinde daima kuzeye (0 pozisyonu) bakar ... Sonra döner, çalışır, döner, çalışır, döner, döner, döner, döner, döner ve sonra çalışır ... kapanmadan önce. Bölüme baktığı son açıya sahip olması gerekir Orientation.
WallyWest

@WallyWest Ah, tamam, düzenlendi. Yönelim 0 ... 360'da değilse sorun değil % 360mi , yoksa üzerinde bir şey yapmak zorunda mıyız ?
Kapı tokmağı

Kodu buna göre bildirerek M=Mathve P=M::PIdeğiştirerek 11 karakter ve ikinciden sonra boşluktan kurtularak bir karakter daha kaydedebilirsiniz puts.
David Herrmann

5

PHP - 238 232 221 212 203 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

(buradan test edin: http://ideone.com/dNZnKX )

Golfsiz sürüm:

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

(buradan test edin: http://ideone.com/1HzWH7 )


Görünüşe göre Perl bizi son dakikada dar bir şekilde yendi. : -O
Kapı tokmağı

@Doorknob Yup, özür dilerim :)
Mouq

Kesinlikle. Mouq, tüm çabalarımızı sadece 188 ile sildin ...
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))

( http://ideone.com/FicW6e adresinde test edin )

Ungolfed sürümü:

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 adresinden test edin )

Not: Birçok cevap başlıklarında -5 içerirken, programları 3 ondalık basamağa kadar doğrulukla mesafeyi temsil etmez ...


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

Burada çok süslü bir şey değil, daha ayrıntılı. Bu, python'un trig fonksiyonlarının radyanlarda çalışmasından memnun olmadığım bir problem.

> 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 karakter (mesafe için -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)

örnek çıktı

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

Python, derece ile değil, radyanlarla trigonometri hesaplamaları yapar. Bu nedenle, hesaplamalarınız büyük olasılıkla yanlış ...
Mathieu Rodic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.