Bu şekli bloklar, levhalar ve merdivenlerle yapabilir miyim?


13

Her hücrenin boş ( .) veya dolu ( 0) olabileceği dikdörtgen iki boyutlu bir ızgara düşünün .

Örneğin

..00....
0000....
.00000..
000...00
..000000
000.00..

Izgara sonsuz olarak kabul edilir, tasvir edilen bölgenin dışındaki tüm hücreler boştur.

Amaç, doldurulmuş boşlukları örtmek ve her birinin ızgaranın 4 hücresini (2 × 2) kapladığı 7 farklı şekilli tuğladan oluşan bir dizi kullanarak boş alanları açık bırakmaktır.

Bunlar 7 tuğla:

  • Bloklar - 1 varyant

    11
    11
    
  • Döşemeler - 2 varyant

    ..
    22
    33
    ..
  • Merdivenler - 4 varyant

    .4
    44
    5.
    55
    66
    .6
    77
    7.

Bu tuğlalar her zaman hücreleri giriş ızgarasının hücrelerinden iki kat daha geniş ve uzun olan bir ızgaraya hizalanmalıdır. Her tuğla, bu büyük ızgaranın yalnızca bir hücresini işgal edebilir, ancak daha küçük ızgara, bir kapak bulmak için daha fazla seçenek sunmak üzere daha büyük ağın altına çevrilebilir (yukarı, aşağı, sola, sağa). Ne ızgaralar ne de münferit tuğlalar döndürülemez.

Yukarıdaki örneği kapsamanın (diğer adıyla çözmenin) bir yolu şöyledir:

..11....
2211....
.47733..
447...22
..771133
227.11..

(Özdeş komşu tuğlalar hala belirsizliğe neden olabilir, ancak daha büyük ızgarayı dikkatlice belirlemek bunu çözer.)

İçin geçersiz bir çözüm

000000
000000

dır-dir

566774
556744

çünkü tuğlaların hepsi daha büyük ızgaraya hizalanmaz veya sadece bir hücresini işgal etmez.

Burada geçerli bir çözüm arka arkaya 3 bloktur:

111111
111111

Ve başka bir geçerli çözüm 6 levha içerir:

......
222222
333333
......

Bu nedenle, bazı giriş ızgaralarının birden çok çözümü olduğunu unutmayın .

İçin geçersiz bir çözüm

00.00
00...

dır-dir

11.33
11...

çünkü tuğlalar daha büyük ızgaraya hizalanmıyor. Döşemenin sola veya sağa birer birer hareket etmesi gerekir, ancak daha sonra kapak eksik olacaktır. Bu giriş ızgarasının çözümü yoktur .

Meydan okuma

Kapsanacak bir ızgarayı temsil eden 's .' ve 0' slerinden oluşan dikdörtgen bir blok içeren (stdin / komut satırı aracılığıyla) bir program yazın .

(Stdout'ta ile) geçerli bir kaplama çözeltisi, baskı eğer varsa , bir tüm ile değiştirilmesi ile aynı şekilde bir çözüm, 0'uygun olan s 1boyunca 7tuğla.

Çözüm yoksa, programınız hiçbir şey vermemelidir, sadece sessizce normal şekilde bitmelidir.

notlar

  • Giriş ve çıkışın aynı dikdörtgen boyutlara sahip olması gerekmez. Çıktınızda, tüm satırların yabancı satırları ve / veya sütunları olabilir ( .çözümü geçersiz kılmadığı sürece).

  • .Doldurulmuş alanları etkilemezse, satırların ve sütunların kırpılması da uygundur. Örneğin

    222222
    333333
    

    geçerli bir çözümdür

    000000
    000000
    

    Tersine, 00..00doldurulmuş boşlukları düzenleyemeyeceği için içindeki iki boş sütun kaldırılamadı.

  • İsteğe bağlı olarak, girdinin tek bir satırsonu olduğunu varsayabilirsiniz. Çıktıdaki tek bir satırsonu da, çözüm olmasa bile iyidir.

  • Tamamen boş olan ızgaralar (tümü .) ve önemsiz 0 × 0 ızgarası, endişelenmeniz gereken giriş durumları değildir. Ancak 1 × 1 0ızgara, en az bir tane içeren diğer tüm ızgaralar gibi 0. (Giriş ızgarasının genişliğinin veya yüksekliğinin eşit olduğunu varsayamazsınız!)

  • Bir program yerine, girdiyi dize bağımsız değişkeni olarak alan ve çıktıyı normal olarak yazdıran veya dize olarak döndüren bir işlev yazabilirsiniz. Herhangi bir çözüm yoksa herhangi bir falsy değeri iade edilebilir.

  • Bunun yerine 9 farklı yazdırılabilir ASCII karakteri kullanabilirsiniz . 0 1 2 3 4 5 6 7. Sadece değişikliklerinizin ne olduğunu söylediğinizden emin olun! Yeni satırlar olduğu gibi kalmalıdır.

puanlama

Bayt cinsinden en kısa kod kazanır. Tiebreaker en yüksek oy alan yazı.

Bu zorluk esinlenerek bloklar , levhalar ve merdiven de Minecraft Burada anlatılan aynı kurallara uyar. PPCG ve Minecraft'tan hoşlanıyorsanız , PPCG Minecraft Sunucusuna göz atmak isteyebilirsiniz .


3
Minecraft sunucusu Golf komut dosyasında uygulanmıyor gibi görünüyor - sıkıcı :-)
Thomas Weller

5
@ ThomasWeller Birkaç bayt tasarruf etmek için CJam'de yeniden uygulandı.
Alex

Yanıtlar:


6

Python - 525 491 478 430 bayt

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

Açıklama: Bu benim ilk kod golf, bu yüzden optimal olmayabilir, ama işte böyle çalışır. T (s) işlevi, iletilen dize için sonuç verir. İlk olarak, sütun sayısını bulur, sonra 1 olası dört çeviriden geçer (yok, sol, yukarı, yukarı sol) ve çözmeye çalışır her biri için. Her 2x2 bloğuna bakar ve sözlüğü tarafından verilen geçerli bir blok numarasıyla eşler ve sıfırları sayı olarak değiştirir.

Eğer sözlükte olmayan birini bulursa, belirli bir ofseti bırakır ve bir sonrakiyle başlar. Geçerli bir çözüm bulmadan 4 ofseti de geçerse, hiçbir şey çıkarmadan sona erer. a (v, i), dizenin dışındaki varsayılan değere izin verir ve yeni satır karakterlerini yoksayar. Her ne kadar çalışma süresi boyunca kısmi çözümlerle sonuçlanabilse de, varsa her zaman son doğru çözümle bunları geçersiz kılar.

Düzenle: Karakterlerin farklı bir eşlemesi kullanılır:. -> d, 0 -> z, diğer tüm sayılar kendi kendine gider. Bu hem giriş hem de çıkış için geçerlidir.


1
PPCG'ye Hoşgeldiniz! Python'da golf oynamak için bazı ipuçları var ; Bence bazı byte'ları kurtarabilirsiniz.
lirtosiast
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.