Mathematica ขนาด 180 ไบต์
(f=Flatten@#;p=Partition)[If[Tr[1^VertexComponent[r~Graph~Cases[##&@@p[#,2,1]&/@Join[g=p[r,5],g],{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b],#]]<3,f[[#]],"x"]&/@(r=Range@25),5]&
คำอธิบาย:
(f=Flatten@#;p=Partition)[
If[
Tr[1^VertexComponent[
r~Graph~Cases[
##&@@p[#,2,1]&/@Join[g=p[r,5],g],
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b
],
#
]]<3,
f[[#]],
"x"
]&/@(r=Range@25),
5
]&
ฟังก์ชั่นบริสุทธิ์ซึ่งยอมรับ5x5อาร์เรย์ เป็น 3 ไบต์ส่วนตัวใช้ตัวอักษรที่เป็นตัวแทนของผู้ประกอบการU+F3C7 postfix transpose\[Transpose]
(f=Flatten@#;p=Partition): flattens fรายการการป้อนข้อมูลและเก็บไว้ใน ตั้งค่าp = Partitionและส่งคืน
g=p[r,5]: อาร์เรย์{{1,2,3,4,5}, ..., {21,22,23,24,25}}(นี่เป็นเพราะrตั้งค่าเป็นRange@25)
Join[g=p[r,5],g]: gรายการของแถวและคอลัมน์ของ
p[#,2,1]&: ฟังก์ชั่นบริสุทธิ์ซึ่งพาร์ทิชันรายการ#ลงในรายการย่อยของความยาว2ด้วยการทับซ้อน1; #คือรายชื่อของคู่ที่อยู่ติดกันใน
##&@@p[#,2,1]&: Sequenceเหมือนข้างบนยกเว้นว่ามันจะส่งกลับ
##&@@p[#,2,1]&/@Join[g=p[r,5],g]: แผนที่ฟังก์ชั่นก่อนหน้าของแถวและคอลัมน์ของการขอรับรายการทั้งหมดของรายการที่อยู่ติดกันในg gไส้ของฉันบอกว่ามีวิธีที่สั้นกว่าในการทำเช่นนี้
r~Graph~Cases[...]: กราฟที่มีจุดยอดเป็นจำนวนเต็ม1, ..., 25และมีขอบเป็นขอบระหว่างรายการที่อยู่ติดกันgซึ่งมีรายการที่สอดคล้องกันในอาร์เรย์อินพุต (นอกเหนือจาก" ")
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ": รูปแบบซึ่งตรง{a,b}เช่นที่f[[a]] == f[[b]](ค่าเดียวกันในอาร์เรย์การป้อนข้อมูล) " "และที่ไม่ได้เท่ากับ ตั้งค่าA = f[[a]]ให้บันทึก1ไบต์
...:>a<->b: แทนที่ทุกนัดด้วยขอบที่ไม่ได้บอกทิศทางจาก a ถึง b
VertexComponent: ส่งคืนส่วนประกอบที่เชื่อมต่อของอาร์กิวเมนต์ที่สอง (จุดสุดยอด) ในอาร์กิวเมนต์แรก (กราฟ)
Tr[1^VertexComponent[...]]: ขนาดของส่วนประกอบที่เชื่อมต่อ บันทึกไบต์จาก1Length@VertexComponent[...]
If[Tr[...]<3,f[[#]],"x"]&: ฟังก์ชั่นเพียวซึ่งจะนำเข้าใน# gหากขนาดของส่วนประกอบที่เชื่อมต่อมีค่าน้อยกว่า3ให้แทนที่ด้วยรายการที่สอดคล้องกันในอินพุต "x"มิฉะนั้นแทนที่ด้วย
(f=Flatten@#;p=Partition)[...,5]: และในที่สุดก็ก่อร่างใหม่ผลลัพธ์ที่จะเป็น5x5อาร์เรย์