Tetris binario nei tweet


16

Di recente (qualche anno fa) si è verificato un certo ronzio nei siti Web di programmazione su un'implementazione di Tetris in 140 byte . ...

Si scopre che sebbene sia piccolo, è una versione semplificata di Tetris e nemmeno un'implementazione completa. Solo la funzione logica di base si adatta a 140 byte di Javascript. Per eseguirlo effettivamente, hai bisogno di altri ~ 840 caratteri di HTML.

Possiamo fare di meglio!
Questa sfida è quella di implementare una versione completa di "Binary Tetris" nel minor numero di tweet possibile.

Regole binarie di Tetris:

  • Il programma deve visualizzare un campo di gioco contenente almeno 5 colonne e 6 righe di celle.
    • È possibile utilizzare qualsiasi metodo di visualizzazione, purché i blocchi e i bordi del campo siano chiaramente contrassegnati.
  • Ci devono essere almeno due tipi di blocchi: #e ##. Il supporto di blocchi aggiuntivi come ###o blocchi angolari a forma di L verrà annullato da me: P e il gioco più completo di tetris binario (il maggior numero di blocchi come le caratteristiche originali e di rotazione) vinceranno la mia felicità e un potenziale aumento di 50 rep.
  • Nuovi blocchi vengono aggiunti al campo nella riga superiore e una cella di blocco deve occupare la colonna centrale.
  • I blocchi scendono verso la riga inferiore a una velocità fissa. I blocchi devono scendere anche senza l'input dell'utente.
  • Quando i blocchi toccano la parte inferiore del campo o un blocco inferiore, smettono di cadere e vengono fissati in posizione. Viene aggiunto un nuovo blocco.
  • Quando tutte le colonne della riga sono piene di blocchi, la riga viene svuotata e tutti i blocchi fissi sopra scendono di una riga.
  • Il programma deve rispondere ai tasti premuti. Devono essere presenti 3 tasti univoci che svolgono le seguenti funzioni
    • sposta il blocco corrente a sinistra di 1 colonna
    • sposta il blocco corrente a destra di 1 colonna
    • sposta il blocco corrente verso il basso di 1 riga
  • Ogni tweet può contenere solo 140 caratteri. È consentito l'uso di caratteri multibyte che possono essere inseriti nei tweet.
  • Le regole per ciò che può essere in un tweet sono semplici. Se puoi twittarlo puoi usarlo.

  • Le lingue interpretate seguono le stesse regole. Ogni sezione deve seguire le specifiche. Finché non si verificano errori di runtime (e il resto è valido secondo le specifiche), la tua risposta è valida Regole del golf:
    poiché l'implementazione originale era "tweetable", questa sfida richiede lo stesso. Le voci devono poter essere trasmesse come una serie di tweet (righe di 140 caratteri o meno).

  • Il primo tweet deve contenere il nome del compilatore / interprete, il nome del programma e tutti gli argomenti della riga di comando

    • verrà salvato come file "P0"
  • I seguenti N tweet devono contenere il programma come una serie di righe.
    • Ogni tweet verrà archiviato in un file con il nome T <n>, dove n è 1..N
  • Ogni riga verrà aggiunta alle righe precedenti e compilata o interpretata. Deve produrre un file oggetto o un programma valido.
  • Non è necessario che il programma sia funzionale fino a quando non viene aggiunta l'ultima riga.
  • Il programma verrà eseguito nel modo seguente (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'interprete deve essere un programma eseguibile comunemente disponibile che non implementa già Tetris.

Punteggio :
minor numero di tweet, incluso P0. Legami rotti dal maggior numero di personaggi di riserva (140 * num tweet - conteggio totale dei personaggi).

Voci di esempio

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

Punteggio = 3 (334 di riserva)

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

Punteggio = 2 (241 di riserva)

tetris

Punteggio = 1 (134 di riserva) se fosse legale, cosa che non lo è

Ringraziamenti speciali

Mi è stato permesso di pubblicare questo per consenso di Ashelly qui


I tweet possono contenere caratteri UTF-8. È vero anche qui (per esempio, possiamo inserire 400 byte in un singolo tweet usando i caratteri CJK?)
Robert Fraser,

@RobertFraser se puoi digitarlo in un tweet e inviarlo, allora sì
Christopher,

Se qualcosa che può rientrare in un tweet è un gioco, possiamo avere nuove righe all'interno di ciascuno dei nostri "tweet"? Le interruzioni di riga sono consentite nei tweet.
Notjagan,

@notjagan sì. Puoi twittarlo puoi averlo
Christopher,

2
Se la sfida sarà così, devi includere una specifica esatta di quali sequenze di caratteri sono consentite in un tweet.
feersum,

Risposte:


8

Python 3, punteggio di 5 tweet (242 di riserva, contando P0)

Demo del programma Tetris (leggermente più liscia rispetto alla versione pubblicata)

-19 byte grazie a Jonathan Allan !

Il conteggio di riserva non tiene conto delle nuove righe tra i tweet.

Tweet 1 (Dichiarazione, 12 byte)

python3 t.py

Tweet 2 (70 byte)

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

Tweet 3 (129 byte)

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

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

  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)

Programma completo (449 byte)

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)

Qualche bit malvagio punta l'hacking e memorizza il campo e il pezzo in due numeri interi. Proverò a pubblicare presto una spiegazione.

Nota: funziona solo su Windows, ma può essere commutato su Linux tramite msvcrtgetche "cls""clear". Inoltre, l'immissione dei caratteri non funziona sull'IDLE di Python, quindi consiglierei di eseguirlo altrove.


Wow ben fatto! Questo corto
Christopher,

1
Buon lavoro. \xe0è di quattro byte non uno, quindi tweet 3 dovrebbe essere 130. Sembra che tu abbia perso time.sleep(.1);c+=1da tweet 4 e abbia cambiato l'ordine (non so se la modifica dell'ordine è intenzionale) e di nuovo \ndue byte non uno, quindi dovrebbe essere 134 .
Jonathan Allan

1
... badate che sembra giocabile senza sleepsul mio computer.
Jonathan Allan,

1
Puoi anche testare c%10<1e rimuovere c=0.
Jonathan Allan,

1
@JonathanAllan Grazie per i suggerimenti! Ho avuto un po 'di fretta quando ho pubblicato questo, quindi sembra che io sia stato un po' trascurato con la divisione dei tweet.
notjagan,

3

JavaScript (4 Tweet / 343 317 byte / 243 di riserva)

Non sono del tutto sicuro dei requisiti del formato dell'intestazione e dei tweet, quindi avvisa se è necessario correggerlo. Ne sono sicuro ancora un po 'di più.

Tweet 1 - P0 (11 byte)

chrome a.js

Tweet 2 (82 byte)

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

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

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

Eseguilo in JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Fare clic sul riquadro di output per mettere a fuoco gli eventi della tastiera)


Non inviare risposte parzialmente completate o non valide alla domanda. Come da questa meta discussione, questa risposta dovrebbe essere cancellata fino a quando non è conforme alle specifiche indicate nella domanda
PunPun1000

@ PunPun1000 Le mie scuse. Ora è completo e non cancellato.
Bumpy

Nessun problema, rimuoverò il mio downvote. Benvenuti in PPCG.
PunPun1000,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.