ค้นหาสมมาตรในกำลังสอง


14

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

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

สี่เหลี่ยมเป็นตัวละครที่แตกต่างกันเพื่อให้พวกเขาสามารถแยกออกจากกัน เฉพาะรูปร่างที่ทำโดยสหภาพของสี่เหลี่ยมทั้งหมดจะต้องมีความสมมาตร คุณสามารถสันนิษฐานได้ว่ารายการจะไม่มีองค์ประกอบมากกว่า 94 องค์ประกอบ (เนื่องจากมี 94 ตัวอักษร)

ตัวอย่างเช่นถ้าอินพุต[2, 1, 2, 2, 2]เป็นเอาต์พุตที่เป็นไปได้คือ:

DD--
DD--
Z
FFPP
FFPP

รูปร่างนี้มีเส้นแนวนอนของสมมาตรการสะท้อนแสง ครึ่งบนและล่างของมันเป็นภาพสะท้อน นี่คือความเป็นไปได้อื่น ๆ : (โปรดทราบว่าช่องสี่เหลี่ยมไม่จำเป็นต้องสัมผัสและสามารถใช้อักขระใด ๆ ได้ตราบใดที่ไม่มีช่องสี่เหลี่ยมสองช่องที่สร้างด้วยอักขระตัวเดียวกัน)

  55
  55
  %%
  %%
@
  HH
  HH
  ((
  ((
       G

     11 33
     11 33

    22   44
    22   44

เส้นสมมาตรอาจเป็นขอบเขตระหว่างตัวละครเช่นสำหรับ[2, 4]:

!!!!
!!!!  ++
!!!!  ++
!!!!

ชุดสี่เหลี่ยมบางชุดเป็นไปไม่ได้ที่จะจัดสมมาตรเช่น[1, 2, 3]:

AAA BB C
AAA BB         (these can't be vertically or horizontally symmetric => no output)
AAA

และจำไว้ว่ารูปร่างโดยรวมอาจจะสมมาตรแม้ว่าจะไม่ใช่ขอบเขตสี่เหลี่ยม เช่นผลลัพธ์ที่ถูกต้องสำหรับ[2, 1, 1, 1, 1, 4]คือ:

AA----
AA----
BC----
DE----

ในทำนองเดียวกันผลลัพธ์ที่ถูกต้องสำหรับ[1, 1, 2, 3, 5]คือ:

44444
44444
44444
44444
44444
33301
33322
33322

หมายเหตุ

  • รายการอินพุตจะมีองค์ประกอบตั้งแต่ 1 ถึง 94 เสมอ
  • รับอินพุตด้วยวิธีที่สมเหตุสมผล: stdin, command line, text text, function arg มันสามารถจัดรูปแบบเล็กน้อยเพื่อให้เหมาะกับความต้องการของคุณเช่นหรือ{1, 2, 3, 4}[1 2 3 4]
  • ส่งออกไปยัง stdout หรือคล้ายกัน จำนวนช่องว่างนำหน้า / ต่อท้ายหรือการขึ้นบรรทัดใหม่จะเป็นจริงตราบใดที่รูปร่างที่ได้มีลักษณะสมมาตร
  • เส้นสมมาตรของเส้นทแยงมุมจะไม่นับ (มิเช่นนั้นคงง่ายมาก) นอกจากนี้จะต้องมีการสะท้อนความสมมาตรไม่หมุนหรือการนำส่ง
  • ฉันไม่แน่ใจว่างานนี้ยากแค่ไหนในการคำนวณ คุณอาจโพสต์คำตอบบางส่วนที่แก้ปัญหาบางส่วนของปัญหา (โดยเฉพาะถ้าคุณต้องการแสดงอัลกอริทึมที่ฉลาดเป็นพิเศษ) สิ่งเหล่านี้ไม่มีสิทธิ์ชนะ
    • ตัวอย่างเช่นคุณอาจสมมติว่าอินพุตมีการจัดเรียงสมมาตรอย่างน้อยหนึ่งครั้งเสมอ (ดังนั้นรายการ[1, 2, 3]จะไม่มีการป้อนข้อมูล)
    • หรือตัวอย่างเช่นคุณอาจพิจารณาเฉพาะการจัดเรียงที่ขอบเขตของสี่เหลี่ยมจัตุรัสรวมถึงรูปร่างโดยรวมมีความสมมาตร ในกรณีนี้[1, 1, 2, 3, 5]จะไม่มีผลลัพธ์
    • หากคุณต้องการที่จะไปบ้าคุณสามารถขยายความคิดที่จะสี่เหลี่ยมหรือแม้กระทั่งpolyominoes

เกณฑ์การให้คะแนน

คะแนนของคุณคือขนาดของโปรแกรมของคุณในไบต์ คะแนนต่ำสุดชนะ Tiebreaker จะตอบคำตอบที่โพสต์ก่อน


2
คะแนนโบนัสสำหรับการแก้[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]แม้ว่าคำถามจะให้อิสระมากขึ้น แต่ก็มีวิธีแก้ปัญหาอื่น ๆ
Sp3000

คำตอบ:


4

Python 2, 460 452 437 ไบต์

exec"""def f(L):
 if[]==L:
  X{2}[map(" ".__lt__,q)for q in G]);Z{2}zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x)
 for n in range(T*T):
  i=n%T;j=n/T
  if all({1}=" "{0}):
{0}:{1}chr(32+len(L))
   r=f(L[:-1])
{0}:{1}" "
   if r:return r""".format("   for a,b in[(a,b)for a in R for b in R]","G[i+a][j+b]=","=filter(sum,")
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

ตอนนี้เล่นกอล์ฟเพียงเล็กน้อยเท่านั้น แต่นี่คือสิ่งที่จะเริ่มต้น ฉันพยายามใช้execสำหรับบรรทัดที่ 10 และ 12 แต่ด้วยเหตุผลบางอย่างมันไม่ได้ทำให้ฉัน

การป้อนข้อมูลรายการLผ่าน STDIN [2, 1, 2, 2, 2]เช่น โปรแกรมจะพยายามวางสี่เหลี่ยมในsum(L) x sum(L)ตาราง

เอาต์พุตตัวอย่าง (ลบบรรทัดว่างเพื่อความกะทัดรัด):

[2, 1, 2, 2, 2]

%%       
%%       
$$       
$$       
"        
##       
##       
!!       
!!      

[2, 4]

""""  
""""  
""""  
""""  
 !!   
 !!   

[2, 1, 1, 1]

$!!  
#!!  
 "   

[1, 1, 2, 3, 5]

%%%%%       
%%%%%       
%%%%%       
%%%%%       
%%%%%       
$$$##       
$$$##       
$$$"!       

[1, 4, 1, 8]

$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
# """" !      
  """"        
  """"        
  """"        

[8, 1, 4, 1]

$   !!!!!!!!  
    !!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
    !!!!!!!!  
"   !!!!!!!!  

(The algorithm starts placing from the last square first, prioritising left then up)

รุ่นที่สับสนน้อยกว่าเล็กน้อย (452 ​​ไบต์):

def f(L):
 if[]==L:
  X=filter(sum,[map(" ".__lt__,q)for q in G]);Z=filter(sum,zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x);V=[(a,b)for a in R for b in R]
 for n in range(T*T):
  i=n%T;j=n/T
  if all(G[i+a][j+b]<"!"for a,b in V):
   for a,b in V:G[i+a][j+b]=chr(32+len(L))
   r=f(L[:-1])
   for a,b in V:G[i+a][j+b]=" "
   if r:return r
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

@ งานอดิเรกของ Calvin ฉันเพิ่งรู้ว่าฉันลืมที่จะตัดแถวและคอลัมน์ที่ว่างเปล่า (ซึ่งก็หมายความว่าโครงแบบนั้นต้องสมมาตรเทียบกับบอร์ดด้วย) [1, 1, 2, 3, 5]ตอนนี้ทำงานได้ดี
Sp3000

อา. ฉันคิดว่ากำลังดุร้ายกำลังดำเนินไปตลอดกาล
งานอดิเรกของ Calvin

@ Calvin'sHobbies ใช้สำหรับกระดานขนาดใหญ่ แต่การเพิ่มข้อ จำกัด ก็ยิ่งทำให้แย่ลง: P
Sp3000

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