Tetris nhị phân trong tweets


16

Gần đây (một vài năm trở lại đây) một số tiếng vang trên các trang web lập trình về việc triển khai Tetris trong 140 Byte . ...

Nó chỉ ra rằng mặc dù nó nhỏ, nhưng nó là một phiên bản đơn giản của Tetris, và thậm chí không phải là một thực hiện hoàn chỉnh. Chỉ có chức năng logic lõi phù hợp với 140 byte Javascript. Để thực sự chạy nó, bạn cần thêm ~ 840 ký tự HTML.

Chúng ta có thể làm tốt hơn!
Thử thách này là triển khai một phiên bản hoàn chỉnh của "Binary Tetris" trong càng ít tweet càng tốt.

Quy tắc Tetris nhị phân:

  • Chương trình phải hiển thị một sân chơi chứa ít nhất 5 cột và 6 hàng ô.
    • Bất kỳ phương pháp hiển thị nào cũng có thể được sử dụng, miễn là các khối và các cạnh của trường được đánh dấu rõ ràng.
  • Phải có ít nhất hai loại khối: ###. Hỗ trợ khối bổ sung như ###hoặc các khối góc có hình chữ L sẽ được tôi nâng cấp: P và trò chơi tetris nhị phân hoàn chỉnh nhất (hầu hết các khối như tính năng gốc và xoay) sẽ giành được hạnh phúc của tôi và có thể kiếm được 50 rep.
  • Các khối mới được thêm vào trường ở hàng trên cùng và một ô khối phải chiếm cột trung tâm.
  • Các khối giảm dần về phía hàng dưới cùng với một tỷ lệ cố định. Các khối phải hạ xuống ngay cả khi không có đầu vào của người dùng.
  • Khi các khối chạm vào đáy của trường hoặc một khối thấp hơn, chúng sẽ ngừng rơi và được cố định tại chỗ. Một khối mới được thêm vào.
  • Khi tất cả các cột trong hàng được lấp đầy bằng các khối, hàng sẽ được làm trống và tất cả các khối cố định ở trên thả xuống một hàng.
  • Chương trình phải đáp ứng với phím nhấn. Phải có 3 phím duy nhất thực hiện các chức năng sau
    • thay đổi khối hiện tại trái 1 cột
    • thay đổi khối hiện tại bên phải 1 cột
    • thay đổi khối hiện tại xuống 1 hàng
  • Mỗi tweet chỉ có thể có 140 ký tự. Sử dụng các ký tự nhiều byte có thể được đặt trong các tweet được cho phép.
  • Các quy tắc cho những gì có thể trong một tweet là đơn giản. Nếu bạn có thể tweet nó, bạn có thể sử dụng nó.

  • Các ngôn ngữ được giải thích tuân theo các quy tắc tương tự. Mỗi phần phải theo thông số kỹ thuật. Miễn là không có lỗi thời gian chạy xảy ra (và phần còn lại là hợp lệ theo thông số kỹ thuật) câu trả lời của bạn là Quy tắc chơi gôn hợp lệ :
    Bởi vì việc triển khai ban đầu là "có thể tweet", thử thách này yêu cầu tương tự. Bài dự thi phải có thể được truyền dưới dạng một loạt các tweet (dòng từ 140 ký tự trở xuống).

  • Dòng tweet đầu tiên phải chứa tên của trình biên dịch / trình thông dịch, tên của chương trình và bất kỳ đối số dòng lệnh nào

    • nó sẽ được lưu dưới dạng tệp "P0"
  • N tweet sau đây phải chứa chương trình dưới dạng một loạt các dòng.
    • Mỗi tweet sẽ được lưu trữ trong một tệp có tên T <n>, trong đó n là 1..N
  • Mỗi dòng sẽ được thêm vào các dòng trước đó và được biên dịch hoặc giải thích. Nó phải tạo ra một tệp đối tượng hoặc chương trình hợp lệ.
  • Chương trình không cần phải hoạt động cho đến khi dòng cuối cùng được thêm vào.
  • Chương trình sẽ được chạy theo cách sau (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
    

    Trình thông dịch phải là một chương trình thực thi thường có sẵn mà chưa triển khai Tetris.

Ghi điểm :
Tweets ít nhất, bao gồm P0. Các mối quan hệ bị phá vỡ bởi số lượng ký tự dự phòng lớn nhất (tweets 140 * num - tổng số ký tự).

Bài dự thi

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

Điểm = 3 (334 dự phòng)

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

Điểm = 2 (dự phòng là 241)

tetris

Điểm = 1 (134 phụ tùng) nếu đó là hợp pháp, nhưng không

Cảm tạ

Tôi được phép đăng bài này bởi sự đồng ý của Ashelly ở đây


Tweets có thể chứa các ký tự UTF-8. Điều đó có đúng ở đây không (ví dụ: chúng ta có thể nhét 400 byte vào một tweet bằng các ký tự CJK không?)
Robert Fraser

@RobertFraser nếu bạn có thể nhập nó vào một tweet và gửi nó thì có
Christopher

Nếu bất cứ điều gì có thể phù hợp trong một tweet là trò chơi, chúng ta có thể có dòng mới trong mỗi "tweet" của mình không? Ngắt dòng được cho phép trong tweets.
notjagan

@notjagan vâng. Bạn có thể tweet nó bạn có thể có nó
Christopher

2
Nếu thử thách sẽ diễn ra theo cách đó, bạn cần bao gồm một đặc điểm kỹ thuật chính xác về các chuỗi ký tự được phép trong một tweet.
frageum

Câu trả lời:


8

Python 3, Điểm của 5 Tweets (242 phụ tùng, tính P0)

Bản demo của chương trình Tetris (được làm mịn hơn một chút so với phiên bản đã đăng)

-19 byte nhờ Jonathan Allan !

Số lượng dự phòng không tính đến các dòng mới từ giữa các tweet.

Tweet 1 (Tuyên bố, 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:

Tweet 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]

Tweet 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 byte)

  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)

Chương trình đầy đủ (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)

Có một số điểm ác độc hack và lưu trữ trường và mảnh trong hai số nguyên. Tôi sẽ thử và gửi một lời giải thích sớm.

Lưu ý: Điều này chỉ chạy trên Windows, nhưng nó có thể được chuyển sang Linux thông qua msvcrtgetch"cls""clear". Ngoài ra, nhập ký tự không hoạt động trên IDLE của Python, vì vậy tôi khuyên bạn nên chạy nó ở nơi khác.


Wow cũng được thực hiện! Ngắn này
Christopher

1
Làm tốt lắm. \xe0là bốn byte không phải là một nên tweet 3 phải là 130. Bạn dường như đã bỏ lỡ time.sleep(.1);c+=1từ tweet 4 và thay đổi thứ tự (Tôi không biết nếu thay đổi thứ tự là cố ý) và một lần nữa \nlà hai byte không phải một, vì vậy nó phải là 134 .
Jonathan Allan

1
... nhớ bạn có vẻ như không thể chơi được sleeptrên máy của tôi.
Jonathan Allan

1
Bạn cũng có thể kiểm tra c%10<1và loại bỏ c=0.
Jonathan Allan

1
@Jonathan ALLan Cảm ơn những lời đề nghị! Tôi đã hơi vội vàng khi đăng bài này vì vậy có vẻ như tôi đã hơi bất cẩn với việc chia các tweet.
notjagan

3

JavaScript (4 Tweets / 343 317 byte / 243 dự phòng)

Không hoàn toàn chắc chắn về các yêu cầu của định dạng Tweets & Tweets, vì vậy vui lòng tư vấn nếu nó cần sửa. Vẫn còn một chút nữa có thể được cạo sạch tôi chắc chắn.

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))

Tweet 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)

Chạy nó trong JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Nhấp vào khung đầu ra để cung cấp tiêu điểm cho các sự kiện bàn phím)


Xin vui lòng không gửi câu trả lời hoàn thành một phần hoặc không hợp lệ cho câu hỏi. Theo cuộc thảo luận meta này, câu trả lời này sẽ bị xóa cho đến khi nó tuân thủ thông số được nêu trong câu hỏi
PunPun1000

@ PunPun1000 Lời xin lỗi của tôi. Bây giờ nó đã hoàn thành và không bị xóa.
Bumpy

Không có vấn đề, tôi sẽ loại bỏ downvote của tôi. Chào mừng đến với PPCG.
PunPun1000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.