難読化された整数表記


14

編集:この質問の新しいバージョンをmeta-golf近日中に投稿します。おしゃべり!

編集#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)=162(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はすでにいくつかの穴を突いていますが、これらの穴では、「最短」の客観的基準を具体的な例なしで決定することは困難です。
魔法のタコUr

わからない高いものの一部、特に約20
ジュリアンLachniet

2
ln(eeee)^ln(ee)ln(eeeeeeeeeeeeeeee)16 より短い
ポストロックガーフハンター

8
提案の一言。これは、コードゴルフの挑戦よりもメタゴルフの挑戦としてもっと楽しいかもしれないと思います。一部のコードが常に最適な結果を生成することを実証するのは非常に難しいので、出力をどれだけうまくゴルフで答えるかを評価する方が良いかもしれません。
ポストロックガーフハンター

回答:


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のためにインデントの1つのレベルのためのスペースやタブでインデントすることができ、タブとインデントの
ポストロックGARFハンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.