Binäres Tetris in Tweets

16

Vor kurzem (vor einigen Jahren) wurde auf Programmierwebsites viel über eine Implementierung von Tetris in 140 Bytes geredet . ...

Es stellt sich heraus, dass es sich, obwohl es klein ist, um eine vereinfachte Version von Tetris und nicht einmal um eine vollständige Implementierung handelt. Nur die Kernlogikfunktion passt in 140 Bytes Javascript. Um es tatsächlich auszuführen, benötigen Sie weitere ~ 840 Zeichen HTML.

Wir können es besser machen!
Diese Herausforderung besteht darin, eine vollständige Version von "Binary Tetris" in möglichst wenigen Tweets zu implementieren.

Binäre Tetris-Regeln:

  • Das Programm muss ein Spielfeld mit mindestens 5 Spalten und 6 Zellenreihen anzeigen.
    • Es kann jede Art der Anzeige verwendet werden, solange die Blöcke und die Ränder des Feldes deutlich gekennzeichnet sind.
  • Es müssen mindestens zwei Arten von Blöcken vorhanden sein: #und ##. Zusätzliche Blockunterstützung wie### oder Winkelblöcke in L-Form werden von mir bewertet: P und das vollständigste Spiel mit binärem Tetris (die meisten Blöcke wie die Original- und Rotationsfunktionen) werden mein Glück und ein mögliches Kopfgeld von 50 Wiederholungen gewinnen.
  • Dem Feld in der oberen Zeile werden neue Blöcke hinzugefügt, und eine Blockzelle muss die mittlere Spalte einnehmen.
  • Die Blöcke fallen mit einer festen Geschwindigkeit in Richtung der untersten Reihe ab. Blöcke müssen auch ohne Benutzereingabe absteigen.
  • Wenn Blöcke den unteren Rand des Feldes oder einen unteren Block berühren, fallen sie nicht mehr und sind fixiert. Ein neuer Block wird hinzugefügt.
  • Wenn alle Spalten in der Zeile mit Blöcken gefüllt sind, wird die Zeile geleert, und alle darüber liegenden festen Blöcke werden um eine Zeile nach unten verschoben.
  • Das Programm muss auf Tastendruck reagieren. Es müssen 3 eindeutige Schlüssel vorhanden sein, die die folgenden Funktionen ausführen
    • aktuellen Block um 1 Spalte nach links schieben
    • aktuellen Block um eine Spalte nach rechts verschieben
    • aktuellen Block um eine Zeile nach unten verschieben
  • Jeder Tweet darf nur 140 Zeichen lang sein. Die Verwendung von Multi-Byte-Zeichen, die in Tweets eingefügt werden können, ist zulässig.
  • Die Regeln für das, was in einem Tweet sein kann, sind einfach. Wenn Sie es twittern können, können Sie es verwenden.

  • Interpretierte Sprachen folgen den gleichen Regeln. Jeder Abschnitt muss den Spezifikationen entsprechen. Solange keine Laufzeitfehler auftreten (und der Rest gemäß den Spezifikationen gültig ist), ist Ihre Antwort gültig. Golfregeln:
    Da die ursprüngliche Implementierung "tweetbar" war, erfordert diese Herausforderung dasselbe. Einträge müssen als eine Reihe von Tweets (Zeilen mit maximal 140 Zeichen) übertragen werden können.

  • Der erste Tweet muss den Namen des Compilers / Interpreters, den Namen des Programms und alle Befehlszeilenargumente enthalten

    • es wird als Datei "P0" gespeichert
  • Die folgenden N Tweets müssen das Programm als eine Reihe von Zeilen enthalten.
    • Jeder Tweet wird in einer Datei mit dem Namen T <n> gespeichert, wobei n für 1..N steht
  • Jede Zeile wird zu den vorherigen Zeilen hinzugefügt und kompiliert oder interpretiert. Es muss eine gültige Objektdatei oder ein gültiges Programm erstellt werden.
  • Das Programm muss erst funktionsfähig sein, wenn die letzte Zeile hinzugefügt wurde.
  • Das Programm wird wie folgt ausgeführt (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
    

    Der Interpreter muss ein allgemein verfügbares ausführbares Programm sein, das Tetris noch nicht implementiert.

Wertung :
Wenige Tweets, einschließlich P0. Unentschieden durch die größte Anzahl von Ersatzzeichen (140 * Anzahl Tweets - Gesamtzahl der Zeichen).

Beispieleinträge

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

Punktzahl = 3 (334 übrig)

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

Punktzahl = 2 (241 übrig)

tetris

Score = 1 (134 Spare), wenn es legal wäre, was es nicht ist

Besonderer Dank

Ich durfte dies mit Ashellys Zustimmung hier posten

Christopher
quelle
Tweets können UTF-8-Zeichen enthalten. Trifft das auch hier zu (können wir beispielsweise 400ish Bytes mit CJK-Zeichen in einen einzelnen Tweet packen?)
Robert Fraser
@RobertFraser Wenn Sie es in einen Tweet eingeben und dann senden können ja
Christopher
Wenn etwas, das in einen Tweet passt, ein Spiel ist, können wir in jedem unserer "Tweets" Zeilenumbrüche einfügen? Zeilenumbrüche sind in Tweets zulässig.
notjagan
@notjagan ja. Sie können es twittern, Sie können es haben
Christopher
2
Wenn die Herausforderung so aussehen soll, müssen Sie genau angeben, welche Zeichenfolgen in einem Tweet zulässig sind.
Feersum

Antworten:

8

Python 3, Score von 5 Tweets (242 Spare, zählt P0)

Demo von Tetris-Programm (etwas mehr als gepostete Version geglättet)

-19 Bytes dank Jonathan Allan !

Die Reservezählung berücksichtigt keine Zeilenumbrüche zwischen Tweets.

Tweet 1 (Deklaration, 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)

Volles Programm (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)

Führt ein böses Bit Point-Hacking durch und speichert das Feld und die Figur in zwei Ganzzahlen. Ich werde versuchen, bald eine Erklärung zu veröffentlichen.

Hinweis: Dies funktioniert nur unter Windows, es kann jedoch über msvcrtgetchund "cls"→ auf Linux umgeschaltet werden "clear". Außerdem funktioniert die Zeicheneingabe in Pythons IDLE nicht. Daher würde ich empfehlen, sie an einem anderen Ort auszuführen.

notjagan
quelle
Wow gut gemacht! Diese kurze
Christopher
1
Gute Arbeit. Ist \xe0vier Bytes nicht eins, so sollte Tweet 3 130 sein. Sie haben anscheinend time.sleep(.1);c+=1Tweet 4 verpasst und die Reihenfolge geändert (ich weiß nicht, ob die Reihenfolge absichtlich geändert wurde) und sind wieder \nzwei Bytes nicht eins, also sollte es 134 sein .
Jonathan Allan
1
... wohlgemerkt scheint es spielbar zu sein ohne das sleepauf meinem Rechner.
Jonathan Allan
1
Sie könnten auch testen c%10<1und entfernen c=0.
Jonathan Allan
1
@ JonathanAllan Danke für die Vorschläge! Ich hatte es ein bisschen eilig, als ich das gepostet habe, so dass es so aussieht, als wäre ich etwas nachlässig, wenn ich die Tweets aufteilte.
Notjagan
3

JavaScript (4 Tweets / 343 317 Bytes / 243 Ersatz)

Wir sind uns nicht ganz sicher über die Anforderungen des Header- und Tweets-Formats. Bitte teilen Sie uns mit, ob eine Korrektur erforderlich ist. Ich bin mir sicher, dass noch ein bisschen mehr rasiert werden kann.

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)

Führen Sie es in JSFiddle aus: https://jsfiddle.net/CookieJon/7Lenhcge/

(Klicken Sie auf das Ausgabefenster, um den Fokus für Tastaturereignisse festzulegen.)

Holperig
quelle
Bitte posten Sie keine unvollständigen oder ungültigen Antworten auf die Frage. Gemäß dieser Meta Diskussion sollte diese Antwort gelöscht werden , bis sie mit der Spezifikation in der Frage beschriebenen entspricht
PunPun1000
@ PunPun1000 Ich entschuldige mich. Es ist nun abgeschlossen und wiederhergestellt.
Holpriger
Kein Problem, ich werde meine Ablehnung entfernen. Willkommen bei PPCG.
PunPun1000