Tetris Tangrams

13

pengantar

Tangram adalah teka-teki klasik yang melibatkan penataan / pemasangan balok ke dalam berbagai bentuk. Dari bahasa Cina 七巧板 - secara harfiah berarti "tujuh papan keterampilan". Mari kita ambil ide ini dan gunakan tujuh potong Tetromino untuk mengisi kotak.

Tantangan

Tulis fungsi atau program yang menggunakan array koordinat grid sebagai input, dan output grid 10 kali 20 diisi diisi dengan potongan Tetris kecuali dalam koordinat yang ditentukan.

Optimalkan skor Anda dengan berusaha menjaga distribusi potongan seragam.

Kriteria

Gunakan pastebin ini koordinat ini untuk menyelesaikan tugas Anda. Ada lima set koordinat. Jangan ragu untuk memodifikasi format di mana koordinat ditulis, tetapi bukan nilainya.

Kumpulan data # 2 tidak dapat dipecahkan - dalam hal ini, cukup masukkan kisi-kisi dengan sel input terisi (yaitu, Xdi mana lubang berada).

Memasukkan

Koordinat kisi mewakili 'lubang' di kisi. Ini adalah sel yang tidak bisa mengandung bagian Tetromino.

Koordinat kisi:

(0,0), (1,0), (2,0), ... (9,0)
(0,1), (1,1), (2,1), ... (9,1)
.
.
.
(0,19), (1,19), (2,19), ... (9,19)
  • Gunakan gaya array bahasa pemrograman pilihan Anda untuk memasukkan koordinat.

  • Menampilkan lubang pada kisi dengan ASCII yang dapat dicetakX atau lainnya .

Keluaran

Menggunakan kisi Tetris standar ukuran 10 sel lebar 20 sel tinggi , cetak kisi solusi jika dan hanya jika kisi dapat diisi sepenuhnya dan dengan sempurna menggunakan potongan Tetromino.

Potongan dibangun dengan huruf I, O, L, J, T, Z, Ssebagai berikut:

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

Contoh

Contoh solusi output tanpa koordinat input:

ZZIIIILLLI
JZZTTTLLLI
JJJSTLOOLI
SZZSSLOOLI
SSZZSLLJJI
TSOOSLLJII
TTOOSSLJII
TZOOSSLZII
ZZOOSSZZII
ZJJJJSZLLI
TTTJJOOILI
ITZJJOOILI
IZZTTTLIII
IZOOTZLIII
IJOOZZLLII
LJJJZSSTII
LLLTSSTTTI
LLLTTSSZJI
OOLTSSZZJI
OOIIIIZJJI

Dengan distribusi sebagai berikut:

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

11   6     8     6      6     7      6

Catatan

Koordinat mewakili satu Xdan Yposisi di grid. Grid didasarkan pada 0, artinya koordinat (0,0)harus berupa sel kiri atas atau kiri bawah, pilihan penulis.

Batu bata bisa:

  • dipilih atas kebijakan penulis.
  • diputar sesuai keinginan penulis.
  • ditempatkan di grid di mana saja atas kebijaksanaan penulis (alias: tidak ada gravitasi Tetris)

Batu bata tidak bisa:

  • ditempatkan di luar batas grid.
  • tumpang tindih dengan batu bata atau lubang yang ada di grid.
  • menjadi potongan Tetromino Tetris non-standar.

Mencetak gol

Skor Anda dalam format:

(1000 - [byte dalam kode]) * (M / 10 + 1)

Di mana M adalah pengganda untuk distribusi potongan yang digunakan dalam set solusi Anda.

Skor tertinggi oleh Ides of March menang.

Untuk menghitung M, tambahkan nilai distribusi tetromino individu terendah untuk setiap set dan kemudian ambil rata-rata dibulatkan ke bawah untuk menghitung M.

Sebagai contoh:

Set 1: 5
Set 2: 4
Set 3: 5
Set 4: 6
Set 5: 3

6 + 4 + 5 + 4 + 4 = 21/5 = 4,6

Jadi, Anda akan menggunakan 4sebagai nilai M Anda .

Catatan: Jika suatu set tidak memiliki solusi, jangan faktor yang mengatur ke dalam penghitungan M, karena itu tidak akan memiliki distribusi tetromino.

CzarMatt
sumber
4
Memperbaiki pertanyaan setelah diposting umumnya sulit, karena jika perubahannya substansial mereka akan membatalkan pekerjaan orang yang sudah mulai mengerjakan masalah (atau lebih buruk, bahkan diposting hasilnya). Saya akan merekomendasikan memposting ide tantangan di kotak pasir . Itu adalah tempat untuk meminta umpan balik dan memoles spec sebelum masuk utama. Yang sedang berkata, setelah skim cepat, saya tidak melihat masalah mencolok dengan tantangan Anda.
Martin Ender
@ MartinBüttner Sepatutnya dicatat, terima kasih atas umpan baliknya.
CzarMatt
2
Ides Maret = 15 Maret. Saya harus mencarinya.
Level River St
Saya telah membuat beberapa perubahan kecil untuk memuat deskripsi tugas di depan, karena jika tidak, tidak mungkin untuk memahami apa yang diminta untuk dilakukan pada pembacaan pertama. Saya pikir ini akan menjadi perbaikan jika Anda menyatakan yang mana dari kasus input tidak dapat diselesaikan, sehingga mereka berfungsi sebagai kasus uji di samping dataset penilaian.
Peter Taylor
@PeterTaylor Cukup adil, saya telah menambahkan set solusi yang tidak dapat diselesaikan. Terima kasih untuk umpan baliknya.
CzarMatt

Jawaban:

2

Python 3 , 819 byte, M = 0, Skor = 181

Ini adalah program DFS brute force. Itu membangun array numpy, dan memasukkan semua lubang yang dimasukkan. Kemudian mengambil ubin paling tidak terisi kiri pada baris tertinggi yang memiliki satu, dan menempatkan tetromino. Secara rekursif, kita sekarang melakukannya lagi - ketika kita tidak dapat menemukan solusi, atau mundur dan mencoba bagian lain pada kesempatan pertama.

Ini memiliki M 0, karena mencoba menggunakan potongan-potongan dalam urutan yang ditentukan, dan hampir selalu menemukan solusi tanpa yang terakhir dalam daftar. Saya mencoba menggunakan daftar yang dipesan secara acak setiap siklus untuk membuat distribusi yang lebih merata, tetapi saya hanya mendapat nilai M 2, yang tidak sebanding dengan byte yang diperlukan untuk mengimpor random.shuffle .

Saya tidak dapat mengomentari kode di bawah ini, karena dalam bermain golf saya sudah lama lupa apa yang dilakukannya. Gagasan umum:

  • Impor produk numpy dan itertools, dengan nama 1 huruf
  • Ubah nama beberapa builtin menjadi fungsi 1 huruf, dan tentukan lambda untuk menyimpan byte
  • Bangun susunan tetromino yang mungkin sebagai array nd-nump, termasuk semua rotasi
  • Dalam fungsi rekursif:
    • Dapatkan posisi ubin yang tidak terisi yang diinginkan, dan siklus melalui daftar potongan
    • Untuk setiap bagian, putar terjemahannya (menggerakkannya ke atas dan ke bawah)
    • Jika ada sesuatu yang tidak berhasil (bagian dari papan, hit bagian lain, lubang, dll), coba terjemahan berikutnya atau seluruh bagian berikutnya
    • Jika berhasil, bagus. Cobalah, lalu panggil fungsi tersebut secara rekursif.
    • Jika jalur itu tidak berhasil, itu akan mengembalikan 'a', jadi kami coba lagi. Jika berhasil, ia mengembalikan papan, dan kami meneruskannya.
  • Akhirnya, programnya. Kami membangun papan 10x20 sebagai array numpy dari 1's.
  • Masukan berupa (x1, y1); (x2, y2); ... Kami menempatkan 9 untuk setiap lubang di dalamnya, kemudian mendapatkan hasil menjalankan fungsi di atasnya.
  • Pernyataan cetak kemudian menampilkan hasil yang sukses atau baris papan asli kosong kosong, menggantikan huruf atau simbol yang sesuai untuk nomor.
import numpy as n
from itertools import product as e
m,s=range,len
p=[n.rot90(a,k)for a,r in[([[2,2]]*2,1),([[3]*3,[1,3,1]],4),([[0]*4],2),([[1,1,6],[6]*3],4),([[7,1,1],[7]*3],4),([[4,4,1],[1,4,4]],2),([[1,5,5],[5,5,1]],2)]for k in m(r)]
o=lambda a:e(m(s(a)),m(s(a[0])))
def t(l,d=0):
	g=list(zip(*n.where(l==1)))[0]
	for a in p:
		for u,v in o(a):
			w,x=l.copy(),0
			for r,c in o(a):
				if a[r,c]!=1:
					i,j=g[0]+r-u,g[1]+c-v
					if any([i<0,i>19,j<0,j>9])or l[i,j]!=1:
						x=1
						break
					w[i,j]=a[r,c]
			if x==0:
				if len(w[w==1]):
					f=t(w,d+1)
					if type(f)==str:continue
					return f
				return w
	return'a'
b=n.ones((20,10))
b[list(zip(*[eval(k)[::-1]for k in input().split(';')]))]=9
a=t(b)
for r in(a,b)[type(a)==str]:
	print(''.join(map(dict(zip([0,2,3,4,5,6,7,9,1],'IOTZSLJX-')).get,r)))

Cobalah online!

Tes sampel:

In: (1,1);(8,1);(4,4);(5,8);(4,11);(5,15);(1,18);(8,18)
Out: 
IIIIOOOOLL
TXOOOOOOXL
TTOOOOOOTL
TOOIOOOOTT
TOOIXOOTTI
TTTITOOTTI
TTTITTTTII
OOTTTTTTII
OOTTTXOOII
TTTTOOOOII
TTTTOOOOII
TTTTXTOOII
ITTTTTTTII
ITTTTTTTII
IITTTLLTTI
IITOOXLTTI
IITOOTLTTI
IITTLTTTTI
IXTLLTJTXI
ILLLLLJJJI
Vedvart1
sumber
1
Ya ampun - ini luar biasa. Terima kasih untuk tulisan yang bagus, dan kerja yang bagus!
CzarMatt