สัญกรณ์ Integer ที่สับสน


14

แก้ไข: ฉันจะโพสต์คำถามนี้ในเวอร์ชันที่ใหม่กว่าในmeta-golfเร็ว ๆ นี้ อยู่ tooned!

แก้ไข # 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)=10eln(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 ได้เจาะรูสองสามรูแล้วด้วยรูเหล่านั้นเกณฑ์วัตถุประสงค์ของ "สั้นที่สุด" นั้นยากที่จะตรวจสอบโดยไม่มีตัวอย่างที่เป็นรูปธรรม
Magic Octopus Urn

ไม่แน่ใจเกี่ยวกับคนที่สูงกว่าโดยเฉพาะ 20 คน
Julian Lachniet

2
ln(eeee)^ln(ee)สั้นกว่าln(eeeeeeeeeeeeeeee)สำหรับ 16
โพสต์ร็อคการ์ฟฮันเตอร์

8
เพียงแค่คำแนะนำ ผมคิดว่านี่อาจจะสนุกมากขึ้นเป็นอภิกอล์ฟที่ท้าทายกว่าเป็นรหัสกอล์ฟที่ท้าทาย มันยากมากที่จะแสดงให้เห็นว่าโค้ดบางตัวสร้างผลลัพธ์ที่ดีที่สุดเสมอดังนั้นมันอาจจะดีกว่าถ้าให้คะแนนคำตอบว่าพวกมันออกมาดีแค่ไหน
โพสต์ Rock Garf Hunter

คำตอบ:


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
โพสต์ Rock Garf Hunter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.