Бінарний тетріс у твітах


16

Нещодавно (кілька років тому) на веб-сайтах програмування було чути певну інформацію про реалізацію Tetris у 140 байтах . ...

Виявляється, хоча він невеликий, але це спрощена версія Tetris і навіть не повна реалізація. Тільки основна логічна функція відповідає 140 байтам Javascript. Щоб насправді його запустити, потрібно ще ~ 840 символів HTML.

Ми можемо зробити краще!
Це завдання полягає в тому, щоб реалізувати повну версію "Бінарного тетрісу" якомога менше твітів.

Правила бінарного тетрісу:

  • Програма повинна відображати ігрове поле, що містить щонайменше 5 стовпців і 6 рядків комірок.
    • Можна використовувати будь-який спосіб відображення, якщо чітко позначені блоки та краї поля.
  • Повинно бути принаймні два типи блоків: #і ##. Додаткова підтримка блоків, таких як ###або кутові блоки у формі L, буде викликана мною: P, і найповніша гра в бінарний тетріс (більшість блоків, як оригінальні функції та функції обертання) виграє моє щастя та можливу нагороду до 50 представників.
  • Нові блоки додаються до поля у верхньому рядку, і одна комірка блоку повинна займати центральний стовпчик.
  • Блоки спускаються до нижнього ряду з фіксованою швидкістю. Блоки повинні спускатися навіть без введення користувача.
  • Коли блоки торкаються дна поля або нижнього блоку, вони припиняють падати і закріплюються на місці. Додано новий блок.
  • Коли всі стовпці в рядку заповнені блоками, рядок спорожняється, а всі нерухомі блоки внизу випадають на один рядок.
  • Програма повинна реагувати на натискання клавіш. Повинно бути 3 унікальних клавіші, які виконують такі функції
    • блок зміщення струму зліва 1 стовпець
    • блок зміщення струму справа 1 стовпець
    • зміщення поточного блоку вниз на 1 ряд
  • Кожен твіт може містити лише 140 символів. Використання багатобайтових символів, які можна помістити в твіти, дозволено.
  • Правила того, що може бути в твітті, прості. Якщо ви можете твітувати його, ви можете використовувати його.

  • Інтерпретовані мови відповідають тим же правилам. Кожен розділ повинен відповідати специфікаціям. Поки не трапляються помилки в часі запуску (а решта дійсна відповідно до специфікацій), ваша відповідь є дійсними Правилами гольфу:
    Оскільки оригінальна реалізація була "твіт", це завдання вимагає того ж. Записи повинні бути спроможні передаватися у вигляді твітів (рядки, що мають 140 символів або менше).

  • Перший твіт повинен містити ім’я компілятора / інтерпретатора, ім'я програми та будь-які аргументи командного рядка

    • він буде збережений як файл "P0"
  • Наступні N твітів повинні містити програму у вигляді рядків рядків.
    • Кожен твіт зберігатиметься у файлі з назвою T <n>, де n дорівнює 1..N
  • Кожен рядок буде доданий до попередніх рядків і складений або інтерпретований. Він повинен створити дійсний об’єктний файл або програму.
  • Програма не повинна бути функціональною, поки не буде доданий останній рядок.
  • Програма буде виконуватися наступним чином (псевдо-баш)

    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 запасних) якби це було законно, а це не так

Особлива подяка

Мені було дозволено розмістити це за згодою Ашеллі тут


Твіти можуть містити символи UTF-8. Це правда і тут (наприклад, чи можемо ми набити 400 байт в один твіт за допомогою символів CJK?)
Роберт Фрейзер

@RobertFraser, якщо ви можете ввести його у твіт і надіслати його, то так
Крістофер

Якщо що-небудь, що може вписатись у твіт, це гра, чи можемо ми мати нові рядки в кожному з наших твітів? У твітах допускаються перерви в рядках.
notjagan

@notjagan так. Це ти можеш твітувати, можеш
Крістофер

2
Якщо виклик буде таким чином, вам потрібно включити точну специфікацію, які послідовності символів дозволені в твітті.
feersum

Відповіді:


8

Python 3, оцінка 5 твітів (242 запасних, підрахунок P0)

Демо програма Tetris (згладжена трохи більше, ніж розміщена версія)

-19 байт завдяки Джонатану Аллану !

Кількість запасів не враховує нових рядків між твітами.

Tweet 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:

Tweet 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:

Tweet 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, але його можна переключити на Linux через msvcrtgetchі "cls""clear". Крім того, введення символів не працює на IDLE Python, тому я рекомендую запустити його в іншому місці.


Нічого молодця! Цей короткий
Крістофер

1
Хороша робота. \xe0це чотири байти, а не один, а твіт 3 повинен бути 130. Здається, ви пропустили time.sleep(.1);c+=1з твіт 4 і змінили порядок (я не знаю, чи зміна порядку є навмисним) і знову \nдва байти не один, тож має бути 134 .
Джонатан Аллан

1
... майте на увазі, вам здається грати без sleepмоєї машини.
Джонатан Аллан

1
Ви також можете протестувати c%10<1та видалити c=0.
Джонатан Аллан

1
@JonathanAllan Дякую за пропозиції! Я трохи поспішав, коли публікував це, то, здається, я був дещо недбалий з розділенням твітів.
нежаган

3

JavaScript (4 твіти / 343 317 байт / 243 запасних)

Не зовсім впевнений у вимогах формату заголовка та твітів, тому, будь ласка, порадьте, чи потрібно його виправити. Ще я можу трохи відголитись, я впевнений.

Tweet 1 - P0 (11 байт)

chrome a.js

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

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

Tweet 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 Мої вибачення. Зараз він завершений і не визначений.
Бурхливий

Немає жодних проблем, я зніму свій потік. Ласкаво просимо до PPCG.
PunPun1000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.