Идея, благодаря @ MartinBüttner из обсуждения в чате
Маджонг - это игра в плитку, которая очень популярна в Азии. Как правило, в нее играют четыре игрока, и цель игры - стать первым, кто выполнил правильную руку, используя плитки. Для этой задачи мы рассмотрим упрощенную версию игры - PPCG mahjong.
В PPCG маджонг, есть три костюмы - m
, p
и s
- и плитки пронумерованы от 1
до 9
. Существует ровно четыре копии каждой плитки, и плитки обозначены номером, за которым следует их масть (например 3m
, 9s
).
Готовая рука маджонга PPCG состоит из четырех наборов по три и пары, что в общей сложности составляет 14 фишек.
Набор из трех может быть:
- Три одинаковых тайла (например
4s 4s 4s
, но не4m 4p 4s
), или - Последовательность из трех последовательных плиток в одной масти (например,
1s 2s 3s
или6p 7p 8p
нет,3s 4m 5m
или3p 5p 7p
). Последовательности не переносятся (поэтому9m 1m 2m
недопустимы).
Пара - это просто две одинаковые плитки (например 5s 5s
).
Соревнование
Ваша программа получит разделенную пробелом руку из 13 плиток, каждая из которых будет появляться не более четырех раз. Вы можете написать либо полную программу, либо функцию, которая принимает строку.
Ваша задача - найти все возможные 14-тые плитки («ждет»), которые, если их добавить в руку, сформируют законченную комбинацию маджонга PPCG. Выводимые плитки должны быть разделены пробелами, но могут быть в любом порядке. Допускаются начальные или конечные пробелы.
Ваша программа должна работать за разумное время, не более минуты.
Примеры
Input: 1m 1m 1m 4s 4s 4s 7p 7p 7p 3m 3m 3m 9s
Output: 9s
Input: 1m 1m 1m 3m 3m 3m 5m 5m 5m 2s 3s 7p 8p
Output:
Input: 1m 2m 2m 3m 3m 3m 3m 4m 1s 1s 9s 9s 9s
Output: 1s
Input: 1m 1m 1m 2m 3m 4m 5m 6m 7m 8m 9m 9m 9m
Output: 1m 2m 3m 4m 5m 6m 7m 8m 9m
Input: 1m 1m 1m 5p 2m 3m 5p 7s 8s 5p 9s 9s 9s
Output: 1m 4m 6s 9s
В первом примере 1m 4s 7p 3m
все они формируют существующие триплеты, оставляя в одиночестве 9s
пару.
Во втором примере 2s 3s
и 7p 8p
могут формировать только последовательности, а оставшиеся фрагменты могут образовывать только триплеты. Следовательно, никакая пара не может быть сформирована, и нет выхода.
В третьем примере рука распадается на 1m2m3m 2m3m4m 3m3m 1s1s 9s9s9s
. Обычно это ожидание 3m 1s
, но, поскольку все четыре 3m
были использованы, единственное доступное ожидание 1s
.
В четвертом примере все m
плитки завершают раздачу. Например, для 1m
, может быть, 1m1m1m 1m2m3m 4m5m6m 7m8m9m 9m9m
кто является законченной рукой.
Попробуйте проработать остаток четвертого примера и пятого примера :)
счет
Это код-гольф , поэтому выигрывает решение с наименьшим количеством байтов. Применяются стандартные лазейки .
Ответы:
Python,
312281 байтW
принимает строку в качестве входных данных и возвращает строку в качестве выходных.Небольшое количество плиток (27) позволяет достаточно быстро проверить, завершает ли каждая из них раздачу. Проблема становится, чтобы проверить, если рука действительна. Функция использует простой алгоритм обратного отслеживания, который учитывает все возможные варианты наборов и проверяет, суммирует ли любой из них полную руку.
Руки представлены в виде гистограмм плиток, то есть списка счетчиков плиток (для всех плиток, а не только тех, которые присутствуют в руке). Это позволяет легко проверить, есть ли у нас определенное количество определенной плитки, и если мы иметь последовательность смежных плиток (заполнение между плитками разных мастей предотвращает последовательности нескольких мастей.)
источник
map
в нескольких местах, например:H(map((S+t).count,T))
JavaScript (E6) 306
Разъяснения
Тест в консоли FireFox / FireBug
Выход
источник