ฟังก์ชันผกผัน


31

มันจะไม่เป็นระเบียบหรือไม่ถ้าฟังก์ชั่นการเขียนโปรแกรมสามารถกลับด้านได้เหมือนกับฟังก์ชั่นทางคณิตศาสตร์ที่ใช้

เขียนฟังก์ชั่น (หรือโปรแกรม) ที่จะใช้เวลาหนึ่งการป้อนข้อมูลในรูปแบบใดที่เอาท์พุทx เมื่อไบต์ของโปรแกรมถูกเรียงลำดับใหม่ / ย้อนกลับเพื่อให้ไบต์แรกในตอนนี้เป็นไบต์สุดท้ายควรใช้หนึ่งอินพุตในรูปแบบและเอาต์พุตใด ๆแทนln(x)
xe^x

  • คำตอบของคุณต้องมีตัวเลขนัยสำคัญที่ถูกต้องอย่างน้อย 3 ตัว
  • การประมาณนั้นใช้ได้ตราบใดที่มีตัวเลขนัยสำคัญที่ถูกต้องอย่างน้อย 3 ตัว
  • รหัสของคุณจะต้องเป็นภาษาการเขียนโปรแกรมเดียวกันทั้งไปข้างหน้าและข้างหลัง

สมมติว่าโปรแกรมนี้ใช้ln(x):

abc你好

จากนั้นโปรแกรมนี้จะต้องดำเนินการe^x:

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

โกลด์สตาร์หากคุณใช้ภาษาที่ไม่มีการสนับสนุนแบบลอย

นี่เป็นรูปแบบแปลก ๆ ของ code-golf ดังนั้นโปรแกรมที่สั้นที่สุดชนะ


4
"มันจะไม่เป็นระเบียบหรือไม่ถ้าฟังก์ชั่นการเขียนโปรแกรมสามารถกลับด้านได้เหมือนกับฟังก์ชั่นทางคณิตศาสตร์ที่ใช้ บางภาษา (เช่น J และ Mathematica) สามารถทำสิ่งนี้ได้จริงสำหรับบางฟังก์ชั่น
Martin Ender

ยิ่งไปกว่านั้น K2 สามารถประมาณค่าผกผันสำหรับฟังก์ชัน monadic pure โดยใช้ฟังก์ชัน "inverse" overload ของ dyadic และ triadic ?ซึ่งใช้วิธี secant
JohnE

1
"ตัวเลขสำคัญอย่างน้อย 3 ตัวที่ถูกต้อง" - ช่วงใด?
TLW

4
ฉันรู้ว่ามันสายเกินไปแล้ว แต่ฉันคิดว่านี่จะเป็นความท้าทายที่ดีจริงๆหากความคิดเห็นไม่ได้รับอนุญาต
Alex A.

จริง ๆ แล้วฉันคิดว่าเมื่อฉันมากับความท้าทายนี้ @AlexA แต่ลืมไปแล้วในขณะที่เขียนโพสต์: P และนั่นอาจทำให้ภาษา "ปกติ" เช่น java, c ++ เป็นต้นเป็นไปไม่ได้
Filip Haglund

คำตอบ:


75

Haskell ขนาด 11 ไบต์

f=log
pxe=f

และในลำดับที่กลับกัน:

f=exp
gol=f

วิธีนี้ใช้งานได้โดยไม่มีเคล็ดลับ "ความคิดเห็น" แต่ละรุ่นจะกำหนดฟังก์ชันเพิ่มเติม แต่ไม่ได้ใช้ ( pxe/ gol)


49
+1 gol=fสำหรับ
Leif Willerts

2
นี่เป็นโซลูชันที่ถูกต้องใน Julia
Rainer P.

44

APL, 3 ไบต์

*⊣⍟

นี่คือรถไฟฟังก์ชั่น เอก* ผลตอบแทนe^x, เอกผลตอบแทน เป็นฟังก์ชัน dyadic ที่คืนค่าอาร์กิวเมนต์ด้านซ้าย ดังนั้นจะเทียบเท่ากับเพียงและกลับเทียบเท่ากับเพียงln(x)*⊣⍟*⍟⊣*


22

เยลลี่, 5 4 ไบต์

ใช่คำตอบเยลลี่แรกของฉัน :) การป้อนข้อมูลผ่านอาร์กิวเมนต์บรรทัดคำสั่ง

เจลลี่มีหน้ารหัสของตัวเองเพื่อให้ตัวละครแต่ละตัวเป็นหนึ่งไบต์

eÆÆl

ลองออนไลน์!

ย้อนกลับ

lÆÆe

ลองออนไลน์!

คำอธิบาย

ตัวÆของมันเองเป็นโทเค็นที่ไม่รู้จักดังนั้นจึงทำหน้าที่เหมือนกับตัวป้อนบรรทัด ซึ่งหมายความว่าในกรณีใดลิงก์หลักเป็นเพียงÆlหรือÆeซึ่งเป็น 2 ตัวในตัวสำหรับexp()หรือln()และเป็นค่าเริ่มต้นดำเนินการในอาร์กิวเมนต์บรรทัดคำสั่งแรก





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

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 ไบต์

ไม่ใช่การแข่งขัน 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.




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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.