Notação Inteira Ofuscada

14

Editar: em breve postarei uma versão mais recente desta pergunta meta-golf. Fique ligado!

Editar # 2: não vou mais atualizar o desafio, mas o deixarei em aberto. A meta-golfversão está disponível aqui: /codegolf/106509/obfuscated-number-golf

Fundo:

A maioria dos números pode ser escrita com apenas 6 símbolos diferentes:

  • e (Constante de Euler)
  • - (Subtração, não negação)
  • ^ (Exponenciação)
  • (
  • )
  • ln (Logaritmo natural)

Por exemplo, você pode converter o número imaginário iusando esta equação:

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

Objetivo:

Dado qualquer número inteiro kpor qualquer meio razoável, produza a menor representação possível desse número usando apenas esses 6 símbolos.

Exemplos:

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:

  • Os parênteses finais contam para a quantidade total de caracteres.
  • ln( conta apenas como 1 caractere.
  • Tudo o resto conta como 1 caractere.
  • n^0=1
  • Ordem de operações aplicável
  • Parêntese multiplicador é aceitável, por exemplo (2)(8)=16, 2(5)=10, e eln(e)=e.
  • ln e não é válido, você deve fazer ln(e)
Julian Lachniet
fonte
3
Eu acho que a fórmula ( ln(ee...e)) é a melhor maneira de retratar aspectos positivos. Edit: não, não é. ln(e^(ln(eeeee)ln(eeee)))é melhor para 20
MildlyMilquetoast 10/01
6
A @JulianLachniet adora a idéia, mas gostaria de ver os primeiros 10 a 20 termos da sequência solicitados. Talvez coloque um exemplo de -10 a 10 para esclarecimento. O WheatWizard já fez alguns furos, sendo difícil determinar com critérios objetivos o "menor possível" sem exemplos concretos.
Magic Octopus Urn
Não tenho certeza sobre alguns dos mais altos, especialmente o 20.
Julian Lachniet
2
ln(eeee)^ln(ee)é menor que ln(eeeeeeeeeeeeeeee)para 16
Post Rock Garf Hunter
8
Apenas uma palavra de sugestão. Acho que isso pode ser mais divertido como um desafio de meta-golfe do que como um desafio de código-golfe . É realmente difícil demonstrar que algum código sempre produz o resultado ideal, portanto, é melhor obter respostas sobre o desempenho da saída deles.
Post Rock Garf Hunter

Respostas:

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

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

Observe que, embora o formato de saída não o reflita, o código conta adequadamente todos os comprimentos de acordo com as especificações da pergunta.

Esta é uma força bruta estúpida em todos os comprimentos possíveis de cordas. Então eu uso algumas substituições para que o Python possa avaliá-lo. Se é igual ao que queremos, também verifico para excluir sinais negativos unários, verificando o AST.

Eu não sou muito bom em jogar golfe em Python, então aqui está o código semi-ungolfed, se alguém quiser ajudar!

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
fonte
Em vez de recuar com guias que você pode recuar com espaços para um nível de travessão e guias para 2.
post rock Garf Hunter