Notación entera ofuscada

14

Editar: meta-golfPronto publicaré una versión más nueva de esta pregunta . Mantente tooned!

Edición n.º 2: ya no actualizaré el desafío, pero lo dejaré abierto. La meta-golfversión está disponible aquí: /codegolf/106509/obfuscated-number-golf

Antecedentes:

La mayoría de los números se pueden escribir con solo 6 símbolos diferentes:

  • e (Constante de Euler)
  • - (Resta, no negación)
  • ^ (Exponenciación)
  • (
  • )
  • ln (Logaritmo natural)

Por ejemplo, podría convertir el número imaginario iusando esta ecuación:

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

Objetivo:

Dado cualquier número entero a ktravés de cualquier medio razonable, genera la representación más corta posible de ese número usando solo esos 6 símbolos.

Ejemplos:

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

Notas:

  • El paréntesis final cuenta para la cantidad total de caracteres.
  • ln( solo cuenta como 1 personaje.
  • Todo lo demás cuenta como 1 personaje.
  • n^0=1
  • Se aplica el orden de operaciones
  • Paréntesis multiplicador es aceptable, por ejemplo (2)(8)=16, 2(5)=10, y eln(e)=e.
  • ln e no es válido, debes hacer ln(e)
Julian Lachniet
fuente
3
Creo que la fórmula ( ln(ee...e)) es la mejor manera de retratar lo positivo. Editar: no, no lo es. ln(e^(ln(eeeee)ln(eeee)))es mejor para 20
MildlyMilquetoast
66
@JulianLachniet ama la idea, aunque me gustaría ver los primeros 10-20 términos de la secuencia solicitada. Tal vez ponga un ejemplo de -10 a 10 para aclaraciones. WheatWizard ya ha perforado un par de agujeros, con esos agujeros el criterio objetivo de "lo más corto posible" es difícil de determinar sin ejemplos concretos.
Urna de pulpo mágico el
No estoy seguro acerca de algunos de los más altos, especialmente 20.
Julian Lachniet
2
ln(eeee)^ln(ee)es más corto que ln(eeeeeeeeeeeeeeee)para 16
Post Rock Garf Hunter
8
Solo una palabra de sugerencia. Creo que esto podría ser más divertido como un desafío de meta-golf que como un desafío de código de golf . Es realmente difícil demostrar que algún código siempre produce el resultado óptimo, por lo que podría ser mejor obtener respuestas sobre qué tan bien juegan su producción.
Post Rock Garf Hunter

Respuestas:

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

Ejemplo de uso:

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

Tenga en cuenta que aunque el formato de salida puede no reflejarlo, el código cuenta correctamente todas las longitudes de acuerdo con las especificaciones de la pregunta.

Esta es una fuerza bruta tonta a través de todas las longitudes posibles de cuerdas. Luego uso algunos reemplazos para que Python pueda evaluarlo. Si es igual a lo que queremos, también verifico para excluir signos negativos unarios marcando el AST.

No soy muy bueno jugando al golf en Python, ¡así que aquí está el código semi-sin golf si alguien quiere ayudar!

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
fuente
En lugar de sangrar con pestañas, puede sangrar con espacios para un nivel de sangría y pestañas para 2.
Post Rock Garf Hunter