수학 Metagolf 매니아!


12

Mathemania 사양 :

Mathemania 코드의 모든 부분은 숫자로 시작합니다 2. 에서 2다음 작업을 수행 할 수 있습니다.

  • e: 지수. 이 명령의 기본값은 숫자를 제곱하는 것입니다.
  • f: 계승. 이 명령의 기본값은 숫자 ( using f on 2 = 2! = 2) 의 단일 계승을 사용합니다 .
  • r: 뿌리. 이 명령의 기본값은 숫자의 제곱근입니다.
  • c: 천장 기능.
  • l: 플로어 기능.

Mathemania에서 숫자를 생성하려면 숫자에서 왼쪽에서 오른쪽으로 수행되는 이러한 명령을 함께 묶어야합니다 2.

예 :

ef = (2^2)! = 4! = 24
rl = floor(sqrt(2)) = floor(1.4...) = 1
er = sqrt(2^2) = sqrt(4) = 2
efrrc = ceil(sqrt(sqrt((2^2)!)))
      = ceil(sqrt(sqrt(24)))
      = ceil(sqrt(4.89...))
      = ceil(2.21...)
      = 3

e, fr명령 (도 함께 시작 여분 Mathemania 명령에 의해 변경 될 수있는 2변경된 함수 뒤에 괄호를 배치하고 내부 Mathemania 명령을 배치하여 다른 exponentiations, 계승 뿌리를 생성하기 위해 "기재"번호).

예를 들어, 숫자를 제곱하는 대신 큐브를 만들려면 3다음 e과 같이 명령을 넣을 수 있습니다 .

e(efrrc) -> cube a number, "efrrc" = 3

참고 : 계승 명령 ( f) 2은 단일 계승으로 시작합니다 . 따라서 그렇게하면 f(efrrc)트리플 팩토리얼이 아닌 더블 팩토리얼로 평가됩니다.

n-factorials (예 : 이중 계승 = 2 팩토리얼, 배 팩토리얼 = 3 요인 등), 기지국 번호 인 숫자로 곱 n덜 미만, n그래서 최종 번호가 없을 때까지에, 이하보다 또는 부정적인 n없이 빼기 0.

예를 들면 다음과 같습니다.

7!! = 7 * 5 * 3 * 1 = 105 (repeatedly subtract 2, 1 is the last term as
                           1 - 2 = -1, which is negative)
9!!! = 9 * 6 * 3 = 162 (repeatedly subtract 3, 3 is the last term as
                        3 - 3 = 0, which is 0)

자세한 내용은 여기를 참조 하십시오 .

어디서나 삽입 할 수 있으며 Mathemania는 단일 기능으로 처리합니다.

e(efrrc)rc = ceil(sqrt(2^3))
           = ceil(2.82...)
           = 3

이것들을 서로 중첩시킬 수도 있습니다.

e(e(e)) = e(4th power)
        = (2^4)th power
        = 16th power

Mathemania 코드 통역사를 보려면 여기를 클릭 하십시오 (환호, @ BradGilbertb2gills!).

직무:

당신의 임무는 n입력 으로 양의 정수가 주어 졌을 때 실행될 때 반환하는 Mathemania 프로그램을 생성하는 프로그램을 만드는 것 n입니다.

그러나 생성 Mathemania 프로그램은 가능한 한 (golfed) 작게해야하며, 최종 점수는 정수 샘플의 생성 Mathemania 프로그램의 바이트 수의 합에 의해 결정됩니다 10,00010,100. 가장 낮은 점수가 이깁니다.

규칙 및 사양 :

  • 여러분의 프로그램 출력해야 양의 정수에 대한 유효한 Mathemania 프로그램,하지만 숫자 사이 10,00010,100테스트됩니다.
  • 정수가 아닌 Mathemania 프로그램을 출력 할 수 없습니다. 그렇게하면 프로그램이 실격됩니다.
  • 명령의 경우 e, fr(예를 들어, 그 함수 내부 Mathemania 코드 e(efrrc)(가), efrrc함수 내부 코드)를 상기 양의 정수로 평가한다 2. 프로그램이이 규칙을 따르지 않으면 자격이 박탈됩니다.
  • 프로그램은 최신 랩탑에서 최대 30 분 안에 101 개의 테스트 정수 중 하나에 대한 Mathemania 프로그램을 반환해야합니다.
  • 프로그램은 실행될 때마다 정수에 대해 동일한 솔루션을 반환해야합니다. 예를 들어, 프로그램은 입력이 주어지면 5그것을 출력 efrc이 모든 시간은 입력이 출력해야 것을 5설명한다.
  • 양의 정수에 대한 솔루션을 하드 코딩 할 수 없습니다.
  • 당신의 출력에서 ​​골프 잠재력을 완전히 극대화하기 위해, 프로그램은 임의로 큰 정수를 처리 할 수 ​​있어야합니다. 귀하의 언어가이를 지원하지 않는다면 행운이긴하지만 요구 사항은 아닙니다.

이것은 이므로 최저 점수가 이깁니다!


2
TIO Nexus의 Perl 6 에서이 언어 에 대한 평가자를 작성했습니다 .
Brad Gilbert b2gills

@ BradGilbertb2gills 와우, 고마워! 도전에 링크를하겠습니다.
clismique

입력이 ef예를 들어, 코드가 "건너 뛰기"만하고 ef작업 전에 결과를 출력 할 수 있습니까?
devRicher

@devRicher "ef"프로그램이 사전에 하드 코딩되어 있음을 의미하는 경우, 현재 규칙에 따라 "ef"의 범위가 10,000에서 10,100 사이가 아니기 때문에 그렇게 할 수 있습니다. 나는 그것이 당신이 의미하는 바인지 확실하지 않으며, 하드 코딩은 도전을 너무 쉽게하기 때문에 규칙을 변경할 수 있습니다.
clismique

1
지난 몇 시간 동안이 과제에 대한 프로그램을 작성했습니다. 작업 코드가 있다고 생각하지만 계승으로 생성 된 일부 숫자는 절대적으로 크며 Python (내 프로그램과 인터프리터가있는 곳)은 제곱근을 취할 수 없기 때문에 올바르게 테스트 할 수 없습니다. 이 시점에서 프로그램으로 무엇을해야할지 잘 모르겠습니다. 부수적으로, 나는 처음에 모든 101 개의 테스트 사례가 시간 제한 내에 맞아야한다고 생각했고, 이는 거의 불가능 해 보였다. 어느 쪽이든 훨씬 합리적으로 보입니다.
notjagan

답변:


1

파이썬 3.5, 점수 ??

현재로서는 101 개의 입력 모두에 대한 출력이 없지만 모든 테스트 사례에 대해 프로그램을 실행하면 점수로 업데이트됩니다.

from math import *

memoized = {}
same = {}

def _(mathmania, n):
    memoized[n] = mathmania
    return mathmania

def is_prime(n):
    if n == 2:
        return True
    if n % 2 == 0 or n <= 1:
        return False
    for divisor in range(3, int(sqrt(n)) + 1, 2):
        if n % divisor == 0:
            return False
    return True

def pair_key(pair):
    low, high = pair
    diff = high - low
    if diff == 0:
        return 100
    low_done, high_done, diff_done = low in memoized, high in memoized, diff in memoized
    if high_done and memoized[high] == None or low_done and memoized[low] == None:
        return -1
    return (high_done + diff_done + (diff + 1 == low)) * 33 + low / high

def major_pairs(n):
    for i in range(n, int(sqrt(n)), -1):
        d = n / i
        if i - d < d - 1:
            break
        if d == int(d):
            yield (int(d), i)

def fact_key(pair):
    i, f = pair
    if i in memoized:
        if memoized[i] == None:
            return -1
        return 1
    return i / f

def near_fact(n, level):
    s = 4
    if n in same:
        s = same[n]
    for i in range(s, n ** 2 ** level):
        f = factorial(i)
        if f > (n - 1) ** 2 ** level:
            if f < (n + 1) ** 2 ** level:
                same[n] = i
                yield (i, f)
            else:
                return

def generate_mathmania(n):
    if n in memoized and memoized[n] != None:
        return memoized[n]
    memoized[n] = None
    binx = log(n, 2)
    if binx == int(binx):
        if binx == 2:
            return _("e", n)
        if binx == 1:
            return _("er", n)
        if binx == 0:
            return _("rl", n)
        return _("e(" + generate_mathmania(int(binx)) + ")", n)
    sq = sqrt(n)
    if sq == int(sq):
        return _(generate_mathmania(int(sq)) + "e", n)
    low, high = max(major_pairs(n), key=pair_key)
    if pair_key((low, high)) == -1:
        level = 1
        while True:
            try:
                i, f = max(near_fact(n, level), key=fact_key)
            except:
                level += 1
                continue
            if fact_key((i, f)) == -1:
                return _(generate_mathmania((n - 1) ** 2 + 1) + "rc", n)
            if f == n ** 2 ** level:
                return _(generate_mathmania(i) + "f" + "r" * level, n)
            if f < n ** 2 ** level:
                return _(generate_mathmania(i) + "f" + "r" * level + "c", n)
            return _(generate_mathmania(i) + "f" + "r" * level + "l", n)
    if low != 1:
        if low == high:
            return _(generate_mathmania(low) + "e", n)
        if high - low == 1:
            return _(generate_mathmania(high) + "f", n)
        return _(generate_mathmania(high) + "f(" + generate_mathmania(high - low + 1) + ")", n)
    good = None
    for i in range(n ** 2 - 1, (n - 1) ** 2, -1):
        if i in memoized:
            return _(generate_mathmania(i) + "rc", n)
        if not is_prime(i):
            good = i
    if good:
        return _(generate_mathmania(good) + "rc", n)
    for i in range((n + 1) ** 2 - 1, n ** 2, -1):
        if i in memoized:
            return _(generate_mathmania(i) + "rl", n)
        if not is_prime(i):
            good = i
    if good:
        return _(generate_mathmania(good) + "rl", n)
    return _(generate_mathmania((n - 1) ** 2 + 1), n)

또한 숫자 크기로 인해 시도한 일부 테스트 사례의 출력을 확인할 수 없었고 그 시점에서 @ BradGilbertb2gills의 온라인 인터프리터가 시간 초과되었습니다. 잘하면 모든 출력이 작동합니다.


파이썬 2 (아마도 3)에 인터프리터가있어 여기에서 임의의 정밀도를 처리 할 수 있습니다 . IDE에 복사하여 붙여 넣어 실행하십시오.
clismique

출력을 최적화 할 수 있도록 일부 출력은 무엇입니까?
브래드 길버트 b2gills
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.