Tetris binario en tweets

16

Recientemente (hace unos años) hubo algunos rumores en los sitios web de programación sobre una implementación de Tetris en 140 Bytes . ...

Resulta que aunque es pequeño, es una versión simplificada de Tetris, y ni siquiera una implementación completa. Solo la función lógica central cabe en 140 bytes de Javascript. Para ejecutarlo realmente, necesita otros ~ 840 caracteres de HTML.

¡Podemos hacerlo mejor!
Este desafío es implementar una versión completa de "Binary Tetris" en la menor cantidad de tweets posible.

Reglas binarias de Tetris:

  • El programa debe mostrar un campo de juego que contenga al menos 5 columnas y 6 filas de celdas.
    • Se puede utilizar cualquier método de visualización, siempre que los bloques y los bordes del campo estén claramente marcados.
  • Debe haber al menos dos tipos de bloques: #y ##. El apoyo adicional del bloque, como los ###bloques angulares con forma de L, serán votados por mí: P y el juego más completo de tetris binario (la mayoría de los bloques como las características originales y de rotación) ganarán mi felicidad y una posible recompensa de hasta 50 repeticiones.
  • Se agregan nuevos bloques al campo en la fila superior, y una celda de bloque debe ocupar la columna central.
  • Los bloques descienden hacia la fila inferior a una velocidad fija. Los bloques deben descender incluso sin la intervención del usuario.
  • Cuando los bloques tocan el fondo del campo o un bloque inferior, dejan de caer y se fijan en su lugar. Se agrega un nuevo bloque.
  • Cuando todas las columnas de la fila están llenas de bloques, la fila se vacía y todos los bloques fijos de arriba se despliegan una fila.
  • El programa debe responder a las pulsaciones de teclas. Debe haber 3 teclas únicas que realicen las siguientes funciones.
    • desplazar el bloque actual a la izquierda 1 columna
    • desplazar bloque actual derecha 1 columna
    • desplazar el bloque actual hacia abajo 1 fila
  • Cada tweet solo puede tener 140 caracteres. Se permite el uso de caracteres de varios bytes que se pueden poner en tweets.
  • Las reglas para lo que puede estar en un tweet es simple. Si puedes tuitearlo, puedes usarlo.

  • Los idiomas interpretados siguen las mismas reglas. Cada sección debe seguir las especificaciones. Siempre que no se produzcan errores en el tiempo de ejecución (y el resto es válido siguiendo las especificaciones) su respuesta es válida Reglas de golf:
    Debido a que la implementación original era "tweetable", este desafío requiere lo mismo. Las entradas deben poder transmitirse como una serie de tweets (líneas de 140 caracteres o menos).

  • El primer tweet debe contener el nombre del compilador / intérprete, el nombre del programa y cualquier argumento de la línea de comandos.

    • se guardará como archivo "P0"
  • Los siguientes N tweets deben contener el programa como una serie de líneas.
    • Cada tweet se almacenará en un archivo con el nombre T <n>, donde n es 1..N
  • Cada línea se agregará a las líneas anteriores y se compilará o interpretará. Debe producir un archivo objeto o programa válido.
  • El programa no necesita ser funcional hasta que se agregue la última línea.
  • El programa se ejecutará de la siguiente manera (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
    

    El intérprete debe ser un programa ejecutable comúnmente disponible que aún no implemente Tetris.

Puntuación :
Fewest Tweets, incluido P0. Lazos rotos por el mayor número de caracteres de reserva (140 * números de tweets - recuento total de caracteres).

Entradas de ejemplo

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

Puntuación = 3 (334 de repuesto)

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

Puntuación = 2 (241 de repuesto)

tetris

Puntuación = 1 (134 de repuesto) si fuera legal, lo cual no es

Gracias especiales

Se me permitió publicar esto por el consentimiento de Ashelly aquí

Christopher
fuente
Los tweets pueden contener caracteres UTF-8. ¿Es eso cierto aquí también (por ejemplo, ¿podemos rellenar 400 bytes en un solo tweet usando caracteres CJK?)
Robert Fraser
@RobertFraser si puede escribirlo en un tweet y enviarlo, sí
Christopher
Si algo que cabe en un tweet es un juego, ¿podemos tener nuevas líneas dentro de cada uno de nuestros "tweets"? Se permiten saltos de línea dentro de los tweets.
notjagan
@notjagan sí. Puede twittearlo, puede tenerlo
Christopher
2
Si el desafío va a ser así, debe incluir una especificación exacta de qué secuencias de caracteres están permitidas en un tweet.
fiesta

Respuestas:

8

Python 3, Puntuación de 5 Tweets (242 de repuesto, contando P0)

Demostración del programa Tetris (suavizado un poco más que la versión publicada)

-19 bytes gracias a Jonathan Allan !

El recuento adicional no tiene en cuenta las nuevas líneas entre tweets.

Tweet 1 (Declaración, 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)

Hace algún punto malicioso de pirateo y almacena el campo y la pieza en dos enteros. Trataré de publicar una explicación pronto.

Nota: Esto solo se ejecuta en Windows, pero podría cambiarse a Linux a través de msvcrtgetchy "cls""clear". Además, la entrada de caracteres no funciona en IDLE de Python, por lo que recomiendo ejecutarlo en otro lugar.

notjagan
fuente
Wow bien hecho! Este corto
Christopher
1
Buen trabajo. \xe0es cuatro bytes, no uno, por lo que el tweet 3 debería ser 130. Parece que se perdió time.sleep(.1);c+=1del tweet 4 y cambió el orden (no sé si el cambio de orden es intencional) y nuevamente \nes dos bytes, no uno, por lo que debería ser 134 .
Jonathan Allan
1
... Eso sí, parece jugable sin el sleepen mi máquina.
Jonathan Allan
1
También puedes probar c%10<1y eliminar c=0.
Jonathan Allan
1
@ JonathanAllan ¡Gracias por las sugerencias! Tenía un poco de prisa cuando publiqué esto, así que parece que fui un poco descuidado al dividir los tweets.
notjagan
3

JavaScript (4 Tweets / 343 317 bytes / 243 de repuesto)

No estoy muy seguro acerca de los requisitos del formato de encabezado y Tweets, por lo que le recomendamos que lo corrija. Todavía se puede afeitar un poco más, estoy seguro.

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)

Ejecútelo en JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Haga clic en el panel de salida para proporcionar foco para eventos de teclado)

Con baches
fuente
No publique respuestas parcialmente completadas o no válidas a la pregunta. Según esta meta discusión, esta respuesta debe eliminarse hasta que cumpla con las especificaciones descritas en la pregunta
PunPun1000,
@ PunPun1000 Mis disculpas. Ahora está completo y sin recuperar.
Bumpy
No hay problema, eliminaré mi voto negativo. Bienvenido a PPCG.
PunPun1000