鸣叫中的二进制俄罗斯方块


16

最近(几年前),编程 网站上出现了一些有关以140 Bytes实现俄罗斯方块的嗡嗡声。...

事实证明,尽管它很小,但它是Tetris的简化版本,甚至不是完整的实现。只有核心逻辑功能适合140字节的Javascript。要实际运行它,您还需要约840个HTML字符。

我们可以做得更好!
面临的挑战是在尽可能少的推文中实现完整版本的“二进制俄罗斯方块”。

二进制俄罗斯方块规则:

  • 程序必须显示至少包含5列和6行单元格的运动场。
    • 可以使用任何显示方法,只要清楚地标记了区域的块和边缘即可。
  • 至少必须有两种类型的块: ###。其他块支持,例如###:P或形状像L的角度块之类的将被我:P投票,最完整的二元俄罗斯方块游戏(大多数块如原始和旋转功能)将赢得我的幸福,并可能获得50 rep奖励。
  • 新块将添加到第一行的字段中,并且一个块单元必须占据中心列。
  • 方块以固定的速率朝底行下降。即使没有用户输入,块也必须下降。
  • 当砖块碰到场地底部或下部砖块时,它们会停止下降并固定到位。添加了一个新块。
  • 当该行中的所有列都填充有块时,该行将被清空,并且上方的所有固定块将下拉一行。
  • 该程序必须响应按键。必须有3个唯一的键才能执行以下功能
    • 将当前块左移1列
    • 将当前块右移1列
    • 将当前块向下移动1行
  • 每条推文只能包含140个字符。允许使用可以放在推文中的多字节字符。
  • 一条推文中的规则很简单。如果可以鸣叫,则可以使用它。

  • 口译语言遵循相同的规则。每个部分都必须遵循规范。只要没有发生运行时错误(其余错误均符合规范),您的答案就是有效的 Golfing规则:
    由于原始实现是“可发推的”,因此这一挑战也需要同样的条件。条目必须能够以一系列推文(每行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 tweets-总字符数)。

示例条目

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字符将400ish字节填充到一条推文中吗?)
Robert Fraser

@RobertFraser如果您可以将其键入推文中并发送,则可以
克里斯托弗(Christopher)

如果有任何适合推文的内容是游戏,我们是否可以在每个“推文”中添加换行符?鸣叫中允许换行。
notjagan

@notjagan是的。它可以鸣叫它,你可以拥有它
克里斯托弗

2
如果挑战将是这种方式,则需要在推文中包括允许使用哪些字符序列的确切说明。
feersum

Answers:


8

Python 3,5条推文得分(242条备用,计数为P0)

俄罗斯方块程序演示(比已发布的版本略有平滑)

-19个字节感谢Jonathan Allan

备用计数不考虑推文之间的换行符。

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

进行一些恶意攻击,并将字段和片段存储为两个整数。我将尽快发布解释。

注意:这只能在Windows上运行,但是可以通过msvcrtgetch"cls"→ 切换到Linux "clear"。另外,字符输入在Python的IDLE上不起作用,因此我建议在其他地方运行它。


哇,做得好!简短内容
克里斯托弗(Christopher)

1
辛苦了 \xe0是四个字节而不是一个,因此推文3应该是130。您似乎错过time.sleep(.1);c+=1了推文4并更改了顺序(我不知道是否有意更改顺序),又\n是两个字节而不是一个,所以应该是134 。
乔纳森·艾伦

1
...注意,如果没有sleep我的机器,它似乎可以玩。
乔纳森·艾伦

1
您也可以测试c%10<1并删除c=0
乔纳森·艾伦

1
@JonathanAllan感谢您的建议!发布此消息时我有点着急,所以我似乎对分割推文有点粗心。
notjagan

3

JavaScript(4个推文/ 343317字节/ 243个备用字节)

对于header&Tweets格式的要求不太清楚,因此请告知是否需要更正。我敢肯定,还有很多可以剃掉的。

推文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 '17

@ PunPun1000我很抱歉。现在已完成且未删除。
颠簸

没问题,我将删除我的否决票。欢迎来到PPCG。
PunPun1000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.