Robot của tôi đã thoát khỏi phòng thí nghiệm!


13

Robot của tôi đã bị ngắn mạch bằng cách nào đó và ngẫu nhiên chạy đi đâu đó từ phòng thí nghiệm của tôi!

May mắn thay, bất cứ khi nào anh ta làm điều này, trình tự tắt máy của anh ta bắt đầu, cho anh ta đủ thời gian để quay ngẫu nhiên và chạy theo hướng mà nó phải đối mặt trong năm vòng trước khi anh ta tắt. Chức năng con quay hồi chuyển và gia tốc kế của anh ta vẫn đang chuyển dữ liệu trở lại phòng thí nghiệm trong khi anh ta vẫn đang bật.

Ví dụ, dữ liệu sẽ luôn ở dạng năm bộ gồm hai số.

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

Nhiệm vụ của bạn, chơi golf là để a) mô phỏng chạy điên cuồng của robot và biến chuỗi bằng cách hiển thị năm bộ các số theo hình thức a1:d1,a2:d2,a3:d3,a4:d4,a5:d5nơi a(n) là góc chiều kim đồng hồ (tính theo độ) sao cho -179<=a<=+180rằng robot sẽ chuyển từ tiêu đề hiện tại của nó ( ban đầu nó ở tiêu đề 0 trước khi nó chạy amok và quay lần đầu tiên) và d(n) là khoảng cách tính theo feet mà nó đã chạy trước khi thay đổi tiêu đề tiếp theo giống như 0<=d<=500bàn chân đó ; và b) Một tiêu đề được tính toán từ phòng thí nghiệm (cũng đang đối mặt với một tiêu đề bằng 0), khoảng cách tính theo feet (độ chính xác lên đến 3 chữ số thập phân được khuyến khích mạnh mẽ, -5 byte nếu bạn làm) và tiêu đề định hướng (tính theo độ) nơi robot của tôi đang đối mặt khi nó đã tắt.

Ví dụ dễ dàng:

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

Các lượt và khoảng cách ngẫu nhiên chỉ có vậy, ngẫu nhiên. Không có giá trị được đặt nào được mã hóa cứng, chúng ta phải thấy tính ngẫu nhiên trong hành động trong mã.

Hạn chế đối với tính ngẫu nhiên: Không có tham chiếu dựa trên đồng hồ hoặc ngày, chúng ta cần xem một randomtham chiếu gốc trong mã. Bất cứ khi nào bạn chạy mã này, tính ngẫu nhiên phải thể hiện chính nó với khả năng hiển thị 1 trong 360 góc quay có thể có với mỗi vòng quay. Vì vậy, robot có thể quay -36 độ ở một lượt và có thể quay +57 độ tiếp theo, tiếp theo là một góc khác +2 độ khác ở góc quay -16 độ và lượt cuối cùng là +42 độ ở lượt cuối cùng. Phải có ít nhất 360 giá trị riêng biệt (bao gồm từ -179 đến +180 độ) với mỗi thế hệ góc ngẫu nhiên.

Hạn chế đối với chạy khoảng cách: Tương tự như vậy, có 501 khoảng cách có thể robot có thể chạy, (bao gồm từ 0 đến 500 feet), vì vậy tôi hy vọng tính ngẫu nhiên cũng có sẵn khi xác định khoảng cách chạy của robot. Về mặt lý thuyết, robot có thể chạy 45, 117, 364, 27 và 6 feet với mỗi vòng tương ứng của nó ...

Dữ liệu được cung cấp cho bạn sẽ luôn ở các giá trị số nguyên ... robot sẽ chuyển theo phạm vi số nguyên độ và sẽ chạy trong phạm vi số nguyên khoảng cách. Tuy nhiên, các giá trị đầu ra sẽ là ...

Đây là môn đánh gôn. Mã ngắn nhất sẽ thắng ... Bây giờ hãy đi tìm robot của tôi!

PS: Liên quan đến "Độ chính xác lên đến 3 chữ số thập phân" của tôi, nếu bạn có thể cung cấp tiêu đề (tính theo độ, đến TỐI THIỂU 3 chữ số thập phân) và khoảng cách tính theo feet (cũng chính xác đến TỐI THIỂU 3 chữ số thập phân) sẽ nhận được phần thưởng -5 byte).


1
@IsmaelMiguel và @OP - Có lẽ tôi sẽ bị bắn vì điều này, nhưng bạn không thể sử dụng -180 < a <= +180làm <dấu hiệu cho chính nó ít hơn nhưng không bao gồm AFAIK ...
George

1
@GeorgeH Bạn đúng, nhưng những gì WallyWest đang nói là sai. "-179 <= a <= 180 kết quả trong tất cả 360 tiêu đề số nguyên có thể" -> điều này sai vì có 361 tiêu đề. Hoặc robot không được phép đi đến -180º?
Ismael Miguel

1
@IsmaelMiguel Nó được phép đi -180 độ, vì điều đó hoàn toàn giống với 180.
Doorknob

1
Điều đó là sai. + 180º có nghĩa là một nửa vòng quay theo chiều kim đồng hồ. -180º có nghĩa là quay nửa chiều ngược chiều kim đồng hồ (hoặc ngược chiều kim đồng hồ, tùy thích). nếu phạm vi là -179 <= a <= + 180, robot không thể quay 180 độ ngược chiều kim đồng hồ. Tại sao? Anh ta sẽ bị kẹt ở -179º! Có lẽ đó là lý do tại sao anh ta bị đoản mạch ...
Ismael Miguel

1
@WallyWest Tôi không ngu ngốc và tôi hiểu ý của bạn. Tôi chỉ nói rằng phạm vi nên được sửa chữa.
Ismael Miguel

Câu trả lời:


2

Perl 6: 188 184 ký tự - 5 = 180 điểm

$_=((-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 với khoảng trắng:

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

Ung dung:

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

Điều này biến dữ liệu thành các số phức với unpolar, đặt tổng của chúng vào $complex, và sau đó lấy tọa độ cực là $dist, $ang.

Góc tích lũy, $cum-angleđược thu thập vì các góc tương đối với robot khi nó di chuyển qua phòng thí nghiệm và vì chúng ta cần góc cuối cùng của robot trong đầu ra của chúng ta.

Đầu ra mẫu:

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

Thủ thuật thực sự duy nhất mà golf sử dụng là nó (mis) sử dụng cả 3 biến đặc biệt của Perl 6 để có hiệu quả tốt:

  • $! được sử dụng cho radian ↔ độ
  • $_giữ dữ liệu và bất cứ thứ gì trông giống như một .method()sự cô đơn thực sự có nghĩa là $_.method()(ngoại trừ bên trong map {…}khối, nơi $_thực sự đảm nhận giá trị của các cặp số tạo nên dữ liệu)
  • $/giữ những gì trong phiên bản không có ý thức ($dist, $ang). $0$1thực sự có nghĩa là $/[0], nghĩa là $dist, và $/[1], tức là$ang

Đẹp! Bạn vẫn có thể giảm từ 188 xuống 184 như thế này:$_=((-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 Ôi, tìm thật hay! Cảm ơn! Thật không may, không gian sau .map:là bắt buộc
Mouq

Ồ, tôi đã sai về không gian, tuyệt vời :)
Mouq

10

Ruby, 274 252 249 245 214 211 207 204 202 ký tự (-5 = 197)

Làm thế nào mà PHP đánh bại Ruby trong số char? >: O Phải tìm cách nào đó để chơi gôn nhiều hơn ...

Chỉnh sửa: Tôi đánh bại câu trả lời PHP, nhưng người dùng đã viết nó đã giúp tôi làm điều đó! Đi lên anh ta; anh ấy xứng đáng với nó :-P

Một chỉnh sửa khác: Gah! Anh lại vượt qua em! Bạn là một đối thủ rất xứng đáng, @MathieuRodic; Xin chúc mừng, tôi phải để bạn giành chiến thắng ;-)

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

Mã Ungolfed (và phiên bản cũ hơn một chút ):

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

Đầu ra mẫu:

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

Làm thế nào robot phải đối mặt do phía bắc sau khi đã quay năm góc ngẫu nhiên?
WallyWest

@WallyWest Tôi có ấn tượng rằng định hướng đánh dấu góc bắt đầu của robot, đúng không? Tôi có thể làm cho nó đánh dấu góc kết thúc chỉ với 3 ký tự phụ.
Doorknob

Không, nó luôn luôn hướng về phía bắc (nhóm 0) khi thực thi mã ... Sau đó, nó quay, chạy, quay, chạy, quay, chạy, quay, chạy, quay, rồi chạy ... trước khi tắt. Nó sẽ cần phải có góc cuối cùng mà nó đang đối mặt với Orientationphần bên trong .
WallyWest

@WallyWest Ah, được rồi, chỉnh sửa. Có ổn không nếu định hướng không ở 0 ... 360, hay chúng ta phải thực hiện % 360theo hướng đó?
Doorknob

Bạn có thể lưu 11 ký tự bằng cách khai báo M=MathP=M::PIthay thế mã phù hợp - và thêm một ký tự bằng cách loại bỏ khoảng trắng sau lần thứ hai puts.
David Herrmann

5

PHP - 238 232 221 212 203 199 ký tự

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

(kiểm tra tại đây: http://ideone.com/dNZnKX )

Phiên bản không chơi gôn:

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

(kiểm tra tại đây: http://ideone.com/1HzWH7 )


Có vẻ như Perl chỉ suýt đánh bại cả hai chúng tôi vào phút cuối. : -O
Doorknob

@Doorknob Yup, xin lỗi :)
Mouq

Chắc chắn rồi. Mouq, bạn đã xóa sạch mọi nỗ lực của chúng tôi chỉ với 188 ...
Mathieu Rodic

3

Python - 264 259 256 258 - 5 = 253 ký tự

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

(kiểm tra tại http://ideone.com/FicW6e )

Phiên bản bị đánh cắp:

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

(kiểm tra tại http://ideone.com/O3PP7T )

Lưu ý: nhiều câu trả lời bao gồm -5 trong tiêu đề của họ, trong khi chương trình của họ không biểu thị khoảng cách với độ chính xác lên đến 3 chữ số thập phân ...


1

Trăn 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

Không có gì quá lạ mắt ở đây, khá dài dòng. Đây là một vấn đề mà tôi không hài lòng khi các chức năng trig của python hoạt động theo 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

0

Con trăn 2 = 376 319 ký tự (-5 cho khoảng cách = 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)

đầu ra mẫu

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

Python thực hiện các phép tính lượng giác với radian, không phải bằng độ. Do đó, tính toán của bạn có thể sai ...
Mathieu Rodic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.