数学メタゴルフマニア!


12

Mathemaniaの仕様:

Mathemaniaコードのすべての部分は、数字で始まり2ます。から、2次の操作を実行できます。

  • e:べき乗。このコマンドのデフォルトは、2乗です。
  • 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

efおよびrコマンド(これもで始める余分Mathemaniaコマンドによって変更することができる2改変された機能の後にブラケットを配置し、その内部Mathemaniaコマンドを配置することによって、異なる累乗、階乗と根を生成するために、その「ベース」数として)。

たとえば、代わりにそれを乗の数をキューブに、あなたがのためにコマンドを入れることができ3た後にeそうように:

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

注:目的のために、階乗コマンド(f2は単一の階乗として開始します。あなたが行うのであれば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プログラムは、できる限り小さく(ゴルフで)する必要があり、最終スコアは、サンプルの生成されたMathemaniaプログラムのバイト数の合計(10,000〜の整数)によって決まります10,100。最も低いスコアが勝ちます。

ルールと仕様:

  • あなたのプログラムを出力しなければならない、任意の正の整数の有効なMathemaniaプログラムが、唯一の番号が間10,000および10,100テストされます。
  • 整数にならないMathemaniaプログラムを出力することはできません。その場合、プログラムは失格となります。
  • コマンドefおよびr、これらの関数内のMathemaniaコード(たとえばe(efrrc)efrrc関数内のコード)は、上の正の整数に評価される必要があり2ます。プログラムがこの規則に従わない場合、同様に失格となります。
  • プログラムは、最新のラップトップで最大30分間で101個のテスト整数のいずれかに対してMathemaniaプログラムを返す必要があります。
  • プログラムは、実行されるたびに整数に対して同じ解を返す必要があります。たとえば、プログラムに入力が与えられ、5出力する場合efrc、入力5が与えられるたびに出力する必要があります。
  • 正の整数の解をハードコーディングすることはできません。
  • 出力でゴルフの可能性を最大限に引き出すには、プログラムで任意の大きな整数を処理できる必要があります。あなたの言語がこれをサポートしていない場合は幸運ですが、それは要件ではありません。

これは、最低スコアが勝ちます!


2
私が書いたこの言語の評価をしてPerl 6の TIOネクサスに。
ブラッドギルバートb2gills 16

@ BradGilbertb2gillsわあ、ありがとう!チャレンジにリンクを配置します。
clismique 16

たとえば、入力がef「スキップ」され、ef操作の前に結果を出力するだけのコードは許可されていますか?
devRicher

@devRicherプログラム "ef"が事前にハードコーディングされていることを意味する場合、現在の規則では、 "ef"が10,000〜10,100の範囲にないため、そうすることができます。しかし、それがあなたが何を意味したのか確信が持てません。ハードコーディングが難易度の高いIMOであるため、ルールを変更するかもしれません。
clismique 16

1
私は過去数時間、この挑戦​​のためのプログラムを書いてきました。私はコードが動作していると思いますが、階乗によって生成される数値の一部は絶対に巨大であり、Python(私のプログラムとインタープリターがあります)は平方根を取ることができないため、正確にテストすることはできません。この時点でプログラムをどうするかはよくわかりません。副次的に、私はもともと誤読し、すべての101のテストケースが制限時間内に収まらなければならないと考えましたが、これはほぼ不可能に思えました。どれもはるかに合理的です。
notjagan

回答:


1

Python 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のオンラインインタープリターがタイムアウトしました。うまくいけば、すべての出力が機能します。


Python 2(おそらく3)のインタープリターがあり、ここで任意の精度を処理できるはずです。IDEにコピーして貼り付けて実行します。
clismique 16

最適化できるように、出力の一部は何でしたか。
ブラッドギルバートb2gills
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.