단일 정장 마작에 대한 오버 핸드 값 확인


12

마작 은 아시아에서 매우 인기있는 타일 게임입니다. 일반적으로 4 명의 플레이어와 함께 플레이하며 게임의 목표는 타일을 사용하여 먼저 유효한 핸드를 완성하는 것입니다. 마작에는 3 개의 타일 슈트와 명예 타일이 있습니다.이 도전에서는 단일 슈트의 타일을 사용하여 형성된 핸드 만 고려합니다.

타일은에서 1까지 번호가 매겨지며 9각 타일에는 정확히 4 개의 사본이 있습니다. 유효한 핸드는 총 14 개의 타일에 대해 4 개의 3 세트와 1 세트로 구성됩니다.

세 세트는 다음 중 하나 일 수 있습니다.

  • 트리플렛, 같은 타일 3 개 (예 :) 444또는
  • 세 개의 연속 타일 (예를 들어,의 순서 123또는 678아니지만 357). 시퀀스는 랩핑되지 않습니다 (따라서 912유효하지 않습니다).

한 쌍은 단순히 두 개의 동일한 타일입니다 (예 :) 55.

도전

14 개의 타일로 구성된 유효한 핸드가 주어지면 다음 기준에 따라 점수를 결정하십시오.

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까지 14 개의 타일과 최대 4 번 나타나는 각 타일은 이미 정렬 된 것으로 간주 될 수 있습니다. 입력은 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''
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.