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 msvcrt→ getche "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.