Pemetaan Primes

19

Baru-baru ini, saya telah menemukan pemetaan bijective f dari bilangan bulat positif ke urutan terbatas, bersarang. Tujuan dari tantangan ini adalah untuk mengimplementasikannya dalam bahasa pilihan Anda.

Pemetaan

Mempertimbangkan sejumlah n dengan faktor-faktor mana . Kemudian:

Sebagai contoh:

Aturan

  • Anda dapat menulis program lengkap atau fungsi untuk melakukan tugas ini.
  • Output dapat dalam format apa pun yang dikenali sebagai urutan.
  • Dibangun untuk faktorisasi prima, pengujian primality, dll . Diizinkan .
  • Celah standar tidak diijinkan.
  • Program Anda harus menyelesaikan test case terakhir dalam waktu kurang dari 10 menit pada mesin saya.
  • Ini adalah kode-golf, jadi kode terpendek menang!

Uji Kasus

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: pastebin
LegionMammal978
sumber
Apakah output yang sama, tanpa koma, masih dikenali sebagai urutan ?
Dennis
@ Dennis Ya, Anda bisa tahu dari kurung.
LegionMammal978
Bagaimana dengan nomor 1
Akangka
Ooh, itu {}.
Akangka
1
Apakah ini merupakan format output yang dapat diterima? CJam tidak membedakan antara daftar kosong dan string kosong, jadi ini adalah cara alami untuk merepresentasikan array bersarang.
Dennis

Jawaban:

1

Pyth, 29 byte

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Demonstrasi

Ini mendefinisikan fungsi ',, yang melakukan pemetaan yang diinginkan.

Fungsi pembantu y,, melakukan pemetaan secara rekursif dengan dekomposisi utama. Kasing dasar dan dekomposisi utama dilakukan pada '.

isaacg
sumber
5

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

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

Cobalah online di juru bahasa CJam .

Terima kasih kepada @ MartinBüttner untuk bermain golf 3 byte!

Terima kasih kepada @PeterTaylor untuk bermain golf 3 byte dan membuka jalan untuk 1 lagi!

Setidaknya di komputer saya, mengunduh file membutuhkan waktu lebih lama daripada menjalankan program ...

I / O

Ini adalah fungsi bernama yang muncul dan integer dari STDIN dan mendorong array sebagai balasannya.

Karena CJam tidak membedakan antara array kosong dan string kosong - string hanyalah daftar yang hanya berisi karakter -, representasi string akan terlihat seperti ini:

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

merujuk pada array bersarang berikut ini

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

Verifikasi

$ 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

Bagaimana itu bekerja

{                           }: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
sumber
Salahkan Pastebin: P
LegionMammal978
mf e=jauh lebih baik daripada apa yang saya temukan ketika saya mengetuk tes kewarasan sementara pertanyaannya di kotak pasir, tapi satu perbaikan yang saya temukan yang belum Anda gunakan adalah melakukan pemetaan untuk keduanya sebagai (0a*+- yaitu ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. Dan ada peningkatan yang jauh lebih besar juga yang akan saya beri Anda beberapa jam headstart on ...
Peter Taylor
@ PeterTaylor Terima kasih untuk golf dan isinya.
Dennis
Yap, mengubah representasi output memang perbaikan yang lebih besar. Ada cara yang lebih baik untuk menangani casing dasar, yang baru saja saya temukan, tetapi untuk mengalahkan solusi Anda, saya harus menggunakan dua ide Anda jadi:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor
@ PeterTaylor Yang ajaib itu 1|. Terima kasih lagi!
Dennis
2

Mathematica, 88 byte

f@1={};f@n_:=f/@Join[1+{##2},1&~Array~#]&@@SparseArray[PrimePi@#->#2&@@@FactorInteger@n]
alephalpha
sumber
Keajaiban internal yang tidak berdokumen ...
LegionMammal978