Отображение простых чисел


19

Недавно я нашел биективное отображение f из натуральных чисел в конечные вложенные последовательности. Цель этого задания - реализовать его на выбранном вами языке.

Картирование

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

Например:

правила

  • Вы можете написать полную программу или функцию для выполнения этой задачи.
  • Вывод может быть в любом формате, распознаваемом как последовательность.
  • Разрешены встроенные модули для первичной факторизации, тестирования первичности и т . Д.
  • Стандартные лазейки запрещены.
  • Ваша программа должна завершить последний контрольный пример менее чем за 10 минут на моем компьютере.
  • Это код-гольф, поэтому выигрывает самый короткий код!

Тестовые случаи

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: pastebin

Является ли тот же вывод без запятых все еще распознаваемым как последовательность ?
Денис

@ Денис Да, вы можете сказать по скобкам.
LegionMammal978

Как насчет числа 1
Akangka

Ох, это {}.
Akangka

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.

Виноват Пастебин: P
LegionMammal978

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

Mathematica, 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.