Mój robot jakoś zwarł i przypadkowo uciekł gdzieś z mojego laboratorium!
Na szczęście za każdym razem, gdy to robi, rozpoczyna się sekwencja wyłączania, dająca mu wystarczająco dużo czasu, aby losowo się odwrócił i pobiegł w kierunku przeciwległym przez pięć rund, zanim się wyłączy. Jego żyroskop i funkcje akcelerometru nadal przekazują dane z powrotem do laboratorium, gdy on jest nadal włączony.
Dane zawsze będą miały na przykład postać pięciu zestawów dwóch liczb.
12:234,-135:47,-68:230,140:324,127,87
Twoja misja, golfiści, to: a) zasymulować szaleńczą sekwencję biegu i obrotu robota, wyświetlając pięć zestawów liczb w postaci a1:d1,a2:d2,a3:d3,a4:d4,a5:d5
gdzie a
(n) jest kątem zgodnym z ruchem wskazówek zegara (w stopniach), dzięki -179<=a<=+180
czemu robot skręci z bieżącego kierunku ( początkowo ma zerowy kurs, zanim zacznie amok i skręci po raz pierwszy), oraz d
(n) jest odległością w stopach, jaką przebył przed następną zmianą kursu, czyli 0<=d<=500
stopami; oraz b) Obliczony kurs z laboratorium (który również jest skierowany na pozycję zerową), odległość w stopach (zdecydowanie zaleca się dokładność do 3 miejsc po przecinku, -5 bajtów, jeśli tak się dzieje), a także orientacja (w stopniach) gdzie stoi mój robot, gdy się wyłączył.
Prosty przykład:
Data: 0:1,45:1,90:1,90:1,90:1
Heading: 0
Distance: 1
Orientation: -45
Losowe zakręty i odległości są po prostu losowe. Żadne ustawione wartości nie mają być zakodowane na stałe, musimy zobaczyć losowość działania w kodzie.
Ograniczenia losowości: Brak odwołań opartych na zegarze lub dacie, musimy zobaczyć natywne random
odwołanie w kodzie. Ilekroć uruchamiasz ten kod, losowość musi przedstawiać się z możliwością pokazania 1 z 360 możliwych kątów skrętu przy każdej rundzie. Tak więc robot może obrócić o -36 stopni za jednym obrotem i może obrócić o +157 stopni za następnym, a następnie o kolejny obrót o +2 stopnie o kolejny obrót o -116 stopni i końcowy obrót o +42 stopnie przy ostatnim zwoju. Przy każdym losowym generowaniu kąta muszą być możliwe co najmniej 360 różnych wartości (od -179 do +180 stopni włącznie).
Ograniczenia biegu na odległość: Podobnie ustawione, istnieje 501 możliwych odległości, które robot może przejechać (od 0 do 500 stóp włącznie), więc spodziewam się, że losowość będzie dostępna również przy określaniu odległości biegu robota. Robot mógłby teoretycznie przejechać 45, 117, 364, 27 i 6 stóp z każdą z odpowiednich rund ...
Dostarczone dane będą zawsze w liczbach całkowitych ... robot skręci w całkowitych zakresach stopni i będzie działał w całkowitych zakresach odległości. Wartości wyjściowe będą jednak zmiennoprzecinkowe ...
To jest golf golfowy. Najkrótszy kod wygrywa ... Teraz idź znajdź mojego robota!
PS: W odniesieniu do mojej „Dokładności do 3 miejsc po przecinku”, jeśli możesz podać nagłówek (w stopniach, do MINIMUM 3 miejsc po przecinku) i odległość w stopach (również dokładna do MINIMUM 3 miejsc po przecinku) dostanie premię -5 bajtów).
-180 < a <= +180
jako<
znaku jako takiego, oznacza mniej niż, ale nie wliczając AFAIK ...Odpowiedzi:
Perl 6:
188184 znaków - 5 = 180 punktówGolf z białymi znakami:
Nie golfowany:
Ten zamienia dane w liczbach zespolonych z
unpolar
, wkłada je do sumy$complex
, a następnie pobiera współrzędne polarne jak$dist
,$ang
.Kąt skumulowany
$cum-angle
jest zbierany, ponieważ kąty odnoszą się do robota poruszającego się w laboratorium i ponieważ potrzebujemy końcowego kąta robota w naszej wydajności.Przykładowe dane wyjściowe:
Jedyną prawdziwą sztuczką, jakiej używa golf, jest to, że (źle) wykorzystuje wszystkie 3 specjalne zmienne Perla 6, aby uzyskać dobry efekt:
$!
jest stosowany dla radianów ↔ stopni$_
przechowuje dane i wszystko, co wygląda na samotne, w.method()
rzeczywistości oznacza$_.method()
(z wyjątkiem wewnątrzmap {…}
bloku, gdzie$_
faktycznie przyjmuje wartość par liczb, które składają się na dane)$/
zawiera to, co jest w wersji bez golfa($dist, $ang)
.$0
i$1
faktycznie oznacza$/[0]
, tj.$dist
i$/[1]
, tj.$ang
źródł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*$!}"
.map:
jest obowiązkoweRubinowy,
274252249245214211207204202 znaków (-5 = 197)W jaki sposób PHP pokonało Ruby w char? >: O Musisz znaleźć sposób na golfa więcej ...
Edycja: Pobiłem odpowiedź PHP, ale użytkownik, który ją napisał, pomógł mi to zrobić! Głosujcie do niego; zasługuje na to :-P
Kolejna edycja: Gah! Minął mnie ponownie! Jesteś bardzo godnym przeciwnikiem, @MathieuRodic; gratulacje, muszę pozwolić ci wygrać ;-)
Kod niepolecany (i
niecodużo starsza wersja):Przykładowe dane wyjściowe:
źródło
Orientation
przekroju.% 360
?M=Math
iP=M::PI
zamieniając kod - i jeszcze jeden znak, pozbywając się miejsca po drugimputs
.PHP -
238232221212203199 znaków(przetestuj tutaj: http://ideone.com/dNZnKX )
Wersja bez gry w golfa:
(przetestuj tutaj: http://ideone.com/1HzWH7 )
źródło
Python -
264259256258 - 5 = 253 znaków(przetestuj na http://ideone.com/FicW6e )
Wersja bez golfa:
(przetestuj na http://ideone.com/O3PP7T )
Uwaga: wiele odpowiedzi zawiera w tytule -5 , a ich program nie oddaje odległości z dokładnością do 3 miejsc po przecinku ...
źródło
Python 301-5 = 296
Nie ma tu nic nadzwyczajnego, raczej gadatliwy. Jest to jeden problem, z którego nie jestem zadowolony, że funkcje trygonowe Pythona działają w radianach.
źródło
Python 2 =
376319 znaków (-5 dla odległości = 314)próbka wyjściowa
źródło