การทำแผนที่ของช่วงเวลา


19

เมื่อเร็ว ๆ นี้ฉันได้พบการทำแผนที่ bijective fจากจำนวนเต็มบวกถึงลำดับที่ จำกัด และซ้อนกัน จุดประสงค์ของการท้าทายนี้คือการนำไปใช้ในภาษาที่คุณเลือก

การทำแผนที่

พิจารณาจำนวนnกับปัจจัยที่ แล้ว:

ตัวอย่างเช่น:

กฎระเบียบ

  • คุณสามารถเขียนโปรแกรมแบบเต็มหรือฟังก์ชั่นเพื่อทำงานนี้
  • เอาต์พุตสามารถอยู่ในรูปแบบใด ๆ ที่รู้จักเป็นลำดับ
  • บิวด์อินสำหรับการแยกตัวประกอบเฉพาะการทดสอบเบื้องต้นและอื่น ๆได้รับอนุญาต
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • โปรแกรมของคุณจะต้องเสร็จสิ้นกรณีทดสอบสุดท้ายภายใน 10 นาทีบนเครื่องของฉัน
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ!

กรณีทดสอบ

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

เอาต์พุตเดียวกันโดยไม่มีเครื่องหมายจุลภาคยังคงสามารถจดจำได้เป็นลำดับหรือไม่?
Dennis

@Dennis ใช่คุณสามารถบอกได้โดยวงเล็บ
LegionMammal978

วิธีเกี่ยวกับหมายเลข 1
Akangka

Ooh นั่นคือ {}
Akangka

1
จะนี้จะเป็นรูปแบบการออกยอมรับ? CJam ไม่แยกความแตกต่างระหว่างรายการว่างและสตริงว่างดังนั้นนี่เป็นวิธีธรรมชาติในการแสดงอาร์เรย์ที่ซ้อนกัน
เดนนิส

คำตอบ:


1

Pyth, 29 ไบต์

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

สาธิต

สิ่งนี้จะกำหนดฟังก์ชั่น'ซึ่งทำแผนที่ที่ต้องการ

ฟังก์ชั่นตัวช่วยy, ทำการแมปแบบซ้ำ ๆ เพื่อให้เกิดการสลายตัวที่สำคัญ 'กรณีฐานและการสลายตัวที่สำคัญจะดำเนินการใน


5

CJam, 51 48 44 42 41 39 34 33 31 ไบต์

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

ลองออนไลน์ใน ล่าม CJam

ขอบคุณ @ MartinBüttnerสำหรับการเล่นกอล์ฟ 3 ไบท์!

ขอบคุณ @PeterTaylor สำหรับการตีกอล์ฟขนาด 3 ไบต์และปูทางไปอีก 1 ทาง!

อย่างน้อยในคอมพิวเตอร์ของฉันการดาวน์โหลดไฟล์ใช้เวลานานกว่าการรันโปรแกรม ...

I / O

นี่คือฟังก์ชั่นที่มีชื่อที่ปรากฏและจำนวนเต็มจาก STDIN และผลักดันอาร์เรย์ในการกลับมา

เนื่องจาก CJam ไม่ได้แยกความแตกต่างระหว่างอาเรย์ที่ว่างเปล่าและสตริงที่ว่างเปล่า - สตริงจึงเป็นเพียงรายการที่มีอักขระเท่านั้น - การแสดงสตริงจะมีลักษณะดังนี้:

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

อ้างถึงอาร์เรย์ที่ซ้อนกันต่อไปนี้

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

การตรวจสอบ

$ 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

มันทำงานอย่างไร

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

Blame Pastebin: P
LegionMammal978

mf e=จะดีกว่าสิ่งที่ฉันต้องการพบเมื่อฉันเคาะขึ้นทดสอบสติในขณะที่คำถามคือใน sandbox แต่ปรับปรุงหนึ่งที่ผมพบที่คุณไม่ได้ใช้คือการทำแมปสำหรับเจ้าตัวเป็น(0a*+- ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}jคือ และมีการปรับปรุงที่ใหญ่กว่ามากเช่นกันซึ่งฉันจะให้ความรู้เบื้องต้นแก่คุณสักครู่ ...
Peter Taylor

@ PeterTaylor ขอบคุณสำหรับการเล่นกอล์ฟและคำใบ้
Dennis

ใช่การเปลี่ยนการแสดงผลลัพธ์เป็นการปรับปรุงที่ใหญ่กว่าแน่นอน มีวิธีที่ดีกว่าในการจัดการกรณีพื้นฐานเช่นกันซึ่งฉันเพิ่งค้นพบ แต่การเอาชนะวิธีแก้ปัญหาของคุณฉันต้องใช้ความคิดของคุณสองข้อ:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor

@ PeterTaylor นั่นวิเศษ1|มาก ขอบคุณอีกครั้ง!
เดนนิส

2

Mathematica, 88 ไบต์

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

ความมหัศจรรย์ของผู้ที่ไม่มีเอกสารประกอบ ...
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.