Неясне ціле позначення


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 Garf Hunter

8
Просто слово навіювання. Я думаю, що це може бути веселіше як мета-гольф, ніж як завдання з гольф-кодом . Насправді важко продемонструвати, що якийсь код завжди дає оптимальний результат, тому може бути краще набрати відповіді на те, наскільки вони добре виграють свій результат.
Пост Рок-Гарф Мисливець

Відповіді:


2

Пітон 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.
Опублікувати Rock Garf Hunter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.