Chức năng trái ngược


31

Sẽ không gọn gàng nếu các chức năng lập trình có thể được đảo ngược, giống như chức năng toán học mà chúng thực hiện?

Viết hàm (hoặc chương trình) nhận một đầu vào xdưới bất kỳ hình thức nào, đầu ra đó ln(x).
Khi các byte của chương trình được sắp xếp lại / đảo ngược để byte đầu tiên bây giờ là byte cuối cùng, nó sẽ lấy một đầu vào xở bất kỳ dạng nào và đầu ra e^xthay thế.

  • Câu trả lời của bạn phải có ít nhất 3 con số quan trọng chính xác.
  • Xấp xỉ là tốt, miễn là họ có ít nhất 3 con số quan trọng chính xác.
  • Mã của bạn phải ở cùng một ngôn ngữ lập trình cả tiến và lùi.

Hãy nói rằng chương trình này thực hiện ln(x):

abc你好

Sau đó, chương trình này phải thực hiện e^x:

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

Sao vàng nếu bạn sử dụng một ngôn ngữ mà không có hỗ trợ nổi.

Đây là một hình thức kỳ lạ của môn đánh gôn, vì vậy chương trình ngắn nhất sẽ thắng.


4
"Sẽ không gọn gàng nếu các chức năng lập trình có thể được đảo ngược, giống như chức năng toán học mà chúng thực hiện?" Một số ngôn ngữ (ví dụ J và Mathicala) thực sự có thể làm điều này cho một số chức năng.
Martin Ender

Ngoài ra, K2 có thể xấp xỉ một nghịch đảo cho một hàm thuần đơn thức tùy ý thông qua quá tải "nghịch đảo chức năng" của dyadic và triadic ?, sử dụng phương thức secant.
JohnE 6/2/2016

1
"ít nhất 3 con số quan trọng chính xác" - trong phạm vi nào?
TLW

4
Tôi nhận ra bây giờ đã quá muộn, nhưng tôi nghĩ rằng đây sẽ là một thử thách thực sự tốt đẹp nếu những bình luận không được chấp nhận.
Alex A.

I actually thought of that when I came up with this challenge @AlexA. but forgot about it while writing the post :P Also that would've made "normal" languages like java, c++ etc basically impossible.
Filip Haglund

Câu trả lời:


75

Haskell, 11 bytes

f=log
pxe=f

and in reverse order:

f=exp
gol=f

This works without the "comment" trick. Instead each version defines an additional, but unused function (pxe/ gol).


49
+1 for gol=f.
Leif Willerts

2
This is also a valid solution in Julia.
Rainer P.

44

APL, 3 bytes

*⊣⍟

This is a function train. Monadic * returns e^x, monadic returns ln(x). is a dyadic function that returns its left argument. Thus, *⊣⍟ is equivalent to just *, and the reverse ⍟⊣* is equivalent to just .


22

Jelly, 5 4 bytes

Yay, my first Jelly answer. :) Input is via command-line argument.

Jelly has its own code page so each character is one byte.

eÆÆl

Try it online!

Reversed:

lÆÆe

Try it online!

Explanation

The Æ on its own is an unrecognised token, so it acts the same as a linefeed. That means in either case the main link is only Æl or Æe which is the 2-character built-in for exp() or ln() and is by default performed on the first command-line argument.


9

Javascript, 18 bytes

Math.log//pxe.htaM

Don't you need a return() or console.log() around it?
OldBunny2800

2
@OldBunny2800 It evaluates to a function, which should be permissible.
Neil

5
Math.ln||pxe.htaM will probably also work.
SuperJedi224

@SuperJedi224 Thanks, that helped me spot the error in my answer!
Neil

@Neil I hadn't even noticed that
SuperJedi224


5

Julia, 7 bytes

log#pxe

This is an anonymous function. Assign it to a variable to call it. Evaluates to builtins log or exp plus a comment.


1
Same answer works for R
Dason

5

Mathematica, 19 bytes

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

Reversed:

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

This was interesting to golf! Mathematica has no line comments / implicit string endings, so I couldn't take the simple route. Instead, I used the fact that 0 + x == x, 0 x == 0, and that 1 x == x, no matter what x is! Testing:

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

4

Python2, 73 bytes

io: stdin/stdout

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

inverse:

from math import*;print exp(input())#))(tupni(gol tnirp;*tropmi htam morf

You can shave 10 characters off by using __import__("math"). instead of
TLW

3

CJam, 11 bytes

rdmle#eemdr

Test it here.

Reversed:

rdmee#elmdr

Test it here.

Basically the same comment-trick as the OP's Python answer. e# starts a comment. rd reads the input and ml or me computes the logarithm or exponential.


3

Brachylog, 3 bytes

*₁≡

Try it online!

Initially, I had hoped to use ~*, but although *~ computes e^x and successfully ignores the trailing tilde, ~* fails for all integer inputs and hits a float overflow on most non-integer inputs.

Forwards:

       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.

This uses the identity predicate because, although trailing tildes are tolerated, leading subscripts are not. (If they were, the Brachylog answer would be *₁ alone, which is just the normal builtin for natural log.)


2

Vitsy, 5 bytes

This is a program that exits on an error.

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

This program exits on an error with ln(input) on the stack.

Try it online! (note that I have put N to have visible output)

Then it's inverse:

Er^LE

This program exits on an error with e^(input) on the stack.

Try it online!


2

Fuzzy Octo Guacamole, 7 bytes

non-competing, FOG is newer than the challenge

EZO@pZE

This is the equivalent of a function in FOG. It assumes the input is on the stack. This can be assigned to a function by the code "EZO@pZE""f"o, where f is any single-char name you want to assign. Then use it like any other command. Example: "EZO@pZE"'f'o^f.

Explanation:

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.

Reversed:

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.


1

Pyth, 12 bytes

Finds ln(input())

.lQ) " Q1n.^

Finds e^input()

^.n1Q " )Ql.

Spaces stop implicit printing of strings, each version calculates it then creates a string with the remaining characters.

ln(x) mode here

e^x mode here



1

Jolf, 9 bytes

Program 1: exp of input

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

Program 2: ln of input

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

Bonus points for being a case-insensitive palindrome? Try it here!


1

J, 8 bytes

The natural logarithm is ^., and exponential ^. The problem is, . can only modify a valid verb, otherwise, a spelling error will occur. Thus, we can't use the left argument trick in the APL answer, becuase ^.[^ would cause an error when reversed, as ^[.^ creates an invalid verb. So, we must use comments; but NB. is so long :( Fortunately, they both end with ., so&ldots; there's that.

Logarithm:

^.NB.BN^

Exponential:

^NB.BN.^

You can enter them for yourself online!



0

Runic Enchantments, 9 bytes

i'lA@Ae'i

Try it online!

An ungodly uninteresting program. @ insures termination of the implied entry point at the left, everything after is unexecuted. I tried really hard to re-use the ' or A instructions, but to no avail, even at larger program sizes. The required explicit entry point for multi-line programs essentially precludes it.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.