A Mapping of Primes


19

Di recente, ho trovato una mappatura biiettiva f da numeri interi positivi a sequenze nidificate finite. Lo scopo di questa sfida è implementarlo nella lingua che preferisci.

La mappatura

Considera un numero n con i fattori in cui . Poi:

Per esempio:

Regole

  • È possibile scrivere un programma completo o una funzione per eseguire questa attività.
  • L'output può essere in qualsiasi formato riconoscibile come sequenza.
  • Sono ammessi built-in per la scomposizione in fattori primi, test di primalità ecc .
  • Le scappatoie standard non sono ammesse.
  • Il mio programma deve completare l'ultimo test in meno di 10 minuti sulla mia macchina.
  • Questo è code-golf, quindi vince il codice più corto!

Casi test

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

Lo stesso output, senza le virgole, è ancora riconoscibile come sequenza ?
Dennis,

@Dennis Sì, lo puoi capire tra parentesi.
LegionMammal978,

Che ne dici del numero 1
Akangka del

Ooh, questo è {}.
Akangka,

1
Sarebbe questo essere un formato di output accettabile? CJam non distingue tra elenchi vuoti e stringhe vuote, quindi questo è il modo naturale di rappresentare un array nidificato.
Dennis,

Risposte:


1

Pyth, 29 byte

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Dimostrazione

Questo definisce una funzione, 'che esegue la mappatura desiderata.

Una funzione di supporto y, esegue la mappatura ricorsivamente data una scomposizione primaria. Il caso base e la decomposizione primaria vengono eseguiti in '.


5

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

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

Provalo online nell'interprete CJam .

Grazie a @ MartinBüttner per giocare a golf con 3 byte!

Grazie a @PeterTaylor per giocare a golf da 3 byte e spianare la strada per altri 1!

Almeno sul mio computer, il download del file richiede più tempo rispetto all'esecuzione del programma ...

I / O

Questa è una funzione denominata che si apre e integra da STDIN e invia in cambio un array.

Poiché CJam non distingue tra array vuoti e stringhe vuote - una stringa è semplicemente un elenco che contiene solo caratteri - la rappresentazione della stringa sarà simile alla seguente:

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

riferendosi alla seguente matrice nidificata

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

Verifica

$ 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

Come funziona

{                           }: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.

Incolpare Pastebin: P
LegionMammal978,

mf e=è molto meglio di quello che avevo trovato quando ho buttato giù un test di sanità mentale mentre la domanda era nella sandbox, ma un miglioramento che ho trovato che non hai usato è quello di fare la mappatura per i due come (0a*+- cioè ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. E c'è anche un miglioramento molto più grande che ti darò qualche ora di vantaggio su ...
Peter Taylor,

@PeterTaylor Grazie per il golf e il suggerimento.
Dennis,

Sì, cambiare la rappresentazione dell'output è stato davvero il miglioramento più grande. C'è un modo migliore di gestire anche il caso di base, che ho appena trovato, ma per battere la tua soluzione devo usare due delle tue idee così:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor,

@PeterTaylor Quello magico 1|. Grazie ancora!
Dennis,

2

Mathematica, 88 byte

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

La magia degli interni privi di documenti ...
LegionMammal978,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.