Funkcja odwrotna

31

Czy nie byłoby fajnie, gdyby funkcje programowania można było odwrócić, tak jak zaimplementowane funkcje matematyczne?

Napisz funkcję (lub program), która przyjmuje jedno dane wejściowe xw dowolnej formie i generuje dane wyjściowe ln(x).
Kiedy bajty programu są ponownie uporządkowane / odwrócone, tak że pierwszy bajt jest teraz ostatnim bajtem, powinien zamiast tego przyjąć jedno wejście xw dowolnej formie i dane wyjściowe e^x.

  • Twoja odpowiedź musi zawierać co najmniej 3 prawidłowe znaczące liczby.
  • Przybliżenia są w porządku, o ile mają co najmniej 3 prawidłowe znaczące liczby.
  • Twój kod musi być w tym samym języku programowania, zarówno do przodu, jak i do tyłu.

Powiedzmy, że ten program implementuje ln(x):

abc你好

Następnie ten program musi zaimplementować e^x:

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

Złota gwiazda, jeśli używasz języka bez obsługi pływaka.

To dziwna forma golfa kodowego, więc wygrywa najkrótszy program.

Filip Haglund
źródło
4
„Czy nie byłoby fajnie, gdyby funkcje programowania można było odwrócić, tak jak funkcje matematyczne, które implementują?” Niektóre języki (np. J i Mathematica) mogą to zrobić w przypadku niektórych funkcji.
Martin Ender,
Dodatkowo, K2 może aproksymować odwrotność arbitralnej czystej funkcji monadycznej poprzez swoje „przeciążenie funkcji odwrotnej” diadycznej i triadowej ?, która wykorzystuje metodę sieczną.
JohnE
1
„co najmniej 3 prawidłowe liczby znaczące” - w jakim zakresie?
TLW
4
Zdaję sobie sprawę, że jest już o wiele za późno, ale myślę, że byłoby to naprawdę miłe wyzwanie, gdyby komentarze zostały odrzucone.
Alex A.
Pomyślałem o tym, kiedy wymyśliłem to wyzwanie @AlexA. ale zapomniałem o tym podczas pisania postu: P Także to uniemożliwiłoby „normalne” języki, takie jak java, c ++ itp.
Filip Haglund,

Odpowiedzi:

75

Haskell, 11 bajtów

f=log
pxe=f

i w odwrotnej kolejności:

f=exp
gol=f

Działa to bez sztuczki „komentowania”. Zamiast tego każda wersja definiuje dodatkową, ale nieużywaną funkcję ( pxe/ gol).

nimi
źródło
49
+1 dla gol=f.
Leif Willerts
2
Jest to również prawidłowe rozwiązanie w Julii.
Rainer P.
44

APL, 3 bajty

*⊣⍟

To jest pociąg funkcyjny. Monadyczne * zwroty e^x, monadyczne zwroty ln(x). jest funkcją dynamiczną, która zwraca swój lewy argument. Zatem *⊣⍟jest równoważne z just *, a odwrotność ⍟⊣*jest równoważna z just .

marinus
źródło
22

Galaretka, 5 4 bajtów

Tak, moja pierwsza galaretka odpowiedź. :) Dane wejściowe są przez argument wiersza poleceń.

Galaretka ma własną stronę kodową, więc każdy znak ma jeden bajt.

eÆÆl

Wypróbuj online!

Wywrócony:

lÆÆe

Wypróbuj online!

Wyjaśnienie

Sam Æw sobie jest nierozpoznanym tokenem, więc działa tak samo jak linia. Oznacza to, że w obu przypadkach główny link jest tylko Ællub Æektóry jest wbudowanym 2-znakowym znakiem dla exp()lub ln()i jest domyślnie wykonywany dla pierwszego argumentu wiersza poleceń.

Martin Ender
źródło
9

JavaScript, 18 bajtów

Math.log//pxe.htaM
Neil
źródło
Czy nie potrzebujesz wokół niego return () lub console.log ()?
OldBunny2800
2
@ OldBunny2800 Ocenia funkcję, która powinna być dopuszczalna.
Neil
5
Math.ln||pxe.htaMprawdopodobnie również zadziała.
SuperJedi224,
@ SuperJedi224 Dzięki, dzięki temu zauważyłem błąd w mojej odpowiedzi!
Neil,
@Neil Nawet tego nie zauważyłem
SuperJedi224,
7

Poważnie, 5 bajtów

,_.e,

Input, ln, output, następnie exp na pustym stosie (nic nie robi), a input (nic nie robi, ponieważ dane wejściowe są wyczerpane). Wypróbuj online!

Wywrócony:

,e._,

Wypróbuj online!

Mego
źródło
5

Julia, 7 bajtów

log#pxe

To anonimowa funkcja. Przypisz ją do zmiennej, aby ją wywołać. Ocenia wbudowane loglubexp plus komentarz.

Rainer P.
źródło
1
Ta sama odpowiedź działa dla R
Dason
5

Mathematica, 19 bajtów

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

Wywrócony:

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

To było interesujące dla golfa! Mathematica nie ma komentarzy do linii / niejawnych zakończeń ciągów, więc nie mogłem wybrać prostej drogi. Zamiast tego wykorzystał fakt 0 + x == x, 0 x == 0i to 1 x == xbez względu na to, co xjest! Testowanie:

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
źródło
4

Python2, 73 bajty

io: stdin / stdout

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

odwrotność:

from math import*;print exp(input())#))(tupni(gol tnirp;*tropmi htam morf
Filip Haglund
źródło
Możesz ogolić 10 znaków, używając __import__("math").zamiast
TLW
3

CJam, 11 bajtów

rdmle#eemdr

Sprawdź to tutaj.

Wywrócony:

rdmee#elmdr

Sprawdź to tutaj.

Zasadniczo taka sama sztuczka związana z komentowaniem jak w odpowiedzi na Python w OP. e#zaczyna komentarz. rdodczytuje dane wejściowe i mlczy meoblicza logarytm lub wykładniczy.

Martin Ender
źródło
3

Brachylog , 3 bajty

*₁≡

Wypróbuj online!

Początkowo miałem nadzieję użyć ~*, ale chociaż *~oblicza e^xi z powodzeniem ignoruje tyldy tyldy, ~*nie udaje się we wszystkich wejściowych liczbach całkowitych i napotyka przepełnienie zmiennoprzecinkowe na większości danych niecałkowitych.

Naprzód:

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

Wstecz:

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

Używa predykatu tożsamości, ponieważ chociaż tyldy tyldy są tolerowane, wiodące indeksy dolne nie są. (Gdyby tak było, odpowiedź Brachylog byłaby *₁sama, co jest zwykłym wbudowanym logiem naturalnym).

Niepowiązany ciąg
źródło
2

Vitsy, 5 bajtów

Jest to program, który kończy działanie po błędzie.

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

Ten program kończy działanie z błędem z ln (wejściem) na stosie.

Wypróbuj online! (zauważ, że umieściłem, Naby mieć widoczny wynik)

To jest odwrotne:

Er^LE

Ten program kończy działanie z błędem z e ^ (wejście) na stosie.

Wypróbuj online!

Addison Crump
źródło
2

Rozmyte Octo Guacamole, 7 bajtów

niekonkurujący, FOG jest nowszy niż wyzwanie

EZO@pZE

Jest to odpowiednik funkcji w FOG. Zakłada, że ​​dane wejściowe znajdują się na stosie. Można to przypisać do funkcji za pomocą kodu "EZO@pZE""f"o, gdzie fjest dowolna nazwa jednoznakowa, którą chcesz przypisać. Następnie używaj go jak każdego innego polecenia. Przykład: "EZO@pZE"'f'o^f.

Wyjaśnienie:

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.

Wywrócony:

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ɪᴋᴇʀ
źródło
1

Pyth, 12 bajtów

Znaleziska ln(input())

.lQ) " Q1n.^

Znaleziska e^input()

^.n1Q " )Ql.

Spacje zatrzymują niejawne drukowanie ciągów, każda wersja oblicza je, a następnie tworzy ciąg z pozostałymi znakami.

ln(x) tryb tutaj

e^x tryb tutaj

niebieski
źródło
1

Jolf, 9 bajtów

Program 1: expwejścia

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

Program 2: lnwejścia

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

Punkty bonusowe za bycie palindromem bez rozróżniania wielkości liter? Wypróbuj tutaj!

Conor O'Brien
źródło
1

J, 8 bajtów

Logarytm naturalny jest ^.wykładniczy ^. Problem polega na tym, że .można modyfikować tylko prawidłowy czasownik, w przeciwnym razie wystąpi błąd pisowni. Dlatego nie możemy użyć lewy argument lewy w odpowiedzi APL, ponieważ ^.[^spowodowałby błąd po odwróceniu, ponieważ ^[.^tworzy niepoprawny czasownik. Musimy więc używać komentarzy; ale NB.jest tak długi :( Na szczęście oba kończą się na ., więc & ldots; jest to.

Logarytm:

^.NB.BN^

Wykładniczy:

^NB.BN.^

Możesz wprowadzić je samemu online !

Conor O'Brien
źródło
0

Java 8, 198 182 30 bajtów

d->Math.log(d)//)d(pxe.htaM<-d

Wypróbuj online.

i odwrócone:

d->Math.exp(d)//)d(gol.htaM<-d

Wypróbuj online.

Wykorzystuje trick trick ( //) z wbudowanymi funkcjami dla Math.logi Math.exp.

Kevin Cruijssen
źródło
0

Runiczne Zaklęcia , 9 bajtów

i'lA@Ae'i

Wypróbuj online!

Bezbożny, nieciekawy program. @zapewnia zakończenie domniemanego punktu wejścia po lewej stronie, wszystko po nim jest niewykonane. Bardzo starałem się ponownie użyć instrukcji 'lub A, ale bezskutecznie, nawet przy większych programach. Wymagany wyraźny punkt wejścia dla programów wieloliniowych zasadniczo go wyklucza.

Draco18s
źródło