Escribir un programa o función que puede distinguir las siguientes 12 funciones trigonométricas: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Su programa recibe una de las funciones anteriores como recuadro negro y debe mostrar el nombre de la función como se indica anteriormente o la forma en que se nombra en su idioma.
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma. Debe mostrar que su código funciona correctamente al incluir casos de prueba con las 12 entradas posibles. Si el idioma de su elección no incluye complementos para todas las funciones anteriores, debe proporcionar sus propias implementaciones sensatas de las que faltan.
Aclaraciones adicionales
- El uso de números complejos para consultar el cuadro negro está permitido si los complementos subyacentes pueden manejarlos.
- Como cuando se usan solo números reales, las consultas a la función de recuadro negro pueden dar errores de dominio. En este caso, debe suponer que el cuadro negro solo comunica la existencia de un error, pero no de qué función se origina.
- Si en lugar de un error se devuelve algún otro valor, por ejemplo,
NaN
ornull
, entonces su envío debería poder manejarlos.
Gracias por los útiles comentarios de sandbox .
fuente
Respuestas:
Python 3.6.4 en Linux, 99 bytes
Una respuesta un poco tonta, pero:
Requiere que las funciones trigonométricas sean una del
cmath
módulo incorporado para entrada / salida compleja.fuente
f
esf(.029)
: llamar a la función con un valor.Perl 6 , 75 bytes
Pruébalo en línea!
Como sucede, las doce funciones a discriminar están integradas y todas toman argumentos complejos.
[X~] ("", "a"), <sin cos tan>, ("", "h")
genera los doce nombres de funciones al reducir las tres listas de entrada con concatenación de productos cruzados. Dados estos,.min(...)
encuentra el que tiene la menor diferencia de la función de entrada2i
.fuente
X
se pueden usar para varios términos, y algunos otros trucos para los bytes de golfC (gcc) ,
178172 bytesPruébalo en línea!
Viejo pero genial: C (gcc) , 194 bytes
Pruébalo en línea!
El
-lm
cambio en TIO es simplemente para probar. Si pudiera escribir una implementación perfecta de las funciones trigonométricas estándar, obtendría la respuesta correcta.Explicación
La idea era encontrar algún valor de entrada tal que cuando interprete las salidas de cada una de las funciones trigonométricas como enteros, tengan diferentes restos módulo 12. Esto permitirá que se utilicen como índices de matriz.
Para encontrar dicho valor de entrada, escribí el siguiente fragmento:
Si ejecuta eso (que debe compilarse con -lm), escupirá que con un valor de 0.9247 obtendrá valores únicos.
Luego reinterpreté como enteros, apliqué el módulo por 12 y tomé el valor absoluto. Esto le dio a cada función un índice. Eran (de 0 -> 11): acosh, sinh, asinh, atanh, tan, cosh, asin, sin, cos, atan, tanh, acos.
Ahora podría simplemente indexar en una serie de cadenas, pero los nombres son muy largos y muy similares, por lo que en su lugar los saco de los segmentos de una cadena.
Para hacer esto, construyo la cadena "asinhacoshatanh" y dos matrices. La primera matriz indica qué carácter de la cadena establecer en el terminador nulo, mientras que la segunda indica qué carácter de la cadena debe ser el primero. Estas matrices contienen: 10,5,5,0,14,10,4,4,9,14,0,9 y 5,1,0,10,11,6,0,1,6,10,11, 5 respectivamente.
Finalmente, fue solo una cuestión de implementar el algoritmo de reinterpretación de manera eficiente en C. Lamentablemente tuve que usar el tipo doble, y con exactamente 3 usos, fue más rápido usar
double
tres veces que#define D double\nDDD
solo 2 caracteres. El resultado está arriba, una descripción está abajo:Editar: Desafortunadamente, solo usar una matriz cruda es en realidad más corto, por lo que el código se vuelve mucho más simple. No obstante, el corte de cuerdas fue divertido. En teoría, un argumento apropiado podría llegar a las rebanadas correctas por sí solo con algunas matemáticas.
fuente
puts(...)
conprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
y reemplazando todos losdouble
s en su código conD
. Tenga en cuenta que la bandera debe contarse para el total de bytes.char*[]
conint*[]
, y cambiando el operador ternario (:) para una?abs(_)
Python 3.6.5 en Linux,
9085 bytesEsto se basa en la respuesta de orlp ; pero en lugar de encontrar 1 número mágico, ¡encontramos 3! Básicamente, esto solo ahorra bytes al evitar poner los literales de cadena para "sin", "cos" y "tan" varias veces, en lugar de construir la respuesta una parte a la vez.
El primer número mágico se usa para determinar si es una de las funciones trigonométricas de "arco", anteponiendo una "a" en consecuencia, la segunda para determinar si es una de las funciones basadas en "pecado", "cos" o "bronceado", seleccionando la cadena apropiada y la tercera para determinar si es una de las funciones hiperbólicas, agregando una "h" en consecuencia.
Al igual que la respuesta de orlp, utiliza las funciones del
cmath
módulo incorporado de Python como entrada.Guardado 5 bytes mediante el uso de indexación de corte en la cadena del medio
Encontrar los números mágicos
Para completar, aquí está (más o menos) el guión que usé para encontrar estos números mágicos. La mayoría de las veces trabajé directamente en una terminal de Python, por lo que el código es desordenado, pero hace el trabajo.
fuente
Python ,
1089490 bytesCompara el resultado de la función de entrada con los resultados de todas las funciones para el valor
.2
.Pruébalo en línea
-14 bytes por Jonathan Allen
-4 bytes por Rod
fuente
re
, solo obtenga los necesarios con el corte:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(reescrito para trabajar en TIO ya que la importación debe ocurrir antesd=dir(cmath)
peroF=
debe estar en el encabezado para no contarse).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 bytesPruébalo en línea!
-3 gracias a H.PWiz
-2 gracias a ngn
Atraviesa todas las funciones trigonométricas requeridas (que en APL son
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) más algunas cosas más (esto atraviesa-7..7
), encuentra cuál coincideinput○2
y genera ese "con"○
, que genera comonum∘○
fuente
C (gcc) con
-lm
,374346324 bytesGracias a Giacomo Garabello por las sugerencias.
Pude ahorrar un poco más de espacio al hacer que una macro auxiliar pegue tokens además de mi macro original que hace cadenas.
En las pruebas, utilicé un par de funciones trigonométricas que no son de biblioteca para confirmar la validez de los resultados. Como los resultados entre las funciones de biblioteca y no biblioteca no eran exactamente el mismo valor de coma flotante, comparé la diferencia de los resultados con un valor pequeño ε en lugar de usar la igualdad.
Pruébalo en línea!
fuente
JavaScript,
766766 bytesNo es bonito, pero fui demasiado lejos por la madriguera del conejo con esto en unas cervezas para no publicarlo. Derivado independientemente de la solución de Nit.
Pruébalo en línea
fuente
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (aunque no sé por qué convertir a String para comparar)NaN
comparar igual aNaN
, así que es eso oObject.is
.Wolfram Language (Mathematica) , 86 bytes
Pruébalo en línea!
fuente
Ruby ,
7167 bytesPruébalo en línea!
fuente
JavaScript,
10870 bytesNo he probado el golf en Javascript puro en años, así que estoy seguro de que hay cosas que mejorar aquí.
Bastante sencillo,
Math
compara todas las funciones del prototipo con un valor arbitrario (0.9, muchos otros valores probablemente funcionan) y lo compara con el resultado de la función de recuadro negro.Probado en Google Chrome, se romperá si la función de cuadro negro de entrada no es uno de los desencadenantes.
Cortar una tonelada de bytes gracias a Shaggy y Neil.
fuente
0.3 -> .3
y asignarMath
am
dentrogetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Noté que @Shaggy también lo usabafind
. Se+''
compara una cadena, lo que significa que solo tenemos que verificar un punto. El,0
nos hace saltarMath.atan2
.,0
sea necesario: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
precedeacosh
en la matriz devuelta porObject.getOwnPropertyNames
.getOwnPropertyNames
es Math.E, y todas las funciones trigonométricas se enumeran antes.R , 75 bytes
Pruébalo en línea!
Por el momento (R v3.5) funciona.
Si en una futura versión R se agregará una función que coincida con esta expresión regular, entonces quién sabe: P
Find
lugar defor
fuente
1i
funciona tan bien como-1i
para -2 bytes.HP 49G RPL, 88.0 bytes excluyendo el encabezado del programa de 10 bytes
¡Otra solución usando números complejos! Ingrese y ejecútelo en modo COMPLEJO, APROX. Toma la función en la pila.
(las nuevas líneas no importan)
Para la constante 2.0, las doce funciones trigonométricas se definen en el plano complejo, por lo que solo evaluamos las doce y vemos cuál coincide. Esta vez, la solución iterativa es más larga (111.5 bytes) debido a la combinación de pila necesaria para obtenerla. RPL, hasta donde yo sé, no te permite salir de un ciclo temprano.
fuente
->STR DUP SIZE 3 - " " " " IFTE XOR
34.5 bytes. (se supone que son 4 y 3 espacios, respectivamente)Perl 6 , 39 bytes
Pruébalo en línea!
Por lo que parece, uno de los pocos que usa la introspección.
i
Aquí está el número complejo, cuyo valor es único para cada función trigonométrica, por lo que al iterar a través de todos los métodos podemos encontrar el método coincidente y escupir implícitamente su nombre. Eltry
es necesaria, ya que algunos (no deseados) métodos tienen la una firma diferente.fuente
JavaScript (Node.js) , 72 bytes
Pruébalo en línea!
fuente