Bir hexomino'yu bir küpün içine katlayabilir misiniz?


24

Çocuğumun en sevdiği oyuncaklarından biri de böyle bir set . Aslında en sevdiğim oyuncaklardan biri - Onunla oynuyordum ve bana bazı PPCG meydan okuma fikirleri veriyor. Işte bir tane:

Giriş olarak ASCII çizgi çizen bir program veya işlev yazın ve bir küpün içine katlanıp katlanmayacağına karar verir.

Giriş

Girdi, bu gibi karelerden inşa edilen tam olarak bir hexomino'dan oluşacak

+-+
| |
+-+

Örneğin geçerli bir girdi heximino:

+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+

Çıktı

  • Eğer hexomino bir küpün içine katlanabiliyorsa, gerçek bir değer veya
  • Aksi takdirde bir falsey değeri.

Bize biraz iş kazandırmak için, wikipedia'ın güzel grafikleri var:

  • 35 hexomino'nun tümü:

  • Küp içine katlanan 11 hexomino:

notlar

  • Giriş heksominoları, sadece yukarıdaki resimlerde gösterilenler değil, herhangi bir döndürme veya yansıma içerebilir.
  • Giriş hekzominolarının öncü boşlukları olabilir, ancak kendilerine göre doğru şekilde hizalanacaktır
  • Giriş hexominoları satırların sonunda boşluk bırakabilir ve girişlerin sonunda yeni satırları izleyebilir

1
Görüntü işleme etiketinin neden burada olduğunu açıklayabilir misiniz? Ne soru ne de cevap, sorunu çözmek için herhangi bir görüntü işleme yapmak zorunda kalmayacak.
Doktor,

Öndeki / sondaki alanla ilgili açıklama: her satırda gereksiz öndeki / sondaki boşluklar ve girdilerde gereksiz yeni satırlara izin veriliyor mu? 1000'den fazla karakter girişi yönetebilmeli miyim?
edc65

@ edc65 evet, tanımladığınız gereksiz beyaz alanı beklemelisiniz. 1000 karakter maksimum giriş boyutu makul görünüyor - şunu düzenleyeceğim
Digital Trauma

Hmm. Basılı bir sayfada kaç tane küp hexomino sıkıştırılabileceğini, yan yana sıkıştırılabileceğini merak ediyorum.
kullanıcı,

Yanıtlar:


7

PMA / Salyangoz , 130

.!(z\ |o{c..!(z\ }3){w=(..!(z\ )|b..!(z\ )o{..!(z\ }2|c{..!(z\ }1,2w..!(z\ )|w{..!(z\ }1,2c..!(z\ }4o..!(z\ )(..!(z\ )|n..!(z\ )`2

veya daha fazla "okunaklı",

?
.!(z\  | o{c..!(z\ }3  )
{w =( ..!(z\ ) | b ..!(z\ ) o {..!(z\ }2  | c {..!(z\ }1,2w..!(z\ ) | w {..!(z\ }1,2c..!(z\  }4
o  ..!(z\ ) ( ..!(z\ ) | n ..!(z\ ) `2

Alışılmadık bir şekilde, şimdiye kadar uygulanan sınırlı sayıda özellik ile çözülebilecek bir sorun ortaya çıktı. !(z\ )Model geçerli konum bazı "octilinear" yönde bir boşluk olduğu negatif bir onaylama işlemi kullanılarak bir karenin ortasında boşlukta olduğunu belirler. Genel fikir, eşleşmenin başladığı kareye göre gerekli 5 konumdan her birine bir kare yerleştiren bir deseni kontrol etmektir. Ayrıca, 2x2 kare blokta olmadığını kontrol etmesi gerekir. Program işe yaramadan önce parantezlerin ayrıştırılmasıyla ilgili bir hatayı düzeltmek zorunda kaldım.

Hexomino bir küp ile eşleşmezse 0, yazdırılır. Varsa, bazı pozitif tamsayılar yazdırılır (eşleşme sayısı).

Bu polyomino jeneratörünü olası tüm test durumlarını oluşturacak şekilde uyarladım :

n=input()
r=range
T=lambda P:set(p-min(p.real for p in P)-min(p.imag for p in P)*1j for p in P)
A=[]
for i in r(1<<18):
 P=[k%3+k/3*1j for k in r(18)if i>>k&1]
 C=set(P[:1])
 for x in P:[any(p+1j**k in C for k in r(4))and C.add(p)for p in P]
 P=T(P)
 if not(C^P or P in A or len(P)-n):
  #for y in r(4):print''.join(' *'[y+x*1j in P] for x in r(6))
  o = [ [' ']*13 for _ in r(9)]
  for y in r(4):
   for x in r(6):
    if y+x*1j in P: X=2*x;Y=2*y; o[Y][X]=o[Y+2][X]=o[Y][X+2]=o[Y+2][X+2]='+'; o[Y][X+1]=o[Y+2][X+1]='-';o[Y+1][X+2]=o[Y+1][X]='|'
  print '\n'.join(map(''.join,o))
  A+=[T([p*1j**k for p in P])for k in r(4)]

hahahahahahahah daha "okunaklı"
Doktor

5

Ruby, 173 148 145 143 bayt

h=->b,c{[c.count(c.max),c.count(c.min),3].max*2<b.max-b.min}
->s{x=[];y=[];i=j=0
s.bytes{|e|e==43&&x<<i|y<<j;i=e<32?0*j+=1:i+1}
h[x,y]||h[y,x]}

Son değişiklik: /2sağ tarafında <yerini *2sol tarafta. Bir kümenin kaldırılmasını sağlar()

açıklama

Kod iki bölümden oluşur: ayrıştırma yapan ana bir adsız işlev hve denetimi yapan değişkene atanan yardımcı bir adsız işlev .

X ve y koordinatları ilave dizge ile ana fonksiyon tarar byte bazında, i,jbütün +semboller bulunmuştur x[]ve y[]. Daha sonra hiki kez arar . Hexomino'yu ilk varsaydığı zaman yataydır ( x[]uzunlukları ve y[]genişlikleri içerir) ve ikinci kez dikey olduğunu varsayar.

İşlev h, dizideki uzunlamasına koordinatları ve dizideki bgenişlik koordinatlarını alır c. İfadenin uzunluğunu (kareler halinde) hesaplar (b.max.b.min)/2. Eğer bu 3'ten küçük veya ona eşitse, hexomino diğer yönde değerlendirilmeli ve bu nedenle hgeri dönmelidir false.

Altıgenlerin muayenesi, uzunluk 4 ise, bir küpün içine katlanacak altıgenlerin +ilk ve son satırda en fazla 2 kareye (3 sembol) sahip olduğunu gösterecektir . Karelerin çoğu, küpün ekvatoru olacak orta sıraya yoğunlaşmıştır. Bu durum, bir küp içine katlanacak olan uzunluğu 4 olan bir heksomino için gerekli ve yeterlidir.

Bir küp içine katlanacak olan uzunluğu 5 olan sadece bir heksomino vardır. +İlk ve son satırlarında 3 kareye (4 sembol) sahiptir. 5 uzunluğundaki tüm diğer heksominolar +, birinci veya son sırada 5 veya daha fazla sembole sahiptir.

Uzunluğu yalnızca 6 olan bir hexomino vardır +. Her satırda 7 sembol vardır .

Bunları bir araya getirmek için, hexomino uzunluğunun 3'ten büyük olduğunu ve +ilk ve son satırlardaki (hangisi daha yüksekse) sembol sayısının uzunluktan daha az olduğunu kontrol etmek yeterlidir .

Test programında Ungolfed

#checking function as explained in text
h=->b,c{[c.count(c.max),c.count(c.min),3].max<(b.max-b.min)/2}

#main function for parsing
f=->s{
  x=[]                 #separate assignments required, 
  y=[]                 #otherwise we get 2 pointers to the same array
  i=j=0                #start coordinates 0,0
  s.bytes{|e|          #scan string bytewise
    e==43&&x<<i|y<<j     #if byte is a + symbol (ascii 43) add the coordinates to arrays x and y
    i=e<32?0*j+=1:i+1    #if byte is before ascii 32 assume newline, increment j and zero i. Otherwise increment i
  }
  h[x,y]||h[y,x]       #call h twice, with x and y in each possible order
}



#VALID INPUTS
puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
+-+
| |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
      | |
      +-+"]

puts f["
    +-+
    | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
    +-+
    | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]


puts f["
  +-+
  | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]  
puts f["
+-+-+
| | |
+-+-+-+
  | | |
  +-+-+-+
    | | |
    +-+-+"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+-+
      | | | |
      +-+-+-+
"]


#INVALID INPUTS

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
  | | | |
  +-+-+-+
"]


puts f["
  +-+-+-+-+-+-+
  | | | | | | |
  +-+-+-+-+-+-+

"]


puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
    | |
    +-+
"]

puts f["
      +-+
      | |
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+-+
        | | |
        +-+-+"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
      | | |
      +-+-+
"] 


puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
  | | | |
  +-+ +-+
"]

puts f["
 +-+   +-+
 | |   | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
   +-+-+
   | | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+
  | |
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+-+-+
  | | | |
  +-+-+-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+
| |
+-+
| |
+-+"]

puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+-+
  | | |
  +-+-+
    | |
    +-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
    | | | |
    +-+-+-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
      | |
      +-+-+
      | | |
      +-+-+
"]


puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
      | | |
      +-+-+
        | |
        +-+
"]

metninizde pentonimo → hexonimo?
Paŭlo Ebermann 17:15

3

JavaScript (ES6), 443 431

Düzenleme boş sütunlar kaldırarak hata düzeltme, giriş ayrıştırması sırasında sorun

F=t=>(a=b=c=d=e=f=g=h=0,M=Math.min,
t=t.split('\n').filter(r=>r.trim()>''),
t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))),
t.map((r,i)=>i&1&&[...r].map((_,j)=>j&1&&r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|'
&&(y=i>>1,x=j>>1,z=y*5,w=x*5,a|=1<<(z+x),e|=1<<(w+y),b|=1<<(4+z-x),f|=1<<(4+w-y),c|=1<<(20-z+x),g|=1<<(20-w+y),d|=1<<(24-z-x),h|=1<<(24-w-y)
))),~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(M(a,b,c,d,e,f,g,h)))

Bu çok uzun ve girdilerin ayrıştırılması işin büyük bir parçası olduğu sürece daha uzun.

Yaptığım, verilen girişin 11 katlanabilir hekzominodan biri olup olmadığını doğrulamak.

Her katlanabilir heksomino, bazı 5x5 bitmap'lerle eşleştirilebilir (simetri ve dönüşlerle 8'e kadar farklı). Bitmapleri 25 bitlik bir sayı olarak aldığımda, aşağıdaki kodu kullanarak (çok basit giriş formatı ile) belirtilen 11 hexomino için min değerlerini buldum.

h=[ // Foldable hexominoes
'o\noooo\no', ' o\noooo\n o', // pink
'o\noooo\n   o', ' o\noooo\n  o', 'ooo\n  ooo', 'oo\n oo\n  oo', //blue
'o\noooo\n o', 'o\noooo\n  o', 'oo\n ooo\n o', 'oo\n ooo\n  o', 'o\nooo\n  oo' // gray
]
n=[]
h.forEach(t=>(
  a=[],
  t.split('\n')
    .map((r,y)=>[...r]
      .map((s,x)=>s>' '&&(
         a[0]|=1<<(y*5+x),a[1]|=1<<(x*5+y),  
         a[2]|=1<<(y*5+4-x),a[3]|=1<<(x*5+4-y),  
         a[4]|=1<<(20-y*5+x),a[5]|=1<<(20-x*5+y),  
         a[6]|=1<<(24-y*5-x),a[7]|=1<<(24-x*5-y))
     )
  ),
n.push(Math.min(...a))
))

Bu verir [1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]

Bu yüzden, giriş dizgisine bakıldığında, min bitmapini bulmak için aynı şeyi yapmalıyım, sonra bu numara prekalser listemde mevcutsa true değerini döndürmem gerekiyor.

// Not so golfed 

F=t=>(  
  a=b=c=d=e=f=g=h=0,M=Math.min,
  t=t.split('\n').filter(r=>r.trim()>''), // remove blank lines
  t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))), // remove blank colums to the left
  t.map((r,i)=>i&1&&[...r] // only odd rows
   .map((_,j)=>j&1&& // only odd columns
      r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|' // found a cell
         &&(y=i>>1,x=j>>1,z=y*5,w=x*5, // find bitmaps for 8 rotations/simmetries
            a|=1<<(z+x),e|=1<<(w+y),  
            b|=1<<(4+z-x),f|=1<<(4+w-y),  
            c|=1<<(20-z+x),g|=1<<(20-w+y),  
            d|=1<<(24-z-x),h|=1<<(24-w-y)  
    ))),
   ~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(Math.min(a,b,c,d,e,f,g,h)) // look for min
)

Firefox'ta test etmek için pasajı çalıştır


Eğer bir şeyleri kaçırıyorsam affet beni, ama ,\nt=tikinci çizginin sonundan / üçüncü çizginin başlangıcından itibaren sen ?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ altı ay sonra incelendiğinde, ayrıştırma kodu 10 ... 15 bayt daha kısa yapılabilir. Olduğu gibi, 2. satırda t ve yine 3. satırda tekrar atamaya ihtiyacım var, çünkü 3. satırda sol tarafta kesilecek boş karakter sayısını bulmak için kullanılır.
edc65
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.