Un mapeo de primes

19

Recientemente, he encontrado un mapeo biyectivo f desde enteros positivos hasta secuencias finitas anidadas. El propósito de este desafío es implementarlo en el idioma que elija.

El mapeo

Considere un número n con los factores donde . Luego:

Por ejemplo:

Reglas

  • Puede escribir un programa completo o una función para realizar esta tarea.
  • La salida puede estar en cualquier formato reconocible como una secuencia.
  • Se muebles empotrados de descomposición en factores primos, las pruebas de primalidad, etc. permitidos .
  • Las lagunas estándar no están permitidas.
  • Su programa debe completar el último caso de prueba en menos de 10 minutos en mi máquina.
  • Este es el código de golf, por lo que gana el código más corto.

Casos de prueba

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: pastebin
LegionMammal978
fuente
¿La misma salida, sin las comas, sigue siendo reconocible como una secuencia ?
Dennis
@ Dennis Sí, se nota por los corchetes.
LegionMammal978
¿Qué tal el número 1
Akangka
Ooh, eso es {}.
Akangka
1
¿Sería este un formato de salida aceptable? CJam no distingue entre listas vacías y cadenas vacías, por lo que esta es la forma natural de representar una matriz anidada.
Dennis

Respuestas:

1

Pyth, 29 bytes

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Demostración

Esto define una función, 'que realiza la asignación deseada.

Una función auxiliar y, realiza el mapeo de forma recursiva dada una descomposición primaria. El caso base y la descomposición primaria se realizan en '.

isaacg
fuente
5

CJam, 51 48 44 42 41 39 34 33 31 bytes

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

Pruébelo en línea en el intérprete de CJam .

¡Gracias a @ MartinBüttner por jugar golf en 3 bytes!

¡Gracias a @PeterTaylor por jugar 3 bytes y preparar el camino para 1 más!

Al menos en mi computadora, descargar el archivo lleva más tiempo que ejecutar el programa ...

I / O

Esta es una función con nombre que emerge y es un entero de STDIN y empuja una matriz a cambio.

Como CJam no distingue entre matrices vacías y cadenas vacías (una cadena es simplemente una lista que contiene solo caracteres), la representación de cadena se verá así:

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

refiriéndose a la siguiente matriz anidada

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

Verificación

$ 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

Cómo funciona

{                           }: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.
Dennis
fuente
Culpa a Pastebin: P
LegionMammal978
mf e=es mucho mejor de lo que encontré cuando hice una prueba de cordura mientras la pregunta estaba en la caja de arena, pero una mejora que encontré que no has usado es hacer el mapeo para los dos como (0a*+, es decir ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. Y también hay una mejora mucho mayor que les daré unas horas de ventaja sobre ...
Peter Taylor
@ PeterTaylor Gracias por el golf y la pista.
Dennis
Sí, cambiar la representación de salida fue de hecho la mayor mejora. También hay una mejor manera de manejar el caso base, que acabo de encontrar, pero para superar su solución, tengo que usar dos de sus ideas, así:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor
@PeterTaylor Ese mágico 1|. ¡Gracias de nuevo!
Dennis
2

Mathematica, 88 bytes

f@1={};f@n_:=f/@Join[1+{##2},1&~Array~#]&@@SparseArray[PrimePi@#->#2&@@@FactorInteger@n]
alephalpha
fuente
La magia de los internos indocumentados ...
LegionMammal978