Saya sangat menyukai Tetris, tetapi saya tidak begitu pandai. Hanya sekali saya ingin melihat bahwa pesawat ruang angkasa lepas landas di depan mata saya sendiri! Dan karena komputer sangat bagus dalam segala hal, satu-satunya solusi yang mungkin adalah membuat program untuk memainkannya untuk saya ... kecuali Anda akan melakukan itu untuk saya!
Diberi tetromino (bentuk yang terbuat dari empat kotak) dan peta lapangan bermain, Anda harus menempatkan tetromino sehingga skor jumlah garis terbanyak (membuat jumlah baris terbanyak penuh blok) dan menciptakan jumlah paling sedikit dari baru lubang (ruang kosong yang tidak bisa "melihat" bagian atas lapangan bermain 1 ).
Memasukkan
Input akan berisi karakter pada satu baris yang mewakili tetromino yang menurun, diikuti oleh 10 * 18 kisi 2 spasi ( ) dan tanda plus (
+
).
Karakter tersebut mewakili salah satu dari tujuh basis tetromino yang ditemukan di Tetris. Semua bagian dapat diputar 90 derajat, tetapi tidak terbalik. Semua tetromino dan rotasinya adalah sebagai berikut:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
Kotak mewakili bidang bermain Tetris, dengan +
balok yang ditempatkan sebelumnya. Jadi, contoh input mungkin sebagai berikut:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Keluaran
Output Anda akan identik dengan input, tetapi dengan tetromino di posisi yang ideal. Tetromino harus diwakili dengan #
untuk membedakannya dari blok yang ditempatkan sebelumnya. Selain itu, Anda juga akan menampilkan berapa banyak garis / lubang penempatan yang Anda buat dalam formulir xL yH
di baris baru.
Output untuk contoh yang diberikan di atas akan menjadi 3 berikut :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Anda hanya akan menampilkan hasil terbaik; dalam hal dua atau lebih kasus memberikan skor yang sama, Anda harus menampilkan semuanya (dipisahkan oleh garis kosong). Hasil terbaik harus ditentukan dengan menyortir dengan jumlah garis yang dicetak (menurun) terlebih dahulu, kemudian jumlah lubang baru dibuat (naik). Jadi, 1L 1H
adalah skor yang lebih baik daripada 0L 0H
.
Saya akan bekerja membuat daftar berbagai input dan output yang diharapkan yang dapat Anda uji terhadap program Anda. Perhatikan ruang ini.
Aturan dan Disambiguasi
- Ini adalah kode-golf , sehingga implementasi terpendek yang benar menang.
- Input / output mungkin dalam media apa pun yang sesuai dengan bahasa target Anda (misalnya file, stdin / stdout, area teks).
- Jika bahasa target Anda tidak mendukung input baris ganda (atau tidak nyaman untuk melakukannya), Anda dapat membatasi setiap baris input dengan koma (
,
). - Anda dapat menghilangkan output dari setiap baris kosong di grid.
- Ingat bahwa tetromino jatuh dari atas - Anda tidak boleh meletakkan potongan "bawah tanah". Karena itu, Anda dapat mengasumsikan bahwa semua kemungkinan penempatan potongan akan berada di "permukaan-tingkat" (yaitu tidak ada blok antara bagian dan bagian atas papan).
- Asumsikan bahwa tidak akan pernah ada situasi di mana Anda dipaksa masuk ke permainan (tetromino yang ditempatkan menyentuh bagian tengah tengah lapangan).
- Solusi yang identik dalam output harus dihilangkan (mis. Ada 3 solusi output jika Anda memutar
O
potongan secara naif ).
1 Saya sadar ini akan membuat beberapa kesalahan positif, tetapi ini adalah penyederhanaan.
2 Ini adalah ukuran grid yang digunakan dalam versi Game Boy.
3 Ya, 0H
benar. Periksa lagi, saya katakan lubang baru ; ^)
Jawaban:
C 1009 byte
Ini adalah versi yang tidak diserang
Saya melihat bahwa sumber utama kode panjang mungkin adalah definisi ubin. Jadi saya memutuskan untuk mewakili mereka sebagai pola bit dalam array bit 4x4. Ini menghasilkan 16 bit yang mudah masuk ke dalam satu
int
. Thetiles
Array memegang semua pola untuk 19 rotasi yang mungkin dari 7 ubin.Saat kompilasi, abaikan peringatan yang
gets
sudah usang. Saya tahu itu tetapi itu adalah cara terpendek membaca baris dari input.sumber
int
seperti yang diasumsikan. Beberapa dari Andaprintfs
hanya menghasilkan satu karakter. Anda mungkin dapat menggantinya dengan yang setaraputchar
untuk menyimpan beberapa karakter. Misalnya, beralihprintf("\n")
keputchar(10)
:)