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


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.