Meu robô entrou em curto-circuito de alguma forma e fugiu aleatoriamente para algum lugar do meu laboratório!
Felizmente, sempre que ele faz isso, sua sequência de desligamento é iniciada, dando-lhe tempo suficiente para virar e correr aleatoriamente na direção em que está por cinco rodadas antes de desligar. Suas funções de giroscópio e acelerômetro ainda estão retransmitindo os dados para o laboratório enquanto ele ainda está ligado.
Os dados sempre virão na forma de cinco conjuntos de dois números, por exemplo.
12:234,-135:47,-68:230,140:324,127,87
Sua missão, jogadores de golfe, é: a) simular a seqüência frenética de rotação e rotação do robô, exibindo cinco conjuntos de números na forma de a1:d1,a2:d2,a3:d3,a4:d4,a5:d5
onde a
(n) é o ângulo no sentido horário (em graus), de modo -179<=a<=+180
que o robô saia da posição atual ( inicialmente ele está no rumo zero antes de girar pela primeira vez), e d
(n) é a distância em pés percorridos antes da próxima mudança de rumo, que é tal que os 0<=d<=500
pés; eb) Um cabeçalho calculado do laboratório (que também está voltado para um zero), a distância em pés (precisão de até três casas decimais é fortemente incentivada, -5 bytes, se você o fizer) e o cabeçalho da orientação (em graus) de onde meu robô está voltado quando desligado.
Exemplo fácil:
Data: 0:1,45:1,90:1,90:1,90:1
Heading: 0
Distance: 1
Orientation: -45
As voltas e distâncias aleatórias são exatamente isso, aleatórias. Nenhum valor definido deve ser codificado, devemos ver a aleatoriedade em ação dentro do código.
Restrições à aleatoriedade: sem referências baseadas em relógio ou data, precisamos ver uma random
referência nativa dentro do código. Sempre que você executa esse código, a aleatoriedade deve se apresentar com a possibilidade de mostrar 1 de 360 possíveis ângulos de giro com cada rodada de giro. Portanto, o robô pode girar -36 graus em um turno e +157 graus no próximo, seguido por outro turno de +2 graus e outro turno de -116 graus e um turno final de +42 graus no turno final. Pelo menos 360 valores distintos devem ser possíveis (entre -179 a +180 graus, inclusive) a cada geração aleatória de ângulo.
Restrições à distância percorrida: Definidas da mesma forma, existem 501 distâncias possíveis que o robô pode percorrer (entre 0 e 500 pés, inclusive), portanto, espero que a aleatoriedade também esteja disponível ao determinar a distância de corrida do robô. O robô poderia teoricamente executar 45, 117, 364, 27 e 6 pés com cada uma de suas respectivas rodadas ...
Os dados fornecidos a você sempre estarão em valores inteiros ... o robô girará em intervalos inteiros de graus e será executado em intervalos inteiros de distância. Os valores de saída, no entanto, serão flutuantes ...
Isso é código-golfe. O menor código vence ... Agora, encontre o meu robô!
PS: em referência à minha "Precisão de até 3 casas decimais", se você pode fornecer o cabeçalho (em graus, para um MÍNIMO de 3 casas decimais) e uma distância em pés (também precisa também para um mínimo de 3 casas decimais), você receberá um bônus de -5 bytes).
-180 < a <= +180
como o<
sinal em seus próprios meios menos do que mas não incluindo AFAIK ...Respostas:
Perl 6:
188184 caracteres - 5 = 180 pontosGolfe com espaço em branco:
Ungolfed:
Isso transforma os dados em números complexos com
unpolar
, coloca a soma deles para$complex
, em seguida, recebe as coordenadas polares como$dist
,$ang
.O ângulo cumulativo
$cum-angle
é coletado porque os ângulos são relativos ao robô enquanto ele se move pelo laboratório e porque precisamos do ângulo final do robô em nossa saída.Saída de amostra:
O único truque real que o golfe usa é que ele (mis) usa todas as 3 variáveis especiais do Perl 6 com bom efeito:
$!
é usado para radianos ↔ graus$_
mantém os dados e qualquer coisa que pareça solitária.method()
significa$_.method()
(exceto dentro domap {…}
bloco, onde$_
assume o valor dos pares de números que compõem os dados)$/
mantém o que está na versão não-destruída($dist, $ang)
.$0
e$1
realmente significa$/[0]
, ie,,$dist
e$/[1]
, ie,$ang
fonte
$_=((-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:
é obrigatórioRuby,
274252249245214211207204202 caracteres (-5 = 197)Como o PHP venceu o Ruby na contagem de caracteres ?! >: O Precisa encontrar uma maneira de jogar mais ...
Edit: Eu venci a resposta do PHP, mas o usuário que a escreveu me ajudou a fazê-lo! Vá votar nele; ele merece :-P
Outra edição: Gah! Ele passou por mim de novo! Você é um oponente muito digno, @MathieuRodic; parabéns, eu tenho que deixar você ganhar ;-)
Código não-bloqueado (e versão
umpouco mais antiga):Saída de amostra:
fonte
Orientation
seção.% 360
nela?M=Math
eP=M::PI
substituindo o código de acordo - e mais um caractere se livrando do espaço após o segundoputs
.PHP -
238232221212203199 caracteres(teste aqui: http://ideone.com/dNZnKX )
Versão sem golfe:
(teste aqui: http://ideone.com/1HzWH7 )
fonte
Python -
264259256258 - 5 = 253 caracteres(teste em http://ideone.com/FicW6e )
Versão não destruída:
(teste em http://ideone.com/O3PP7T )
NB: muitas respostas incluem -5 no título, enquanto o programa não representa a distância com precisão de até três casas decimais ...
fonte
Python 301-5 = 296
Nada muito chique aqui, bastante detalhado. Esse é um problema para o qual não estou feliz que as funções trigonométricas do python funcionem em radianos.
fonte
Python 2 =
376319 caracteres (-5 para distância = 314)saída de amostra
fonte