混淆整数表示法


14

编辑:我将meta-golf很快发布此问题的较新版本。保持警惕!

编辑2:我将不再更新挑战,但将其保持打开状态。该meta-golf版本位于此处:https : //codegolf.stackexchange.com/questions/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)=162(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已经戳了几个漏洞,如果没有具体示例,很难确定“最短”漏洞的客观标准。
Magic Octopus Urn

不确定其中一些较高的级别,尤其是20级
。–朱利安·拉希涅

2
ln(eeee)^ln(ee)ln(eeeeeeeeeeeeeeee)16 短
发布Rock Garf Hunter

8
只是一个建议。我认为,这比起对代码高尔夫的挑战,作为元高尔夫挑战可能更有趣。真的很难证明某些代码总是会产生最佳结果,因此最好对他们打高尔夫球的成绩打分。
发布Rock Garf Hunter,2017年

Answers:


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
后摇滚Garf亨特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.