ツイート内のバイナリテトリス


16

最近(数年前)、プログラミング ウェブサイトで140バイトテトリスの実装に関する話題がありました。...

小さいながらも、Tetrisの簡易バージョンであり、完全な実装ではないことがわかりました。コアロジック関数のみが140バイトのJavascriptに適合します。実際に実行するには、別の〜840文字のHTMLが必要です。

もっと良くできる!
この課題は、「Binary Tetris」の完全なバージョンを可能な限り少ないツイートで実装することです。

バイナリテトリスルール:

  • プログラムは、少なくとも5列と6行のセルを含む競技場を表示する必要があります。
    • フィールドのブロックとエッジが明確にマークされている限り、どのような表示方法を使用してもかまいません。
  • 少なくとも2種類のブロックが必要です: ######Lのような形状のブロックやアングルブロックなどの追加ブロックサポートは私に支持されます:Pとバイナリテトリスの最も完全なゲーム(元の機能や回転機能のような最もブロック)は、私の幸福と賞金50倍の賞金を獲得します。
  • 新しいブロックが一番上の行のフィールドに追加され、1つのブロックセルが中央の列を占める必要があります。
  • ブロックは固定レートで最下行に向かって下降します。ブロックは、ユーザー入力なしでも下降する必要があります。
  • ブロックがフィールドの下部または下のブロックに触れると、落下が止まり、固定されます。新しいブロックが追加されます。
  • 行のすべての列がブロックで満たされると、その行は空になり、上のすべての固定ブロックが1行ドロップダウンします。
  • プログラムはキー入力に応答する必要があります。次の機能を実行する3つの一意のキーが必要です
    • 現在のブロックを1列左にシフト
    • 現在のブロックを右に1列シフト
    • 現在のブロックを1行下にシフト
  • 各ツイートには140文字しか使用できません。ツイートに入れることができるマルチバイト文字の使用は許可されています。
  • ツイートに含めることができるルールは簡単です。ツイートできる場合は、使用できます。

  • 解釈された言語は同じルールに従います。各セクションは仕様に従う必要があります。限り何も実行時エラーが発生しない(と残りはスペック以下有効である)として、あなたの答えは有効である ゴルフのルール:
    オリジナルの実装は、「tweetable」だったので、この課題は、同じことを必要とします。エントリーは、一連のツイート(140文字以下の行)として送信できる必要があります。

  • 最初のツイートには、コンパイラ/インタープリターの名前、プログラムの名前、およびコマンドライン引数が含まれている必要があります

    • ファイル「P0」として保存されます
  • 次のN個のツイートには、プログラムを一連の行として含める必要があります。
    • 各ツイートは、T <n>という名前のファイルに保存されます(nは1..N)。
  • 各行は前の行に追加され、コンパイルまたは解釈されます。有効なオブジェクトファイルまたはプログラムを生成する必要があります。
  • プログラムは、最後の行が追加されるまで機能する必要はありません。
  • プログラムは次の方法で実行されます(疑似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
    

    インタープリターは、テトリスをまだ実装していない一般に入手可能な実行可能プログラムでなければなりません。

スコアリング
P0を含むツイートが最も少ない。スペア文字の最大数(140 * numツイート-合計文字数)で壊れた関係。

エントリの例

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

スコア= 3(334スペア)

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

スコア= 2(スペア241)

tetris

スコア= 1(134スペア) が合法だった場合、それはそうではありません

特別な感謝

ここに Ashellyの同意によりこれを投稿することが許可されまし


ツイートにはUTF-8文字が含まれる場合があります。ここでも同様です(たとえば、CJK文字を使用して400バイトを1つのツイートに詰め込めますか?)
ロバートフレイザー

@RobertFraserツイートに入力して送信できる場合は、はい
クリストファー

ツイートに収まるものがゲームである場合、各「ツイート」内に改行を入れることはできますか?ツイート内での改行は許可されています。
-notjagan

@notjaganはい。ツイートすることができます
クリストファー

2
課題がそのようになる場合は、ツイートで許可される文字シーケンスの正確な仕様を含める必要があります。
-feersum

回答:


8

Python 3、5ツイートのスコア(242スペア、P0をカウント)

テトリスプログラムのデモ(投稿されたバージョンよりも若干滑らかになりました)

ジョナサン・アランのおかげで-19バイト!

予備カウントでは、ツイート間からの改行は考慮されません。

ツイート1(宣言、12バイト)

python3 t.py

ツイート2(70バイト)

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

ツイート3(129バイト)

 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]

ツイート4(113バイト)

 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:

ツイート5(134バイト)

  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)

フルプログラム(449バイト)

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)

いくつかの悪意のあるビットがハッキングを行い、フィールドとピースを2つの整数に格納します。すぐに説明を投稿してみます。

注:これはWindowsでのみ実行されますが、msvcrtgetchおよび"cls"→を介してLinuxに切り替えることができます"clear"。さらに、PythonのIDLEでは文字入力が機能しないため、他の場所で実行することをお勧めします。


よくできました!この短い
クリストファー

1
よくできました。\xe0である4つのバイトではない1つぶやき3は、130はあなたが見逃しているように見えるべきであるので、time.sleep(.1);c+=1再びつぶやき4からとオーダー(注文変更が意図的である場合、私は知りません)に変更し、\nそれが134でなければならないので、1〜2つのバイトではありません。
ジョナサン・アラン

1
... sleep私のマシンにいなくてもプレイできるようです。
ジョナサンアラン

1
テストc%10<1して削除することもできc=0ます。
ジョナサンアラン

1
@JonathanAllan提案をありがとう!これを投稿するとき、私は少し急いでいたので、ツイートを分割することに多少不注意だったようです。
-notjagan

3

JavaScript(4ツイート/ 343 317バイト/ 243スペア)

ヘッダーとツイートの形式の要件についてはよくわからないので、修正が必要かどうかアドバイスしてください。確かにもう少し削ることができます。

ツイート1-P0(11バイト)

chrome a.js

ツイート2(82バイト)

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)

ツイート3(126バイト)

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

ツイート4(98バイト)

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

JSFiddleで実行します:https ://jsfiddle.net/CookieJon/7Lenhcge/

(出力ペインをクリックして、キーボードイベントにフォーカスを提供します)


質問に対する部分的に完了した回答または無効な回答を投稿しないでください。このメタディスカッションに従ってこの回答は、質問で概説されている仕様(
PunPun1000

@ PunPun1000おMyび申し上げます。これで完了し、削除されていません。
バンピー

問題ありません、下票を削除します。PPCGへようこそ。
PunPun1000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.