2つの数値に一意の階乗が含まれていますか?


11

2つの数値を階乗に分解します。共有している場合は、偽の値を返します。それ以外の場合は、真実の値を返します。(この最近の質問に触発された)

言い換えれば、各入力番号を可能な限り貪欲な方法で(正の整数の)階乗の合計として書き込みます。両方の表現に階乗が現れない場合は真実の値を、そうでなければ偽の値を返します。

20と49が与えられた場合:

20 = 3! + 3! + 3! + 2!
49 = 4! + 4! + 1!

両方の表現に階乗が現れないため、真理値を返します。

32と132が与えられた場合:

132 = 5! + 3! + 3!
 32 = 4! + 3! + 2!

3!両方の表現に表示されるため、falsey値を返します。

I / O

入力と出力は、任意の標準的な手段で行うことができます。

入力は常に2つの非負整数になります。言語が必要とするもの以外のこれらの整数の上限はありません。

出力は、真偽値または偽値でなければなりません。すべての出力が正しく真実/偽である限り、これらの値は必ずしも異なる入力に対して一貫している必要はありません。

テストケース

1つの入力がの0場合、答えは常に真実です。他の真実のテストケース:

{6, 3}, {4, 61}, {73, 2}, {12, 1}, {240, 2}, {5, 264}, {2, 91}, {673, 18},
 {3, 12}, {72, 10}, {121, 26}, {127, 746}

両方の入力が奇数の整数である場合、または両方の入力が同じ正の整数である場合、出力は常に偽になります。その他の偽のテストケース:

{8, 5}, {7, 5}, {27, 47}, {53, 11}, {13, 123}, {75, 77}, {163, 160}, {148, 53},
 {225, 178}, {285, 169}, {39, 51}, {207, 334}, {153, 21}, {390, 128}, {506, 584},
 {626, 370}, {819, 354}

これはなので、最少バイトが勝ちます!


「各入力値を(正の整数の)階乗の合計として可能な限り最も貪欲な方法で記述してください」代わりに、最も遅延可能な方法を意味しませんか?
-user41805

4
@KritixiLithosいいえ。彼は貪欲なアルゴリズムとして知られるアルゴリズムのクラスに言及しています。これは、各ステップの後に何らかのメトリックを最大化することで機能します。のように、常にできるだけ多くを摂取します。
ジョンドヴォルザーク

回答:


9

ゼリー、7バイト

Æ!ṠḄ&/¬

オンラインでお試しください!

使い方

Æ!ṠḄ&/¬  Main link. Argument: (x, y) (pair of integers)

Æ!       Convert x and y to factorial base.
  Ṡ      Apply the sign function to each digit.
   Ḅ     Unbinary; convert each resulting Boolean array from base 2 to integer.
    &/   Reduce the resulting pair of integers by bitwise AND.
      ¬  Take the logical NOT of the result.

Æ!特定のシナリオでは非常に便利なようです。
魔法のタコUr

記号を使わずに、階乗ベースリストを要素ごとに直接乗算しようとすることによって得られるものはありますか?
グレッグマーティン

@GregMartin私はそうは思わない。桁配列は同じ長さになるようにパディングまたは切り捨てる必要があり、おそらく保存するよりも多くのバイトがかかります。
デニス



2

JavaScript(ES6)、71バイト

(a,b,g=(n,e=1,f=1)=>n>=f&&g(n,++e,f*e)+((n/f|0)%e&&1<<e))=>!(g(a)&g(b))

JavaScriptの整数は53ビットの精度に制限されていますが、これは18ビットで十分です!; これは、18ビットのマスクを使用して、どの階乗が必要かを追跡できることを意味します。



0

Mathematica、73バイト

F[x_]:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[F@#,F@#2]&

入力フォーム

[x1、x2]


私はこれをテストするいくつかのエラーを取得しています...
スコット・ミルナー

最後に入力するだけ[x1、x2]
J42161217

あ。2つの個別の整数の代わりに、リストを入力していました。±x_:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[±#,±#2]&[4,61](69バイト)でさらにゴルフできます。ISO 8859-1エンコーディングでは、±は1バイトです。
スコットミルナー

0

C、122 119バイト

G(q,i){return gamma(q+1)>i?gamma(q):G(q+1,i);}
Q(a,b,u,v){while(a&&b){a-=u=G(1,a);b-=v=G(1,b);if(a==b)exit();}exit(0);}

Q主な機能です。正確に2つの正の整数値で呼び出す必要があります。これは、真実および偽の終了コード終了します01

これはTIOでは動作しないようですが、Homebrewが提供されているシステムで動作しgcc 7.1.0ます。

私はCしばらくゴルフをしていませんので、ゴルフのコツは大歓迎です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.