ตัวเลขสองตัวมีแฟคทอเรียลที่ไม่ซ้ำกันหรือไม่?


11

แบ่งตัวเลขสองตัวเป็นแฟคทอเรียล หากพวกเขาแบ่งปันใด ๆ ส่งคืนค่าความเท็จ มิฉะนั้นส่งคืนค่าความจริง (ได้รับแรงบันดาลใจจากคำถามล่าสุดนี้ )

กล่าวอีกนัยหนึ่งให้เขียนหมายเลขอินพุตแต่ละตัวเป็นผลรวมของแฟคทอเรียล (ของจำนวนเต็มบวก) ด้วยวิธีที่เป็นไปได้ที่เป็นไปได้มากที่สุด ส่งกลับค่าความจริงหากไม่มีแฟคทอเรียลปรากฏขึ้นในการแทนทั้งคู่

ตัวอย่าง

ให้ 20 และ 49:

20 = 3! + 3! + 3! + 2!
49 = 4! + 4! + 1!

ไม่มีแฟคทอเรียลปรากฏขึ้นในการเป็นตัวแทนทั้งสองดังนั้นโปรดส่งคืนค่าความจริง

รับ 32 และ 132:

132 = 5! + 3! + 3!
 32 = 4! + 3! + 2!

3! ปรากฏในการรับรองทั้งสองดังนั้นส่งคืนค่าความผิดพลาด

I / O

input และ output สามารถผ่านวิธีมาตรฐานใด

ข้อมูลที่ป้อนจะเป็นจำนวนเต็มสองจำนวนที่ไม่ใช่ค่าลบเสมอ ไม่ จำกัด ขอบเขตบนของจำนวนเต็มเหล่านี้นอกเหนือจากภาษาที่คุณต้องการ

เอาท์พุทควรจะเป็นtruthy หรือ falsey ค่า ค่าเหล่านี้ไม่จำเป็นต้องสอดคล้องกันสำหรับอินพุตที่แตกต่างกันตราบใดที่เอาต์พุตทุกอย่างถูกต้องตามความเป็นจริง / เท็จ

กรณีทดสอบ

หากอินพุตหนึ่ง0คำตอบจะเป็นจริงเสมอ กรณีทดสอบจริงอื่น ๆ :

{6, 3}, {4, 61}, {73, 2}, {12, 1}, {240, 2}, {5, 264}, {2, 91}, {673, 18},
 {3, 12}, {72, 10}, {121, 26}, {127, 746}

หากทั้งสองอินพุทเป็นจำนวนเต็มคี่หรือถ้าทั้งสองอินพุทเป็นจำนวนเต็มบวกเหมือนกันเอาต์พุตจะเป็นเท็จเสมอ กรณีทดสอบอื่น ๆ :

{8, 5}, {7, 5}, {27, 47}, {53, 11}, {13, 123}, {75, 77}, {163, 160}, {148, 53},
 {225, 178}, {285, 169}, {39, 51}, {207, 334}, {153, 21}, {390, 128}, {506, 584},
 {626, 370}, {819, 354}

นี่คือซึ่งมีจำนวนน้อยที่สุดที่จะชนะ!


"เขียนแต่ละหมายเลขอินพุตเป็นผลรวมของแฟคทอเรียล (ของจำนวนเต็มบวก) ด้วยวิธีที่เป็นไปได้มากที่สุด" คุณไม่ได้หมายถึงวิธีที่ขี้เกียจที่สุดใช่ไหม?
user41805

4
@KritixiLithos no. เขาอ้างถึงคลาสของอัลกอริทึมที่รู้จักกันในชื่ออัลกอริทึมโลภซึ่งทำงานโดยการเพิ่มตัวชี้วัดหลังจากแต่ละขั้นตอน เช่นเดียวกับที่ใช้เวลามากที่สุดเท่าที่จะทำได้
John Dvorak

คำตอบ:


9

เยลลี่ขนาด 7 ไบต์

Æ!ṠḄ&/¬

ลองออนไลน์!

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

Æ!ṠḄ&/¬  Main link. Argument: (x, y) (pair of integers)

Æ!       Convert x and y to factorial base.
  Ṡ      Apply the sign function to each digit.
   Ḅ     Unbinary; convert each resulting Boolean array from base 2 to integer.
    &/   Reduce the resulting pair of integers by bitwise AND.
      ¬  Take the logical NOT of the result.

Æ!ดูเหมือนว่ามีประโยชน์อย่างบ้าคลั่งในบางสถานการณ์
Magic Octopus Urn

มีสิ่งใดบ้างที่จะได้รับจากการพยายามคูณจำนวนเต็มในรายการแฟคทอเรียลโดยตรงโดยไม่ต้องมีสัญญาณ?
เกร็กมาร์ติน

@ GregMartin ฉันไม่คิดอย่างนั้น อาเรย์ตัวเลขจะต้องมีการเสริมหรือตัดให้มีความยาวเท่ากันซึ่งอาจมีค่าใช้จ่ายมากกว่าไบต์ที่บันทึกไว้
Dennis



2

JavaScript (ES6), 71 ไบต์

(a,b,g=(n,e=1,f=1)=>n>=f&&g(n,++e,f*e)+((n/f|0)%e&&1<<e))=>!(g(a)&g(b))

จำนวนเต็มของ JavaScript ถูก จำกัด ไว้ที่ 53 บิตซึ่งมีความแม่นยำเพียง 18 บิตเท่านั้น นี่หมายความว่าฉันสามารถใช้หน้ากากขนาด 18 บิตเพื่อติดตามว่าแฟคทอเรียลใดที่จำเป็น



0

Mathematica, 73 ไบต์

F[x_]:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[F@#,F@#2]&

แบบฟอร์มการป้อนข้อมูล

[x1, x2]


ฉันได้รับข้อผิดพลาดหลายการทดสอบนี้ ...
สกอตต์มิลเนอร์

เพียงพิมพ์ที่ส่วนท้าย [x1, x2]
J42161217

อา. ฉันกำลังป้อนรายการแทนที่จะเป็นจำนวนเต็มสองจำนวนแยกกัน คุณสามารถตีกอล์ฟเพิ่มได้ด้วย±x_:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[±#,±#2]&[4,61](69 ไบต์) ในการเข้ารหัส ISO 8859-1 ±คือหนึ่งไบต์
Scott Milner

0

C, 122 119 ไบต์

G(q,i){return gamma(q+1)>i?gamma(q):G(q+1,i);}
Q(a,b,u,v){while(a&&b){a-=u=G(1,a);b-=v=G(1,b);if(a==b)exit();}exit(0);}

Qเป็นหน้าที่หลัก ควรเรียกใช้ด้วยค่าจำนวนเต็มบวกสองค่า ทางออกนี้มีรหัสทางออกของ0เพื่อความจริงและ1เป็นเท็จ

แม้ว่าสิ่งนี้จะไม่สามารถใช้งานได้กับ TIO แต่ก็ใช้ได้กับระบบของฉันด้วยHomebrew ที่ให้gcc 7.1.0ไว้

ฉันไม่ได้เล่นกอล์ฟมาCระยะหนึ่งแล้วดังนั้นเคล็ดลับการเล่นกอล์ฟจึงเป็นที่นิยมอย่างมาก!

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