Написать программу или функцию, можно выделить следующие 12 тригонометрические функции: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Ваша программа имеет одну из перечисленных выше функций в виде черного ящика и должна выводить имя функции, как указано выше, или так, как оно названо на вашем языке.
Это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке. Вы должны показать, что ваш код работает правильно, включив контрольные примеры со всеми 12 возможными входными данными. Если выбранный вами язык не включает встроенные модули для всех вышеперечисленных функций, вы должны предоставить собственные разумные реализации отсутствующих.
Дальнейшие разъяснения
- Использование комплексных чисел для запроса черного ящика разрешено, если базовые встроенные модули могут их обрабатывать.
- Как при использовании только действительные числа, запросы к функции черного ящика может дать ошибки домена. В этом случае вы должны предположить, что черный ящик сообщает только о существовании ошибки, но не из какой функции он исходит.
- Если вместо ошибки возвращается какое-то другое значение, например,
NaN
илиnull
, то ваше представление должно быть в состоянии обработать их.
Спасибо за полезную обратную связь песочницы !
code-golf
function
trigonometry
Laikoni
источник
источник
Ответы:
Python 3.6.4 в Linux, 99 байт
Немного глупый ответ, но:
Требует, чтобы тригонометрические функции были одним из встроенного
cmath
модуля для сложного ввода / вывода.источник
f
будетf(.029)
- вызов функции со значением.Perl 6 , 75 байт
Попробуйте онлайн!
Как это случается, все двенадцать функций, подлежащих различению, являются встроенными и все принимают сложные аргументы.
[X~] ("", "a"), <sin cos tan>, ("", "h")
генерирует все двенадцать имен функций путем сокращения трех входных списков с перекрестной конкатенацией продуктов. Учитывая те,.min(...)
находит тот, который наименьшее отличие от функции ввода в2i
.источник
X
можно использовать для нескольких терминов, а также несколько других приемов для байтов гольфаC (gcc) ,
178172 байтаПопробуйте онлайн!
Старый, но крутой: C (gcc) , 194 байта
Попробуйте онлайн!
-lm
Переключатель в TIO просто проверить. Если бы вы могли написать идеальную реализацию стандартных функций триггера, вы бы получили правильный ответ.объяснение
Идея заключалась в том, чтобы найти некоторое входное значение, чтобы при интерпретации выходных данных каждой из функций триггера как целых чисел они имели разные остатки по модулю 12. Это позволит использовать их как индексы массива.
Чтобы найти такое входное значение, я написал следующий фрагмент:
Если вы запустите его (который должен быть скомпилирован с помощью -lm), то получится, что со значением 0,9247 вы получите уникальные значения.
Затем я переинтерпретировал как целые числа, применил по модулю 12 и взял абсолютное значение. Это дало каждой функции индекс. Это были (от 0 до> 11): акош, синх, асин, атан, тан, кош, асин, грех, соз, атан, тан, акос.
Теперь я могу просто индексировать в массив строк, но имена очень длинные и очень похожие, поэтому вместо этого я беру их из кусочков строки.
Для этого я строю строку «asinhacoshatanh» и два массива. Первый массив указывает, какой символ в строке установить на нулевой терминатор, а второй указывает, какой символ в строке должен быть первым. Эти массивы содержат: 10,5,5,0,14,10,4,4,9,14,0,9 и 5,1,0,10,11,6,0,1,6,10,11, 5 соответственно.
Наконец, это было просто вопросом эффективной реализации алгоритма реинтерпретации в C. К сожалению, мне пришлось использовать двойной тип, и с ровно 3-мя использованием было быстрее использовать
double
три раза, чем использовать#define D double\nDDD
всего 2 символа. Результат выше, описание ниже:Редактировать: К сожалению, просто использование необработанного массива на самом деле короче, поэтому код становится намного проще. Тем не менее нарезка строк была веселой. Теоретически, подходящий аргумент может на самом деле придумать правильные кусочки самостоятельно с некоторой математикой.
источник
puts(...)
наprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
и заменив всеdouble
s в вашем коде наD
. Обратите внимание, что этот флаг должен учитываться для общего количества байтов.char*[]
наint*[]
и путем замены троичного оператора (? :) наabs(_)
Python 3.6.5 в Linux,
9085 байтЭто основано на ответе orlp ; но вместо того, чтобы найти 1 магическое число, мы находим 3! Это в основном просто экономит байты, избегая многократного размещения строковых литералов для «sin», «cos» и «tan», вместо этого выстраивая ответ по одной части за раз.
Первое магическое число используется для определения того, является ли оно одной из тригонометрических функций «дуги», с соответствующим добавлением «a», а второе - для функций на основе «sin», «cos» или «tan», выбирая соответствующая строка, и третья для того, является ли она одной из гиперболических функций, добавляя соответственно «h».
Как и ответ orlp, в
cmath
качестве входных данных используются функции встроенного модуля Python .Сохранено 5 байт с использованием индексации фрагмента в средней строке
В поисках магических чисел
Для полноты вот (более или менее) сценарий, который я использовал, чтобы найти эти магические числа. Я в основном просто работал прямо в терминале Python, поэтому код грязный, но он выполняет свою работу.
источник
Python ,
1089490 байтСравнивает результат функции ввода с результатами всех функций по значению
.2
.Попробуйте онлайн
-14 байтов Джонатаном Алленом
-4 байта Родом
источник
re
, просто получите то, что нужно с нарезкой:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(переписано для работы на TIO, так как импорт должен произойти раньше,d=dir(cmath)
ноF=
должен быть в заголовке, чтобы не учитываться).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Дьялог АПЛ ,
252119 байтПопробуйте онлайн!
-3 благодаря H.PWiz
-2 благодаря ngn
Идет через все необходимые тригонометрические функции (которые в APL есть
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
), плюс еще несколько вещей (это проходит через-7..7
), находит, какой из них соответствуетinput○2
, и выводит это «с»○
, которое выводит какnum∘○
источник
C (gcc) с
-lm
,374346324 байтаСпасибо Джакомо Гарабелло за предложения.
Я смог сэкономить немного больше места, используя вспомогательный макрос, выполняющий вставку токена в дополнение к моему исходному макросу, который выполняет строковое форматирование.
В тестах я использовал несколько небиблиотечных триггерных функций, чтобы подтвердить достоверность результатов. Поскольку результаты между библиотечными и небиблиотечными функциями не были точно такими же значениями с плавающей запятой, я сравнил разницу результатов с небольшим значением ε вместо использования равенства.
Попробуйте онлайн!
источник
JavaScript,
766766 байтНе красиво, но я пошел слишком далеко вниз по кроличьей норе с этим из-за нескольких сортов пива, чтобы не публиковать его. Получено независимо от решения Нита.
Попробуйте онлайн
источник
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (хотя я не совсем понимаю, зачем конвертировать в String для сравнения)NaN
сравнить, равноеNaN
, так что это либо то, либоObject.is
.Wolfram Language (Mathematica) , 86 байт
Попробуйте онлайн!
источник
Рубин ,
7167 байтПопробуйте онлайн!
источник
JavaScript,
10870 байтЯ давно не пробовал играть в гольф на чистом Javascript, поэтому уверен, что здесь есть что улучшить.
Довольно просто, проверяет каждую функцию на
Math
прототипе по произвольному значению (0,9, многие другие значения, вероятно, работают) и сравнивает с результатом функции черного ящика.Протестировано в Google Chrome, сломается, если функция ввода черного ящика не входит в число триггеров.
Отрежьте тонну байтов благодаря Шегги и Нейлу.
источник
0.3 -> .3
и назначитьMath
сm
точностью доgetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Я заметил, что @Shaggy также используетсяfind
. Функция+''
сравнения строк означает, что нам нужно проверить только одну точку. Это,0
заставляет нас пропуститьMath.atan2
.,0
что нужно: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
предшествуетacosh
в массиве, возвращаемомObject.getOwnPropertyNames
.getOwnPropertyNames
- это Math.E, а все триггерные функции перечисляются до этого.R 75 байт
Попробуйте онлайн!
На данный момент (R v3.5) это работает.
Если в будущей версии R будет добавлена функция, соответствующая этому регулярному выражению, то кто знает: P
Find
вместоfor
источник
1i
работает так же, как-1i
для -2 байтов.HP 49G RPL, 88,0 байтов, исключая 10-байтовый заголовок программы
Другое решение с использованием комплексных чисел! Введите и выполните его в режиме COMPLEX, APPROX. Берет функцию в стеке.
(переводы строк не имеют значения)
Для константы 2.0 все двенадцать функций триггера определены в комплексной плоскости, поэтому мы просто оцениваем все двенадцать и видим, какая из них соответствует. На этот раз итеративное решение длиннее (111,5 байта) из-за перестановки стека, необходимой для его получения. Насколько мне известно, RPL не позволяет рано выйти из цикла.
источник
->STR DUP SIZE 3 - " " " " IFTE XOR
, 34,5 байта. (должно быть 4 и 3 пробела соответственно)Perl 6 , 39 байт
Попробуйте онлайн!
Судя по всему, один из немногих, кто использует самоанализ.
i
вот комплексное число, значение которого уникально для каждой функции триггера, поэтому, перебирая все методы, мы можем найти подходящий метод и неявно выложить его имя. Этоtry
необходимо, поскольку некоторые (нежелательные) методы имеют другую подпись.источник
JavaScript (Node.js) , 72 байта
Попробуйте онлайн!
источник