Encontre o ângulo de referência

17

Esta é uma pergunta bastante simples. De acordo com este site aleatório que encontrei - Web Archive , um ângulo de referência é the acute angle formed by the terminal side of the given angle and the x-axis.Você precisa escrever um programa para encontrá-los.

Não me lembro de nada da álgebra 2, o que isso significa?

Os ângulos são geralmente dados na forma padrão , que é medida colocando um lado do ângulo e medindo para o outro lado, no sentido anti-horário, da seguinte forma:

Forma padrão

Esta será a sua entrada. Sua saída será o ângulo de referência disso. Você pode pensar nisso como basicamente a menor distância do lado do terminal ao eixo x. Exceto que é um ângulo, não uma distância. aqui estão alguns exemplos:

Quad 2 ref Quad 1 ref

Quad 3 ref Quad 4 ref

Esclarecimentos

  • Todos os padrões de entradas e envios.
  • Ângulos está em graus .
  • Ângulos negativos, ângulos não inteiros e ângulos> 360 graus são permitidos.
  • Saída em forma 60 deg.
  • Isso é , então o código mais curto em bytes vence!

Outro link útil .

Casos de teste

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg
Maltysen
fonte
11
O que fazemos na entrada de 90?
lirtosiast
2
@ThomasKwa, seriam 90 em qualquer direção.
Maltysen
11
Uma solução curta é abs(arcsin(sin(input)))+" deg", embora eu não saiba qual idioma venceria (seria necessário oferecer suporte a graus e operações de string).
lirtosiast
A entrada é sempre um número inteiro?
lirtosiast
6
Como ângulos não inteiros são permitidos, você deve incluir um nos casos de teste.
Dennis19 /

Respostas:

6

Pitão, 18 bytes

+.a-%+QK90yKK" deg

Experimente online.

grovesNL
fonte
baixei
Maltysen
@ Maltysen: Obrigado, encontrou outra melhoria também
grovesNL
5

Python 2, 34 bytes

lambda x:`90-abs(x%180-90)`+' deg'

O uso da "%d deg"formatação de string seria mais longo devido aos parênteses necessários.

Sp3000
fonte
5

CJam (21 bytes)

180qd1$%z_@@-e<" deg"

Demonstração online

Peter Taylor
fonte
4

dc, 25

90?90+d*v180%-d*vn[ deg]p

Nota dc usa _como um sinal -ve em vez de -.

Saída de teste:

$ for test in 70 135 210 _60 91 610 _1000; do dc -e'90?90+d*v180%-d*vn[ deg]p' <<< $test ; done
70 deg
45 deg
30 deg
60 deg
89 deg
70 deg
80 deg
$
Trauma Digital
fonte
3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&
alefalpha
fonte
11
@ LegionMammal978 Se eu apenas multiplicar deg, 0 degserá 0.
Alephalpha
11
Desde que você não se preocupam com o tipo de saída, você pode salvar 2 bytes assim:Row@{Abs@Mod[#,180,-90],deg}&
LegionMammal978
3

Python 2, 35

lambda x:`min(x%180,-x%180)`+' deg'

O menor do ângulo e seu módulo negativo 180. Converte efetivamente o ângulo no intervalo de 0 a 180 e leva a distância até o ponto mais próximo dos pontos finais. Observe que os -x%180grupos como (-x)%180.

Mesmo comprimento com formatação de string para Python 3:

lambda x:'%d deg'%min(x%180,-x%180)
xnor
fonte
3

Pyth 25 30 bytes

Solução dolorosamente não criativa, usando funções trigonométricas. Permalink

+.R.t.a.t.t.tQ7Z3 6?%Q1Q0" deg

Todas as sugestões são bem-vindas.

Winny
fonte
11
O número chegou a 28 ao atender as .tchamadas e dobrá-las:+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Maltysen 25/07/2015
Arrumado. Notei ele não aparece para trabalhar com uma entrada de ponto flutuante: 90.5 => 90.0 deg, no entanto.
25715 Winny
Isso ocorre porque o seu também não: pyth.herokuapp.com/…
Maltysen
Captura interessante. Com entrada, -60.5 => 60.5 degmas com 60.5 => 60.0 deg. Parece um problema com o Pyth - Exemplo usando pyth / macros.py
Winny
1

JavaScript (ES6), 43 bytes

Semelhante à resposta do Sp3000 , embora o módulo seja bastante longo devido ao comportamento em JavaScript .

f=x=>90-Math.abs((x%180+180)%180-90)+' deg'

Demo

O código é reescrito no ES5 para compatibilidade do navegador:

function f(x){return 90-Math.abs((x%180+180)%180-90)+' deg'}

// Snippet stuff
console.log = function(x){document.body.innerHTML += x + '<br>'};
[70,135,210,-60,91,610,-1000].map(function(v){console.log(f(v))});

CoffeeScript, 45 bytes

f=(x)->90-Math.abs((x%180+180)%180-90)+' deg'
rink.attendant.6
fonte
5
Suponho que foi uma decisão de projeto feita por um engenheiro de hardware do PDP, responsável pelo fato de que várias décadas depois ainda temos muito poucas linguagens que são implementadas com %sensibilidade.
22415 Peter Peter
Substituindo o primeiro 180 com (t=180), em seguida, substituindo as seguintes 180s com t provavelmente economizar alguns bytes
Downgoat
@ vihan1086 É o mesmo
rink.attendant.6
1

J, 26 bytes

m=:180&|
' deg',~m@-":@<.m

O mesmo que o método xnor .

Legendre
fonte
1

Matlab, 44

Usando uma função anônima:

f=@(x)[num2str(min(mod([x -x],180))) ' deg']

Exemplo:

>> f=@(x)[num2str(min(mod([x -x],180))) ' deg']
f = 
    @(x)[num2str(min(mod([x,-x],180))),' deg']

>> f(70)
ans =
70 deg

>> f(210)
ans =
30 deg

>> f(-1000)
ans =
80 deg
Luis Mendo
fonte
4
Isso não acrescenta o 'deg' no final. (Será que não downvote.)
Legendre
@Legendre Oops. Obrigado! Corrigido
Luis Mendo
1

Scala, 40 35 caracteres

(a:Int)⇒s"${90-(a%180-90).abs} deg"
Gilad Hoch
fonte
0

Tcl , 83 bytes

proc R a {puts [expr [set a $a%360]>90?$a>180?$a>270?360-$a:$a-180:180-$a:$a]\ deg}

Experimente online!

sergiol
fonte
-1

PHP, 44 bytes

Toma um parâmetro da linha de comando. Novamente, o PHP sofre o mesmo problema que o JavaScript .

<?=90-abs(($argv[1]%180+180)%180-90)+' deg';

O uso da solução canônica requer 53 bytes (a conversão em graus e radianos ocupa muitos caracteres):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';
rink.attendant.6
fonte
11
O PHP não usa .para concatenação?
Downgoat
@ vihan1086 Sim, o PHP usa . . Downvoted até que seja corrigido
Ismael Miguel