KenKen Puzzle Helper - ลดลำดับที่ไม่ต้องสั่งซื้อ

Aug 19 2020

ในตัวอย่างต่อไปนี้ฉันกำลังสร้างตัวแปรทั้งหมดของไฟล์ $9 \times 9$ ปริศนา KenKenที่มาในกลุ่มสามกลุ่มโดยใช้การเพิ่มที่ส่งผลให้$18$.

  data = Select[Tuples[Range[9], 3], Plus @@ # == 18 &]

สิ่งนี้สร้าง

$\{\{1,8,9\},\{1,9,8\},\{2,7,9\},\{2,8,8\},\{2,9,7\},\{3,6,9\},\{3,7,8\},\{3,8,7\},\{3,9,6\},\{4,5,9\},\{4,6,8\},\{4,7,7\},\{4,8,6\},\{4,9,5\},\{5,4,9\},\{5,5,8\},\{5,6,7\},\{5,7,6\},\{5,8,5\},\{5,9,4\},\{6,3,9\},\{6,4,8\},\{6,5,7\},\{6,6,6\},\{6,7,5\},\{6,8,4\},\{6,9,3\},\{7,2,9\},\{7,3,8\},\{7,4,7\},\{7,5,6\},\{7,6,5\},\{7,7,4\},\{7,8,3\},\{7,9,2\},\{8,1,9\},\{8,2,8\},\{8,3,7\},\{8,4,6\},\{8,5,5\},\{8,6,4\},\{8,7,3\},\{8,8,2\},\{8,9,1\},\{9,1,8\},\{9,2,7\},\{9,3,6\},\{9,4,5\},\{9,5,4\},\{9,6,3\},\{9,7,2\},\{9,8,1\}\}$

จากนั้นฉันสามารถค้นหากรณีที่เกิดซ้ำโดยไม่ต้องสั่งได้

  Cases[data, {OrderlessPatternSequence[1, 8, 9]}]

สิ่งนี้สร้างขึ้น (ฉันต้องการลบทั้งหมดหลังจากนั้น $198$ จากข้อมูล แต่จะทำสำหรับชุดตัวเลขสามหลักที่ไม่ซ้ำกันแต่ละชุด)

$$\{\{1,8,9\},\{1,9,8\},\{8,1,9\},\{8,9,1\},\{9,1,8\},\{9,8,1\}\}$$

วิธีนี้มีข้อบกพร่องสองประการฉันต้องรู้ลำดับที่จะทดสอบจากนั้นฉันสามารถใช้วิธีนั้นเพื่อทิ้งการทำซ้ำทั้งหมดจากข้อมูล ฉันจะต้องทำซ้ำสำหรับลำดับที่ไม่ซ้ำกันถัดไป

มีวิธีง่ายๆในการสร้าง

 data2 = some_fancy_command[data]

มันสร้าง data2 (หมายเหตุ - ฉันไม่สนใจเกี่ยวกับเครื่องหมายจุลภาคเช่นกัน) ซึ่งมีตัวเลข 3 หลักที่ไม่ซ้ำกันโดยไม่คำนึงถึงลำดับ

$$\{\{189\},\{279\},\{288\}\},\{369\},\{378\}\}... $$

วิธีที่ง่ายที่สุดในการทำคืออะไร?

สังเกตว่าฉันคุ้นเคยกับ https://community.wolfram.com/groups/-/m/t/478684/แต่ต้องการเพียงผู้ช่วยเมื่อเทียบกับผู้แก้ปัญหา

นอกเหนือ: เป้าหมายของฉันคือการมีเครื่องมือที่ทำซ้ำได้อย่างมีประสิทธิภาพ https://homepages.bluffton.edu/~nesterd/apps/kenkenhelp.html อาจจะเป็น CDF ของสมุดบันทึก MMA ที่ฉันเข้าไปในกรงทั้งหมดประเภทขนาดของปริศนาและมันให้คำแนะนำเกี่ยวกับตัวเลขทั้งหมดที่สามารถเข้าไปในกรงได้

คำตอบ

2 flinty Aug 19 2020 at 03:31
triples = Select[Sort /@ IntegerPartitions[18,{3},Range[9]], DuplicateFreeQ]

FromDigits /@ triples
(* {189, 279, 369, 459, 378, 468, 567} *)

หากคุณอนุญาตตัวเลขซ้ำแล้ว:

FromDigits@*Sort /@ IntegerPartitions[18, {3}, Range[9]]
(* {189, 279, 369, 459, 288, 378, 468, 558, 477, 567, 666} *)