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.