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.


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).


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 .


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.


9

Javascript, 18 bytes

Math.log//pxe.htaM

¿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.


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

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

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.


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).


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!


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.


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í



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í!


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 !



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.