Binarne Tetris w tweetach

16

Niedawno (kilka lat temu) na stronach programistycznych pojawiło się trochę szumu na temat implementacji Tetris w 140 bajtach . ...

Okazuje się, że choć jest niewielki, jest to uproszczona wersja Tetris, a nawet kompletna implementacja. Tylko podstawowa funkcja logiczna mieści się w 140 bajtach JavaScript. Aby go uruchomić, potrzebujesz kolejnych ~ 840 znaków HTML.

Możemy zrobić lepiej!
Wyzwanie polega na wdrożeniu pełnej wersji „Binary Tetris” w jak najmniejszej liczbie tweetów.

Zasady binarne Tetris:

  • Program musi wyświetlać pole gry zawierające co najmniej 5 kolumn i 6 rzędów komórek.
    • Można stosować dowolną metodę wyświetlania, o ile bloki i krawędzie pola są wyraźnie oznaczone.
  • Muszą być co najmniej dwa rodzaje bloków: #i ##. Dodatkowe wsparcie dla bloków, takich jak ###lub bloki kątowe w kształcie litery L, zostanie przeze mnie ocenione: P i najbardziej kompletna gra binarnych tetris (najwięcej bloków, takich jak funkcje oryginalne i rotacyjne) wygra moje szczęście i możliwe nagrody za 50 powtórzeń.
  • Nowe bloki są dodawane do pola w górnym rzędzie, a jedna komórka bloku musi zajmować środkową kolumnę.
  • Bloki schodzą w kierunku dolnego rzędu ze stałą prędkością. Bloki muszą opadać nawet bez udziału użytkownika.
  • Kiedy bloki dotykają dolnej części pola lub dolnego bloku, przestają spadać i zostają unieruchomione. Dodano nowy blok.
  • Gdy wszystkie kolumny w rzędzie są wypełnione blokami, wiersz jest opróżniany, a wszystkie stałe bloki powyżej są rozwijane o jeden wiersz.
  • Program musi reagować na naciśnięcia klawiszy. Muszą być 3 unikalne klucze, które wykonują następujące funkcje
    • przesuń bieżący blok w lewo o 1 kolumnę
    • przesuń bieżący blok w prawo o 1 kolumnę
    • przesuń bieżący blok w dół o 1 rząd
  • Każdy tweet może mieć tylko 140 znaków. Dozwolone jest stosowanie znaków wielobajtowych, które można umieścić w tweetach.
  • Zasady tego, co może znajdować się w tweecie, są proste. Jeśli możesz tweetować, możesz go użyć.

  • Języki interpretowane podlegają tym samym zasadom. Każda sekcja musi być zgodna ze specyfikacjami. Dopóki nie wystąpią błędy w czasie wykonywania (a reszta jest zgodna ze specyfikacjami), twoja odpowiedź jest poprawna. Zasady gry w golfa:
    Ponieważ oryginalna implementacja była „tweetowalna”, to wyzwanie wymaga tego samego. Zgłoszenia muszą być przesyłane jako seria tweetów (wiersze o długości 140 znaków lub mniej).

  • Pierwszy tweet musi zawierać nazwę kompilatora / tłumacza, nazwę programu i wszelkie argumenty wiersza poleceń

    • zostanie zapisany jako plik „P0”
  • Następujące N tweetów musi zawierać program jako serię wierszy.
    • Każdy tweet zostanie zapisany w pliku o nazwie T <n>, gdzie n oznacza 1..N
  • Każda linia zostanie dodana do poprzednich linii i skompilowana lub zinterpretowana. Musi wygenerować poprawny plik obiektowy lub program.
  • Program nie musi działać, dopóki nie zostanie dodany ostatni wiersz.
  • Program zostanie uruchomiony w następujący sposób (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
    

    Tłumacz musi być powszechnie dostępnym programem wykonywalnym, który jeszcze nie implementuje Tetris.

Punktacja :
Najmniej tweetów, w tym P0. Więzy podzielone przez największą liczbę wolnych znaków (140 * num tweetów - łączna liczba znaków).

Przykładowe wpisy

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

Wynik = 3 (334 rezerwowy)

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

Wynik = 2 (241 zapasowy)

tetris

Wynik = 1 (134 rezerwowy), jeśli było to zgodne z prawem, a nie jest

Szczególne podziękowania

Pozwolono mi to opublikować za zgodą Ashelly tutaj

Krzysztof
źródło
Tweety mogą zawierać znaki UTF-8. Czy to prawda również tutaj (na przykład, czy możemy umieścić 400ish bajtów w jednym tweecie przy użyciu znaków CJK?)
Robert Fraser
@RobertFraser, jeśli możesz wpisać go w tweecie i wysłać, to tak
Christopher
Jeśli coś, co może zmieścić się w tweecie, to gra, czy możemy mieć nowe wiersze w każdym z naszych tweetów? Podziały linii są dozwolone w tweetach.
notjagan
@notjagan tak. Możesz to opublikować na Twitterze, możesz mieć
Christopher
2
Jeśli wyzwanie będzie tak wyglądać, musisz podać dokładną specyfikację dozwolonych sekwencji znaków w tweecie.
feersum

Odpowiedzi:

8

Python 3, wynik 5 tweetów (242 zapasowych, zliczanie P0)

Wersja demonstracyjna programu Tetris (wygładzona nieco bardziej niż opublikowana wersja)

-19 bajtów dzięki Jonathanowi Allanowi !

Zapasowa liczba nie uwzględnia nowych linii między tweetami.

Tweet 1 (Deklaracja, 12 bajtów)

python3 t.py

Tweet 2 (70 bajtów)

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

Tweet 3 (129 bajtów)

 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 bajtów)

 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 bajtów)

  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)

Pełny program (449 bajtów)

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)

Czy jakieś zło wskazuje na hakowanie i przechowuje pole i kawałek w dwóch liczbach całkowitych. Postaram się wkrótce opublikować wyjaśnienie.

Uwaga: Działa to tylko w systemie Windows, ale można go przełączyć na system Linux za pomocą msvcrtgetchi "cls""clear". Dodatkowo wprowadzanie znaków nie działa na IDLE Pythona, więc polecam uruchomienie go w innym miejscu.

notjagan
źródło
Wow, dobra robota! To krótkie
Christopher
1
Dobra robota. \xe0ma cztery bajty, a nie jeden, więc tweet 3 powinien mieć 130. Wygląda na to, że przegapiłeś time.sleep(.1);c+=1tweeta 4 i zmieniłeś kolejność (nie wiem, czy zmiana kolejności jest zamierzona)\n to dwa bajty, a nie jeden, więc powinna wynosić 134 .
Jonathan Allan
1
... uwaga, wydaje się, że można grać bez tego sleepna moim komputerze.
Jonathan Allan
1
Możesz także przetestować c%10<1i usunąć c=0.
Jonathan Allan
1
@JonathanAllan Dzięki za sugestie! Pośpieszyłem trochę, pisząc to, więc wygląda na to, że trochę nieostrożnie podzieliłem tweety.
notjagan
3

JavaScript (4 tweety / 343 317 bajtów / 243 zapasowe)

Nie jestem pewien co do wymagań formatu nagłówka i tweetów, więc proszę doradzić, czy wymaga korekty. Jestem pewien, że jeszcze trochę więcej można zgolić.

Tweet 1 - P0 (11 bajtów)

chrome a.js

Tweet 2 (82 bajty)

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 bajtów)

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 bajtów)

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

Uruchom go w JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(Kliknij panel wyjściowy, aby ustawić fokus dla zdarzeń klawiatury)

Wyboisty
źródło
Nie publikuj częściowo wypełnionych lub nieprawidłowych odpowiedzi na pytanie. Zgodnie z tą meta dyskusją odpowiedź należy usunąć, dopóki nie będzie zgodna ze specyfikacją opisaną w pytaniu
PunPun1000
@ PunPun1000 Moje przeprosiny. Jest teraz ukończony i nieskasowany.
Wyboisty
Nie ma problemu, usunę moją opinię. Witamy w PPCG.
PunPun1000