Gizli Tam Sayı Gösterimi


14

Edit: meta-golfYakında bu sorunun daha yeni bir sürümünü yayınlayacağım . Kalmak!

Edit # 2: Artık meydan okumayı güncellemeyeceğim, ancak açık bırakacağım. meta-golfSürümüne buradan ulaşabilirsiniz: /codegolf/106509/obfuscated-number-golf

Arka fon:

Çoğu sayı yalnızca 6 farklı sembolle yazılabilir:

  • e (Euler Sabiti)
  • - (Çıkarma, Olumsuzluk)
  • ^ (Üs)
  • (
  • )
  • ln (Doğal logaritma)

Örneğin, ibu denklemi kullanarak hayali sayıyı dönüştürebilirsiniz :

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

Hedef:

Herhangi kbir makul yolla herhangi bir tamsayı göz önüne alındığında , yalnızca bu 6 sembolü kullanarak bu sayının mümkün olan en kısa gösterimini yapın.

Örnekler:

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

Notlar:

  • Parantez sonunu toplam karakter sayısına doğru bitirmek.
  • ln( sadece 1 karakter olarak sayılır.
  • Diğer her şey 1 karakter olarak sayılır.
  • n^0=1
  • İşlem sırası geçerlidir
  • Parantez çoğaltan örneğin, kabul edilebilir (2)(8)=16, 2(5)=10ve eln(e)=e.
  • ln e geçerli değil, yapmalısın ln(e)

3
Bence formül ( ln(ee...e)) pozitifleri tasvir etmenin en iyi yoludur. Düzenleme: hayır, değil. ln(e^(ln(eeeee)ln(eeee)))20 için daha iyi
MildlyMilquetoast

6
@JulianLachniet fikri seviyor, yine de istenen dizinin ilk 10-20 terimini görmek istiyor. Belki açıklığa kavuşturmak için -10 ila 10 arasında bir örnek verebiliriz. WheatWizard zaten birkaç delik açmıştır, bu deliklerle "mümkün olan en kısa" objektif kriterlerin somut örnekler olmadan belirlenmesi zordur.
Sihirli Ahtapot Urn

Bazı yüksek olanlardan emin değilim, özellikle 20.
Julian Lachniet

2
ln(eeee)^ln(ee)daha kısadır ln(eeeeeeeeeeeeeeee)16 için
Post Rock GARF Hunter

8
Sadece bir öneri. Bu bir meta-golf meydan okuma olarak bir kod-golf meydan okuma daha eğlenceli olabilir düşünüyorum . Bazı kodların her zaman en iyi sonucu verdiğini göstermek gerçekten zor, bu yüzden çıktılarını ne kadar iyi golf oynadıklarına dair cevaplar almak daha iyi olabilir.
Post Rock Garf Hunter

Yanıtlar:


2

Python 3, 402 bayt

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

Örnek kullanım:

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

Çıktı biçimi onu yansıtmasa da, kodun tüm uzunlukları sorunun özelliklerine göre saydığını unutmayın.

Bu, olası tüm tel uzunlukları boyunca aptal bir kaba kuvvettir. Sonra Python'un değerlendirebilmesi için bazı değiştirmeler kullanıyorum. İstediğimiz şeye eşitse, AST'yi kontrol ederek tekli olumsuz işaretleri hariç tutmayı da kontrol ederim.

Python'da golf oynamakta pek iyi değilim, bu yüzden kimse yardım etmek isterse yarı ungolfed kod!

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

Sekmelerle girintilemek yerine, bir girintili seviye için boşluklar ve 2 için sekmelerle girintili olabilirsiniz
Post Rock Garf Hunter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.