Мій номер унікальний


21

У цьому виклику ми вивчили спосіб кодування кожного додатного цілого числа за допомогою факторних дерев.

Ось як це працює:

  • Порожній рядок має значення 1.

  • (S)де Sбудь-який вираз зі значенням S оцінює до S- го простого.

  • ABде Aі Bє arbirary вирази зі значеннями A і B відповідно , має значення A * B .

Наприклад, якби ми хотіли представляти 7, ми б це зробили

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

Виявляється, ми можемо представляти кожне ціле число за допомогою цього методу. Насправді деякі числа ми можемо представити різними способами. Оскільки множення є комутативним 10, це і те і інше

((()))()

і

()((()))

При цьому деякі числа можна представити лише 1 способом. Візьмемо, наприклад 8. 8 можна представити лише як

()()()

А оскільки всі наші атоми однакові, ми не можемо використовувати комунікацію для їх реорганізації.


Тож тепер питання "Які числа можна представити лише 1 способом?". Перше спостереження - це те, що я тільки почав робити там. Здається, досконалі сили мають якісь особливі властивості. В ході подальшого дослідження ми можемо знайти 36, тобто 6 2 - це досконала влада, але має декілька уявлень.

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

І це має сенс, тому що 6 вже перекладається на зміну, тому будь-яке число, яке ми складаємо з 6, також повинно бути зміненим.

Отже, тепер у нас є правило:

  • Число має унікальне представлення, якщо це досконала сила числа з унікальним поданням.

Це правило може допомогти нам зменшити визначення того, чи є складене число унікальним для визначення того, чи є простим числом унікальне. Тепер, коли ми маємо це правило, ми хочемо з'ясувати, що робить просте число унікальним. Це насправді досить очевидно. Якщо ми візьмемо унікальне число і зафіксуємо його в дужках, результат повинен бути унікальним, а, якщо n має декілька представлень, n- го простих даних має мати декілька подань. Це дає друге правило:

  • П е просте єдино тоді і тільки тоді , коли п є унікальним.

Обидва ці правила є рекурсивними, тому нам буде потрібно базовий випадок. Яке найменше унікальне число? Можна спокуситись сказати 2, оскільки його справедливий (), але 1, порожній рядок, ще менший і унікальний.

  • 1 унікальний.

За допомогою цих трьох правил ми можемо визначити, чи має число унікальне дерево факторів.

Завдання

Можливо, ви бачили, що він наближається, але ваше завдання - взяти додатне ціле число і визначити, чи унікальне воно. Ви повинні написати або програму, або функцію, яка робить це обчислення. Ви повинні вивести одне з двох можливих значень, те, що ці значення, залежить від вас, але одне повинно представляти "так", виводиться тоді, коли введення унікальне, а одне - "ні", виводиться інакше.

Ваші відповіді повинні бути оцінені в байтах, а менше байтів - краще.

Тестові кейси

Ось перша пара унікальних номерів:

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

Пропоновані тестові випадки

5381 -> Unique

Здається, що OEIS A214577 якимось чином пов'язаний, тому, якщо вам потрібно більше тестових випадків, спробуйте там, але я не знаю, що вони однакові, тому використовуйте на свій страх і ризик.


Я вважаю, що основні фактори повинні були бути відсортовані, але що завгодно.
Нісса

1
@JonathanAllan ні, тут все.
Нісса

Пропонований тестовий випадок: 5381
Нісса

@StephenLeppik Тестовий випадок додано, дякую.
Пшеничний майстер

1
@ H.PWiz Я скажу, що повна програма може помилитися як вихід, тому що це форма виводу для програми, але функція повинна повертати значення.
Пшеничний майстер

Відповіді:


9

Лушпиння , 11 10 байт

Збережено один байт завдяки Згарбу!

Ωε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 О, фантазії, я думаю, ти дав мені цю пораду раніше
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=31( 31 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=625( 5 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=225( 5 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ес не надто здійсненним на TiO.


Моя відповідь вийшла досить схожою на вашу, хоча я написав першу версію близько 4 годин тому
H.PWiz

@ H.PWiz дивись чоловіче, мені дуже не байдуже, коли люди подають однаковою мовою, хоча я зазвичай вважаю за краще коментувати, коли знаходжу коротше рішення, але це майже те саме. Я не проти того, щоб ви її зберігали, але я знаходжу відповіді, які виглядають так само марно. Про терміни - ось як це працює. Я кинув десятки відповідей, тому що хтось інший прийшов першим. Я (і я вважаю, що решта) роблю це для розваги, а не для справжнього змагання.
Уріель

Вибачте за те, що так довго обіймалися, але свою відповідь я видалила. Озираючись назад, коментар здається, що це було б доречніше. Я думаю, оскільки я в цей час був новим в APL, така відповідь вимагала досить значних зусиль, і я відчув, що коментар змусив би її почути себе марною
H.PWiz

2

Желе , 11 байт

ÆfẋE$ḢÆCµl¿

Спробуйте в Інтернеті!

-2 завдяки дуже геніальному трюку Джонатана Аллана .

Використання алгоритму Husk H.PWiz.


Оскільки увійти до базового першого та нульового обох доходів, Noneви можете зробити ÆfẋE$ḢÆCµl¿за 11 :)
Джонатан Аллан

@JonathanAllan Гей, це перше! Приємно.
Ерік Аутгольфер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.