編集:私はこれが終了しないことについて多くのコメントを受け取っています-私は私に与えた最初の人にFF(3)
(正しい答えでそれを提供するように)「正解」タグを与えるか、それFF(3)
が本当に無期限に爆破することを証明します。
仕事:
あなたの仕事はFF(n)
、正の整数を与えられた分数フレンジー関数()の逆数のリストを生成する可能な限り最小のプログラムを作ることn
です。
前書き:
FF関数を紹介する前に、まずエジプトの分数について説明する必要があります。
エジプトの分数:
エジプトの分数は、分数を個別の単位分数の合計として表す方法5/8
です1/2 + 1/8
。したがって、分数を表す1つの方法はです。それは他の分数の合計ではありません
1/4 + 1/4 + 1/8
1/2 + 1/16 + 1/16
すべての分数が異なるわけではないためです(1/4
最初の例と1/16
2番目の例で繰り返されます)。
エジプトの分数の定義では、単位分数にも負の分母の使用を含めています。
FF関数:
FF(Fraction Frenzy)関数は次のように記述されます:
FF(1)
エジプトの分数1/2 + 1/3 + 1/5 + 1/-30
です。
FF(2)
FF(1)
単独で「乗算」に等しい(FF(1)
「二乗」):
(1/2 + 1/3 + 1/5 + 1/-30)(1/2 + 1/3 + 1/5 + 1/-30)
= 1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
分数には「繰り返し」があるため、これはまだ完全に削減されたエジプトの分数ではありません。それらを減らすために、次の手順が実行されます。
- すべての「類似した」単位分数を合計します。
- 最も単純な形態に和を減らす-ので、例えば、ステップの合計が場合
1
である2/6
に低減することができます、1/3
。 - すべての分母が区別されるまで、1と2を繰り返します。たとえば、分母が繰り返されるとは
1/2 + 2/3 + 1/5
対照的に1/2 + 1/3 + 1/3
、3
です。 - 絶対値が等しい1つの正の分数と1つの負の分数のペアがある場合は、両方を削除します(たとえば
1/-5
、両方を削除する1/5
必要があります)。 - 分数が単位ではなく、それ以上削減できない場合は、分母を同じ分母で単位分数に分割し、1つの分数をそのままにします。他のものを使用して、それらを乗算し
FF(1)
ます(1/2 + 1/3 + 1/5 + 1/-30)
。 - 最終的な端数の合計が有効なエジプトの端数になるまで、手順1〜5を繰り返します。つまり、すべての端数は互いに異なり、それらはすべて単位の端数になります。
これはの削減ですFF(2)
:
1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
= 1/4 + 2/6 + 1/9 + 2/10 + 2/15 + 1/25 + 2/-60 + 2/-90 + 2/-150 + 1/900 (step 1)
= 1/4 + 1/3 + 1/9 + 1/5 + 2/15 + 1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900 (step 2)
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/15(1/2 + 1/3 + 1/5 + 1/-30) + (step 5)
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/30 + 1/45 + 1/75 + 1/-450 +
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/25 + 1/-450 + 1/900 (step 4)
すべての場合n
(を除く1
)FF(n)
は、「squaring」によって定義されFF(n-1)
ます。
入出力:
整数を指定するとn
、のすべての逆数のリストを出力し、FF(n)
絶対値の昇順で並べ替えます。
1 -> [2, 3, 5, -30]
# 1/2 + 1/3 + 1/5 + 1/-30 = FF(1), reciprocals = [2, 3, 5, -30]
2 -> [3, 4, 5, 9, 15, 25, -450, 900]
区切り文字を含む文字列、またはリストの言語の解釈を使用することが許可されているため、これらの出力はすべてinputで受け入れられます1
。
2 3 5 -30 (Space-delimited)
2,3,5,-30 (Comma-delimited)
[2 3 5 -30] (Lisp-like lists)
etc. etc.
スペック:
FF(n)
上記の指定どおりに関数の結果を出力する必要があります。- 入力は正の整数であることが保証されます。ゼロ未満になることはなく、小数(または小数)になることもありません。
これはcode-golfなので、バイト単位の最短コードが優先されます。