Tetris Biner dalam tweet

16

Baru-baru ini (beberapa tahun yang lalu) beberapa buzz di situs web pemrograman tentang implementasi Tetris dalam 140 Bytes . ...

Ternyata meskipun kecil, ini adalah versi Tetris yang disederhanakan, dan bahkan bukan implementasi yang lengkap. Hanya fungsi logika inti yang cocok dengan 140 byte Javascript. Untuk benar-benar menjalankannya, Anda memerlukan ~ 840 karakter HTML lainnya.

Kita bisa berbuat lebih baik!
Tantangan ini adalah untuk mengimplementasikan versi lengkap "Tetris Biner" dalam sesedikit mungkin tweet.

Aturan Tetris Biner:

  • Program harus menampilkan bidang bermain yang mengandung setidaknya 5 kolom dan 6 baris sel.
    • Metode tampilan apa pun dapat digunakan, selama blok dan tepi bidang ditandai dengan jelas.
  • Paling tidak harus ada dua jenis blok: #dan ##. Dukungan blok tambahan seperti ###atau blok sudut berbentuk seperti L akan ter-upgrade oleh saya: P dan permainan biner tetris paling lengkap (blok paling banyak seperti fitur rotasi dan asli) akan memenangkan kebahagiaan saya dan kemungkinan hadiah hingga 50 rep.
  • Blok baru ditambahkan ke bidang di baris atas, dan satu sel blok harus menempati kolom tengah.
  • Blok turun menuju baris paling bawah pada tingkat yang tetap. Blok harus turun bahkan tanpa input pengguna.
  • Ketika blok menyentuh bagian bawah bidang atau blok yang lebih rendah, mereka berhenti jatuh dan diperbaiki di tempatnya. Blok baru ditambahkan.
  • Ketika semua kolom di baris diisi dengan blok, baris dikosongkan, dan semua blok tetap di atas drop down satu baris.
  • Program harus merespons penekanan tombol. Harus ada 3 tombol unik yang menjalankan fungsi berikut
    • menggeser blok saat ini ke kiri 1 kolom
    • menggeser blok saat ini ke kanan 1 kolom
    • menggeser blok saat ini ke bawah 1 baris
  • Setiap tweet mungkin hanya memiliki 140 karakter. Menggunakan karakter multi-byte yang dapat dimasukkan ke dalam tweet diperbolehkan.
  • Aturan untuk apa yang bisa di tweet itu sederhana. Jika Anda bisa tweet, Anda bisa menggunakannya.

  • Bahasa yang ditafsirkan mengikuti aturan yang sama. Setiap bagian harus mengikuti spesifikasi. Selama tidak ada kesalahan run time (dan sisanya valid mengikuti spesifikasi) jawaban Anda adalah Aturan Golf yang valid :
    Karena implementasi asli "tweetable", tantangan ini memerlukan hal yang sama. Entri harus dapat ditransmisikan sebagai serangkaian tweet (garis 140 karakter atau kurang).

  • Tweet pertama harus berisi nama kompiler / juru bahasa, nama program, dan argumen baris perintah apa pun

    • itu akan disimpan sebagai file "P0"
  • N tweet berikut harus mengandung program sebagai serangkaian baris.
    • Setiap tweet akan disimpan dalam file dengan nama T <n>, dengan n adalah 1..N
  • Setiap baris akan ditambahkan ke baris sebelumnya dan dikompilasi atau ditafsirkan. Itu harus menghasilkan file objek atau program yang valid.
  • Program tidak perlu berfungsi sampai baris terakhir ditambahkan.
  • Program akan dijalankan dengan cara berikut (pseudo-bash)

    interp,prog,args = split P0 /\s/ 
    touch $prog
    for file in ./T* do
      cat $prog file > $prog
      $interp $prog $args
      die("FAIL") if $? #detect error
    done
    

    Penerjemah harus merupakan program yang dapat dieksekusi yang tersedia secara umum yang belum mengimplementasikan Tetris.

Penilaian :
Tweet Paling Sedikit, termasuk P0. Ikatan terputus oleh jumlah karakter cadangan terbesar (tweet 140 * num - jumlah karakter total).

Entri Contoh

chrome a.htm
<html><div id="output"></div></html>
<script>cool java script here</script>

Nilai = 3 (334 cadangan)

cc a.c ;a.out
main(){/*cool prog here*/}

Nilai = 2 (241 cadangan)

tetris

Nilai = 1 (134 cadangan) jika itu sah, padahal tidak

Terima kasih khusus

Saya diizinkan memposting ini atas persetujuan Ashelly di sini

Christopher
sumber
Tweet dapat berisi karakter UTF-8. Apakah itu benar di sini juga (misalnya, dapatkah kita memasukkan 400 byte dalam satu tweet menggunakan karakter CJK?)
Robert Fraser
@RobertFraser jika Anda bisa mengetiknya di tweet dan kirimkan ya
Christopher
Jika sesuatu yang dapat ditampung dalam tweet adalah game, dapatkah kita memiliki baris baru di masing-masing "tweet" kita? Jeda baris diizinkan dalam tweet.
notjagan
@ notjagan ya. Jika Anda dapat tweet, Anda dapat memilikinya
Christopher
2
Jika tantangannya akan seperti itu, Anda harus memasukkan spesifikasi yang tepat dari urutan karakter mana yang diizinkan dalam tweet.
feersum

Jawaban:

8

Python 3, Skor 5 Tweet (242 cadangan, menghitung P0)

Demo program Tetris (merapikan sedikit lebih dari versi yang diposting)

-19 byte, terima kasih kepada Jonathan Allan !

Hitungan cadangan tidak memperhitungkan baris baru akun di antara tweet.

Tweet 1 (Deklarasi, 12 byte)

python3 t.py

Tweet 2 (70 byte)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1<<32;t=30
while 1:

Kicauan 3 (129 byte)

 if m.kbhit()and b"\xe0"==m.getch():p=[p>>(not(a|f<<1)&p),p,p<<(not(a<<4|f>>1)&p),p>>5-5*(bool(f&p>>5)or p<t)][ord(m.getch())-77]

Kicauan 4 (113 byte)

 c+=1;print("\n".join("".join(".#"[1&(f|p)>>i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t<1:

Tweet 5 (134 bytes)

  if f&p>>5or p<t:s=~s;f|=p;p=2-s<<26
  else:p>>=5
 for i in r(0,t,5):
  if f|31<<i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)

Program Lengkap (449 byte)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1<<32;t=30
while 1:
 if m.kbhit()and b"\xe0"==m.getch():p=[p>>(not(a|f<<1)&p),p,p<<(not(a<<4|f>>1)&p),p>>5-5*(bool(f&p>>5)or p<t)][ord(m.getch())-77]
 c+=1;print("\n".join("".join(".#"[1&(f|p)>>i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t<1:
  if f&p>>5or p<t:s=~s;f|=p;p=2-s<<26
  else:p>>=5
 for i in r(0,t,5):
  if f|31<<i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)

Apakah beberapa titik jahat peretasan dan menyimpan bidang dan potong dalam dua bilangan bulat. Saya akan mencoba dan mengirim penjelasan segera.

Catatan: Ini hanya berjalan pada Windows, tetapi bisa dialihkan ke Linux melalui msvcrtgetchdan "cls""clear". Selain itu, input karakter tidak berfungsi pada IDLE Python, jadi saya sarankan menjalankannya di tempat lain.

notjagan
sumber
Wah, bagus! Ini singkat
Christopher
1
Kerja bagus. \xe0adalah empat byte bukan satu sehingga tweet 3 harus 130. Anda tampaknya telah melewatkan time.sleep(.1);c+=1tweet 4 dan mengubah urutannya (Saya tidak tahu apakah perubahan urutannya disengaja) dan sekali lagi \ndua byte bukan satu, jadi seharusnya 134 .
Jonathan Allan
1
... pikiran Anda tampaknya dapat dimainkan tanpa sleepdi komputer saya.
Jonathan Allan
1
Anda juga dapat menguji c%10<1dan menghapus c=0.
Jonathan Allan
1
@JonathanAllan Terima kasih atas sarannya! Saya agak terburu-buru ketika memposting ini jadi sepertinya saya agak ceroboh dengan membelah tweet.
notjagan
3

JavaScript (4 Tweet / 343 317 byte / 243 cadangan)

Tidak begitu yakin tentang persyaratan format tajuk & Tweet, jadi harap beri tahu jika perlu diperbaiki. Masih sedikit lagi yang bisa dicukur. Aku yakin.

Tweet 1 - P0 (11 byte)

chrome a.js

Tweet 2 (82 byte)

a=y=z=j=0,onkeyup=b=>R((k=b.keyCode-40)?z*2*(d=k+3?k+1?1:.5:2)&65|j*d&a||(z*=d):0)

Tweet 3 (126 byte)

R=d=>{d||(!(!y||a&j>>5)||(y>25?a=0:(31^31&(a|=j)>>y||(a=a>>y+5<<y|a&-1>>>-y-5>>5),y=0)),y-=5),y>=0||(y=30,z=12/(new Date%3+1))

Kicauan 4 (98 byte)

j=z<<y;for(o="",i=30;i--;)o+=1<<i&(a|j)?"#":"_",o+=i%5?"":"<br>";O.innerHTML=o},setInterval(R,300)

Jalankan di JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Klik pada panel output untuk memberikan fokus untuk acara keyboard)

Bergelombang
sumber
Tolong jangan posting jawaban yang sebagian atau tidak lengkap untuk pertanyaan. Sesuai diskusi meta ini, jawaban ini harus dihapus sampai sesuai dengan spesifikasi yang diuraikan dalam pertanyaan
PunPun1000
@ PunPun1000 Saya minta maaf. Sekarang sudah selesai dan tidak terhapus.
Bumpy
Tidak masalah, saya akan menghapus downvote saya. Selamat datang di PPCG.
PunPun1000