Бинарный тетрис в твитах


16

В последнее время (несколько лет назад) на веб-сайтах программировалось некоторое оживление о реализации Tetris в 140 байт . ...

Оказывается, что, хотя он небольшой, он представляет собой упрощенную версию тетриса, а не полную реализацию. Только основная логическая функция помещается в 140 байтов Javascript. Чтобы запустить его, вам понадобится еще ~ 840 символов HTML.

Мы можем сделать лучше!
Эта задача состоит в том, чтобы реализовать полную версию «Бинарного тетриса» в как можно меньшем количестве твитов.

Правила двоичного тетриса:

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

  • Интерпретируемые языки следуют тем же правилам. Каждый раздел должен соответствовать спецификациям. До тех пор, пока не возникнут ошибки времени выполнения (а остальные действительны в соответствии со спецификациями), ваш ответ действителен. Правила игры в гольф:
    поскольку исходная реализация была «твиттерной», эта задача требует того же. Записи должны быть в состоянии передаваться в виде серии твитов (не более 140 символов).

  • Первый твит должен содержать имя компилятора / интерпретатора, имя программы и любые аргументы командной строки

    • он будет сохранен как файл "P0"
  • Следующие N твитов должны содержать программу в виде ряда строк.
    • Каждый твит будет сохранен в файле с именем T <n>, где n равно 1..N
  • Каждая строка будет добавлена ​​к предыдущим строкам и скомпилирована или интерпретирована. Он должен создать действительный объектный файл или программу.
  • Программа не должна быть функциональной, пока не будет добавлена ​​последняя строка.
  • Программа будет работать следующим образом (псевдо-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
    

    Интерпретатор должен быть общедоступной исполняемой программой, которая еще не реализует тетрис.

Подсчет очков :
немного твитов, включая P0. Связи разбиты по наибольшему количеству запасных символов (140 * количество твитов - общее количество символов).

Пример записи

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 байтов благодаря Джонатану Аллану !

Запасной счет не учитывает переводы строк между твитами.

Чирикать 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, но его можно переключить в Linux через msvcrtgetchи "cls""clear". Кроме того, ввод символов не работает на Python IDLE, поэтому я рекомендую запускать его в другом месте.


Ого молодец! Этот короткий
Кристофер

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

1
... имейте в виду, что sleepна моем компьютере это возможно.
Джонатан Аллан

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

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 Мои извинения. Теперь оно завершено и не восстановлено.
Неровный

Нет проблем, я уберу свое понижение. Добро пожаловать в PPCG.
PunPun1000
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.