Asal Haritaların Haritası


19

Son zamanlarda, bir bijective haritalama bulduk f sonlu olumlu tamsayılar, iç içe dizilerinden. Bu zorluğun amacı, onu seçtiğiniz dilde uygulamaktır.

Haritalama

Nerede faktörleri olan bir sayı n düşünün . Sonra:

Örneğin:

kurallar

  • Bu görevi yerine getirmek için tam bir program veya işlev yazabilirsiniz.
  • Çıktı, sekans olarak tanınabilir herhangi bir formatta olabilir.
  • Asal çarpanlara ayırma, öncelik testi vb. İçin yerleşiklere izin verilir . İçin .
  • Standart boşluklara izin verilmez.
  • Programınızın son test vakasını makinemde 10 dakikadan kısa sürede tamamlaması gerekir.
  • Bu kod golf, bu yüzden en kısa kod kazanır!

Test Durumları

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

Virgülsüz aynı çıktı yine de bir dizi olarak tanınabilir mi?
— Dennis

@Dennis Evet, parantez ile söyleyebilirsiniz.
— LegionMammal978

1 numaraya ne dersin
— Akangka

Ooh, bu {}.
— Akangka

1
Misiniz bu kabul edilebilir bir çıkış biçimi olabilir mi? CJam, boş listeler ve boş dizeler arasında ayrım yapmaz, bu nedenle iç içe bir diziyi temsil etmenin doğal yolu budur.
— Dennis

Yanıtlar:


1

Pyth, 29 bayt

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

gösteri

Bu ', istenen eşlemeyi gerçekleştiren bir işlevi tanımlar .

Yardımcı fonksiyon, ybirincil ayrıştırma verildiğinde eşlemeyi tekrar tekrar gerçekleştirir. Taban kasası ve ana ayrışma '.


5

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

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

CJam yorumlayıcısında çevrimiçi deneyin .

@ BayBüttner'e 3 bayt golf oynadıkları için teşekkürler!

@PeterTaylor'a 3 bayt golf oynadığı ve 1 daha yol kat ettiği için teşekkürler!

En azından bilgisayarımda, dosyayı indirmek programı çalıştırmaktan daha uzun sürüyor ...

I / O

Bu, STDIN'den gelen ve tamsayı olan ve karşılığında bir dizi iten adlandırılmış bir işlevdir.

CJam, boş diziler ve boş dizeler arasında ayrım yapmadığından - dize yalnızca karakter içeren bir listedir - dize temsili aşağıdaki gibi görünür:

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

aşağıdaki iç içe diziye atıfta bulunarak

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

Doğrulama

$ 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

Nasıl çalışır

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

Suçlama Macunu: P
— LegionMammal978 23:15

mf e=soru kum havuzundayken bir akıl sağlığı testine başladığımda bulduğumdan çok daha iyi, ama kullanmadığınız bir gelişme, ikişer ikişer eşleme yapmak (0a*+- yani ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. Ve size çok daha büyük bir gelişme var, bu da size birkaç saatlik bir başlangıç ​​yapacağım ...
— Peter Taylor

@PeterTaylor Golf ve ipucu için teşekkürler.
— Dennis

Evet, çıktı gösterimini değiştirmek gerçekten daha büyük bir gelişmeydi. Daha önce bulduğum temel davayı ele almanın daha iyi bir yolu var, ancak çözümünüzü yenmek için iki {mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
— Peter Taylor

@PeterTaylor Bu büyülü 1|. Tekrar teşekkürler!
— Dennis

2

Mathematica, 88 bayt

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

Belgelenmemiş iç büyü ...
— LegionMammal978
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.