Karelerde Simetri Bulma


14

Pozitif tamsayılar listesini alan bir program veya işlev yazın. Bu tamsayıların her biri 2B düzlemdeki bir karenin yan uzunluğunu temsil eder. Her kare düzlemdeki herhangi bir tamsayı koordinatına taşınabilir, ancak dönemez ve diğer karelerle çakışamaz.

Her kare için farklı bir yazdırılabilir ASCII karakteri kullanarak (boşluk için kullanılan alan hariç), programınızın / fonksiyonunuzun yatay veya dikey yansıma simetrisine sahip karelerin herhangi bir tek düzenini yazdırması gerekir. Böyle bir düzenleme yoksa hiçbir şey yazdırılmamalıdır.

Kareler farklı karakterlerdir, böylece ayrı ayrı söylenebilirler. Sadece tüm karelerin birleşmesi ile yapılan şeklin simetrik olması gerekir. Listenin 94'ten fazla öğe içermediğini varsayabilirsiniz (94 karakter olduğu için).

Örneğin, girdiyse, [2, 1, 2, 2, 2]olası bir çıktı:

DD--
DD--
Z
FFPP
FFPP

Bu şeklin yatay bir yansıma simetrisi çizgisi vardır; üst ve alt yarıları ayna görüntüleridir. Diğer bazı olasılıklar şunlardır: (Aynı karakterden iki kare yapılmadığı sürece karelerin dokunması gerekmediğini ve herhangi bir karakterin kullanılabileceğini unutmayın.)

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

     11 33
     11 33

    22   44
    22   44

Simetri satırı, karakterler arasındaki sınır da olabilir, örneğin [2, 4]:

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

Bazı kareler kümelerini simetrik olarak düzenlemek imkansızdır, örneğin [1, 2, 3]:

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

Kare sınırları olmasa bile genel şeklin simetrik olabileceğini unutmayın. örneğin için geçerli bir çıktı [2, 1, 1, 1, 1, 4]:

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

Benzer şekilde, için geçerli bir çıktı [1, 1, 2, 3, 5]:

44444
44444
44444
44444
44444
33301
33322
33322

notlar

  • Giriş listesinde her zaman 1 ila 94 öğe olacaktır.
  • Girdiyi makul bir şekilde alın: stdin, komut satırı, metin dosyası, işlev arg. İhtiyaçlarınıza uyacak şekilde biraz biçimlendirilebilir, örneğin {1, 2, 3, 4}veya [1 2 3 4].
  • Stdout veya benzeri çıktılar. Ortaya çıkan şekil simetri çizgisine sahip olduğu sürece, herhangi bir miktarda öndeki / arkadaki boşluklar veya satırsonları iyidir.
  • Çapraz bir simetri çizgisi sayılmaz (aksi takdirde bu çok kolay olurdu). Ayrıca, dönel veya geçişli değil, yansıtıcı simetri olmalıdır.
  • Dürüst olmak gerekirse, bu görevin hesaplama açısından ne kadar zor olduğundan emin değilim. Sorunun bazı alt kümelerini çözen kısmi yanıtlar gönderebilirsiniz (özellikle özellikle akıllı bir algoritma göstermek istiyorsanız). Bunlar kazanmaya uygun değil.
    • Örneğin, girdinin her zaman en az bir simetrik düzene sahip olduğunu varsayabilirsiniz (bu nedenle listeler [1, 2, 3]asla girilmez).
    • Ya da, örneğin, sadece kare sınırlarının ve genel şeklin simetrik olduğu düzenlemeleri düşünebilirsiniz. Bu durumda [1, 1, 2, 3, 5]çıktı olmaz.
    • Eğer çıldırmak istiyorsanız, fikri dikdörtgenlere, hatta poliminolara kadar genişletebilirsiniz .

puanlama

Puanınız, programınızın bayt cinsinden boyutudur . En düşük puan kazanır. Tiebreaker ilk gönderilen cevaba gider.


2
[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]Çözüm için bonus puan , ancak soru çok daha fazla özgürlük verdiği için muhtemelen başka çözümler var.
Sp3000

Yanıtlar:


4

Python 2, 460 452 437 bayt

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)

Şimdilik sadece hafifçe golf oynadım, ama işlere başlamak için bir şey. exec10 ve 12. satırlar için kullanmayı denedim , ama nedense bana izin vermedi.

Listeyi LSTDIN ile girin, örn [2, 1, 2, 2, 2]. Program sadece kareler bir sum(L) x sum(L)ızgara içine yerleştirmek için her olasılığı dener .

Örnek çıktı (kompaktlık için boş satırlar kaldırıldı):

[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)

Biraz daha az kafa karıştırıcı sürüm (452 ​​bayt):

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)

Sadece boş satır ve sütun şerit unuttum gerçekleştirilen Calvin'sHobbies @ (ki yapılandırma ile ilgili olarak simetrik olmak zorunda olduğu anlamına olurdu tahta gibi). [1, 1, 2, 3, 5]şimdi iyi çalışıyor.
Sp3000

Ah. Kaba kuvvetin sonsuza dek sürdüğünü düşündüm.
Calvin'in Hobileri

@ Calvin'sHobbies Daha büyük kartlar için yapar, ancak ek kısıtlamalar koymak daha da kötüleştirir: P
Sp3000 17:15

Girinti hilesini kullanarak bazı karakterleri kaydedebileceğinizi düşünüyorum .
Calvin'in Hobileri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.