Bản đồ các số nguyên tố


19

Gần đây, tôi đã tìm thấy một ánh xạ phỏng đoán f từ các số nguyên dương đến các chuỗi hữu hạn, lồng nhau. Mục đích của thử thách này là thực hiện nó bằng ngôn ngữ bạn chọn.

Bản đồ

Xét một số n với các yếu tố trong đó . Sau đó:

Ví dụ:

Quy tắc

  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng để thực hiện nhiệm vụ này.
  • Đầu ra có thể ở bất kỳ định dạng nào có thể nhận ra dưới dạng một chuỗi.
  • Được xây dựng cho yếu tố chính, thử nghiệm nguyên thủy, vv được cho phép .
  • Sơ hở tiêu chuẩn là không được phép.
  • Chương trình của bạn phải hoàn thành trường hợp thử nghiệm cuối cùng trong vòng dưới 10 phút trên máy của tôi.
  • Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: quá khứ

Là cùng một đầu ra, không có dấu phẩy, vẫn có thể nhận ra như một chuỗi ?
Dennis

@Dennis Có, bạn có thể nói bằng dấu ngoặc.
LegionMammal978

Làm thế nào về số 1
Akangka

Ồ, đó là {}.
Akangka

1
Sẽ này là một định dạng đầu ra có thể chấp nhận? CJam không phân biệt giữa danh sách trống và chuỗi rỗng, vì vậy đây là cách tự nhiên để biểu diễn một mảng lồng nhau.
Dennis

Câu trả lời:


1

Bình thường, 29 byte

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

Trình diễn

Điều này xác định một chức năng, 'thực hiện ánh xạ mong muốn.

Hàm trợ giúp y, thực hiện ánh xạ đệ quy với phân rã chính. Các trường hợp cơ sở và phân tách nguyên tố được thực hiện trong '.


5

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

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Cảm ơn @ MartinBüttner vì đã chơi golf 3 byte!

Cảm ơn @PeterTaylor vì đã chơi golf 3 byte và mở đường cho thêm 1!

Ít nhất trên máy tính của tôi, việc tải xuống tệp mất nhiều thời gian hơn chạy chương trình ...

Tôi / O

Đây là một hàm được đặt tên bật và số nguyên từ STDIN và trả về một mảng.

Vì CJam không phân biệt giữa các mảng trống và chuỗi rỗng - một chuỗi chỉ đơn giản là một danh sách chỉ chứa các ký tự -, nên biểu diễn chuỗi sẽ như sau:

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

đề cập đến sau đây, mảng lồng nhau

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

xác minh

$ 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

Làm thế nào nó hoạt động

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

Đổ lỗi cho Pastebin: P
LegionMammal978

mf e=tốt hơn nhiều so với những gì tôi tìm thấy khi tôi thực hiện bài kiểm tra độ tỉnh táo trong khi câu hỏi nằm trong hộp cát, nhưng một cải tiến tôi thấy mà bạn chưa sử dụng là thực hiện ánh xạ cho twos như (0a*+- tức là ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. Và có một cải tiến lớn hơn nhiều mà tôi sẽ cung cấp cho bạn trong vài giờ đầu ...
Peter Taylor

@PeterTaylor Cảm ơn golf và gợi ý.
Dennis

Đúng, thay đổi đại diện đầu ra thực sự là sự cải thiện lớn hơn. Có một cách xử lý trường hợp cơ bản tốt hơn, điều mà tôi chỉ mới tìm thấy, nhưng để đánh bại giải pháp của bạn, tôi phải sử dụng hai ý tưởng của bạn để:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor

@PeterTaylor Đó là một phép thuật 1|. Cảm ơn một lần nữa!
Dennis

2

Toán học, 88 byte

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

Sự kỳ diệu của nội bộ không có giấy tờ ...
LegionMammal978
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.