Deskripsi
Kami menganggap versi Tetris yang sedikit disederhanakan di mana setiap gerakan terdiri dari:
- memutar potongan searah jarum jam, 0 hingga 3 kali
- memposisikan potongan pada kolom yang diberikan
- penurunan cepat
Tujuannya adalah untuk menentukan jumlah garis yang diselesaikan, mengingat daftar gerakan Tetris tersebut.
Baris yang sudah selesai dihapus saat potongan dijatuhkan, mengikuti aturan Tetris standar.
Playfield
Playfield memiliki lebar 10 kolom. Tidak ada Game Over dan diasumsikan bahwa selalu ada cukup ruang dan waktu untuk melakukan tindakan di atas, tidak peduli konfigurasi playfield. Ketinggian playfield tidak terlalu penting di sini, tetapi Anda dapat menggunakan 22 baris standar sebagai batas atas.
Bentuk Tetromino
Input output
Memasukkan
Daftar tetris bergerak dengan koma yang disandikan dengan 3 karakter. Dua karakter pertama menggambarkan bentuk Tetromino yang akan digunakan dan yang terakhir menggambarkan posisi di mana ia dijatuhkan.
- Tetromino:
I
,O
,T
,L
,J
,Z
atauS
, dalam urutan yang sama seperti di atas. - Jumlah rotasi searah jarum jam:
0
ke3
- Kolom:
0
ke9
. Ini adalah kolom di mana sudut kiri atas potongan (ditandai denganx
gambar di atas) terletak setelah rotasi 1
Diasumsikan bahwa semua gerakan dalam daftar yang disediakan valid. Tidak perlu memeriksa entri yang tidak valid seperti I07
( I
bentuk horizontal diletakkan terlalu jauh di sebelah kanan).
1 Anda bebas menerapkan algoritme rotasi nyata atau meng-hardcode semua bentuk yang berbeda, asalkan x
terletak di kolom yang diberikan oleh karakter ketiga gerakan.
Keluaran
Jumlah garis yang diselesaikan.
Contoh
O00,T24
akan menghasilkan posisi pertama dan O00,T24,S02,T01,L00,Z03,O07,L06,I05
akan menghasilkan posisi kedua.
Oleh karena itu, urutan berikut akan menghasilkan Tetris dan harus kembali 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Uji kasus
1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8
Halaman uji
Anda dapat menggunakan JSFiddle ini untuk menguji daftar pemindahan.
Jawaban:
PHP,
405399378372368360354347331330328319309300 byte(dengan pemetaan blok Dave )
program, mengambil gerakan sebagai argumen terpisah, mencetak hasil
kerusakan berfungsi:
mengambil gerakan sebagai array, mengembalikan hasil
untuk referensi: pemetaan lama
pengujian
lihat jawaban PHP saya yang lain
mau nonton
hapus
#
dari sumber fungsi dan tambahkan ini:beberapa langkah golf
Wahyu 5: Sebuah lompatan besar (399- 21 = 378) datang hanya dengan menggerakkan pergeseran kolom
dari loop terpisah untuk dua loop yang ada.
Rev. 8: Beralih dari array ke base 16 untuk bagian ($ s) tidak memberi banyak,
tetapi memberi jalan bagi golf lagi.
Rev. 17: membuat nilai-nilai dengan
base64_encode(pack('V*',<values>))
dan menggunakan pengindeksan byte alih-alih
unpack
menyimpan 16 byteWahyu 25 hingga 29: terinspirasi oleh kode Dave: hashing baru (-2), desain loop baru (-9), goto (-10)
tidak ada pre-shift; biayanya 17 byte.
lebih potensial
Dengan
/2%9
, saya bisa menyimpan 15 byte (hanya dengan 14 byte/4%5
)dengan memasukkan data biner ke dalam file
b
dan kemudian mengindeksfile(b)[0]
.Apakah saya menginginkan itu?
Karakter UTF-8 akan membutuhkan banyak biaya untuk transformasi.
pada hashing
Saya menggunakan
ZJLO.ST /2%9 -> 0123.56
; tetapiT.ZJLOS /3%7 -> 0.23456
sama baiknya.satu byte lebih lama:
O.STJLZ %13/2 -> 0.23456
dan tiga lagi:
OSTZJ.L %17%12%9 -> 01234.6
Saya tidak dapat menemukan hash pendek (maks. 5 byte) yang tidak meninggalkan celah;
tetapi Dave menemukan
STZJL /4%5 -> 01234
, menjatuhkan O dari daftar. wtg!btw:
TIJSL.ZO (%12%8) -> 01234.67
menyisakan ruang untukI
bentuk(dan fiksi
A
,M
atauY
bentuk).%28%8
dan%84%8
, lakukan hal yang sama (tetapi denganE
bukannyaA
).sumber
break 2
jauh lebih bersih daripada apa yang harus saya lakukan di C! Anda mungkin dapat menyimpan beberapa byte dengan menggunakanarray_diff
(atur baris yang telah selesai ke nilai tetap alih-alih menggunakanunset
lalu gantiarray_values
denganarray_diff
), tetapi saya tidak dapat mengatakan dari dokumen jika itu akan meratakan nilai yang diulang (misalnya array_diff ([1,2, 2,3], [1]) -> [2,2,3] atau hanya [2,3])array_diff
tidak menghapus nilai duplikat; dan saya sudah memiliki nilai tetap (1023); tetapi itu tidak mengindeks ulang array. Ide bagus, tapi biayanya satu byte./10
semua tempat), tetapi kalau tidak saya pikir saya sudah selesai. Saya terkejut melihat betapa kompetitifnya PHP dan C secara langsung. Ini menyenangkan - semoga OP menerima jawaban Anda!if
.C,
401392383378374351335324320318316305 byteMengambil input yang dipisahkan koma pada stdin, mengembalikan skor dalam status keluar.
Harus
char
ditandatangani (yang merupakan standar untuk GCC) dan'3Z3Z'
harus ditafsirkan sebagai 861549402 (yang merupakan kasus untuk GCC pada mesin endian kecil, setidaknya).Contoh penggunaan:
Penjelasan tingkat tinggi:
Semua bentuk kecuali garis dapat ditampung dalam kisi 3x3 dengan satu sudut hilang:
Itu berarti mudah untuk menyimpannya dalam byte masing-masing. Sebagai contoh:
(kami menyelaraskan setiap bagian ke kiri bawah kotak untuk memudahkan menjatuhkannya)
Karena kita mendapatkan setidaknya 4 byte ke int, ini berarti kita dapat menyimpan semua 4 rotasi setiap bagian dalam bilangan bulat tunggal, dengan kasing khusus untuk garis. Kami juga dapat memasukkan setiap baris kisi permainan ke int (hanya membutuhkan 10 bit), dan potongan yang saat ini jatuh menjadi panjang (4 baris = 40 bit).
Kerusakan:
-4, -1 terima kasih kepada @Titus, dan -23, -11 dengan inspirasi dari jawaban mereka
sumber
s+=(d[A-x]=d[A])
tanpa menggunakanx
?x
diperlukan untuk melacak berapa banyak baris untuk runtuh pada langkah saat ini (setiap barisA
diatur ke nilai barisA-x
saat loop berlangsung)1[a]
dana[1]
lakukan hal yang sama (atau lebih tepatnya,a[b]
diterjemahkan menjadi*(a+b)
). Ini disalahgunakan seperti ini sebagai cara menghindari kurung. Dalam hal ini,1[*v]
==(*v)[1]
, yaitu huruf kedua dari perintah, yaitu rotasi.I
placeholder? Jika demikian, coba/2%9
sebagai hash alih-alih%12
.%12%8
jika tidak.Ruby,
474443428379 + 48 = 427 byte-1 terima kasih kepada @Titus
Ini pasti bisa bermain golf lebih banyak.
Membaca kamus potongan-potongan biner (lihat di bawah) dari STDIN atau nama file dan mengambil daftar pemindahan sebagai argumen, misalnya
$ cat pieces | ruby script.rb O00,T24,S02,...
.Data potongan biner (format xxd)
Lihat di repl.it (dengan argumen hard-kode, kamus): https://repl.it/Cqft/2
Tidak dikelompokkan & penjelasan
sumber
m >> 10
bisam >> x
\d
s dalam ekspresi reguler:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 bytebidang bit untuk potongan dan peta; tetapi tidak ada kasus khusus untuk
I
bentuk seperti golf Dave.mengambil argumen dari baris perintah, mencetak hasil
ungolfed sebagai fungsi
mengambil argumen sebagai array, mengembalikan hasil
tes (berfungsi)
sumber
<?
biaya overhead :)