Encuentra el ángulo de referencia

17

Esta es una pregunta bastante simple. De acuerdo con este sitio web aleatorio que encontré: Archivo web , un ángulo de referencia es the acute angle formed by the terminal side of the given angle and the x-axis.que debe escribir un programa para encontrarlos.

No recuerdo nada del álgebra 2, ¿qué significa esto?

Los ángulos generalmente se dan en forma estándar , que se mide colocando un lado del ángulo y midiendo al otro lado, en sentido antihorario, de la siguiente manera:

Forma estándar

Esta será tu aportación. Su salida será el ángulo de referencia de esto. Puede pensar en esto como básicamente la distancia más pequeña desde el lado terminal al eje x. Excepto que es un ángulo, no una distancia. Aquí hay unos ejemplos:

Quad 2 ref Quad 1 ref

Quad 3 ref Quad 4 ref

Aclaraciones

  • Todos los valores predeterminados en entradas y envíos.
  • Los ángulos están en grados .
  • Los ángulos negativos, ángulos no enteros, y los ángulos> 360 grados están permitidos.
  • Salida en forma 60 deg.
  • Este es el , por lo que gana el código más corto en bytes.

Otro enlace útil .

Casos de prueba

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg
Maltysen
fuente
1
¿Qué hacemos en la entrada de 90?
lirtosiast
2
@ThomasKwa sería 90 desde cualquier dirección.
Maltysen
1
Una solución corta es abs(arcsin(sin(input)))+" deg", aunque no sé qué idioma ganaría (necesitaría admitir grados y operaciones de cadena).
lirtosiast
¿La entrada es siempre un número entero?
lirtosiast
66
Como se permiten ángulos no enteros, debe incluir uno en los casos de prueba.
Dennis

Respuestas:

6

Pyth, 18 bytes

+.a-%+QK90yKK" deg

Pruébalo en línea.

arboledasNL
fuente
lo consiguió hasta 19 Uso pero con algo de asignación en línea, no dude en utilizar: pyth.herokuapp.com/...
Maltysen
@Maltysen: Gracias, encontré otra mejora también
grovesNL
5

Python 2, 34 bytes

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

El uso del "%d deg"formato de cadena sería más largo debido a los paréntesis necesarios.

Sp3000
fuente
4

dc, 25

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

Nota dcusos _como un signo -ve en lugar de -.

Prueba de salida:

$ 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
fuente
3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&
alephalpha
fuente
1
@ LegionMammal978 Si sólo se multiplica por deg, 0 degconvertiré 0.
alephalpha
1
Como no le importa el tipo de salida, puede guardar 2 bytes como este:Row@{Abs@Mod[#,180,-90],deg}&
LegionMammal978
3

Pitón 2, 35

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

El más pequeño del ángulo y su módulo negativo 180. Convierte efectivamente el ángulo al rango de 0 a 180 y toma la distancia al punto más cercano de los puntos finales. Tenga en cuenta que los -x%180grupos como (-x)%180.

Misma longitud con formato de cadena para Python 3:

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

Pyth 25 30 bytes

Solución dolorosamente poco creativa, utilizando funciones trigonométricas. Enlace permanente

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

Cualquier sugerencia bienvenida.

Winny
fuente
1
Lo bajé a 28 tomando las .tllamadas y poniéndolas en un pliegue:+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Maltysen
Ordenado. Sin embargo, noté que no parece funcionar con una entrada de punto flotante 90.5 => 90.0 deg.
Winny
Eso es porque el suyo no sea: pyth.herokuapp.com/...
Maltysen
Interesante captura. Con entrada -60.5 => 60.5 degpero con 60.5 => 60.0 deg. Se parece a un problema con Pyth - Ejemplo utilizando Pyth / macros.py
Winny
1

JavaScript (ES6), 43 bytes

Al igual que en la respuesta de SP3000 , aunque el módulo es bastante largo debido al comportamiento en JavaScript .

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

Manifestación

El código se reescribe en ES5 para la compatibilidad del 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
fuente
55
Supongo que fue una decisión de diseño de un ingeniero de hardware de PDP que es responsable del hecho de que varias décadas después todavía tenemos muy pocos idiomas que se implementen de manera %sensata.
Peter Taylor
Reemplazar los primeros 180 con (t=180)luego reemplazar los siguientes 180 con t probablemente ahorraría unos pocos bytes
Downgoat
@ vihan1086 Es lo mismo
rink.attendant.6
1

Matlab, 44

Usando una función anónima:

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

Ejemplo:

>> 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
fuente
44
Sin embargo, esto no agrega el 'deg' al final. (No votó en contra.)
Legendre
@Legendre Oops. ¡Gracias! Corregido
Luis Mendo
1

Scala, 40 35 Personajes

(a:Int)⇒s"${90-(a%180-90).abs} deg"
gilad hoch
fuente
-1

PHP, 44 bytes

Toma un parámetro de línea de comando. Una vez más, PHP sufre el mismo problema que JavaScript .

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

El uso de la solución canónica requiere 53 bytes (la conversión de grados y radianes requiere muchos caracteres):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';
rink.attendant.6
fuente
1
¿PHP no usa .para la concatenación?
Downgoat
@ vihan1086 Sí, PHP usa .. Voto negativo hasta que se arregle
Ismael Miguel