Umkehrfunktion


31

Wäre es nicht schön, wenn Programmierfunktionen umgekehrt werden könnten, genau wie die mathematische Funktion, die sie implementieren?

Schreiben Sie eine Funktion (oder ein Programm), die eine Eingabe xin beliebiger Form annimmt und ausgibt ln(x).
Wenn die Bytes des Programms neu angeordnet / vertauscht werden, so dass das erste Byte jetzt das letzte Byte ist, sollte es stattdessen eine Eingabe xin beliebiger Form und Ausgabe annehmen e^x.

  • Ihre Antwort muss mindestens 3 korrekte signifikante Ziffern enthalten.
  • Annäherungen sind in Ordnung, solange sie mindestens 3 korrekte signifikante Zahlen haben.
  • Ihr Code muss vorwärts und rückwärts in derselben Programmiersprache sein.

Nehmen wir an, dieses Programm implementiert ln(x):

abc你好

Dann muss dieses Programm folgendes implementieren e^x:

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

Goldener Stern, wenn Sie eine Sprache ohne Float-Unterstützung verwenden.

Dies ist eine seltsame Form von Code-Golf, so dass das kürzeste Programm gewinnt.


4
"Wäre es nicht schön, wenn Programmierfunktionen umgekehrt werden könnten, genau wie die mathematische Funktion, die sie implementieren?" Einige Sprachen (z. B. J und Mathematica) können dies für einige Funktionen tatsächlich tun.
Martin Ender

Zusätzlich könnte K2 eine Inverse für eine beliebige monadische reine Funktion über seine "funktionsinverse" Überladung von Dyade und Triade ?, die die Sekantenmethode verwendeten, approximieren.
JohnE

1
"mindestens 3 richtige signifikante Zahlen" - über welchen Bereich?
TLW

4
Mir ist klar, dass es jetzt viel zu spät ist, aber ich denke, dass dies eine wirklich schöne Herausforderung gewesen wäre, wenn Kommentare abgelehnt worden wären.
Alex A.

Daran habe ich tatsächlich gedacht, als ich diese Herausforderung @AlexA erfunden habe. habe es aber beim schreiben des posts vergessen: P Auch das hätte "normale" sprachen wie java, c ++ etc im grunde unmöglich gemacht.
Filip Haglund

Antworten:


75

Haskell, 11 Bytes

f=log
pxe=f

und in umgekehrter Reihenfolge:

f=exp
gol=f

Dies funktioniert ohne den Trick "Kommentar". Stattdessen definiert jede Version eine zusätzliche, aber nicht verwendete Funktion ( pxe/ gol).


49
+1 für gol=f.
Leif Willerts

2
Dies ist auch eine gültige Lösung in Julia.
Rainer P.

44

APL, 3 Bytes

*⊣⍟

Dies ist ein Funktionszug. Monadische * Rückkehr e^x, monadische Rückkehr ln(x). ist eine dyadische Funktion, die das linke Argument zurückgibt. Also *⊣⍟ist äquivalent zu gerecht *, und das Gegenteil ⍟⊣*ist äquivalent zu gerecht .


22

Gelee, 5 4 Bytes

Ja, meine erste Gelee-Antwort. :) Die Eingabe erfolgt über ein Befehlszeilenargument.

Jelly hat eine eigene Codepage, sodass jedes Zeichen aus einem Byte besteht.

eÆÆl

Probieren Sie es online!

Rückgängig gemacht:

lÆÆe

Probieren Sie es online!

Erläuterung

Das ÆToken für sich ist ein nicht erkanntes Token und entspricht daher einem Zeilenvorschub. Dies bedeutet, dass in beiden Fällen nur der Hauptlink vorhanden ist Æloder Æeder 2-stellige eingebaute Link für exp()oder ist ln()und standardmäßig für das erste Befehlszeilenargument ausgeführt wird.


9

Javascript, 18 Bytes

Math.log//pxe.htaM

Benötigen Sie kein return () oder console.log ()?
OldBunny2800

2
@ OldBunny2800 Es wird eine Funktion ausgewertet, die zulässig sein sollte.
Neil

5
Math.ln||pxe.htaMwird wohl auch funktionieren.
SuperJedi224

@ SuperJedi224 Danke, das hat mir geholfen, den Fehler in meiner Antwort zu erkennen!
Neil

@Neil Ich hatte nicht einmal bemerkt, dass
SuperJedi224


5

Julia, 7 Bytes

log#pxe

Dies ist eine anonyme Funktion. Weisen Sie es einer Variablen zu, um es aufzurufen. Wertet zu Builtins logoder expplus einem Kommentar aus.



5

Mathematica, 19 Bytes

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

Rückgängig gemacht:

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

Das war interessant zum Golfen! Mathematica hat keine Zeilenkommentare / impliziten Zeichenfolgenenden, daher konnte ich den einfachen Weg nicht einschlagen. Stattdessen habe ich die Tatsache ausgenutzt 0 + x == x, dass 0 x == 0, und das 1 x == x, egal was xist! Testen:

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

invers:

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

Sie können 10 Zeichen weg rasieren, indem Sie __import__("math").anstelle von
TLW

3

CJam, 11 Bytes

rdmle#eemdr

Teste es hier.

Rückgängig gemacht:

rdmee#elmdr

Teste es hier.

Grundsätzlich der gleiche Kommentar-Trick wie die Python-Antwort des OP. e#startet einen Kommentar. rdund liest die Eingabe mloder meberechnet den Logarithmus oder exponentiell.


3

Brachylog , 3 Bytes

*₁≡

Probieren Sie es online!

Anfangs hatte ich gehofft, zu verwenden ~*, aber obwohl die nachgestellte Tilde *~berechnet e^xund erfolgreich ignoriert wird,~* schlägt dies für alle Ganzzahleingaben fehl und führt bei den meisten Nicht-Ganzzahleingaben zu einem Float-Überlauf.

Vorwärts:

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

Rückwärts:

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

Hierbei wird das Identitätsprädikat verwendet, da nachfolgende Tilden zwar toleriert werden, führende Indizes jedoch nicht. (Wenn dies der Fall *₁wäre, wäre die Brachylog-Antwort allein. Dies ist nur der normale Wert für natürliches Protokoll.)


2

Vitsy, 5 Bytes

Dies ist ein Programm, das bei einem Fehler beendet wird.

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

Dieses Programm wird bei einem Fehler mit ln (Eingabe) auf dem Stapel beendet.

Probieren Sie es online! (beachte, dass ich Nsichtbare Ausgabe gemacht habe)

Dann ist es umgekehrt:

Er^LE

Dieses Programm wird bei einem Fehler mit e ^ (Eingabe) auf dem Stapel beendet.

Probieren Sie es online!


2

Fuzzy Octo Guacamole, 7 Bytes

Nicht konkurrierend, ist FOG neuer als die Herausforderung

EZO@pZE

Dies entspricht einer Funktion in FOG. Es wird davon ausgegangen, dass sich die Eingabe auf dem Stapel befindet. Dies kann durch den Code einer Funktion zugeordnet werden "EZO@pZE""f"o, in dem firgendein Einzel char Namen , den Sie zuweisen möchten. Verwenden Sie es dann wie jeden anderen Befehl. Beispiel: "EZO@pZE"'f'o^f.

Erläuterung:

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.

Rückgängig gemacht:

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

Funde ln(input())

.lQ) " Q1n.^

Funde e^input()

^.n1Q " )Ql.

Leerzeichen stoppen das implizite Drucken von Zeichenfolgen. Jede Version berechnet dies und erstellt dann eine Zeichenfolge mit den verbleibenden Zeichen.

ln(x) Modus hier

e^x Modus hier



1

Jolf, 9 Bytes

Programm 1: expder Eingabe

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

Programm 2: lnder Eingabe

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

Bonuspunkte für ein Palindrom ohne Berücksichtigung der Groß- und Kleinschreibung? Probieren Sie es hier aus!


1

J, 8 Bytes

Der natürliche Logarithmus ist ^.exponentiell ^. Das Problem ist, .kann nur ein gültiges Verb ändern, sonst tritt ein Rechtschreibfehler auf. Daher können wir den linken Argumenttrick nicht in der APL-Antwort verwenden, da ^.[^dies beim Umkehren zu einem Fehler führen würde, da ^[.^ein ungültiges Verb erstellt wird. Wir müssen also Kommentare verwenden. ist aber NB.so lang :( Zum Glück enden beide mit. , also gibt es das.

Logarithmus:

^.NB.BN^

Exponentiell:

^NB.BN.^

Sie können sie online selbst eintragen !



0

Runenverzauberungen , 9 Bytes

i'lA@Ae'i

Probieren Sie es online!

Ein gottlos uninteressantes Programm. @versichert die Kündigung des implizierten Einstiegspunkts links, alles danach ist nicht ausgeführt. Ich habe mich wirklich sehr bemüht, die Anweisungen 'oder wiederzuverwenden A, aber auch bei größeren Programmgrößen ohne Erfolg. Der erforderliche explizite Einstiegspunkt für mehrzeilige Programme schließt dies im Wesentlichen aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.