Notasi Integer yang Dikacaukan

14

Sunting: Saya akan segera memposting versi yang lebih baru dari pertanyaan ini meta-golf. Tetap diajak bicara!

Sunting # 2: Saya tidak akan lagi memperbarui tantangan, tetapi akan membiarkannya terbuka. The meta-golfVersi tersedia di sini: /codegolf/106509/obfuscated-number-golf

Latar Belakang:

Sebagian besar angka dapat ditulis dengan hanya 6 simbol yang berbeda:

  • e (Konstan Euler)
  • - (Pengurangan, Bukan Negasi)
  • ^ (Eksponen)
  • (
  • )
  • ln (Logaritma Alam)

Misalnya, Anda dapat mengonversi angka imajiner imenggunakan persamaan ini:

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

Tujuan:

Dengan bilangan bulat apa pun kmelalui cara apa pun yang masuk akal, hasilkan representasi sesingkat mungkin dari angka tersebut hanya dengan menggunakan 6 simbol tersebut.

Contoh:

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

Catatan:

  • Mengakhiri kurung dihitung terhadap jumlah total karakter.
  • ln( hanya dihitung sebagai 1 karakter.
  • Segala sesuatu yang lain dihitung sebagai 1 karakter.
  • n^0=1
  • Pesanan operasi berlaku
  • Kurung mengalikan diterima, misalnya (2)(8)=16, 2(5)=10, dan eln(e)=e.
  • ln e tidak valid, Anda harus melakukannya ln(e)
Julian Lachniet
sumber
3
Saya pikir rumus ( ln(ee...e)) adalah cara terbaik untuk menggambarkan hal positif. Sunting: tidak, tidak. ln(e^(ln(eeeee)ln(eeee)))lebih baik untuk 20
MildlyMilquetoast
6
@JulianLachniet menyukai ide ini, ingin melihat 10-20 syarat pertama dari urutan yang diminta. Mungkin berikan contoh untuk -10 hingga 10 untuk klarifikasi. WheatWizard telah menyodok beberapa lubang, dengan lubang-lubang itu kriteria objektif "sesingkat mungkin" sulit ditentukan tanpa contoh konkret.
Guci Gurita Ajaib
Tidak yakin tentang beberapa yang lebih tinggi, terutama 20.
Julian Lachniet
2
ln(eeee)^ln(ee)lebih pendek dari ln(eeeeeeeeeeeeeeee)untuk 16
Post Rock Garf Hunter
8
Hanya sepatah kata saran. Saya pikir ini mungkin lebih menyenangkan sebagai tantangan meta-golf daripada sebagai tantangan kode-golf . Sangat sulit untuk menunjukkan bahwa beberapa kode selalu menghasilkan hasil yang optimal sehingga mungkin lebih baik untuk mencetak jawaban pada seberapa baik mereka golf output mereka.
Post Rock Garf Hunter

Jawaban:

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

Contoh penggunaan:

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

Perhatikan bahwa meskipun format output mungkin tidak mencerminkannya, kode dengan benar menghitung semua panjang sesuai dengan spesifikasi pertanyaan.

Ini adalah bruteforce bodoh melalui semua panjang string yang mungkin. Lalu saya menggunakan beberapa penggantian sehingga Python dapat mengevaluasinya. Jika itu sama dengan yang kita inginkan, saya juga mengecek untuk mengecualikan tanda-tanda negatif yang tidak disadari dengan memeriksa AST.

Saya tidak terlalu pandai bermain golf di Python, jadi inilah kode semi-ungolfed kalau ada yang mau membantu!

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
sumber
Alih-alih menjorok dengan tab, Anda dapat membuat indentasi dengan spasi untuk satu tingkat indentasi dan tab untuk 2.
Post Rock Garf Hunter