Tetris binaire dans les tweets

16

Il y a eu récemment (il y a quelques années) un certain buzz sur les sites de programmation concernant une implémentation de Tetris en 140 octets . ...

Il s'avère que bien qu'il soit petit, il s'agit d'une version simplifiée de Tetris, et même pas d'une implémentation complète. Seule la fonction logique principale tient dans 140 octets de Javascript. Pour l'exécuter, vous avez besoin de ~ 840 caractères HTML supplémentaires.

On peut faire mieux!
Ce défi consiste à implémenter une version complète de "Tetris binaire" dans le moins de tweets possible.

Règles Tetris binaires:

  • Le programme doit afficher un terrain de jeu contenant au moins 5 colonnes et 6 lignes de cellules.
    • N'importe quelle méthode d'affichage peut être utilisée, tant que les blocs et les bords du champ sont clairement marqués.
  • Il doit y avoir au moins deux types de blocs: #et ##. Un support de bloc supplémentaire tel que des ###blocs d'angle en forme de L sera voté par moi: P et le jeu de tetris binaire le plus complet (le plus de blocs comme les fonctionnalités d'origine et de rotation) gagnera mon bonheur et une prime possible jusqu'à 50 répétitions.
  • De nouveaux blocs sont ajoutés au champ de la ligne supérieure et une cellule de bloc doit occuper la colonne centrale.
  • Les blocs descendent vers la rangée du bas à un taux fixe. Les blocs doivent descendre même sans intervention de l'utilisateur.
  • Lorsque des blocs touchent le bas du champ ou un bloc inférieur, ils arrêtent de tomber et sont fixés en place. Un nouveau bloc est ajouté.
  • Lorsque toutes les colonnes de la ligne sont remplies de blocs, la ligne est vidée et tous les blocs fixes ci-dessus déroulent d'une ligne.
  • Le programme doit répondre aux pressions de touches. Il doit y avoir 3 touches uniques qui remplissent les fonctions suivantes
    • décaler le bloc actuel vers la gauche 1 colonne
    • décaler le bloc en cours vers la droite 1 colonne
    • décaler le bloc actuel d'une ligne vers le bas
  • Chaque tweet ne peut contenir que 140 caractères. L'utilisation de caractères multi-octets pouvant être mis dans des tweets est autorisée.
  • Les règles pour ce qui peut être dans un tweet sont simples. Si vous pouvez le tweeter, vous pouvez l'utiliser.

  • Les langues interprétées suivent les mêmes règles. Chaque section doit suivre les spécifications. Tant qu'aucune erreur d'exécution ne se produit (et que le reste est valide selon les spécifications), votre réponse est des règles de golf valides :
    parce que l'implémentation d'origine était "tweetable", ce défi nécessite la même chose. Les inscriptions doivent pouvoir être transmises sous la forme d'une série de tweets (lignes de 140 caractères ou moins).

  • Le premier tweet doit contenir le nom du compilateur / interpréteur, le nom du programme et tout argument de ligne de commande

    • il sera enregistré en tant que fichier "P0"
  • Les N tweets suivants doivent contenir le programme sous la forme d'une série de lignes.
    • Chaque tweet sera stocké dans un fichier avec le nom T <n>, où n est 1..N
  • Chaque ligne sera ajoutée aux lignes précédentes et compilée ou interprétée. Il doit produire un fichier objet ou un programme valide.
  • Le programme n'a pas besoin d'être fonctionnel jusqu'à ce que la dernière ligne soit ajoutée.
  • Le programme sera exécuté de la manière suivante (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
    

    L'interpréteur doit être un programme exécutable couramment disponible qui n'implémente pas déjà Tetris.

Score : le moins de
tweets, y compris P0. Liens rompus par le plus grand nombre de caractères de rechange (140 * num tweets - nombre total de caractères)

Exemples d'entrées

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

Score = 3 (334 de rechange)

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

Score = 2 (241 de rechange)

tetris

Score = 1 (134 de rechange) si c'était légal, ce qui n'est pas le cas

Remerciement spécial

J'ai été autorisé à poster ceci avec le consentement d'Ashelly ici

Christophe
la source
Les tweets peuvent contenir des caractères UTF-8. Est-ce vrai également ici (par exemple, pouvons-nous remplir 400 octets dans un seul tweet en utilisant des caractères CJK?)
Robert Fraser
@RobertFraser si vous pouvez le taper dans un tweet et l'envoyer alors oui
Christopher
Si quelque chose qui peut tenir dans un tweet est un jeu, pouvons-nous avoir des nouvelles lignes dans chacun de nos "tweets?" Les sauts de ligne sont autorisés dans les tweets.
notjagan
@notjagan oui. Si vous pouvez le tweeter, vous pouvez l'avoir
Christopher
2
Si le défi va être de cette façon, vous devez inclure une spécification exacte des séquences de caractères autorisées dans un tweet.
feersum

Réponses:

8

Python 3, Score de 5 Tweets (242 de rechange, en comptant P0)

Démo du programme Tetris (lissé légèrement plus que la version publiée)

-19 octets merci à Jonathan Allan !

Le compte de réserve ne prend pas en compte les sauts de ligne entre les tweets.

Tweet 1 (Déclaration, 12 octets)

python3 t.py

Tweet 2 (70 octets)

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

Tweet 3 (129 octets)

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

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

  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)

Programme complet (449 octets)

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)

Est-ce que certains bits maléfiques pointent le piratage et stockent le champ et la pièce dans deux entiers. Je vais essayer de poster une explication bientôt.

Remarque: Cela ne fonctionne que sur Windows, mais il peut être basculé sur Linux via msvcrtgetchet "cls""clear". De plus, la saisie de caractères ne fonctionne pas sur IDLE de Python, donc je recommanderais de l'exécuter ailleurs.

notjagan
la source
Wow bien fait! Ce court
Christopher
1
Bon travail. \xe0est de quatre octets et non un donc le tweet 3 devrait être 130. Vous semblez avoir manqué time.sleep(.1);c+=1du tweet 4 et changé l'ordre (je ne sais pas si le changement d'ordre est intentionnel) et encore \ndeux octets pas un, donc il devrait être 134 .
Jonathan Allan
1
... attention, il semble jouable sans sleepsur ma machine.
Jonathan Allan
1
Vous pouvez également tester c%10<1et supprimer c=0.
Jonathan Allan
1
@JonathanAllan Merci pour les suggestions! J'étais un peu pressé lors de la publication de ce document, il semble donc que j'étais un peu imprudent de diviser les tweets.
notjagan
3

JavaScript (4 Tweets / 343 317 octets / 243 de rechange)

Pas tout à fait sûr des exigences du format d'en-tête et de tweets, veuillez donc indiquer s'il doit être corrigé. Encore un peu plus peut être rasé, j'en suis certain.

Tweet 1 - P0 (11 octets)

chrome a.js

Tweet 2 (82 octets)

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

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

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

Exécutez-le dans JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Cliquez sur le volet de sortie pour mettre l'accent sur les événements du clavier)

Cahoteux
la source
Veuillez ne pas poster de réponses partiellement remplies ou invalides à la question. Selon cette méta-discussion, cette réponse devrait être supprimée jusqu'à ce qu'elle soit conforme aux spécifications décrites dans la question
PunPun1000
@ PunPun1000 Mes excuses. Il est maintenant terminé et non supprimé.
Bumpy
Pas de problème, je vais supprimer mon downvote. Bienvenue chez PPCG.
PunPun1000