Tweetlerde İkili Tetris


16

Kısa bir süre önce (birkaç yıl önce) , Tetris'in 140 Bytes'te uygulanmasıyla ilgili web sitelerini programlama konusunda bazı sıkıntılar yaşandı . ...

Küçük olmasına rağmen, Tetris'in basitleştirilmiş bir versiyonu olduğu ve tam bir uygulama olmadığı ortaya çıkıyor. Yalnızca çekirdek mantık işlevi 140 bayt Javascript'e sığar. Aslında çalıştırmak için, HTML ~ 840 karakter daha gerekir.

Daha iyisini yapabiliriz!
Bu zorluk mümkün olduğunca az tweet'te "Binary Tetris" in tam bir versiyonunu uygulamaktır.

İkili Tetris Kuralları:

  • Program, en az 5 sütun ve 6 satır hücre içeren bir oynatma alanı görüntülemelidir.
    • Alanın blokları ve kenarları açıkça işaretlendiği sürece herhangi bir görüntüleme yöntemi kullanılabilir.
  • En az iki tip blok olmalıdır: #ve ##. ###L gibi şekillendirilmiş ek blok desteği veya açı blokları benim tarafımdan seçilecek: P ve en eksiksiz ikili tetris oyunu (orijinal ve rotasyon özellikleri gibi en çok blok) mutluluğumu ve 50 rep'lık olası bir ödül kazanacak.
  • Üst satırdaki alana yeni bloklar eklenir ve bir blok hücrenin orta sütunu işgal etmesi gerekir.
  • Bloklar alt sıraya sabit bir oranda iner. Bloklar kullanıcı girişi olmasa bile alçalmalıdır.
  • Bloklar alanın altına veya bir alt bloğa temas ettiğinde düşmeyi durdurur ve sabitlenir. Yeni bir blok eklenir.
  • Satırdaki tüm sütunlar bloklarla doldurulduğunda, satır boşaltılır ve yukarıdaki tüm sabit bloklar bir satır açılır.
  • Program tuş basmalarına yanıt vermelidir. Aşağıdaki işlevleri gerçekleştiren 3 benzersiz anahtar olmalıdır
    • mevcut bloğu 1 sütun sola kaydır
    • geçerli bloğu sağa 1 sütun kaydır
    • mevcut bloğu 1 satır aşağı kaydır
  • Her tweet'in yalnızca 140 karakteri olabilir. Tweetlere koyulabilen çok baytlı karakterlerin kullanılmasına izin verilir.
  • Bir tweet'te ne olabileceğine dair kurallar basittir. Eğer tweet atabilirsen kullanabilirsiniz.

  • Yorumlanan diller aynı kurallara uyar. Her bölüm teknik özellikleri takip etmelidir. Hiçbir çalışma süresi hatası oluşmadığı sürece (ve diğer özellikler teknik özelliklere göre geçerlidir) cevabınız geçerlidir Golf Kuralları:
    Orijinal uygulama "tweetable" olduğundan, bu zorluk aynı şeyi gerektirir. Girişler bir dizi tweet (140 karakter veya daha kısa satırlar) olarak iletilebilmelidir.

  • İlk tweet, derleyicinin / yorumlayıcının adını, programın adını ve komut satırı bağımsız değişkenlerini içermelidir

    • "P0" dosyası olarak kaydedilecektir
  • Aşağıdaki N tweet'ler programı bir dizi satır olarak içermelidir.
    • Her tweet, T <n> adında bir dosyada saklanır; burada n, 1'dir.
  • Her satır önceki satırlara eklenir ve derlenir veya yorumlanır. Geçerli bir nesne dosyası veya program üretmesi gerekir.
  • Son satır eklenene kadar programın işlevsel olması gerekmez.
  • Program aşağıdaki şekilde çalıştırılacaktır (sözde 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
    

    Tercüman, Tetris'i uygulamayan, yaygın olarak bulunan bir yürütülebilir program olmalıdır.

Puanlama :
P0 dahil olmak üzere en az Tweet. En fazla sayıda yedek karakterle kesilen bağlar (140 * num tweet - toplam karakter sayısı).

Örnek Girişler

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

Puan = 3 (334 yedek)

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

Puan = 2 (241 yedek)

tetris

Skor = 1 (134 yedek) yasal ise, ki bu değil

Özel teşekkür

Bunu Ashelly'nin rızasıyla buraya göndermeme izin verildi


Tweetler UTF-8 karakterleri içerebilir. Burada da doğru mu (örneğin, CJK karakterlerini kullanarak tek bir tweet'e 400 bayt doldurabilir miyiz?)
Robert Fraser

@RobertFraser eğer bir tweet yazıp gönderebilirsen evet
Christopher

Eğer bir tweet'e sığabilecek herhangi bir şey oyun ise, "tweetler" in her birinde yeni satırlar olabilir mi? Tweetlerde satır sonlarına izin verilir.
notjagan

@ notjagan evet. Bunu tweet atabilirsin
Christopher

2
Zorluk bu şekilde olacaksa, bir tweet'te hangi karakter dizilerine izin verildiğini tam olarak belirtmeniz gerekir.
feersum

Yanıtlar:


8

Python 3, 5 Tweet Puanı (242 yedek, P0 sayma)

Tetris programının demosu (yayınlanan versiyondan biraz daha düzeltildi)

-19 bayt Jonathan Allan sayesinde !

Yedek sayı, tweet'ler arasındaki satırsonlarını dikkate almaz.

Tweet 1 (Beyan, 12 bayt)

python3 t.py

Tweet 2 (70 bayt)

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

Tweet 3 (129 bayt)

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

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

  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)

Tam Program (449 bayt)

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)

Bazı kötü bit nokta hackleme yapar ve alan ve parça iki tamsayılarda saklar. Yakında bir açıklama yapmaya çalışacağım.

Not: Bu yalnızca Windows'ta çalışır, ancak msvcrtgetchve "cls"→ aracılığıyla Linux'a geçirilebilir "clear". Ayrıca, karakter girişi Python IDLE üzerinde çalışmaz, bu yüzden başka bir yerde çalıştırmanızı tavsiye ederim.


Vay be aferin! Bu kısa
Christopher

1
İyi iş. \xe0dört bayt değil, bu yüzden tweet 3 130 olmalı time.sleep(.1);c+=1. tweet 4'ü kaçırmış ve sırayı değiştirmişsiniz gibi (sipariş değişikliğinin kasıtlı olup olmadığını bilmiyorum) ve tekrar \niki bayt değil, bu yüzden 134 olmalı .
Jonathan Allan

1
... dikkat edin sleep, makinem olmadan oynanabilir gibi görünüyor .
Jonathan Allan

1
Ayrıca test edebilir c%10<1ve kaldır c=0.
Jonathan Allan

1
@JonathanAllan Önerileriniz için teşekkürler! Bunu gönderirken biraz acelem vardı, bu yüzden tweet'leri ayırmakla biraz dikkatsiz görünüyordum.
notjagan

3

JavaScript (4 Tweet / 343 317 bayt / 243 yedek)

Başlık ve Tweetler biçiminin gereksinimleri hakkında tam olarak emin değilsiniz, bu yüzden düzeltilmesi gerekip gerekmediğini belirtin. Hala biraz daha traş edilebilir eminim.

Tweet 1 - P0 (11 bayt)

chrome a.js

Tweet 2 (82 bayt)

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

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

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

JSFiddle'da çalıştırın: https://jsfiddle.net/CookieJon/7Lenhcge/

(Klavye olaylarına odaklanmak için çıkış bölmesini tıklayın)


Lütfen soruya kısmen tamamlanmış veya geçersiz cevaplar göndermeyin. Gereğince bu meta tartışma söz konusu özetlenen spec uyana kadar bu cevabı silinmesi gerektiğini
PunPun1000

@ PunPun1000 Özür dilerim. Şimdi tamamlandı ve silindi.
İnişli çıkışlı

Sorun değil, benim oyumu kaldıracağım. PPCG'ye hoş geldiniz.
PunPun1000
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.