Проверьте значения рук для одномодного маджонга


12

Маджонг - это игра в плитку, которая очень популярна в Азии. Как правило, в нее играют четыре игрока, и цель игры - стать первым, кто выполнил правильную руку, используя плитки. В маджонге есть три масти плиток плюс плитки чести - для этого испытания мы будем рассматривать только руки, сформированные из плиток одной масти.

Плитки пронумерованы от 1до 9, и каждая копия имеет ровно четыре копии. Действительная рука состоит из четырех наборов по три и пары, в общей сложности четырнадцать тайлов.

Набор из трех может быть:

  • Триплет, три одинаковых тайла (например 444) или
  • Последовательность из трех последовательных плиток (например, 123или 678нет 357). Последовательности не переносятся (поэтому 912недопустимы).

Пара - это просто две одинаковые плитки (например 55).

Соревнование

Имея действительную руку из четырнадцати тайлов, определите ее счет на основе следующих критериев:

Condition                Description                                 Point/s
-------------------------------------------------------------------------------
Straight                 Contains the sequences 123 456 789          1
Identical sequences      Contains two identical sequences            1
All simples              Only 2-8, no 1s or 9s                       1
All sequences            All sets of three are sequences             1
All triplets             All sets of three are triplets              2
Flush                    Single-suit hand (always applies)           5

(Оценка здесь основана на правилах японского маджонга, но сильно упрощена, чтобы сделать спецификацию менее запутанной.)

Оценка руки - это сумма очков за условия, которым она удовлетворяет. Если рука может быть разложена более чем одним способом, возьмите наивысшую оценку.

Входная стрелка гарантированно будет действительной, то есть четырнадцать плиток от 1 до 9 и каждая плитка появится не более четырех раз, и можно предположить, что она уже отсортирована. Ввод - это список цифр (в виде строки или единого плоского списка целых чисел) через STDIN, аргумент функции или командную строку. Выход может быть в STDOUT или возвращаемое значение.

Контрольные примеры

22233355777888  ->  8  # 222 333 55 777 888, flush + all simp. + all trip.
11112345678999  ->  6  # 111 123 456 789 99, flush + straight
11123456788999  ->  5  # 111 234 567 88 999, flush only (no straight)
23344455566788  ->  7  # 234 345 456 567 88, flush + all simp. + all seq.
33334444555566  ->  8  # 33 345 345 456 456, flush + all simp. + all seq. + identical seq.
11122233377799  ->  7  # 111 222 333 777 99, flush + all trip. (no identical seq.)
12344556678889  ->  8  # 123 456 456 789 88, flush + all seq. + straight + identical seq.
11344556678999  ->  5  # 11 345 456 678 999, flush only (no identical seq.)
22233344455566  ->  8  # 222 333 444 555 66, flush + all simp. + all trip.
11112233344555  ->  5  # 111 123 234 345 55, flush only

Для пятого примера, несмотря на наличие двух пар идентичных последовательностей, только одна должна присутствовать для достижения этой точки. Разложение 345 345 345 345 66получит одинаковую оценку, тогда как 333 345 444 555 66оценка ухудшится.

счет

Это , поэтому выигрывает решение с наименьшим количеством байтов. Применяются стандартные лазейки .


Сопутствующий вызов: чего вы ждете? (Решатель маджонга)

Ответы:


1

J (241 байт)

Вам нужна последняя версия J установлена.

i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'

Вызовите функцию sсо списком целых чисел. Например, следующий пример сценария проверяет приведенные выше тестовые случаи:

#!/usr/bin/jconsole
i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'


echo (s 2 2 2 3 3 3 5 5 7 7 7 8 8 8)=8
echo (s 1 1 1 1 2 3 4 5 6 7 8 9 9 9)=6
echo (s 1 1 1 2 3 4 5 6 7 8 8 9 9 9)=5
echo (s 2 3 3 4 4 4 5 5 5 6 6 7 8 8)=7
echo (s 3 3 3 3 4 4 4 4 5 5 5 5 6 6)=8
echo (s 1 1 1 2 2 2 3 3 3 7 7 7 9 9)=7
echo (s 1 2 3 4 4 5 5 6 6 7 8 8 8 9)=8
echo (s 1 1 3 4 4 5 5 6 6 7 8 9 9 9)=5
echo (s 2 2 2 3 3 3 4 4 4 5 5 5 6 6)=8
echo (s 1 1 1 1 2 2 3 3 3 4 4 5 5 5)=5

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