Función inversa

31

¿No sería genial si las funciones de programación pudieran invertirse, al igual que la función matemática que implementan?

Escriba una función (o programa) que tome una entrada xen cualquier forma, que salga ln(x).
Cuando los bytes del programa se reordenan / invierten de modo que el primer byte ahora es el último, debe tomar una entrada xen cualquier forma y, en su e^xlugar, la salida .

  • Su respuesta debe tener al menos 3 cifras significativas correctas.
  • Las aproximaciones están bien, siempre que tengan al menos 3 cifras significativas correctas.
  • Su código debe estar en el mismo lenguaje de programación, tanto hacia adelante como hacia atrás.

Digamos que este programa implementa ln(x):

abc你好

Entonces este programa tiene que implementar e^x:

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

Estrella dorada si usas un idioma sin soporte flotante.

Esta es una forma extraña de código de golf, por lo que gana el programa más corto.

Filip Haglund
fuente
44
"¿No sería genial si las funciones de programación pudieran invertirse, al igual que la función matemática que implementan?" Algunos lenguajes (por ejemplo, J y Mathematica) pueden hacer esto para algunas funciones.
Martin Ender
Además, K2 podría aproximar una inversa para una función pura monádica arbitraria a través de su sobrecarga de "función inversa" de diádica y triádica ?, que utiliza el método secante.
JohnE
1
"al menos 3 cifras significativas correctas": ¿en qué rango?
TLW
44
Me doy cuenta de que es demasiado tarde ahora, pero creo que este habría sido un desafío realmente agradable si los comentarios no hubieran sido permitidos.
Alex A.
De hecho, pensé en eso cuando se me ocurrió este desafío @AlexA. pero lo olvidé mientras escribía la publicación: P También eso habría hecho que los lenguajes "normales" como java, c ++, etc. fueran básicamente imposibles.
Filip Haglund

Respuestas:

75

Haskell, 11 bytes

f=log
pxe=f

y en orden inverso:

f=exp
gol=f

Esto funciona sin el truco del "comentario". En cambio, cada versión define una función adicional, pero no utilizada ( pxe/ gol).

nimi
fuente
49
+1 para gol=f.
Leif Willerts
2
Esta también es una solución válida en Julia.
Rainer P.
44

APL, 3 bytes

*⊣⍟

Este es un tren funcional. Monádicos * rendimientos e^x, monádicos rendimientos ln(x). es una función diádica que devuelve su argumento izquierdo. Por lo tanto, *⊣⍟es equivalente a justo *, y lo contrario ⍟⊣*es equivalente a justo .

marinus
fuente
22

Jalea, 5 4 bytes

Yay, mi primera respuesta de Jelly. :) La entrada se realiza mediante un argumento de línea de comandos.

Jelly tiene su propia página de códigos, por lo que cada carácter es un byte.

eÆÆl

Pruébalo en línea!

Invertido:

lÆÆe

Pruébalo en línea!

Explicación

Por Æsí solo es un token no reconocido, por lo que actúa igual que un salto de línea. Eso significa que, en cualquier caso, el enlace principal es solo Ælo Æecuál es el incorporado de 2 caracteres para exp()o ln()y por defecto se realiza en el primer argumento de línea de comandos.

Martin Ender
fuente
9

Javascript, 18 bytes

Math.log//pxe.htaM
Neil
fuente
¿No necesita un return () o console.log () a su alrededor?
OldBunny2800
2
@ OldBunny2800 Se evalúa como una función, que debería ser permisible.
Neil
55
Math.ln||pxe.htaMprobablemente también funcionará.
SuperJedi224
@ SuperJedi224 Gracias, ¡eso me ayudó a detectar el error en mi respuesta!
Neil
@Neil ni siquiera me había dado cuenta de eso
SuperJedi224
5

Julia, 7 bytes

log#pxe

Esta es una función anónima. Asignarlo a una variable para llamarlo. Evalúa a incorporados logo expmás un comentario.

Rainer P.
fuente
1
La misma respuesta funciona para R
Dason
5

Mathematica, 19 bytes

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

Invertido:

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

¡Esto fue interesante para el golf! Mathematica no tiene comentarios de línea / terminaciones de cadena implícitas, por lo que no pude tomar la ruta simple. En su lugar, he utilizado el hecho de que 0 + x == x, 0 x == 0y que 1 x == x, sin importar lo que xes! Pruebas:

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
fuente
4

Python2, 73 bytes

io: stdin / stdout

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

inverso:

from math import*;print exp(input())#))(tupni(gol tnirp;*tropmi htam morf
Filip Haglund
fuente
Puede eliminar 10 caracteres usando en __import__("math").lugar de
TLW
3

CJam, 11 bytes

rdmle#eemdr

Pruébalo aquí.

Invertido:

rdmee#elmdr

Pruébalo aquí.

Básicamente el mismo truco de comentarios que la respuesta de Python del OP. e#comienza un comentario rdlee la entrada y / mlo mecalcula el logaritmo o exponencial.

Martin Ender
fuente
3

Brachylog , 3 bytes

*₁≡

Pruébalo en línea!

Inicialmente, esperaba usar ~*, pero aunque *~calcula e^xe ignora con éxito la tilde final,~* falla en todas las entradas enteras y alcanza un desbordamiento flotante en la mayoría de las entradas no enteras.

Hacia adelante:

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

Hacia atrás:

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

Esto utiliza el predicado de identidad porque, aunque se toleran tildes finales, los subíndices iniciales no lo son. (Si lo fueran, la respuesta de Brachylog estaría *₁sola, que es solo la construcción normal para el registro natural).

Cadena no relacionada
fuente
2

Vitsy, 5 bytes

Este es un programa que sale por un 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

Este programa sale por un error con ln (entrada) en la pila.

Pruébalo en línea! (tenga en cuenta que he puestoN a tener salida visible)

Entonces es inverso:

Er^LE

Este programa sale por un error con e ^ (entrada) en la pila.

Pruébalo en línea!

Addison Crump
fuente
2

Fuzzy Octo Guacamole, 7 bytes

no compite, FOG es más nuevo que el desafío

EZO@pZE

Este es el equivalente de una función en FOG. Se supone que la entrada está en la pila. Esto se puede asignar a una función por el código "EZO@pZE""f"o, donde fhay cualquier nombre de carácter único que desee asignar. Luego úsalo como cualquier otro comando. Ejemplo: "EZO@pZE"'f'o^f.

Explicación:

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.

Invertido:

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ɪᴋᴇʀ
fuente
1

Pyth, 12 bytes

Encuentra ln(input())

.lQ) " Q1n.^

Encuentra e^input()

^.n1Q " )Ql.

Los espacios detienen la impresión implícita de cadenas, cada versión lo calcula y luego crea una cadena con los caracteres restantes.

ln(x) modo aquí

e^x modo aquí

Azul
fuente
1

Jolf, 9 bytes

Programa 1: expde entrada

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

Programa 2: lnde entrada

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

¿Puntos de bonificación por ser un palíndromo que no distingue entre mayúsculas y minúsculas? Pruébalo aquí!

Conor O'Brien
fuente
1

J, 8 bytes

El logaritmo natural es ^., y exponencial ^. El problema es .que solo puede modificar un verbo válido, de lo contrario, se producirá un error ortográfico. Por lo tanto, no podemos usar el truco del argumento izquierdo en la respuesta APL, porque ^.[^podría causar un error cuando se invierte, ya que ^[.^crea un verbo no válido. Entonces, debemos usar comentarios; pero NB.es tan largo :( Afortunadamente, ambos terminan con. , así que & ldots; ahí está.

Logaritmo:

^.NB.BN^

Exponencial:

^NB.BN.^

¡Puedes ingresarlos por ti mismo en línea !

Conor O'Brien
fuente
0

Java 8, 198 182 30 bytes

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

Pruébalo en línea.

y revertido:

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

Pruébalo en línea.

Utiliza el truco de comentarios ( //) con funciones integradas para Math.logy Math.exp.

Kevin Cruijssen
fuente
0

Encantamientos rúnicos , 9 bytes

i'lA@Ae'i

Pruébalo en línea!

Un programa impío y sin interés. @asegura la terminación del punto de entrada implícito a la izquierda, todo lo que sigue no está ejecutado. Intenté realmente reutilizar las instrucciones 'o A, pero fue en vano, incluso en programas de mayor tamaño. El punto de entrada explícito requerido para programas de líneas múltiples esencialmente lo excluye.

Draco18s
fuente