Ký hiệu số nguyên bị che khuất


14

Chỉnh sửa: Tôi sẽ sớm đăng một phiên bản mới hơn của câu hỏi này meta-golf. Ở lại toiled!

Chỉnh sửa # 2: Tôi sẽ không còn cập nhật thử thách nữa, nhưng sẽ để nó mở. Các meta-golfphiên bản có sẵn ở đây: /codegolf/106509/obfuscated-number-golf

Lý lịch:

Hầu hết các số có thể được viết chỉ với 6 ký hiệu khác nhau:

  • e (Hằng số của Euler)
  • - (Phép trừ, không phủ định)
  • ^ (Lũy thừa)
  • (
  • )
  • ln (Logarit tự nhiên)

Ví dụ: bạn có thể chuyển đổi số ảo ibằng phương trình này:

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

Mục tiêu:

Cho bất kỳ số nguyên nào kthông qua bất kỳ phương tiện hợp lý nào, hãy đưa ra biểu diễn ngắn nhất có thể của số đó chỉ bằng 6 ký hiệu đó.

Ví dụ:

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

Ghi chú:

  • Kết thúc số ngoặc đơn đối với tổng số lượng ký tự.
  • ln( chỉ được tính là 1 ký tự.
  • Mọi thứ khác được tính là 1 ký tự.
  • n^0=1
  • Thứ tự các hoạt động áp dụng
  • Ngoặc nhân lên là chấp nhận được, ví dụ (2)(8)=16, 2(5)=10eln(e)=e.
  • ln e không hợp lệ, bạn phải làm ln(e)

3
Tôi nghĩ rằng công thức ( ln(ee...e)) là cách tốt nhất để miêu tả tích cực. Chỉnh sửa: không, không phải. ln(e^(ln(eeeee)ln(eeee)))tốt hơn cho 20
MildlyMilquetoast

6
@JulianLachniet thích ý tưởng này, muốn xem 10-20 điều khoản đầu tiên của chuỗi được yêu cầu mặc dù. Có thể đưa ra một ví dụ cho -10 đến 10 để làm rõ. WheatWizard đã chọc một vài lỗ, với những lỗ đó, tiêu chí khách quan của "ngắn nhất có thể" rất khó xác định nếu không có ví dụ cụ thể.
Bạch tuộc ma thuật Urn

Không chắc chắn về một số người cao hơn, đặc biệt là 20.
Julian Lachniet

2
ln(eeee)^ln(ee)ngắn hơn so ln(eeeeeeeeeeeeeeee)với 16
Post Rock Garf Hunter

8
Chỉ là một lời đề nghị. Tôi nghĩ rằng điều này có thể thú vị hơn khi là một thử thách meta-golf hơn là một thử thách golf-code . Thật sự rất khó để chứng minh rằng một số mã luôn tạo ra kết quả tối ưu để có thể tốt hơn để ghi câu trả lời về mức độ họ chơi golf tốt như thế nào.
Đăng Rock Garf Hunter

Câu trả lời:


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

Ví dụ sử dụng:

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

Lưu ý rằng mặc dù định dạng đầu ra có thể không phản ánh nó, nhưng mã sẽ đếm đúng tất cả các độ dài theo thông số kỹ thuật của câu hỏi.

Đây là một bruteforce ngu ngốc thông qua tất cả các độ dài có thể của chuỗi. Sau đó, tôi sử dụng một số thay thế để Python có thể đánh giá nó. Nếu nó bằng với những gì chúng ta muốn, tôi cũng kiểm tra để loại trừ các dấu hiệu tiêu cực đơn phương bằng cách kiểm tra AST.

Tôi không giỏi chơi gôn trong Python, vì vậy đây là mã bán vô dụng nếu có ai muốn giúp!

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

Thay vì thụt lề bằng các tab, bạn có thể thụt lề bằng khoảng trắng cho một cấp độ thụt lề và các tab cho 2.
Post Rock Garf Hunter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.