Обратная функция

31

Разве не было бы замечательно, если бы функции программирования можно было инвертировать, точно так же, как математические функции, которые они реализуют?

Напишите функцию (или программу), которая принимает один вход xв любой форме, который выводит ln(x).
Когда байты программы переупорядочены / перевернуты так, что первый байт теперь является последним байтом, он должен принимать один вход xв любой форме и выводить e^xвместо него.

  • Ваш ответ должен содержать не менее 3 правильных значащих цифр.
  • Аппроксимации хороши, если они имеют как минимум 3 правильные значащие цифры.
  • Ваш код должен быть на одном языке программирования как вперед, так и назад.

Допустим, эта программа реализует ln(x):

abc你好

Тогда эта программа должна реализовать e^x:

\xBD\xA5\xE5\xA0\xBD\xE4cba

Золотая звезда, если вы используете язык без поддержки плавания.

Это странная форма игры в гольф, поэтому выигрывает самая короткая программа.

Филип Хаглунд
источник
4
«Разве не было бы замечательно, если бы функции программирования можно было инвертировать, точно так же, как математические функции, которые они реализуют?» Некоторые языки (например, J и Mathematica) могут делать это для некоторых функций.
Мартин Эндер
Кроме того, K2 может аппроксимировать инверсию для произвольной монадической чистой функции через перегрузку «обратная функция» двоичной и триадической функций ?, в которой используется секущий метод.
JohnE
1
«не менее 3 правильных значащих цифр» - в каком диапазоне?
TLW
4
Я понимаю, что сейчас слишком поздно, но я думаю, что это было бы действительно хорошим испытанием, если бы комментарии были запрещены.
Алекс А.
Я действительно думал об этом, когда придумал этот вызов @AlexA. но забыл об этом во время написания поста: P Также это сделало бы "нормальные" языки, такие как java, c ++ и т. д., в принципе невозможными.
Филипп Хаглунд,

Ответы:

75

Haskell, 11 байт

f=log
pxe=f

и в обратном порядке:

f=exp
gol=f

Это работает без уловки "комментария". Вместо этого каждая версия определяет дополнительную, но неиспользуемую функцию ( pxe/ gol).

Ними
источник
49
+1 за gol=f.
Лейф Виллертс
2
Это также верное решение в Юлии.
Райнер П.
44

APL, 3 байта

*⊣⍟

Это функциональный поезд. Монадические * возвраты e^x, монадические возвраты ln(x). является диадической функцией, которая возвращает свой левый аргумент. Таким образом, *⊣⍟эквивалентно справедливому *, а обратное ⍟⊣*эквивалентно справедливому .

Мэринус
источник
22

Желе, 5 4 байта

Yay, мой первый ответ Jelly. :) Ввод осуществляется через аргумент командной строки.

У желе есть своя собственная кодовая страница, поэтому каждый символ составляет один байт.

eÆÆl

Попробуйте онлайн!

Перевернутый:

lÆÆe

Попробуйте онлайн!

объяснение

Сам Æпо себе это нераспознанный токен, поэтому он действует так же, как перевод строки. Это означает, что в любом случае основная ссылка является единственной Ælили Æeкоторая является 2-символьной встроенной для exp()или ln()и по умолчанию выполняется для первого аргумента командной строки.

Мартин Эндер
источник
9

Javascript, 18 байт

Math.log//pxe.htaM
Нил
источник
Разве вам не нужны return () или console.log ()?
OldBunny2800
2
@ OldBunny2800 Оценивает функцию, которая должна быть допустимой.
Нил
5
Math.ln||pxe.htaMвероятно, тоже будет работать.
SuperJedi224
@ SuperJedi224 Спасибо, это помогло мне обнаружить ошибку в моем ответе!
Нил
@Neil Я даже не заметил этого
SuperJedi224
5

Юлия, 7 байт

log#pxe

Это анонимная функция. Назначьте это переменной, чтобы вызвать это. Оценивает встроенные logили expплюс комментарий.

Райнер П.
источник
1
Тот же ответ работает для R
Dason
5

Mathematica, 19 байт

1&#@pxE+0&0+Log@#&1

Перевернутый:

1&#@goL+0&0+Exp@#&1

Это было интересно для гольфа! Mathematica не имеет комментариев к строке / неявных окончаний строки, поэтому я не мог выбрать простой маршрут. Вместо этого я использовал тот факт , что 0 + x == x, 0 x == 0и что 1 x == x, независимо от того , что xесть! Тестирование:

In[1]:= (1&#@pxE+0&0+Log@#&1)[x]

Out[1]= Log[x]

In[2]:= (1&#@goL+0&0+Exp@#&1)[x]

         x
Out[2]= E
LegionMammal978
источник
4

Python2, 73 байта

io: стандартный ввод / вывод

from math import*;print log(input())#))(tupni(pxe tnirp;*tropmi htam morf

обратное:

from math import*;print exp(input())#))(tupni(gol tnirp;*tropmi htam morf
Филип Хаглунд
источник
Вы можете сбрить 10 символов, используя __import__("math").вместо
TLW
3

CJam, 11 байт

rdmle#eemdr

Проверьте это здесь.

Перевернутый:

rdmee#elmdr

Проверьте это здесь.

В основном тот же трюк с комментариями, что и в ответе Python от OP. e#начинает комментарий rdчитает входные данные и / mlили meвычисляет логарифм или экспоненту.

Мартин Эндер
источник
3

Брахилог , 3 байта

*₁≡

Попробуйте онлайн!

Первоначально я надеялся использовать ~*, но, хотя *~вычисляет e^xи успешно игнорирует завершающую тильду, происходит ~*сбой для всех целочисленных входных данных и попадает в переполнение с плавающей запятой на большинстве нецелых входных данных.

Вперед:

       The output
  ≡    is
*₁     the natural logarithm of
       the input.

Backwards:

       The output is
  *    Euler's number to the power of
       the input
≡      passed through the identity predicate
 ₁     with an extraneous subscript.

При этом используется предикат идентификации, поскольку, хотя конечные тильды допускаются, ведущие подписчики - нет. (Если бы они были, ответ Brachylog был бы *₁один, который является просто нормальным встроенным для естественного журнала.)

Несвязанная строка
источник
2

Витси, 5 байтов

Это программа, которая завершается с ошибкой.

EL^rE
E   E  Push java.lang.Math.E
 L     Push log_(top) (input) (ln(input))
  ^    Push (top)^(input)  (e^(input))
   r   Reverse the stack

Эта программа завершается с ошибкой с ln (вход) в стеке.

Попробуйте онлайн! (обратите внимание, что я поставил, Nчтобы иметь видимый вывод)

Тогда все наоборот:

Er^LE

Эта программа завершается с ошибкой с e ^ (input) в стеке.

Попробуйте онлайн!

Аддисон Крамп
источник
2

Нечеткое окто гуакамоле, 7 байтов

неконкурентный, FOG новее, чем вызов

EZO@pZE

Это эквивалент функции в FOG. Предполагается, что вход находится в стеке. Это может быть назначено функции с помощью кода "EZO@pZE""f"o, где fлюбое имя с одним символом вы хотите назначить. Затем используйте его как любую другую команду. Пример: "EZO@pZE"'f'o^f.

Объяснение:

EZO@pZE
E       # Push E (2.718....)
 Z      # Reverse stack (it is now [e, input])
  O     # log(x, y) which is ln(input)
   @    # Exit. (implicit output) Nothing after this gets run.
    p   # x^y (power function)
     Z  # Reverse stack
      E # Push E.

Перевернутый:

EZp@OZE
E       # Push E (2.718....)
 Z      # Reverse stack (it is now [e, input])
  O     # x^y (power function)
   @    # Exit. (implicit output) Nothing after this gets run.
    p   # log(x, y) which is ln(input)
     Z  # Reverse stack
      E # Push E.
Rɪᴋᴇʀ
источник
1

Pyth, 12 байт

Находки ln(input())

.lQ) " Q1n.^

Находки e^input()

^.n1Q " )Ql.

Пробелы останавливают неявную печать строк, каждая версия вычисляет ее, а затем создает строку с оставшимися символами.

ln(x) режим здесь

e^x режим здесь

синий
источник
1

Джольф, 9 байт

Программа 1: expввода

amoj"jOma
a         print
 moj      e^j
    "jOma  the rest of the line is captured as a string; implicit printing is restricted.

Программа 2: lnввода

amOj"joma
a         print
 mOj      ln(j)
    "joma  the rest of the line is captured as a string; implicit printing is restricted.

Бонусные баллы за то, что не учитывает регистр палиндром? Попробуй это здесь!

Конор О'Брайен
источник
1

J, 8 байт

Натуральный логарифм имеет ^.экспоненциальный характер ^. Проблема в том, что .можно изменить только действительный глагол, иначе произойдет орфографическая ошибка. Таким образом, мы не можем использовать левый трюк аргумента в ответе APL, потому ^.[^что при обратном вызове возникнет ошибка, так как ^[.^создаст недопустимый глагол. Итак, мы должны использовать комментарии; но NB.так долго :( К счастью, они оба заканчиваются ., так что & ldots; есть это.

Логарифм:

^.NB.BN^

Экспоненциальная:

^NB.BN.^

Вы можете ввести их для себя онлайн !

Конор О'Брайен
источник
0

Рунические чары , 9 байт

i'lA@Ae'i

Попробуйте онлайн!

Безбожная неинтересная программа. @обеспечивает завершение подразумеваемой точки входа слева, все после не выполняется. Я очень старался повторно использовать инструкции 'или A, но безрезультатно, даже при больших размерах программ. Требуемая явная точка входа для многострочных программ по существу исключает это.

Draco18s
источник