ถอดรหัสต้นไม้ปัจจัย


11

ในกรณีที่คุณพลาดEncode Factor Treesนี่คือคำจำกัดความของ Tree Factor:

  • สตริงว่างคือ 1
  • การต่อข้อมูลแสดงการคูณ
  • ตัวเลขn ที่อยู่ในวงเล็บ (หรืออักขระที่จับคู่) หมายถึงตัวเลขหลักที่nโดยที่ 2 เป็นหมายเลขเฉพาะตัวแรก
    • โปรดทราบว่าสิ่งนี้จะเกิดขึ้นซ้ำแล้วซ้ำ: n th prime เป็นต้นไม้ปัจจัยสำหรับnในวงเล็บ
  • ปัจจัยของจำนวนควรเรียงจากน้อยไปหามากที่สุด

ตัวอย่างเช่นนี่คือต้นไม้ปัจจัยสำหรับ 2 ถึง 10:

()
(())
()()
((()))
()(())
(()())
()()()
(())(())
()((()))

ความท้าทายนี้ใช้รูปแบบที่คล้ายคลึงกัน อย่างไรก็ตามความท้าทายนี้คือการถอดรหัสโครงสร้างเหล่านี้

กรณีทดสอบ

ขโมยอย่าง ไร้ยางอายrepurposedจากความท้าทายที่ผ่านมา

นอกเหนือจากข้อ 9 ข้างต้น ...

()()((()))((())) => 100
(()(()(()))) => 101
(()())(((())))(()(())) => 1001
(((((((()))))))) => 5381
(()())((((()))))(()()(())(())) => 32767
()()()()()()()()()()()()()()() => 32768

กฎระเบียบ

  • อักขระที่จับคู่ในอินพุตคือตัวเลือกของคุณคือวงเล็บ, วงเล็บ, วงเล็บปีกกาหรือวงเล็บเหลี่ยม ฉันอาจอนุญาตรูปแบบอื่น ๆ (เช่นแท็ก XML) หากถูกถาม
  • คุณควรจะสามารถจัดการต้นไม้ทรีสำหรับจำนวนใด ๆ ตั้งแต่ 2 ถึง 2 15หรือ 32768
  • เนื่องจากนี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


9

ภาษา Wolfram (Mathematica) , 52 45 ไบต์

ToExpression@*StringReplace[{"["->"Prime[1"}]

ลองออนไลน์!

อินพุตใช้วงเล็บเหลี่ยม

แปลงอินพุตให้เป็นนิพจน์ทางคณิตศาสตร์ที่คำนวณผลลัพธ์ เราทำเช่นนี้เพียงโดยการแทนที่ด้วย[ Prime[1ใช้งานได้เนื่องจากการต่อข้อมูลเป็นการคูณใน Mathematica


8

Prolog (SWI) , 134 128 127 124 ไบต์

คำตอบนี้เป็นส่วนหนึ่งของการทำงานร่วมกันระหว่างฉันกับ 0 ' เราทั้งคู่ทำสิ่งนี้ด้วยกันเหตุผลเดียวที่ฉันโพสต์คือเพราะฉันได้รับรางวัลร็อคกระดาษกรรไกร

\Q-->{Q=1};"(",\N,")",\B,{findnsols(N,I,(between(2,inf,I),\+ (between(3,I,U),0=:=I mod(U-1))),L)->append(_,[Y],L),Q is Y*B}.

ลองออนไลน์!

คำอธิบาย

คำตอบนี้เป็นแบบอย่างที่สมบูรณ์แบบของสิ่งที่ทำให้การเล่นกอล์ฟเป็นไปอย่างสนุกสนาน


คำตอบนี้ใช้ระบบที่มีประสิทธิภาพ Prologs สำหรับไวยากรณ์ประโยคที่ชัดเจน นี่คือหลักไวยากรณ์ของเรา

head(1)-->[].
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

กฎการก่อสร้างแรกคือ:

head(1)-->[].

สิ่งนี้จะบอก Prolog ว่าสตริงว่างสอดคล้องกับ 1

กฎการก่อสร้างข้อที่สองของเราซับซ้อนกว่าเล็กน้อย

head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.

สิ่งนี้บอกเราว่าสตริงที่ไม่ว่างใด ๆ มีวงเล็บอยู่รอบ clause ด้วยกฎเดียวกันนี้ทางด้านขวาของ clause ที่มีกฎเดียวกันเหล่านี้

นอกจากนี้ยังบอกเราว่ามูลค่าของข้อนี้ ( Q) เป็นไปตามกฎ:

{prime(N,Y),Q is Y*B}

หมดสภาพนี้Qเป็นผลิตภัณฑ์ของ 2 ตัวเลขและ Y เป็นเพียงค่าของส่วนคำสั่งทางด้านซ้ายและเป็นส่วนที่สำคัญที่เป็นค่าของส่วนคำสั่งในวงเล็บBBYNN

กฎนี้ครอบคลุมทั้งกฎการก่อตัวของทรีแฟคเตอร์

  • การต่อข้อมูลแบบทวีคูณ
  • สิ่งที่แนบมาใช้เวลาที่สำคัญที่

ตอนนี้สำหรับคำจำกัดความของคำกริยา ในเวอร์ชั่นที่ไม่ดีมีสองภาคที่เล่น (ในรหัสจริงของฉันฉันไปข้างหน้าล่ามโซ่ภาคไป) เพรดิเคตที่เกี่ยวข้องทั้งสองที่นี่คือisprime/1ซึ่งตรงกับจำนวนเฉพาะและprime/2ที่กำหนดNและYตรงกับ iff YคือNth ไพรม์ ก่อนอื่นเรามี

isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).

ผลงานของคำนิยามมาตรฐานสวยของ primality นี้เรายืนยันว่ามีจำนวนระหว่าง 2 และไม่Iรวมถึง 2 แต่ไม่ว่าแบ่งII

ภาคต่อไปนี้ก็ค่อนข้างง่าย

prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

เราใช้findnsolsเพื่อหาNตัวเลขแรกที่เป็นจำนวนเฉพาะเราจะคืนค่าตัวเลขสุดท้าย เคล็ดลับที่นี่คือในขณะที่findnsolsไม่รับประกันว่าจะหาช่วงเวลาที่น้อยที่สุด Nเพราะวิธีการที่ SWI จัดการbetweenนั้นจะพบช่วงเวลาที่เล็กกว่าในไม่ช้า อย่างไรก็ตามนี่หมายความว่าเราต้องตัดเพื่อป้องกันไม่ให้หาช่วงเวลาที่มากขึ้น


นักกอล์ฟ

เราสามารถส่งต่อเหตุผลในรหัสของเราสองครั้ง ตั้งแต่ใช้เพียงครั้งเดียวหมายของมันสามารถเคลื่อนย้ายภายในของisprime primeสิ่งต่อไปคือการย้ายprimeโดยตรงภายใน DCG อย่างไรก็ตามเนื่องจากเราใช้การตัดprimeเพื่อป้องกันfindnsolsการผลิตช่วงเวลาที่มากเกินไปเราจึงมีปัญหาเล็กน้อย การตัดเป็นการลด DCG ทั้งหมดแทนที่จะเป็นบิตที่เราต้องการ หลังจากการขุดเอกสารเล็กน้อยเราพบว่าonce/1สามารถใช้ตัดส่วนนี้ได้ แต่ไม่ใช่ DCG ทั้งหมด อย่างไรก็ตามการขุดเอกสารเพิ่มเติมพบว่า->ผู้ปฏิบัติงานสามารถใช้เพื่อทำงานที่คล้ายกันได้ ->ผู้ประกอบการคือประมาณเทียบเท่ากับ,!,เพื่อให้เราย้ายไปตัดของเราไปยังด้านอื่น ๆ ของและแทนที่ด้วยappend/3->

ใน SWI-Prolog predicates (และกฎ) สามารถให้โอเปอเรเตอร์เป็นชื่อซึ่งช่วยให้เราสามารถวางวงเล็บที่จำเป็นตามปกติ ดังนั้นเราสามารถบันทึก 6 \ไบต์โดยการเรียกกฎ



1

JavaScript (ES6), 98 ไบต์

แรงบันดาลใจจากnotjagan คำตอบของงูหลาม เปลี่ยนการแสดงออกของการป้อนข้อมูลให้เป็นสตริงที่ใหญ่และปฏิบัติการได้น่าเกลียด

s=>eval(s.split`)(`.join`)*(`.split`(`.join`(g=(n,k)=>(C=d=>n%--d?C(d):k-=d<2)(++n)?g(n,k):n)(1,`)

การผสานCและgฟังก์ชั่นเข้าด้วยกันอาจช่วยให้คุณประหยัดไบต์ได้ แต่จะต้องเรียกซ้ำอีกครั้ง

กรณีทดสอบ

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