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

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:




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.



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
$

3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&

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)

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.


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'

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

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

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"


-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';

11
O PHP não usa .para concatenação?
Downgoat

@ vihan1086 Sim, o PHP usa . . Downvoted até que seja corrigido
Ismael Miguel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.