Как стать автором
Обновить

Комментарии 61

В оригинальном тетрисе можно ещё двигать фигурки влево-вправо в процессе падения, что иногда действительно необходимо (по крайней мере, со стандартным тетрисовым набором фигурок).
Вдобавок вы не разрешаете повороты. Когда тетрис был единственной игрой, в которую я играл, то самые эффективные ходы, которые мне удавалось совершать в трудных ситуациях, производились при помощи комбинаций перемещений и поворотов. Особенно это было круто в «кривых» реализациях тетриса (на некоторых телефонах, например); там иногда удавалось «повернуть» фигурку и одновременно установить её внутрь уже стоящего блока.
Вы действительно фанат тетриса! Извините, я не хотел обидеть игру. Всё, что я хотел — это дать возможность читателям решить задачку, подумать немного, возможно, посоревноваться в лучшем алгоритме. Для этого я и упростил входные данные. Думаю, потом можно будет тетрис сделать действительно тетрисом, чтобы функция возвращала не только номер колонки, но еще и состояние поворота.
И вы меня простите, пожалуй, я слишком грубо выразился. Думаю, найдутся желающие размять мозги и написать бота для тетриса.
В данном случае целевая функция слишком отличается от того, что нужно в настоящем тетрисе. И дело не в форме фигур и возможности поворачивать, а в том, что в тетрисе полностью заполненный ряд — исчезает, поэтому появление внутренних пустот проблемой не является. А в данном случае задача выглядит, как минимизация числа пустот.
Мне прислали уже первый алгоритм, к сожалению, у человека read-only аккаунт, поэтому я опубликую за него:
http://jsfiddle.net/H3kra/
Спасибо, добавлю в base-версию
Если бы, хотя бы, заполненные ряды бы исчезали бы, это ещё как-то напоминало бы тетрис. А так от него одно название.
Наверное по этому и интересуются постом в основном те, кто в Read-Only =)
Вы правы, нужно так сделать, тогда нужно разнообразить фигуры, потому что с двумя это будет бесконечная игра.
тетрис это полный набор тетрамино, семь фигур, если не ошибаюсь… но это будет задача абсолютно другого уровня
Зависит от алгоритма. Как я видел, то предложенные на данный момент алгоритмы оставляют дыры, а значит и не будет игра бесконечной, хотя будет достаточно долгой.
да, у фигур есть «свои» места… когда они их заполняют, начинают бороться за чужие :)
Кстати, было пару раз «Squares left: 0»
Еще одно решение
Простой поиск промежутка подходящего по ширине для текущей фигуры, начиная с минимально заполненного столбца. Высота не учитывается.
Мне понравилось ваше решение. Вот только если такой промежуток не найден, то должна тоже быть какая-то логика, куда поставить фигуру. Хотя бы так, чтобы осталось меньше закрытых пробелов.
По логике этого алгоритма, такой промежуток найдется всегда (т.е. последняя строка 'return order[0];' никогда не будет вызвана), другое дело что помещение в него не всегда будет оптимально.
я когда решение выдумывал, больше не про минимизацию окон думал, а про
alert('WOW!. Your algorithm is awesome!');
Так вот, задачей будет описать алгоритм, который будет правильно размещать фигурки, таким образом, чтобы не было пустых мест.

Но у вас все равно получилось лучше, чем у других :) И ещё, судя по результатам, у меня такой же алгоритм.
Классное решение) Почти человеческое.
И за тестилку спасибо!
Вот мое решение: jsfiddle Не самое эффективное, но очень простое.
добавил в тестилку, плюс запилил минимакс — jsfiddle.net/vp_arth/TbYtF/4/
Ух ты, у меня 6 место, я попал в десятку лучших:)
Хм, добавил свое решение в тестилку: jsfiddle.net/TbYtF/6/
Стабильно показывает лучший результат и по очкам и по времени. Не думал, что столь тупой алгоритм может быть настолько эффективен.
Никого здесь не смущает, что задача о заполнении рюкзака (частными случаем которой является и предложенный вариант тетриса) является NP-полной? И что оптимальное решение NP-полной задачи может быть получено только методом полного перебора?
Нет не смущает. В задаче с рюкзаком, нам известен набор вещей заранее, а тут другая задача.
И что? NP-полной задачей является не только задача в канонической форме, но и любая задача, сводимая за полиномиальное время к любой из канонических.

Доказано, что классический тетрис является именно NP-полной задачей.
Доказано, что классический тетрис является именно NP-полной задачей.
А ссылочкой не поделитесь?
Ну или хотя бы формулировкой «классической задачи тетриса», так чтобы ее можно было к NP-задачам отнести?
При условии что имеют известный порядок фигур. В случае рандома, задача не будет полная же.
Ага, я так и думал, что вы детерменированный тетрис подгоните. Не уверен, что такую задачу можно назвать «классическим тетрисом».
Наоборот, NP-полная задача — та, к которой сводится другая NP-полная задача (плюс наша задача еще сама должна лежать в NP).
Дык частный случай же. Да и NP-полные задачи необязательно решаются «полным перебором».
НЛО прилетело и опубликовало эту надпись здесь
А можно еще один мой алгоритм разместить? Он тоже довольно простой, но намного эффективнее: jsfiddle
Действительно хороший алгоритм, но финишную часть надо бы доработать, чтобы при сильном заполнении стакана оставлял место для вертикальной «палки»
Спасибо. Попробую, но он и так очень медленный, боюсь, что тогда придется 5 секунд ждать на выполенние:)
Добавил оставление места для палки, но так он наоборот теряет в эффективности, где-то 2-5(в зависимости от порога сильного заполнения) очек на 100 запусков. Ну по крайней мере в моей реализации.
Алгоритм ваш мне понравился, компактно написан.
Пасиб!
jsfiddle.net/TbYtF/7/
оставил лучший из трёх
Да, спасибо!
Что-то меня так никто и не добавил :) jsfiddle.net/QPC7v/7/
Спасибо вам огромное за ваш тест! С ним намного удобней. Давайте тогда добавим всех участников. На моём блоге оставили такое решение:
jsfiddle.net/H3kra/
Это не мой тест, а товарища tigerforce
Вам ничто не мешает добавлять самому — это же fiddle
Вот товарищ один еще усовершенствовал своё решение, тоже может принять участие. jsfiddle.net/Night_Death/K4x3M/5/
во первых, невалидный код — не закрыт блок switch.
во вторых, некорректный алгоритм:
— возвращает значения от 0 до 9, вместо «от 1 до 10»
— не проверяет влезет ли фигура в эту колонку
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации