Tetris binário em tweets

16

Recentemente (há alguns anos atrás) houve um burburinho nos sites de programação sobre uma implementação do Tetris em 140 bytes . ...

Acontece que, embora seja pequeno, é uma versão simplificada do Tetris, e nem mesmo uma implementação completa. Somente a função lógica central cabe em 140 bytes de Javascript. Para executá-lo, você precisa de outros ~ 840 caracteres de HTML.

Nós podemos fazer melhor!
Esse desafio é implementar uma versão completa do "Binary Tetris" no menor número possível de tweets.

Regras binárias de Tetris:

  • O programa deve exibir um campo de jogo contendo pelo menos 5 colunas e 6 linhas de células.
    • Qualquer método de exibição pode ser usado, desde que os blocos e as bordas do campo estejam claramente marcados.
  • Deve haver pelo menos dois tipos de blocos: #e ##. Suporte adicional a blocos, como ###blocos angulares em forma de L, será votado por mim: P e o jogo mais completo de tetris binários (a maioria dos blocos como os recursos originais e de rotação) ganharão minha felicidade e uma possível recompensa de 50 repetições.
  • Novos blocos são adicionados ao campo na linha superior e uma célula de bloco deve ocupar a coluna central.
  • Os blocos descem em direção à linha inferior a uma taxa fixa. Os blocos devem descer mesmo sem a entrada do usuário.
  • Quando os blocos tocam a parte inferior do campo ou um bloco inferior, eles param de cair e são fixados no lugar. Um novo bloco é adicionado.
  • Quando todas as colunas da linha são preenchidas com blocos, a linha é esvaziada e todos os blocos fixos acima caem uma linha.
  • O programa deve responder a pressionamentos de tecla. Deve haver três teclas exclusivas que executam as seguintes funções
    • deslocar o bloco atual para a esquerda 1 coluna
    • deslocar o bloco de corrente à direita 1 coluna
    • deslocar o bloco atual para baixo 1 linha
  • Cada tweet pode ter apenas 140 caracteres. É permitido o uso de caracteres de vários bytes que podem ser colocados nos tweets.
  • As regras para o que pode estar em um tweet é simples. Se você pode twittar, você pode usá-lo.

  • Os idiomas interpretados seguem as mesmas regras. Cada seção deve seguir as especificações. Desde que não ocorram erros no tempo de execução (e o restante seja válido de acordo com as especificações), sua resposta é válida Regras de golfe:
    Como a implementação original era "tweetável", esse desafio requer o mesmo. As entradas devem poder ser transmitidas como uma série de tweets (linhas de 140 caracteres ou menos).

  • O primeiro tweet deve conter o nome do compilador / intérprete, o nome do programa e quaisquer argumentos de linha de comando

    • ele será salvo como arquivo "P0"
  • Os seguintes N tweets devem conter o programa como uma série de linhas.
    • Cada tweet será armazenado em um arquivo com o nome T <n>, onde n é 1..N
  • Cada linha será adicionada às linhas anteriores e compilada ou interpretada. Ele deve produzir um arquivo ou programa de objeto válido.
  • O programa não precisa estar funcional até que a última linha seja adicionada.
  • O programa será executado da seguinte maneira (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
    

    O intérprete deve ser um programa executável comumente disponível que ainda não implemente o Tetris.

Scoring :
tweets, incluindo P0 menor índice. Gravatas quebradas pelo maior número de caracteres sobressalentes (140 * num tweets - contagem total de caracteres).

Entradas de exemplo

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

Pontuação = 3 (334 de reposição)

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

Pontuação = 2 (241 de reposição)

tetris

Pontuação = 1 (134 de reposição) se for legal, o que não é

Agradecimentos especiais

Pude postar isso com o consentimento de Ashelly aqui

Christopher
fonte
Os tweets podem conter caracteres UTF-8. Isso é verdade aqui também (por exemplo, podemos encher bytes 400ish em um único tweet usando caracteres CJK?)
Robert Fraser
@RobertFraser se você pode digitá-lo em um tweet e enviá-lo, então sim
Christopher
Se alguma coisa que possa caber em um tweet é um jogo, podemos ter novas linhas em cada um dos nossos "tweets"? Quebras de linha são permitidas nos tweets.
Notjagan 18/05
@notjagan yes. Ele você pode tweet ele você pode tê-lo
Christopher
2
Se o desafio for assim, você precisará incluir uma especificação exata de quais seqüências de caracteres são permitidas em um tweet.
feersum

Respostas:

8

Python 3, Pontuação de 5 Tweets (242 de reposição, contando P0)

Demo do programa Tetris (suavizado um pouco mais do que a versão postada)

-19 bytes graças a Jonathan Allan !

A contagem de reposição não leva em consideração as novas linhas entre os tweets.

Tweet 1 (Declaração, 12 bytes)

python3 t.py

Tweet 2 (70 bytes)

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

Tweet 3 (129 bytes)

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

 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)

Programa completo (449 bytes)

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)

Algum ponto do mal aponta para hackers e armazena o campo e a peça em dois números inteiros. Vou tentar postar uma explicação em breve.

Nota: Isso funciona apenas no Windows, mas pode ser alterado para Linux através de msvcrtgetche "cls""clear". Além disso, a entrada de caracteres não funciona no IDLE do Python, então eu recomendo executá-la em outro lugar.

notjagan
fonte
Uau bem feito! Este curta
Christopher
1
Bom trabalho. \xe0tem quatro bytes e não um, então o tweet 3 deve ter 130. Parece que você perdeu o time.sleep(.1);c+=1tweet 4 e alterou a ordem (não sei se a alteração da ordem é intencional) e novamente \ntem dois bytes e não um, então deve ser 134 .
Jonathan Allan
1
... lembre-se, parece jogável sem o sleepmeu computador.
Jonathan Allan
1
Você também pode testar c%10<1e remover c=0.
Jonathan Allan
1
@ JonathanAllan Obrigado pelas sugestões! Eu estava com pressa ao postar isso, então parece que fiquei um pouco descuidado ao dividir os tweets.
Nothagan
3

JavaScript (4 Tweets / 343 317 bytes / 243 sobressalentes)

Não tem muita certeza dos requisitos do cabeçalho e do formato dos Tweets, por isso, informe se ele precisa ser corrigido. Ainda um pouco mais pode ser raspado, tenho certeza.

Tweet 1 - P0 (11 bytes)

chrome a.js

Tweet 2 (82 bytes)

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

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

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

Execute-o no JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Clique no painel de saída para dar foco aos eventos do teclado)

Irregular
fonte
Não poste respostas parcialmente preenchidas ou inválidas para a pergunta. De acordo com esta meta-discussão, esta resposta deve ser excluída até que esteja em conformidade com as especificações descritas na pergunta #
19717 PunPun1000
@ PunPun1000 Minhas desculpas. Agora está completo e sem exclusão.
Acidentado
Não tem problema, vou remover meu voto negativo. Bem-vindo ao PPCG.
precisa saber é o seguinte