私の番号はユニークですか


21

、この課題我々は要因の木を使用して整数すべての正をエンコードする方法を学びました。

仕組みは次のとおりです。

  • 空の文字列の値は1です。

  • (S)ここSで、値がSの式は、S番目の素数に評価されます。

  • ABここでAおよびBは、それぞれAおよびBの値を持つ任意の式の値はA * Bです。

たとえば、7を表す場合は、次のようにします。

  7 -> (4) -> (2*2) -> ((1)(1)) -> (()())

この方法を使用すると、すべての整数を表すことができます。実際、いくつかの数値は複数の方法で表すことができます。乗算は可換であるため、10は両方

((()))()

そして

()((()))

同時に、いくつかの数値は1つの方法でしか表現できません。例として8を取り上げます。8は次のようにしか表現できません

()()()

そして、私たちの原子はすべて同じなので、commutivityを使用して原子を再編成することはできません。


それで、今の質問は「どの数字が一方向でしか表現できないのか?」です。最初の観察は、私がそこに戻り始めたばかりのものです。完全な力にはいくつかの特別な特性があるようです。さらに調査すると、36を見つけることができます。これは6 2が完全な力ですが、複数の表現があります。

(())()(())()
(())()()(())
()(())()(())
()(())(())()
()()(())(())

また、6はすでに再配置可能であるため、これは理にかなっています。したがって、6から作成する数も再配置可能でなければなりません。

これでルールができました:

  • 数値は、一意の表現を持つ数値の完全な力である場合、一意の表現を持ちます。

この規則は、素数が一意であるかどうかを判断するために、合成数が一意であるかどうかの判断を減らすのに役立ちます。この規則ができたので、何が素数を一意にするのかを理解したいと思います。これは実際にはかなり自明です。一意の番号を取得して括弧で囲む場合、結果は一意である必要があります。逆に、nに複数の表現がある場合n番目の素数には複数の表現が必要です。これにより、2番目のルールが生成されます。

  • N番目の素数をしている場合にのみ場合は一意であるnがユニークです。

これらのルールは両方とも再帰的であるため、ベースケースが必要になります。最小の一意の番号は何ですか?()空の文字列である1 だけがさらに小さく、一意であるため、2と言いたくなるかもしれません。

  • 1は一意です。

これらの3つのルールを使用して、数値に一意の因子ツリーがあるかどうかを判断できます。

仕事

あなたはそれが来るのを見たかもしれませんが、あなたの仕事は正の整数を取り、それが一意であるかどうかを判断することです。この計算を行うプログラムまたは関数を作成する必要があります。2つの可能な値のいずれかを出力する必要があります。これらの値は自由ですが、入力が一意の場合は「yes」を、そうでない場合は「no」を出力する必要があります。

回答はバイト単位でスコアリングする必要があり、バイト数は少ない方が良いでしょう。

テストケース

最初のカップルの一意の番号は次のとおりです。

1
2
3
4
5
7
8
9
11
16
17
19
23
25
27
31

推奨テストケース

5381 -> Unique

と思われOEIS A214577が何らかの形で関係している、あなたはそこにしようと、私は、彼らはあなた自身の責任で同じように使用されているかわからない複数のテストケースを必要とするので、場合。


私は、主な要因を並べ替える必要があったと思いますが、何であれ。
ニッサ

1
@JonathanAllanいいえ、すべてここにあります。
ニッサ

推奨されるテストケース:5381
Nissa

@StephenLeppikテストケースが追加されました、ありがとう。
小麦ウィザード

1
@ H.PWiz完全なプログラムは出力としてエラーになる可能性があると言いますが、それはプログラムの出力形式ですが、関数は値を返す必要があるからです。
ウィートウィザード

回答:


9

11 10バイト

Zgarbのおかげで1バイト節約できました!

Ωεo?oṗ←¬Ep

1一意の0場合はそれ以外を返します

オンラインでお試しください!または最初の50を返す

説明:

Ωε              Until the result is small (either 1 or 0), we repeat the following
         p     Get the prime factors
  o?           If ...
        E      they are all equal:
    ȯṗ←           Get the index of the first one into the primes
               Else:
       ¬          Not the list (since non-empty lists are truthy, this returns 0)

ああ、あなたの説明は「ȯp←」です。
エリックアウトゴルファー

@EriktheOutgolfer良いキャッチ、修正
H.PWiz

私は考えるṁ¬だけでことができ¬、リストはそのブランチ内の非空でなければならないからです。
Zgarb

ああ空想@Zgarb、私はあなたが前に私にそのヒントを与えたと思う
H.PWiz

7

ゼリー、10 バイト

いじくり回した後!

ÆET0ṪḊ?µl¿

正の整数を取り、1それが一意であるか0どうかを返す単項リンク。

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

どうやって?

ÆET0ṪḊ?µl¿ - Link: number, n     e.g. 11          or 13            or 20
         ¿ - while:
        l  - ...condition: (left) logarithm with base (right)
           -               note: x log 0 and x log 1 both yield None, which is falsey
       µ   - ...do the monadic chain: (first pass shown)
ÆE         -   prime exponent array   [0,0,0,0,1]    [0,0,0,0,0,1]    [2,0,1]
  T        -   truthy indexes         [5]            [6]              [1,3]
      ?    -   if:
     Ḋ     -   ...condition: dequeue (i.e. if length > 1)
   0       -   ...then: literal zero   -              -               0
    Ṫ      -   ...else: tail           5              6               -
           - end result                1              0               0

待って、対数、何?!

ループの例をいくつか見てみましょう。

もしn=3131 1、第十一の素数)。

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |       31 |        31 |    1.000 -> continue
         2 |       11 |        31 |    0.698 -> continue
         3 |        5 |        11 |    0.671 -> continue
         4 |        3 |         5 |    0.683 -> continue
         5 |        2 |         3 |    0.631 -> continue
         6 |        1 |         2 |    0.000 -> stop, yielding left = 1

n=6255 4)の場合:

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      625 |       625 |    1.000 -> continue
         2 |        3 |       625 |    0.171 -> continue
         3 |        2 |         3 |    0.631 -> continue
         4 |        1 |         2 |    0.000 -> stop, yielding left = 1

もしn=2255 2 ×3 2)。

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      225 |       225 |    1.000 -> continue
         2 |     *  0 |       225 |-inf+nanj -> continue
         3 |     ** 0 |         0 |     None -> stop, yielding left = 0

*The dequeued list was not empty
**Tailing an empty list in Jelly yields 0

4

APL(Dyalog)、42バイト

CY'dfns'
{1≥⍵:11=≢∪r3pco⍵:∇11pcor0}

使用する⎕CY'dfns'dfns、ESは、ショに非常に現実的ではありません。


私の答えは、私は4時間前に周りの最初のバージョンを書きましたが、あなたと非常によく似て出てきた
H.PWiz

@ H.PWizのように見えますが、同じ言語で投稿することはあまり気にしませんが、通常は短いソリューションを見つけたときにコメントすることを好みますが、これはほとんど同じです。私はあなたがそれを維持することを気にしないが、同じように見える答えはかなり役に立たないと思う。タイミングについて-それが動作する方法です。他の誰かが最初に来たので、私は何十もの答えを落としました。私(そして私は他の人たちも)は本当の競争ではなく、楽しみのためにそれをやっています。
ウリエル

長い時間をかけてごめんなさい、申し訳ありませんが、回答を削除しました。振り返ってみると、コメントの方が適切だったようです。私は一度にAPLに新しいだったので、そのような答えは努力のかなり大量に必要、と私はコメントはそれが無駄のように感じただろうと感じ、考える
H.PWiz

2

ゼリー、11バイト

ÆfẋE$ḢÆCµl¿

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

-2 Jonathan Allanによる非常に天才的なトリックに感謝します。

H.PWizのHuskアルゴリズムを使用。


基数1と0の両方にログを記録するため、11でNone実行できますÆfẋE$ḢÆCµl¿:)
ジョナサンアラン

@JonathanAllanねえ、それが最初です!いいね
エリックアウトゴルファー

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