หลักการการเปลี่ยนแปลงของ Pigeon-hole


25

ในเกมซูโดกุผู้เล่นหลายคนชอบที่จะ "จับ" ตัวเลขที่เป็นไปได้ที่สามารถไปในแต่ละตาราง:

แถว Sudoku

แถวด้านบนสามารถแสดงเป็นอาร์เรย์ได้:

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [1,2,4], [8]]

ตอนนี้สังเกตเห็นว่ามีเพียง 1 แห่งที่4สามารถไปได้ สิ่งนี้ช่วยให้เราลดความซับซ้อนของรายการด้านบนเพื่อ

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [4], [8]]

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

เป็นอีกตัวอย่างหนึ่งสมมติว่าคุณมีความเป็นไปได้หลายอย่างดังต่อไปนี้:

[[0,1,3], [0,2,3], [1,2], [1,2]]

สองสถานที่สุดท้ายจะต้องเต็มไปด้วย 1 และ 2 ดังนั้นเราสามารถลบความเป็นไปได้เหล่านั้นออกจากสององค์ประกอบแรกในอาร์เรย์:

[[0,3], [0,3], [1,2], [1,2]]

เป็นอีกตัวอย่าง:

[[0,1,2,3], [0,2], [0,2], [0,2]]

มันเป็นไปไม่ได้ที่จะสร้างการเปลี่ยนแปลงจากความเป็นไปได้ดังกล่าวข้างต้นเป็นมีเพียง 1 สถานที่สำหรับทั้งสอง1และ3และคุณจะต้องการที่จะกลับอาร์เรย์ที่ว่างเปล่า

คุณต้องป้อนรายการความเป็นไปได้และส่งออกความเป็นไปได้ที่เหลืออยู่หลังจากกำจัดจำนวนความเป็นไปได้สูงสุดแล้ว

  • หากไม่สามารถกำหนดอาเรย์เฉพาะได้คุณต้องส่งคืนอาเรย์ที่ว่างเปล่าหรืออาเรย์ที่หนึ่งในอาเรย์ย่อยนั้นว่างเปล่า
  • คุณอาจคิดว่าอาร์เรย์จะมีรูปแบบที่ดีและมีองค์ประกอบอย่างน้อย 1 รายการ
  • เมื่อกำหนดขนาดของอาร์เรย์Nคุณสามารถสมมติว่าตัวเลขใน subarray นั้นจะอยู่ในช่วง[0:N)และเสมอN <= 10
  • คุณอาจไม่คิดว่าทุกหมายเลขจาก0ถึงN-1จะมีอยู่
  • คุณอาจสันนิษฐานว่าตัวเลขภายในหนึ่ง subarray นั้นไม่ซ้ำกัน
  • หากระบบย่อยมีความเป็นไปได้เพียงครั้งเดียวคุณสามารถแสดงความเป็นไปได้ในอาร์เรย์หรือด้วยตัวมันเอง [[1],[2],[0]], [1,2,0], [[1,2],0,[1,2]]ถูกต้องทั้งหมด
  • คุณอาจยอมรับอาร์เรย์ในรูปแบบสตริงที่เหมาะสมหรือในรูปแบบรายการ / อาร์เรย์
  • subarrays สามารถอยู่ในลำดับใดก็ได้
  • -1แทนที่จะจัดการกับอาร์เรย์มอมแมมคุณแผ่นสามารถล้างสถานที่ที่มี

กรณีทดสอบ

[[0]]                                         -> [[0]]
[[1],[0]]                                     -> [[1],[0]]
[[1],[1]]                                     -> []
[[1],[0,1]]                                   -> [[1],[0]]
[[0,1,2],[1,2],[1,2]]                         -> [[0],[1,2],[1,2]]
[[0,1],[1,2],[0,2]]                           -> [[0,1],[1,2],[0,2]]
[[2,1],[1,2],[1,2]]                           -> []
[[0,3],[2,1],[3,0],[3,2]]                     -> [[0,3],[1],[0,3],[2]]
[[0,1],[0,1],[2,3],[2,3,0]]                   -> [[0,1],[0,1],[2,3],[2,3]]
[[0,1],[0,3],[3,2],[0]]                       -> [[1],[3],[2],[0]]
[[3,5,2],[0,2,4],[4,0],[0,1,3,5],[2,1],[2,4]] -> [[3,5],[0,2,4],[4,0],[3,5],[1],[2,4]]
[[6,9,8,4],[4,5],[5,3,6],[3,8,6,1,4],[3,1,9,6],[3,7,0,2,4,5],[9,5,6,8],[6,5,8,1,3,7],[8],[8,0,6,2,5,6,3]] -> [[6,9,4],[4,5],[5,3,6],[3,6,1,4],[3,1,9,6],[0,2],[9,5,6],[7],[8],[0,2]]
[[3,5,0],[5,7],[5,1,2],[1,3,0],[5,3],[5,0],[5,3,7,8,0,6],[7,5,0,1,8],[1,0,8],[0,6]] -> []
[[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]] -> [[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]]
[[2,6,0],[0,4,3],[0,6,2],[0,7],[0,9,2,3,6,1,4],[1,7,2],[2,7,8],[8,6,7],[6,5,2,8,0],[5,8,1,4]] -> [[2,6,0],[3],[0,6,2],[0,7],[9],[1],[2,7,8],[8,6,7],[5],[4]]
[[8],[8,0,6,5,7,2,4,1],[8,6,9,3,5,0,7],[3,9,1,0],[9],[9,2,6],[2,8,3],[3,1,6,8,2],[6],[6,4,5,3,0,7]] -> [[8],[5,7,4],[5,7],[0],[9],[2],[3],[1],[6],[4,5,7]]
[[8,1,0],[5,8,7,6,2,0],[6,8,2],[2,4,0,9],[4,1,7,3,6,8],[8,1],[8,0,3],[0,8,2],[0,8,3],[1,8,0]] -> []

นี่คือเพื่อให้คำตอบของคุณสั้นที่สุด!


จำนวนใดที่มากกว่า 9
Leun Nun

คุณไม่จำเป็นต้องสนับสนุนตัวเลขที่มากกว่า 9
นาธานเมอร์ริลล์

ฉันจะกลับมาพร้อมรายการที่ซ้ำกันในระบบย่อยหรือไม่
Leun Nun

@LeakyNun ไม่ หัวข้อย่อยสามารถมีองค์ประกอบที่ไม่ซ้ำกันได้เท่านั้น
Nathan Merrill

ฉันคิดว่าคุณมีข้อผิดพลาดในกรณีทดสอบครั้งที่สี่ รายการย่อยรายการใดรายการหนึ่งอยู่ในวงเล็บปีกกาสองครั้ง
TheBikingViking

คำตอบ:


17

Brachylogขนาด 21 ไบต์

:1fz:da|,[]
:2a#d
:Am

ลองออนไลน์!

ลองออนไลน์!

กริยา 0 (เพรดิเคตหลัก)

:1fz:da|,[]
:1f            Find all solutions of Predicate 1 using Input as Input.
   z           Transpose
    :da        Deduplicate each.
       |,[]    If there is no solution, return [] instead.

ภาค 1 (ภาคเสริม 1)

:2a#d
:2a     Each element of Output satisfies Predicate 2 with each element of Input as Input
   #d   Each element is different

ภาค 2 (ภาคเสริม 2)

:Am     Output is member of Input

8

เยลลี่ 10 ไบต์

Œp⁼Q$ÐfZQ€

ลองออนไลน์!

Œp⁼Q$ÐfZQ€   Main chain, argument: z

Œp           Cartesian product
  ⁼Q$Ðf      Filter for those that remain unchanged when uniquified
       Z     Transpose
        Q€   Uniquify each subarray

ดูเหมือนว่าจะไม่เหมาะสมสักเล็กน้อยในการรับสิทธิ์ 10 ไบต์เมื่อ Jelly ใช้อักขระนอก latin1 แสดงเป็น UTF-8 ลำดับข้างต้นต้องการ 16 ไบต์
Chris Becke

1
@ChrisBecke Jelly มีชุดอักขระของตัวเอง
Robin Gertenbach

และ - ถ้าฉันลองออนไลน์! - ฉันต้องส่ง 16 ไบต์
Chris Becke

@ChrisBecke ใช่ แต่ถ้าคุณดาวน์โหลด Jelly คุณจะต้องเขียนโปรแกรมขนาด 10 ไบต์เท่านั้น
Leun Nun

และบันทึกไว้ในไฟล์ข้อความฉันไม่สามารถแก้ไขด้วยสิ่งอื่นนอกจากเจลลี่ได้หรือไม่ จากเหตุผลนั้นถ้าเยลลี่บีบอัดโปรแกรมเราควรนับจำนวนไบต์ที่บีบอัดเท่านั้น?
Chris Becke




2

Python 3, 101 99 ไบต์

ขอบคุณ @TLW สำหรับ -2 ไบต์

from itertools import*
lambda x:list(map(set,zip(*[i for i in product(*x)if len(i)==len(set(i))])))

ฟังก์ชั่นที่ไม่ระบุชื่อที่รับอินพุตผ่านการโต้แย้งของรายการและส่งกลับรายการชุด

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

from itertools import*        Import Python's library for iterator generation
lambda x                      Anonymous function with input possibilities x as a
                              list of lists
...for i in product(*x)...    For i in the Cartesian product of x, ie all candidate
                              arrangements:
[...if len(i)==len(set(i))]    Filter into list by non-duplicity (set removes
                               duplicates, so there are no duplicates if the length
                               of i is the same as the length of the set of
                               the elements of i)
zip(*...)                     Unpack and take the transpose, leaving the modified
                              possibilities with duplicates
map(set,...)                  Remove duplicates
:list(...)                    Return the modified possibilities as a list of sets

ลองใช้กับ Ideone


list(map(set,สั้นกว่าฉันคิดว่า
TLW


0

PHP, 245 231 ไบต์

131 117 สำหรับฟังก์ชั่นผลิตภัณฑ์คาร์ทีเซียน 114 สำหรับสิ่งอื่น ๆ

function c($a){if ($a){if($u=array_pop($a))foreach(c($a)as$p)foreach($u as$v)yield $p+[count($p)=>$v];}else yield[];}
function p($a){foreach(c($a)as$i)if(max(array_count_values($i))<2)foreach($i as$k=>$v)$r[$k][$v]=$v;return$r?:[];}

ฉันพบปัญหาหน่วยความจำในบางกรณีทดสอบด้วยฟังก์ชั่นวนซ้ำสำหรับผลิตภัณฑ์คาร์ทีเซียน ทำงานได้ดีขึ้นด้วยระดับกำเนิดนี้function c($a){$b=[];foreach($a as$i)$b[]=new \ArrayIterator($i);return new CartesianProductIterator($b);}และ
แต่ตัวกำเนิดของฉันสั้นลงและทำงานเหมือนเดิม

อย่างไรก็ตามตัวอย่างที่มีขนาดใหญ่กว่าส่งผลให้เกิดข้อผิดพลาดภายในของเซิร์ฟเวอร์ (ทั้งที่มีตัววนซ้ำและตัวสร้าง) หลังจากผ่านไประยะหนึ่งบนเครื่องของฉัน ขณะนี้ไม่มีเวลาที่จะตรวจสอบบันทึกเซิร์ฟเวอร์โชคไม่ดี

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