Il mio robot è scappato dal laboratorio!


13

Il mio robot ha cortocircuitato in qualche modo ed è fuggito a caso da qualche parte dal mio laboratorio!

Fortunatamente, ogni volta che lo fa, inizia la sua sequenza di spegnimento, dandogli abbastanza tempo per girare a casaccio e correre nella direzione in cui è rivolto per cinque round prima che si spenga. Le sue funzioni giroscopiche e accelerometriche stanno ancora trasmettendo i dati al laboratorio mentre è ancora acceso.

I dati verranno sempre sotto forma di cinque serie di due numeri, ad esempio.

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

La tua missione, i golfisti è di a) simulare la corsa frenetica del robot e girare la sequenza visualizzando cinque serie di numeri sotto forma di a1:d1,a2:d2,a3:d3,a4:d4,a5:d5 cui a(n) è l'angolo in senso orario (in gradi) in modo -179<=a<=+180che il robot si giri dalla sua direzione corrente ( inizialmente si trova a zero prima di girare di traverso e gira per la prima volta), e d(n) è la distanza in piedi percorsa prima del successivo cambio di rotta che è tale che i 0<=d<=500piedi; e b) un'intestazione calcolata dal laboratorio (che si trova anche di fronte a un'intestazione di zero), distanza in piedi (l'accuratezza fino a 3 decimali è fortemente incoraggiata, -5 byte se lo si fa) e la direzione di orientamento (in gradi) di dove è rivolto il mio robot quando si è spento.

Esempio semplice:

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

Le svolte e le distanze casuali sono proprio questo, casuali. Nessun valore impostato deve essere codificato, dobbiamo vedere la casualità in azione all'interno del codice.

Restrizioni alla casualità: nessun riferimento basato su orologio o data, dobbiamo vedere un nativo random riferimento all'interno del codice. Ogni volta che si esegue questo codice, la casualità deve presentarsi con la possibilità di mostrare 1 di 360 possibili angoli di svolta ad ogni giro di giro. Quindi il robot può girare di -36 gradi in un turno e può girare di +157 gradi il successivo, seguito da un altro giro di +2 gradi da un altro giro di -116 gradi e un giro finale di +42 gradi nell'ultimo turno. Almeno 360 valori distinti devono essere possibili (tra -179 e +180 gradi inclusi) con ogni generazione di angoli casuali.

Restrizioni per la corsa a distanza: impostate allo stesso modo, ci sono 501 possibili distanze che il robot può percorrere (tra 0 e 500 piedi inclusi), quindi mi aspetto che la casualità sia disponibile anche nel determinare la distanza di corsa del robot. Il robot potrebbe teoricamente correre 45, 117, 364, 27 e 6 piedi con ciascuno dei rispettivi giri ...

I dati forniti saranno sempre in valori interi ... il robot ruoterà in intervalli interi di gradi e verrà eseguito in intervalli interi di distanza. I valori di output tuttavia saranno float ...

Questo è code-golf. Il codice più corto vince ... Ora vai a trovare il mio robot!

PS: in riferimento alla mia "Precisione fino a 3 posizioni decimali", se è possibile fornire la direzione (in gradi, a un MINIMO di 3 posizioni decimali) e una distanza in piedi (precisa anche anche a un minimo di 3 posizioni decimali) riceverà un bonus di -5 byte).


1
@IsmaelMiguel e @OP - Probabilmente ho intenzione di farmi sparare per questo, ma non potresti usare -180 < a <= +180come <segno da solo meno di ma non compreso AFAIK ...
George

1
@GeorgeH Hai ragione, ma ciò che WallyWest sta dicendo è sbagliato. "-179 <= a <= 180 risultati in tutte le 360 ​​possibili intestazioni di numeri interi" -> questo è sbagliato perché ci sono 361 intestazioni. O il robot non può andare a -180º?
Ismael Miguel,

1
@IsmaelMiguel È consentito andare -180 gradi, perché è esattamente lo stesso di 180.
Maniglia

1
Questo è sbagliato. + 180º significa mezzo giro in senso orario. -180º significa mezzo giro in senso antiorario (o antiorario, come preferisci). se l'intervallo è -179 <= a <= + 180, il robot non può ruotare di 180º in senso antiorario. Perché? Sarà bloccato a -179º! Forse è per questo che ha avuto un corto circuito ...
Ismael Miguel,

1
@WallyWest Non sono stupido e capisco cosa intendi. Sto solo dicendo che l'intervallo dovrebbe essere fissato.
Ismael Miguel,

Risposte:


2

Perl 6: 188 184 caratteri - 5 = 180 punti

$_=((-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 con spazi bianchi:

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

Questo trasforma i dati in numeri complessi con unpolar, mette la somma di essi in $complex, e poi si fa le coordinate polari come $dist, $ang.

L'angolo cumulativo $cum-angleviene raccolto perché gli angoli sono relativi al robot mentre si muove attraverso il laboratorio e perché abbiamo bisogno dell'angolo finale del robot nella nostra produzione.

Uscita campione:

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

L'unico vero trucco che il golf usa è che (mis) usa tutte e 3 le variabili speciali di Perl 6 con buoni risultati:

  • $! è usato per radianti ↔ gradi
  • $_contiene i dati e tutto ciò che sembra un solitario in .method()realtà significa $_.method()(tranne all'interno del map {…}blocco, dove $_assume effettivamente il valore delle coppie di numeri che compongono i dati)
  • $/contiene ciò che è nella versione non golfata ($dist, $ang). $0e in $1realtà significa $/[0], cioè $dist, e $/[1], cioè,$ang

Bello! Puoi ancora scendere da 188 a 184 in questo modo:$_=((-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, bella scoperta! Grazie! Sfortunatamente, lo spazio dopo .map:è obbligatorio
Mouq

Oh, mi sbagliavo nello spazio, bello :)
Mouq

10

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

In che modo PHP ha battuto Ruby nel conteggio dei caratteri ?! >: O Deve trovare un modo per giocare a golf altro ...

Modifica: ho battuto la risposta PHP, ma l'utente che l'ha scritta mi ha aiutato a farlo! Vai a votarlo; se lo merita :-P

Un'altra modifica: Gah! Mi ha superato di nuovo! Sei un degno avversario, @MathieuRodic; complimenti, devo lasciarti vincere ;-)

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

Codice non golfato (e versione leggermente più vecchia):

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

Uscita campione:

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

In che modo il robot è rivolto verso nord dopo aver girato cinque angoli casuali?
WallyWest,

@WallyWest Avevo l'impressione che l'orientamento segna l'angolo iniziale del robot, giusto? Potrei farlo segnare l'angolo finale per soli 3 caratteri extra.
Maniglia della porta

No, è sempre rivolto a nord (direzione 0) all'esecuzione del codice ... Poi gira, gira, gira, gira, gira, gira, gira, gira, gira e poi corre ... prima di spegnersi. Dovrà avere l'angolo finale rivolto verso la Orientationsezione.
WallyWest,

@WallyWest Ah, ok, modificato. Va bene se l'orientamento non è in 0 ... 360, o dobbiamo fare una cosa % 360su di esso?
Maniglia della porta

Puoi salvare 11 caratteri dichiarando M=Mathe P=M::PIsostituendo il codice di conseguenza - e un altro carattere eliminando lo spazio dopo il secondo puts.
David Herrmann,

5

PHP - 238 232 221 212 203 199 caratteri

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

(testalo qui: http://ideone.com/dNZnKX )

Versione non golfata:

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

(testalo qui: http://ideone.com/1HzWH7 )


Sembra che Perl ci abbia battuto entrambi all'ultimo minuto. : -O
Maniglia della porta

@Doorknob Yup, sorry :)
Mouq

Decisamente. Mouq, hai spazzato via tutti i nostri sforzi con solo 188 ...
Mathieu Rodic,

3

Pitone - 264 259 256 258 - 5 = 253 caratteri

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

(testalo su http://ideone.com/FicW6e )

Versione non golfata:

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

(provalo a http://ideone.com/O3PP7T )

NB: molte risposte includono -5 nel loro titolo, mentre il loro programma non rappresenta la distanza con precisione fino a 3 decimali ...


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

Niente di troppo lussuoso qui, piuttosto prolisso. Questo è un problema per il quale non sono contento che le funzioni di trigger di Python funzionino in radianti.

> 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 caratteri (-5 per distanza = 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)

uscita campione

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

Python esegue calcoli di trigonometria con radianti, non con gradi. Quindi, i tuoi calcoli sono probabilmente sbagliati ...
Mathieu Rodic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.