Картографування прайм


19

Нещодавно я виявив бієктивне відображення f від позитивних цілих чисел до кінцевих, вкладених послідовностей. Мета цього виклику - реалізувати його на обраній вами мові.

Картографування

Розглянемо число n з факторами, де . Потім:

Наприклад:

Правила

  • Ви можете написати повну програму або функцію для виконання цього завдання.
  • Вихід може бути в будь-якому форматі, розпізнаваний як послідовність.
  • Дозволено вбудовувати основні факторизації, тестування первинності тощо .
  • Стандартні лазівки заборонені.
  • Ваша програма повинна заповнити останній тестовий випадок за 10 хвилин на моїй машині.
  • Це код-гольф, тому найкоротший код виграє!

Випробування

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: пастебін

Чи той самий вихід, без коми, все ще впізнаваний як послідовність ?
Денніс

@Dennis Так, ви можете сказати по дужках.
LegionMammal978

Як щодо числа 1
Акангка

О, це {}.
Акангка

1
Буде чи це бути прийнятний формат виведення? CJam не розрізняє порожні списки та порожні рядки, тому це природний спосіб представлення вкладеного масиву.
Денніс

Відповіді:


1

Pyth, 29 байт

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Демонстрація

Це визначає функцію, ' , яка виконує потрібне відображення.

Хелперна функція, yвиконує відображення рекурсивно з заданим розкладанням. Базовий випадок і просте розкладання виконуються в '.


5

CJam, 51 48 44 42 41 39 34 33 31 байт

{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Дякуємо @ MartinBüttner за те, що виграли 3 байти!

Завдяки @PeterTaylor за те, що виграли 3 байти і проклали шлях ще на 1!

Принаймні, на моєму комп’ютері завантаження файлу займає більше часу, ніж запуск програми ...

I / O

Це названа функція, яка спливає і ціле число з STDIN і виштовхує масив натомість.

Оскільки CJam не розрізняє порожні масиви та порожні рядки - рядок - це просто список, який містить лише символи -, представлення рядків виглядатиме так:

[[""] "" [""] ""]

посилаючись на наступний, вкладений масив

[[[]] [] [[]] []]

Перевірка

$ wget -q pastebin.com/raw.php?i=28MmezyT -O test.ver
$ cat prime-mapping.cjam
ri
  {mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
~`
$ time cjam prime-mapping.cjam <<< 16777213 > test.out

real    0m25.116s
user    0m23.217s
sys     0m4.922s
$ diff -s <(sed 's/ //g;s/""/{}/g;y/[]/{}/' < test.out) <(tr -d , < test.ver)
Files /dev/fd/63 and /dev/fd/62 are identical

Як це працює

{                           }:J  Define a function (named block) J.
 mf                              Push the array of prime factors, with repeats.
   _W=                           Push a copy and extract the last, highest prime.
      )1|                        Increment and OR with 1.
         {mp},                   Push the array of primes below that integer.

                                 If 1 is the highest prime factor, this pushes
                                 [2], since (1 + 1) | 1 = 2 | 1 = 3.
                                 If 2 is the highest prime factor, this pushes
                                 [2], since (2 + 1) | 1 = 3 | 1 = 3.
                                 If p > 2 is the highest prime factor, it pushes
                                 [2 ... p], since (p + 1) | 1 = p + 2, where p + 1
                                 is even and, therefor, not a prime.

              \fe=               Count the number of occurrences of each prime
                                 in the factorization.

                                 This pushes [0] for input 1.

                  (              Shift out the first count.
                   0a*           Push a array of that many 0's.
                      +          Append it to the exponents.

                                 This pushes [] for input 1.

                       {  }%     Map; for each element in the resulting array:
                                   Increment and call J.


mf e=набагато краще, ніж те, що я виявив, коли я підбив тест на розумність, поки питання було в пісочниці, але я знайшов одне поліпшення, яке ви ще не використовували, - це зробити картування для двох як (0a*+- тобто ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. І є набагато більше поліпшення, а також я дам вам кілька годин на голову ...
Пітер Тейлор

@PeterTaylor Дякую за гольф та підказку.
Денніс

Так, зміна представництва результатів справді було більшим поліпшенням. Є також кращий спосіб поводження з базовим корпусом, який я тільки що знайшов, але щоб перемогти ваше рішення, я повинен використовувати дві ваші ідеї так:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Пітер Тейлор

@PeterTaylor Той магічний 1|. Знову дякую!
Денніс

2

Математика, 88 байт

f@1={};f@n_:=f/@Join[1+{##2},1&~Array~#]&@@SparseArray[PrimePi@#->#2&@@@FactorInteger@n]

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