Escreva um programa ou função que pode distinguir os seguintes 12 funções trigonométricas: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Seu programa recebe uma das funções acima como caixa preta e deve exibir o nome da função conforme indicado acima ou da maneira como é nomeado no seu idioma.
Isso é código-golfe , então a resposta mais curta em cada idioma vence. Você deve mostrar que seu código funciona corretamente incluindo casos de teste com todas as 12 entradas possíveis. Se o idioma de sua escolha não incluir build-ins para todas as funções acima, você deverá fornecer suas próprias implementações sensíveis das ausentes.
Esclarecimentos adicionais
- O uso de números complexos para consultar a caixa preta é permitido se os build-ins subjacentes puderem lidar com eles.
- Como quando se utiliza apenas números reais, as consultas para a função caixa negra pode dar erros de domínio. Nesse caso, você deve supor que a caixa preta comunica apenas a existência de um erro, mas não da qual função ela se origina.
- Se, em vez de um erro, algum outro valor, por exemplo,
NaN
ounull
, for retornado, seu envio deverá ser capaz de lidar com eles.
code-golf
function
trigonometry
Laikoni
fonte
fonte
Respostas:
Python 3.6.4 no Linux, 99 bytes
Uma resposta meio boba, mas:
Requer que as funções trigonométricas sejam uma fora do
cmath
módulo interno para entrada / saída complexa.fonte
f
éf(.029)
- chamar a função com um valor.Perl 6 , 75 bytes
Experimente online!
Por acaso, todas as doze funções a serem discriminadas estão integradas e todas têm argumentos complexos.
[X~] ("", "a"), <sin cos tan>, ("", "h")
gera todos os doze nomes de funções reduzindo as três listas de entrada com concatenação de produtos cruzados. Dado isso,.min(...)
encontra aquele em que a menor diferença da função de entrada é2i
.fonte
X
podem ser usados para vários termos e alguns outros truques para bytes de golfeC (gcc) ,
178172 bytesExperimente online!
Antigo, mas interessante: C (gcc) , 194 bytes
Experimente online!
A
-lm
opção no TIO é apenas para testar. Se você pudesse escrever uma implementação perfeita das funções trigonométricas padrão, obteria a resposta certa.Explicação
A idéia era encontrar algum valor de entrada tal que, quando eu interpreto as saídas de cada uma das funções trigonométricas como números inteiros, elas tenham diferentes remanescentes no módulo 12. Isso permitirá que elas sejam usadas como índices de matriz.
Para encontrar esse valor de entrada, escrevi o seguinte trecho:
Se você executar isso (que precisa ser compilado com -lm), ele citará que, com um valor de 0,9247, você obtém valores exclusivos.
Em seguida, reinterpetuei como números inteiros, apliquei o módulo em 12 e peguei o valor absoluto. Isso deu a cada função um índice. Eles eram (de 0 a 11): acosh, sinh, asinh, atanh, tan, cosh, asin, pecado, cos, atan, tanh, acos.
Agora eu poderia apenas indexar em uma matriz de seqüências de caracteres, mas os nomes são muito longos e muito semelhantes; portanto, eu os retiro das fatias de uma sequência.
Para fazer isso, construo a string "asinhacoshatanh" e duas matrizes. A primeira matriz indica qual caractere da string deve ser definido como terminador nulo, enquanto a segunda indica qual caractere da string deve ser o primeiro. Essas matrizes contêm: 10,5,5,0,14,10,4,4,9,14,0,9 e 5,1,0,10,11,6,0,1,6,10,11, 5 respectivamente.
Finalmente, era apenas uma questão de implementar o algoritmo de reinterpretação de forma eficiente em C. Infelizmente, eu tive que usar o tipo duplo e, com exatamente 3 usos, foi mais rápido usar apenas
double
três vezes e usar#define D double\nDDD
apenas 2 caracteres. O resultado está acima, uma descrição está abaixo:Edit: Infelizmente, apenas o uso de uma matriz bruta é realmente mais curto, portanto o código se torna muito mais simples. No entanto, o corte das cordas foi divertido. Em teoria, um argumento apropriado pode, na verdade, apresentar as fatias certas por conta própria com um pouco de matemática.
fonte
puts(...)
porprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
e substituindo todos osdouble
s no seu código porD
. Observe que o sinalizador precisa ser contado para o total de bytes.char*[]
comint*[]
, e alterando o operador ternário (:) a uma?abs(_)
Python 3.6.5 no Linux,
9085 bytesIsso se baseia na resposta do orlp ; mas em vez de encontrar 1 número mágico, encontramos 3! Isso basicamente salva os bytes, evitando colocar as strings literais para "sin", "cos" e "tan" várias vezes, em vez de criar a resposta uma parte de cada vez.
O primeiro número mágico é usado para determinar se é uma das funções trigonométricas do "arco", acrescentando um "a" de acordo, e o segundo para se é uma das funções baseadas em "pecado", "cos" ou "bronzeado", selecionando a sequência apropriada e a terceira, para saber se é uma das funções hiperbólicas, acrescentando um "h" de acordo.
Como a resposta do orlp, ele usa as funções do
cmath
módulo interno do Python como entrada.Salvou 5 bytes usando a indexação de fatia na cadeia do meio
Encontrando os números mágicos
Para completar, aqui está (mais ou menos) o script que eu usei para encontrar esses números mágicos. Na maioria das vezes, trabalhei diretamente em um terminal python, então o código é confuso, mas faz o trabalho.
fonte
Python ,
1089490 bytesCompara o resultado da função de entrada com os resultados de todas as funções do valor
.2
.Experimente online
-14 bytes por Jonathan Allen
-4 bytes por Rod
fonte
re
, basta obter os necessários com o fatiamento:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(reescrito para funcionar no TIO, pois a importação deve ocorrer antes ed=dir(cmath)
aindaF=
deve estar no cabeçalho para não ser contada).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 bytesExperimente online!
-3 graças a H.PWiz
-2 graças a ngn
Percorre todas as funções trigonométricas necessárias (que são no APL
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) e mais algumas coisas (isso ocorre-7..7
), localiza qual correspondeinput○2
e gera "com"○
, que gera comonum∘○
fonte
C (gcc) com
-lm
,374346324 bytesObrigado a Giacomo Garabello pelas sugestões.
Consegui economizar um pouco mais de espaço fazendo com que uma macro auxiliar fizesse a colagem de tokens, além da macro original, que faz strings.
Nos testes, usei algumas funções trigonométricas não relacionadas à biblioteca para confirmar a validade dos resultados. Como os resultados entre as funções de biblioteca e não de biblioteca não eram exatamente o mesmo valor de ponto flutuante, comparei a diferença dos resultados com um valor pequeno ε em vez de usar igualdade.
Experimente online!
fonte
JavaScript,
766766 bytesNão é bonito, mas fui longe demais na toca do coelho com algumas cervejas para não publicá-la. Derivado independentemente da solução de Nit.
Experimente online
fonte
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (embora eu não sei bem porque convertido em String para comparar)NaN
comparar igual aNaN
, então é isso ouObject.is
.Língua Wolfram (Mathematica) , 86 bytes
Experimente online!
fonte
Ruby ,
7167 bytesExperimente online!
fonte
JavaScript,
10870 bytesEu não tentei jogar golfe em Javascript puro há anos, então tenho certeza de que há coisas a melhorar aqui.
Bem simples, verifica todas as funções no
Math
protótipo em relação a um valor arbitrário (0,9, muitos outros valores provavelmente funcionam) e se compara ao resultado da função de caixa preta.Testado no Google Chrome, será interrompido se a função de caixa preta de entrada não for um dos truques.
Corte uma tonelada de bytes graças a Shaggy e Neil.
fonte
0.3 -> .3
e atribuirMath
am
dentrogetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Notei que o @Shaggy também foi usadofind
. O+''
compara uma string, o que significa que precisamos verificar apenas um ponto. O,0
que nos faz saltarMath.atan2
.,0
é necessário: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
precedeacosh
na matriz retornada porObject.getOwnPropertyNames
.getOwnPropertyNames
é Math.E, e todas as funções trig enumeradas antes disso.R , 75 bytes
Experimente online!
No momento (R v3.5), ele funciona.
Se em uma futura versão R for adicionada uma função correspondente a este regex, quem sabe: P
Find
vez defor
fonte
1i
funciona tão bem quanto-1i
para -2 bytes.HP 49G RPL, 88,0 bytes, excluindo o cabeçalho do programa de 10 bytes
Outra solução usando números complexos! Digite e execute-o no modo COMPLEX, APPROX. Assume a função na pilha.
(as novas linhas não importam)
Para a constante 2.0, todas as doze funções trigonométricas são definidas no plano complexo; portanto, apenas avaliamos todas as doze e vemos qual delas corresponde. Desta vez, a solução iterativa é mais longa (111,5 bytes) devido ao embaralhamento da pilha necessário para obtê-lo. A RPL, até onde eu sei, não permite que você saia do circuito mais cedo.
fonte
->STR DUP SIZE 3 - " " " " IFTE XOR
34,5 bytes. (aqueles deveriam ser de 4 e 3 lugares, respectivamente)Perl 6 , 39 bytes
Experimente online!
Pela aparência das coisas, um dos poucos a usar a introspecção.
i
aqui está o número complexo, cujo valor é único para cada função trigonométrica, portanto, percorrendo todos os métodos, podemos encontrar o método correspondente e citar implicitamente seu nome. otry
é necessário, pois alguns métodos (indesejados) têm a uma assinatura diferente.fonte
JavaScript (Node.js) , 72 bytes
Experimente online!
fonte