Notazione integra offuscata


14

Modifica: pubblicherò presto una versione più recente di questa domanda meta-golf. Resta tooned!

Modifica n. 2: non aggiornerò più la sfida, ma la lascerò aperta. La meta-golfversione è disponibile qui: /codegolf/106509/obfuscated-number-golf

Sfondo:

La maggior parte dei numeri può essere scritta con solo 6 simboli diversi:

  • e (Costante di Eulero)
  • - (Sottrazione, non negazione)
  • ^ (Esponenziale)
  • (
  • )
  • ln (Logaritmo naturale)

Ad esempio, potresti convertire il numero immaginario iusando questa equazione:

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

Obbiettivo:

Dato un numero intero kcon qualsiasi mezzo ragionevole, genera la rappresentazione più breve possibile di quel numero usando solo quei 6 simboli.

Esempi:

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

Appunti:

  • Le parentesi finali contano per la quantità totale di caratteri.
  • ln( conta solo 1 carattere.
  • Tutto il resto conta come 1 carattere.
  • n^0=1
  • Si applica l'ordine delle operazioni
  • Parentesi moltiplicando è accettabile, ad esempio (2)(8)=16, 2(5)=10e eln(e)=e.
  • ln e non è valido, devi farlo ln(e)

3
Penso che formula ( ln(ee...e)) sia il modo migliore per ritrarre i positivi. Modifica: no, non lo è. ln(e^(ln(eeeee)ln(eeee)))è meglio per 20
MildlyMilquetoast

6
@JulianLachniet ama l'idea, mi piacerebbe vedere i primi 10-20 termini della sequenza richiesta però. Forse dare un esempio da -10 a 10 per chiarimenti. WheatWizard ha già fatto un paio di buchi, con quei buchi i criteri oggettivi del "più breve possibile" sono difficili da determinare senza esempi concreti.
Magic Octopus Urn

Non sono sicuro di alcuni di quelli superiori, in particolare il 20.
Julian Lachniet,

2
ln(eeee)^ln(ee)è più corto di ln(eeeeeeeeeeeeeeee)per 16
Post Rock Garf Hunter

8
Solo una parola di suggerimento. Penso che questo potrebbe essere più divertente come una sfida al meta-golf che come una sfida al code-golf . È davvero difficile dimostrare che un po 'di codice produce sempre il risultato ottimale, quindi potrebbe essere meglio segnare le risposte su come golfano il loro output.
Post Rock Garf Hunter,

Risposte:


2

Python 3, 402 byte

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

Esempio di utilizzo:

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

Si noti che sebbene il formato di output potrebbe non rispecchiarlo, il codice conta correttamente tutte le lunghezze in base alle specifiche della domanda.

Questa è una forza bruta stupida attraverso tutte le lunghezze possibili di stringhe. Quindi uso alcuni sostituti in modo che Python possa valutarlo. Se è uguale a quello che vogliamo, controllo anche per escludere segni negativi unari controllando l'AST.

Non sono molto bravo a giocare a golf in Python, quindi ecco il codice semi-non golf se qualcuno vuole aiutare!

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

Invece di rientrare con le schede puoi rientrare con gli spazi per un livello di rientro e le schede per 2.
Post Rock Garf Hunter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.