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