Um mapeamento de primos


19

Recentemente, eu encontrei um mapeamento bijetivo f de números inteiros positivos para seqüências aninhadas finitas. O objetivo deste desafio é implementá-lo no idioma de sua escolha.

O Mapeamento

Considere um número n com os fatores em que . Então:

Por exemplo:

Regras

  • Você pode escrever um programa completo ou uma função para executar esta tarefa.
  • A saída pode estar em qualquer formato reconhecível como uma sequência.
  • Built-ins para fatoração nobre, teste de primalidade, etc. são permitidos .
  • As brechas padrão não são permitidas.
  • Seu programa deve concluir o último caso de teste em menos de 10 minutos na minha máquina.
  • Isso é código-golfe, então o código mais curto vence!

Casos de teste

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

A mesma saída, sem as vírgulas, ainda é reconhecível como uma sequência ?
Dennis

@ Dennis Sim, você pode dizer pelos parênteses.
precisa

Como sobre o número 1
Akangka 23/11/2015

Ooh, isso é {}.
Akangka

11
Será que este seja um formato de saída aceitável? O CJam não faz distinção entre listas vazias e cadeias vazias; portanto, essa é a maneira natural de representar uma matriz aninhada.
Dennis

Respostas:


1

Pitão, 29 bytes

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Demonstração

Isso define uma função ', que executa o mapeamento desejado.

Uma função auxiliar y, executa o mapeamento recursivamente, dada uma decomposição principal. O caso base e a decomposição principal são executados em '.


5

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

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

Experimente on-line no intérprete CJam .

Obrigado a @ MartinBüttner por jogar fora 3 bytes!

Graças a @PeterTaylor por jogar fora 3 bytes e abrir caminho para mais 1!

Pelo menos no meu computador, o download do arquivo leva mais tempo do que a execução do programa ...

I / O

Essa é uma função nomeada que aparece e número inteiro de STDIN e envia uma matriz de retorno.

Como o CJam não faz distinção entre matrizes vazias e cadeias vazias - uma cadeia é simplesmente uma lista que contém apenas caracteres -, a representação da cadeia terá a seguinte aparência:

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

referindo-se à seguinte matriz aninhada

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

Verificação

$ 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

Como 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.

Culpa Pastebin: P
LegionMammal978

mf e=é muito melhor do que o que encontrei quando fiz um teste de sanidade enquanto a pergunta estava na caixa de areia, mas uma melhoria que encontrei e que você não usou é fazer o mapeamento para os dois como (0a*+- ie ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. E há uma melhoria muito maior, bem como que eu vou te dar headstart algumas horas em ...
Peter Taylor

@ PeterTaylor Obrigado pelo golfe e pela dica.
Dennis

Sim, mudar a representação da saída foi de fato a maior melhoria. Também há uma maneira melhor de lidar com o caso base, que eu acabei de encontrar, mas para vencer sua solução, tenho que usar duas de suas idéias:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor

@ PeterTaylor Esse é mágico 1|. Obrigado novamente!
Dennis

2

Mathematica, 88 bytes

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

A magia de elementos internos não documentados ... #
7897
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.