ไบนารีเตตริสในทวีต


16

นอกจากนั้นเมื่อเร็ว ๆ นี้ (ไม่กี่ปีหลัง) ฉวัดเฉวียนบางอย่างเกี่ยวกับการเขียนโปรแกรม เว็บไซต์เกี่ยวกับการดำเนินการของTetris ใน 140 Bytes ...

ปรากฎว่าแม้ว่ามันจะเล็ก แต่ก็เป็นเวอร์ชั่นที่ง่ายกว่าของ Tetris และไม่ได้ใช้งานอย่างสมบูรณ์ เฉพาะฟังก์ชันลอจิกแบบหลักที่เหมาะกับ Javascript 140 ไบต์ ในการใช้งานจริงคุณต้องมีอีก 840 อักขระของ HTML

เราทำได้ดีกว่า!
ความท้าทายนี้คือการติดตั้ง "Binary Tetris" เวอร์ชั่นเต็มในทวีตให้น้อยที่สุด

กฎเตตริสไบนารี:

  • โปรแกรมจะต้องแสดงสนามเล่นที่มีอย่างน้อย 5 คอลัมน์และ 6 แถวของเซลล์
    • วิธีการแสดงผลใด ๆ อาจถูกนำมาใช้ตราบใดที่บล็อกและขอบของสนามถูกทำเครื่องหมายไว้อย่างชัดเจน
  • ต้องมีอย่างน้อยสองชนิดของบล็อก: และ# ##การสนับสนุนบล็อกเพิ่มเติมเช่น###หรือบล็อกมุมที่มีรูปร่างคล้าย L จะได้รับการอัปเกรดโดยฉัน: P และเกมที่สมบูรณ์ที่สุดของไบนารีเตตริส (บล็อกส่วนใหญ่เช่นคุณลักษณะดั้งเดิมและการหมุน) จะชนะความสุขของฉัน
  • บล็อกใหม่จะถูกเพิ่มไปยังเขตข้อมูลในแถวบนสุดและเซลล์บล็อกหนึ่งต้องครอบครองคอลัมน์กลาง
  • บล็อกลงมาสู่แถวล่างในอัตราคงที่ บล็อกจะต้องลงมาแม้ไม่มีผู้ใช้
  • เมื่อบล็อกสัมผัสด้านล่างของสนามหรือบล็อกที่ต่ำกว่าพวกเขาจะหยุดตกและได้รับการแก้ไขในสถานที่ เพิ่มบล็อกใหม่
  • เมื่อคอลัมน์ทั้งหมดในแถวเต็มไปด้วยบล็อกแถวนั้นจะว่างเปล่าและบล็อกคงที่ทั้งหมดด้านบนจะเลื่อนลงหนึ่งแถว
  • โปรแกรมจะต้องตอบสนองต่อการกดปุ่ม จะต้องมี 3 ปุ่มที่ไม่ซ้ำกันซึ่งทำหน้าที่ดังต่อไปนี้
    • เลื่อนบล็อกปัจจุบันไปทางซ้าย 1 คอลัมน์
    • เลื่อนบล็อกปัจจุบันขวา 1 คอลัมน์
    • เลื่อนบล็อกปัจจุบันลง 1 แถว
  • ทวีตแต่ละรายการมีได้เพียง 140 ตัวอักษร อนุญาตให้ใช้อักขระแบบหลายไบต์ที่สามารถใส่ในทวีตได้
  • กฎสำหรับสิ่งที่สามารถเป็นทวีตนั้นง่าย หากคุณสามารถทวีตคุณสามารถใช้งานได้

  • ภาษาที่ตีความจะปฏิบัติตามกฎเดียวกัน แต่ละส่วนจะต้องปฏิบัติตามข้อกำหนด ตราบใดที่ไม่มีข้อผิดพลาดในการรัน (และส่วนที่เหลือนั้นถูกต้องตามข้อกำหนด) คำตอบของคุณคือกฎการตีกอล์ฟที่ถูกต้อง :
    เนื่องจากการใช้งานดั้งเดิมคือ "tweetable" ความท้าทายนี้จึงต้องเหมือนกัน รายการจะต้องสามารถส่งเป็นชุดทวีต (บรรทัดละ 140 ตัวอักษรหรือน้อยกว่า)

  • ทวีตแรกต้องมีชื่อของคอมไพเลอร์ / ล่ามชื่อของโปรแกรมและอาร์กิวเมนต์บรรทัดคำสั่งใด ๆ

    • มันจะถูกบันทึกเป็นไฟล์ "P0"
  • ทวีต N ต่อไปนี้ต้องมีโปรแกรมเป็นชุดของบรรทัด
    • ทวีตแต่ละรายการจะถูกเก็บไว้ในไฟล์ที่มีชื่อ T <n> โดยที่ n คือ 1..N
  • แต่ละบรรทัดจะถูกเพิ่มไปยังบรรทัดก่อนหน้าและรวบรวมหรือตีความ มันจะต้องผลิตวัตถุไฟล์หรือโปรแกรมที่ถูกต้อง
  • โปรแกรมไม่จำเป็นต้องทำงานได้จนกว่าจะมีการเพิ่มบรรทัดสุดท้าย
  • โปรแกรมจะทำงานในลักษณะต่อไปนี้(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
    

    ล่ามจะต้องเป็นโปรแกรมที่สามารถใช้งานได้ทั่วไปที่ไม่ได้ใช้ Tetris

การให้คะแนน :
ทวีตน้อยที่สุดรวมถึง P0 ความสัมพันธ์ที่ขาดจากจำนวนตัวอักษรสำรองมากที่สุด (140 * num ทวีต - จำนวนตัวอักษรทั้งหมด)

รายการตัวอย่าง

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

คะแนน = 3 (334 สำรอง)

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

คะแนน = 2 (241 สำรอง)

tetris

คะแนน = 1 (134 สำรอง) ถ้ามันถูกกฎหมายซึ่งไม่ใช่

ขอขอบคุณเป็นพิเศษ

ฉันได้รับอนุญาตให้โพสต์สิ่งนี้โดยความยินยอมของ Ashelly ที่นี่


ทวีตอาจมีอักขระ UTF-8 เป็นจริงที่นี่เช่นกัน (ตัวอย่างเช่นเราสามารถบรรจุ 400ish ไบต์ลงในทวีตเดียวโดยใช้ตัวอักษร CJK ได้หรือไม่)
Robert Fraser

@RobertFraser ถ้าคุณสามารถพิมพ์ลงในทวีตและส่งไปแล้วใช่
คริส

หากมีสิ่งใดที่เหมาะกับทวีตคือเกมเราสามารถขึ้นบรรทัดใหม่ภายใน "ทวีตของเรา" ได้หรือไม่ อนุญาตให้แบ่งบรรทัดได้ภายในทวีต
notjagan

@notjagan ใช่ มันคุณสามารถทวีตมันได้
Christopher

2
หากการท้าทายเป็นไปตามนั้นคุณจะต้องรวมข้อกำหนดที่แน่นอนของลำดับอักขระที่อนุญาตให้ใช้ในทวีต
feersum

คำตอบ:


8

Python 3, คะแนนของ 5 Tweets (242 สำรอง, การนับ P0)

ตัวอย่างโปรแกรม Tetris (ปรับให้เรียบขึ้นมากกว่ารุ่นที่ลงเล็กน้อย)

-19 ไบต์ขอบคุณJonathan Allan !

จำนวนอะไหล่ไม่ได้คำนึงถึงการขึ้นบรรทัดใหม่จากระหว่างทวีต

ทวีต 1 (การประกาศ 12 ไบต์)

python3 t.py

ทวีต 2 (70 ไบต์)

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

ทวีต 3 (129 ไบต์)

 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]

ทวีต 4 (113 ไบต์)

 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:

ทวีต 5 (134 ไบต์)

  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)

โปรแกรมเต็มรูปแบบ (449 ไบต์)

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)

ทำบิตแฮ็กจุดชั่วร้ายและเก็บฟิลด์และชิ้นส่วนเป็นจำนวนเต็มสองจำนวน ฉันจะลองและโพสต์คำอธิบายในไม่ช้า

หมายเหตุ: นี้ทำงานบน Windows แต่มันอาจจะเปลี่ยนไปลินุกซ์ผ่านmsvcrtgetchและ→"cls" "clear"นอกจากนี้การป้อนอักขระไม่ทำงานบน Python IDLE ดังนั้นฉันขอแนะนำให้เรียกใช้ที่อื่น


ว้าวทำได้ดีมาก! สั้นนี้
คริสโตเฟอร์

1
การทำงานที่ดี. \xe0คือสี่ไบต์ไม่ใช่หนึ่งดังนั้นทวีต 3 ควรเป็น 130 คุณดูเหมือนจะพลาดtime.sleep(.1);c+=1จากทวีต 4 และเปลี่ยนคำสั่งซื้อ (ฉันไม่ทราบว่าการเปลี่ยนคำสั่งนั้นตั้งใจหรือไม่) และอีก\nสองไบต์ไม่ได้เป็นหนึ่งดังนั้นมันควรเป็น 134 .
Jonathan Allan

1
... ใจคุณดูเหมือนว่าเล่นได้โดยไม่ต้องใช้sleepเครื่องของฉัน
Jonathan Allan

1
คุณสามารถทดสอบc%10<1และลบc=0ได้
Jonathan Allan

1
@ JonathanAllan ขอบคุณสำหรับคำแนะนำ! ฉันกำลังรีบหน่อยเมื่อโพสต์ข้อความนี้ดูเหมือนว่าฉันค่อนข้างประมาทด้วยการแยกทวีต
notjagan

3

JavaScript (4 ทวีต / 343 317 ไบต์ / อะไหล่ 243)

ไม่แน่ใจเกี่ยวกับข้อกำหนดของรูปแบบส่วนหัว & ทวีตดังนั้นโปรดแนะนำหากต้องการแก้ไข ยังมีอีกมากที่ฉันสามารถกำจัดได้

ทวีต 1 - P0 (11 ไบต์)

chrome a.js

ทวีต 2 (82 ไบต์)

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)

ทวีต 3 (126 ไบต์)

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

ทวีต 4 (98 ไบต์)

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

เปิดใช้ใน JSFiddle: https://jsfiddle.net/CookieJon/7Lenhcge/

(คลิกที่บานหน้าต่างผลลัพธ์เพื่อให้ความสำคัญกับเหตุการณ์แป้นพิมพ์)


โปรดอย่าโพสต์คำตอบสำหรับคำถามที่เสร็จสมบูรณ์หรือไม่ถูกต้อง ตามการอภิปรายเมตานี้คำตอบนี้ควรถูกลบจนกว่าจะเป็นไปตามข้อกำหนดที่ระบุไว้ในคำถาม
PunPun1000

@ PunPun1000 ขอโทษด้วย เสร็จสมบูรณ์และยกเลิกการลบแล้ว
Bumpy

ไม่มีปัญหาฉันจะลบ downvote ของฉัน ยินดีต้อนรับสู่ PPCG
PunPun1000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.