난독 화 된 정수 표기법


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)=16, 2(5)=10eln(e)=e.
  • ln e 유효하지 않습니다, 당신은해야합니다 ln(e)

3
나는 공식 ( ln(ee...e))이 긍정적 인 것을 묘사하는 가장 좋은 방법 이라고 생각합니다 . 편집 : 아니오, 아닙니다. ln(e^(ln(eeeee)ln(eeee)))
MildlyMilquetoast

6
@JulianLachniet은 아이디어를 좋아하지만 요청 된 순서의 처음 10-20 용어를보고 싶습니다. 설명을 위해 -10 ~ 10의 예를 들어보십시오. WheatWizard는 이미 몇 개의 구멍을 뚫었습니다. 이러한 구멍을 통해 "가장 짧은"의 객관적인 기준을 구체적인 예없이 결정하기는 어렵습니다.
Magic Octopus Urn

더 높은 것들, 특히 20에 대해서는 확실하지 않습니다.
Julian Lachniet

2
ln(eeee)^ln(ee)ln(eeeeeeeeeeeeeeee)16
시보 다

8
단지 한마디의 제안. 나는 이것이 코드 골프 도전보다는 메타 골프 도전 으로 더 재미있을 것이라고 생각합니다 . 일부 코드는 항상 최적의 결과를 생성하므로 출력을 얼마나 잘 골프화하는지에 대한 답을 얻는 것이 좋습니다.
Post Rock Garf Hunter

답변:


2

파이썬 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)'

출력 형식이이를 반영하지 않을 수 있지만 코드는 질문의 사양에 따라 모든 길이를 올바르게 계산합니다.

이것은 가능한 모든 길이의 끈을 통과하는 멍청한 폭력입니다. 그런 다음 파이썬이 그것을 평가할 수 있도록 대체물을 사용합니다. 원하는 것과 같으면 AST를 확인하여 단항 음수 부호를 제외시킵니다.

나는 파이썬에서 골프를 잘하지 못합니다. 따라서 누군가 도움이되고 싶다면 반 멍청한 코드가 있습니다!

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 헌터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.