Запутанная целочисленная запись


14

Изменить: я буду публиковать более новую версию этого вопроса в meta-golfближайшее время. Оставайтесь на связи!

Правка № 2: я больше не буду обновлять вызов, но оставлю его открытым. meta-golfВерсия доступна здесь: /codegolf/106509/obfuscated-number-golf

Фон:

Большинство чисел могут быть написаны только с 6 различными символами:

  • e (Константа Эйлера)
  • - (Вычитание, а не отрицание)
  • ^ (Возведение)
  • (
  • )
  • ln (Натуральный логарифм)

Например, вы можете преобразовать мнимое число, iиспользуя это уравнение:

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

Цель:

Для любого целого числа kлюбым разумным способом выведите кратчайшее возможное представление этого числа, используя только эти 6 символов.

Примеры:

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

Примечания:

  • Конечные скобки учитывают общее количество символов.
  • ln( учитывается только как 1 символ
  • Все остальное считается за 1 символ.
  • n^0=1
  • Порядок операций применяется
  • Скобки умножение является приемлемым, например (2)(8)=16, 2(5)=10и eln(e)=e.
  • ln e недействительно, вы должны сделать ln(e)

3
Я думаю, что формула ( ln(ee...e)) - лучший способ изобразить позитивы. Редактировать: нет, это не так. ln(e^(ln(eeeee)ln(eeee)))лучше для 20
MildlyMilquetoast

6
@JulianLachniet любит эту идею, но хотел бы увидеть первые 10-20 членов требуемой последовательности. Возможно, приведите пример для -10 до 10 для разъяснения. WheatWizard уже пробил пару отверстий, с этими отверстиями объективный критерий «кратчайшего» трудно определить без конкретных примеров.
Волшебная Урна Осьминога

Не уверен насчет некоторых из высших, особенно 20.
Джулиан Лакнет

2
ln(eeee)^ln(ee)короче, чем ln(eeeeeeeeeeeeeeee)на 16
Post Rock

8
Просто слово предложения. Я думаю , что это может быть более увлекательным , как мета-гольф вызов , чем как код-гольф вызов. Действительно трудно продемонстрировать, что какой-то код всегда дает оптимальный результат, поэтому может быть лучше получить ответы о том, насколько хорошо они демонстрируют результат.
Пост Рок Гарф Хантер

Ответы:


2

Python 3, 402 байта

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

Пример использования:

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

Обратите внимание, что хотя формат вывода может не отражать его, код правильно считает все длины в соответствии со спецификациями вопроса.

Это тупой грубый удар через все возможные длины струн. Затем я использую некоторые замены, чтобы Python мог это оценить. Если он равен тому, что мы хотим, я также проверяю, чтобы исключить унарные отрицательные знаки, проверяя AST.

Я не очень хорош в игре в гольф на Python, так что вот полуголфый код, если кто-то хочет помочь!

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

Вместо отступа для вкладок вы можете сделать отступы для одного уровня отступа и для вкладок для 2.
Post Rock
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.