Desafio
Dado um número de segundos após a meia-noite, produza o menor ângulo entre dois ponteiros em um relógio, usando o mínimo de bytes possível.
Você pode assumir que o número de segundos é sempre menor que 86400. Os ângulos podem ser representados em graus ou radianos.
Uma solução de referência está em: http://ideone.com/eVdgC0
Casos de teste (resultados em graus)
0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333
Esclarecimentos
- O relógio possui três ponteiros: horas, minutos e segundos.
- Todos os ponteiros se movem continuamente, portanto, os ponteiros de horas e minutos podem ser encontrados entre as graduações no mostrador do relógio.
code-golf
arithmetic
geometry
toto
fonte
fonte
Respostas:
CJam,
3635343230 bytesA saída está em radianos. Eu verifiquei as soluções para todas as 86400 entradas possíveis.
Experimente on-line no intérprete CJam .
Idéia
Como 2π radianos é uma volta completa, cada intervalo de minuto / segundo no relógio tem 2π / 60 = π / 30 radianos de largura.
Assim, dividir o número de segundos por π / 30 produz a posição do ponteiro dos segundos.
O ponteiro dos minutos se move a 1/60 do ritmo do ponteiro dos segundos, portanto, dividir o resultado de cima por 60 gera a posição do ponteiro dos minutos.
Da mesma forma, dividir o último resultado por 12 gera a posição do ponteiro das horas.
Observe que nossos três quocientes acima não estão necessariamente no intervalo [0,2π).
Ao calcular todas as nove possíveis diferenças dos ângulos das mãos, obtemos três 0 (distância angular entre uma mão e ela mesma) e as seis distâncias entre as diferentes mãos.
Se os ponteiros mais próximos estiverem na metade que não inclui 12 , uma das diferenças acima será a saída desejada (mod 2π ).
No entanto, às 01:55:30 (por exemplo), o ponteiro das horas está em um ângulo de 1.008 rad (57.75 graus) e o ponteiro dos minutos em um ângulo de 5.812 rad (333.00 graus) de 12 , dando uma diferença de 4.804 rad (275,25 graus). Subtraindo esse resultado de uma volta completa, obtemos o ângulo medido "na outra direção", que é igual a 1,479 rad (84,75 rad).
Agora, em vez de mapear cada ângulo θ em [0,2π) e subtrair condicionalmente o resultado de π , podemos simplesmente calcular arccos (cos (θ)) , pois cos é periódico e par e os arccos sempre produzem um valor em [ 0, π) .
Ignorando os três menores resultados (todos zero), o quarto menor será a saída desejada.
Código
Versão alternativa (34 bytes)
A saída é em graus e nenhuma função trigonométrica é usada.
Experimente on-line no intérprete CJam .
fonte
Mathematica, 40 bytes
Explicação: Seja o
t
número de segundos desde a meia-noite. A posição de cada mão éPara calcular a distância angular absoluta entre
x
graus ey
graus, podemos modificary - x
360 no intervalo[-180, 180]
e, em seguida, pegar o valor absoluto. (Note que não há nenhuma restriçãox
ey
.) Então, esta função apenas calcula as diferenças de parest/10-t/120
,6t-t/10
e,6t-t/120
e faz isso.fonte
&
) e o primeiro argumento que é passado é referido dentro como#
.Python, 65
A distância percorrida pela hora, minuto e ponteiro dos segundos, em unidades de 1/60 do círculo, é
h,m,s = n/720, n/60, n/1
. Podemos pegar esses mod 60 para obter sua posição no círculo de0
para60
.Se considerarmos a diferença 60, obtemos o número de unidades que uma está na frente da outra. Tomamos todas as seis diferenças possíveis, encontramos o mínimo e multiplicamos por
6
para redimensionar para360
graus.A compreensão da lista de duas camadas primeiro escolhe o primeiro lado, como representado por
720
,60
ou1
, então escolhe o outro lado de fora do referido conjunto com a primeira escolha removido por meio de conjunto xor.Eu testei isso exaustivamente contra o código de referência.
fonte
C #,
163152 bytesIsso cria todas as mãos duas vezes para contar a volta, depois percorre todas as combinações e encontra o ângulo mínimo entre as mãos. Os cálculos são realizados em 60 divisões, depois multiplicados por 6 para obter graus.
Recuado para maior clareza:
Exemplo de saída:
fonte
TI-BASIC, 17 bytes
Usa Dennis's
arccos(cos(
para normalizar distâncias; no entanto, em vez de calcular todas as distâncias aos pares, calcula apenas as três necessárias usandoΔList([seconds],[minutes],[hours],[seconds]
.Este programa espera o
Degree
modo e retorna a resposta em graus.EDIT:
5!
é um byte menor que120
.fonte