Verschleierte Ganzzahlnotation

14

Bearbeiten: Ich werde in Kürze eine neuere Version dieser Frage veröffentlichen meta-golf. Bleib auf dem Laufenden!

Bearbeiten # 2: Ich werde die Herausforderung nicht mehr aktualisieren, aber offen lassen. Die meta-golfVersion ist hier verfügbar: /codegolf/106509/obfuscated-number-golf

Hintergrund:

Die meisten Zahlen können mit nur 6 verschiedenen Symbolen geschrieben werden:

  • e (Eulers Konstante)
  • - (Subtraktion, nicht Negation)
  • ^ (Potenzierung)
  • (
  • )
  • ln (Natürlicher Logarithmus)

Beispielsweise könnten Sie die imaginäre Zahl imithilfe der folgenden Gleichung konvertieren :

(e-e-e^(e-e))^(e^(e-e-ln(e^(e-e)-(e-e-e^(e-e)))))

Tor:

Ausgeben kder kürzestmöglichen Darstellung dieser Zahl unter Verwendung nur dieser 6 Symbole, wenn eine Ganzzahl mit einem vernünftigen Mittel angegeben wird.

Beispiele:

0 => "e-e"
1 => "ln(e)"
2 => "ln(ee)"
// Since - cannot be used for negation, this is not a valid solution: 
// ln(e)-(-ln(e))
-1 => "e-e-ln(e)"

Anmerkungen:

  • Endeklammern werden auf die Gesamtzahl der Zeichen angerechnet.
  • ln( zählt nur als 1 Zeichen.
  • Alles andere zählt als 1 Charakter.
  • n^0=1
  • Es gilt die Reihenfolge der Operationen
  • Parenthesis Vervielfachungs akzeptabel ist , zum Beispiel (2)(8)=16, 2(5)=10, und eln(e)=e.
  • ln e ist nicht gültig, müssen Sie tun ln(e)
Julian Lachniet
quelle
3
Ich denke, dass formula ( ln(ee...e)) der beste Weg ist, um Positive darzustellen. Edit: nein, es ist nicht. ln(e^(ln(eeeee)ln(eeee)))ist besser für 20
MildlyMilquetoast
6
@ JulianLachniet liebe die Idee, möchte aber die ersten 10-20 Begriffe der Sequenz angefordert sehen. Stellen Sie zur Verdeutlichung vielleicht ein Beispiel für -10 bis 10 auf. WheatWizard hat bereits ein paar Löcher gestochen, bei denen das objektive Kriterium "kürzestmöglich" ohne konkrete Beispiele schwer zu bestimmen ist.
Magic Octopus Urn
Ich
bin
2
ln(eeee)^ln(ee)ist kürzer als ln(eeeeeeeeeeeeeeee)für 16
Post Rock Garf Hunter
8
Nur ein Wort des Vorschlags. Ich denke, dies könnte als Meta-Golf- Herausforderung mehr Spaß machen als als Code-Golf- Herausforderung. Es ist wirklich schwer zu demonstrieren, dass ein Code immer das optimale Ergebnis liefert, daher ist es möglicherweise besser, Antworten darauf zu erhalten, wie gut er seine Ausgabe spielt.
Post Rock Garf Hunter

Antworten:

2

Python 3, 402 Bytes

from itertools import*
from ast import*
from math import*
v,r=lambda x:'UnaryOp'not in dump(parse(x)),lambda s,a,b:s.replace(a,b)
def l(x,y):
    for s in product('L()e^-',repeat=x):
        f=r(r(r(''.join(s),'L','log('),')(',')*('),'^','**')
        g=r(f,'ee','e*e')
        while g!=f:f,g=g,r(g,'ee','e*e')
        try:
            if eval(g)==y and v(g):return g
        except:0
def b(v):
    i=1
    while 1:
        r=l(i,v)
        if r:return r
        i+=1

Anwendungsbeispiel:

>>> b(1)
'log(e)'
>>> b(0)
'e-e'
>>> b(-3)
'e-log(e*e*e)-e'
>>> b(8)
'log(e*e)**log(e*e*e)'

Beachten Sie, dass das Ausgabeformat es möglicherweise nicht widerspiegelt, der Code jedoch alle Längen gemäß den Angaben der Frage korrekt zählt.

Dies ist eine dumme rohe Kraft durch alle möglichen Längen von Saiten. Dann benutze ich einige Ersetzungen, damit Python es auswerten kann. Wenn es dem entspricht, was wir wollen, schließe ich auch unäre negative Vorzeichen durch Überprüfen des AST aus.

Ich kann nicht sehr gut in Python Golf spielen, also hier ist der Code, wenn jemand helfen möchte!

from itertools import*
from ast import*
from math import*

def valid(ev):
    return 'UnaryOp' not in dump(parse(ev))

def to_eval(st):
    f = ''.join(st).replace('L', 'log(').replace(')(', ')*(').replace('^', '**')
    nf = f.replace('ee', 'e*e')
    while nf != f:
        f, nf = nf, nf.replace('ee', 'e*e')
    return nf

def try_length(length, val):
    for st in product('L()e^-', repeat=length):
        ev = to_eval(st) 
        try:
            if eval(ev) == val and valid(ev):
                return st
        except:
            pass

def bruteforce(val):
    for i in range(11):
        res = try_length(i, val)
        if res:
            print(i, res)
            return res
George V. Williams
quelle
Anstatt mit Tabulatoren einzurücken, können Sie mit Leerzeichen für eine Ebene und Tabulatoren für 2
einrücken