Bisakah saya membuat bentuk itu dengan balok, lempengan, dan tangga?

13

Pertimbangkan kisi dua dimensi persegi panjang di mana setiap sel bisa kosong ( .) atau penuh ( 0).

misalnya

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

Kotak dianggap tak terbatas, semua sel di luar wilayah yang digambarkan kosong.

Tujuannya adalah untuk menutupi ruang-ruang yang terisi dan membiarkan ruang-ruang kosong terbuka menggunakan satu set 7 batu bata yang berbeda yang masing-masing mengambil 4 sel (2 × 2) dari kisi.

Ini adalah 7 bata:

  • Blok - 1 varian

    11
    11
    
  • Slab - 2 varian

    ..
    22
    33
    ..
  • Tangga - 4 varian

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

Batu bata ini harus selalu sejajar dengan kisi yang selnya dua kali lebih lebar dan setinggi sel kisi input. Setiap bata hanya dapat menempati satu sel dari kisi yang lebih besar ini, tetapi kisi yang lebih kecil dapat diterjemahkan (bergeser ke atas, bawah, kiri, kanan) di bawah kisi yang lebih besar untuk memberikan lebih banyak opsi untuk menemukan penutup. Baik kisi-kisi maupun batu bata individu mungkin diputar.

Jadi salah satu cara untuk menutupi (alias menyelesaikan) contoh di atas adalah seperti ini:

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

(Batu bata tetangga yang identik masih dapat menyebabkan ambiguitas tetapi dengan hati-hati mengidentifikasi kisi yang lebih besar menyelesaikannya.)

Sebuah valid solusi untuk

000000
000000

adalah

566774
556744

karena batu bata tidak semuanya sejajar dengan grid yang lebih besar atau hanya menempati satu sel saja.

Solusi yang valid di sini adalah 3 blok berturut-turut:

111111
111111

Dan solusi lain yang valid melibatkan 6 lempengan:

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

Jadi perhatikan bahwa beberapa kisi masukan memiliki beberapa solusi .

Sebuah valid solusi untuk

00.00
00...

adalah

11.33
11...

karena batu bata tidak sejajar dengan grid yang lebih besar. Lempengan akan perlu bergerak ke kiri atau kanan satu per satu, tetapi tentu saja penutupnya tidak lengkap. Kisi masukan ini tidak memiliki solusi .

Tantangan

Tulis sebuah program yang menerima (melalui stdin / command line) sebuah blok persegi panjang teks .'s dan 0' s yang mewakili kisi yang akan dibahas.

Jika ada solusi penutup yang valid, cetak (via stdout) salah satu solusi dengan cara yang sama seperti di atas, ganti semua 0dengan yang sesuai 1melalui 7batu bata.

Jika tidak ada solusi, program Anda seharusnya tidak menghasilkan apa-apa, diam-diam berakhir dengan normal.

Catatan

  • Input dan output tidak perlu memiliki dimensi persegi panjang yang sama. Output Anda dapat memiliki baris dan / atau kolom yang terpisah dari semua .(asalkan mereka tidak membatalkan solusi).

  • Tidak apa-apa untuk memotong baris dan kolom semua .jika tidak akan mempengaruhi ruang yang diisi. misalnya

    222222
    333333
    

    adalah solusi yang valid untuk

    000000
    000000
    

    Sebaliknya, dua kolom kosong di 00..00tidak dapat dihapus karena akan mengacaukan ruang yang diisi.

  • Anda bisa berasumsi bahwa input tersebut memiliki satu baris tambahan. Baris baru tunggal dalam output juga baik-baik saja, bahkan dalam kasus tidak ada solusi.

  • Kisi yang benar-benar kosong (semuanya .) dan kisi 0 × 0 yang sepele bukanlah kotak masukan yang perlu Anda khawatirkan. Tetapi 0kisi 1 × 1 adalah, seperti kisi-kisi lain yang mengandung setidaknya satu 0. (Anda mungkin tidak menganggap lebar atau tinggi dari kisi masukan adalah genap!)

  • Alih-alih suatu program Anda dapat menulis fungsi yang mengambil input sebagai argumen string dan mencetak output secara normal atau mengembalikannya sebagai string. Setiap nilai falsy dapat dikembalikan jika tidak ada solusi.

  • Anda dapat menggunakan 9 karakter ASCII yang dapat dicetak untuk menggantikan . 0 1 2 3 4 5 6 7. Pastikan untuk mengatakan apa pengganti Anda! Baris baru harus tetap apa adanya.

Mencetak gol

Kode terpendek dalam byte menang. Tiebreaker adalah pos terpilih tertinggi.

Tantangan ini terinspirasi oleh balok , lempengan , dan tangga di Minecraft , yang mengikuti aturan yang sama dengan yang dijelaskan di sini. Jika Anda menikmati PPCG dan Minecraft, Anda mungkin ingin memeriksa PPCG Minecraft Server .

Hobi Calvin
sumber
3
Tampaknya server Minecraft tidak diimplementasikan dalam skrip Golf - membosankan :-)
Thomas Weller
5
@ThomasWeller Diimplementasikan kembali di CJam untuk menghemat beberapa byte.
Alex A.

Jawaban:

6

Python - 525 491 478 430 byte

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"

Penjelasan: Ini adalah kode golf pertama saya, jadi mungkin tidak optimal, tapi begini caranya. Fungsi t (s) memberikan hasil untuk string yang dilewatkan. Pertama, ia menemukan jumlah kolom, kemudian menelusuri empat terjemahan berbeda yang mungkin dengan 1 (tidak ada, kiri, atas, atas-kiri) dan mencoba menyelesaikannya untuk setiap. Itu terlihat pada setiap blok 2x2 dan memetakannya ke nomor blok yang valid, diberikan oleh kamus, dan mengubah angka nol menjadi angka.

Jika ia menemukan satu tidak dalam kamus, ia meninggalkan offset tertentu dan mulai lagi dengan yang berikutnya. Jika melewati semua 4 offset tanpa menemukan solusi yang valid, itu berakhir tanpa menghasilkan apa pun. a (v, i) memungkinkan untuk nilai default di luar string, dan mengabaikan karakter baris baru. Meskipun mungkin berakhir dengan solusi parsial melalui durasi lari, itu akan selalu menimpa mereka dengan yang benar akhir jika ada.

Sunting: Pemetaan karakter yang berbeda digunakan:. -> d, 0 -> z, semua nomor lain milik sendiri. Ini berlaku untuk input dan output.

Melon Fricative
sumber
1
Selamat datang di PPCG! Kami memiliki beberapa tips untuk bermain golf di Python ; dimana saya pikir Anda dapat menyimpan beberapa byte.
lirtosiast