Tek uygun Mahjong için el değerlerini kontrol edin


12

Mahjong , Asya'da son derece popüler olan bir çini oyunudur. Genellikle dört oyuncu ile oynanır ve oyunun amacı fayansları kullanarak geçerli bir eli tamamlayan ilk kişi olmaktır. Mahjong'da üç karo takımı artı şeref karosu vardır - bu meydan okuma için sadece tek bir takımdan fayans kullanılarak oluşturulan elleri dikkate alacağız.

Fayans gelen numaralandırılmıştır 1için 9ve her karo dört kopya aynen vardır. Geçerli bir el, toplam on dört karo için dört set ve bir çiftten oluşur.

Üçlü bir dizi şunlardan biri olabilir:

  • Üçlü, aynı döşemeden üçü (ör. 444) Veya
  • Üç ardışık döşemeden oluşan bir dizi (örneğin 123veya 678değil 357). Diziler sarılmaz ( 912geçersizdir).

Bir çift basitçe iki özdeş döşemedir (örneğin 55).

Meydan okuma

On dört taştan oluşan geçerli bir el verildiğinde puanını aşağıdaki kriterlere göre belirleyin:

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

(Burada puanlama Japon mahjong kurallarına dayanmaktadır, ancak spesifikasyonu daha az dağınık hale getirmek için büyük ölçüde basitleştirilmiştir.)

Bir elin puanı, yerine getirdiği koşullar için puanların toplamıdır. Bir el birden fazla şekilde ayrıştırılabiliyorsa, en yüksek skorlu ayrışmayı alın.

Giriş elinin geçerli olacağı garanti edilir, yani 1'den 9'a kadar on dört kiremit ve her bir kiremit en fazla dört kez görünür ve zaten sıralandığı varsayılabilir. Girdi, STDIN, işlev bağımsız değişkeni veya komut satırı aracılığıyla bir basamak listesidir (dize veya tek bir düz tamsayı listesi olarak). Çıktı STDOUT veya dönüş değeri olabilir.

Test senaryoları

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

Beşinci örnek için, iki çift özdeş diziye sahip olmasına rağmen, bu noktaya ulaşmak için sadece bir tane mevcut olmalıdır. Ayrışma 345 345 345 345 66aynı puanı alırken, 333 345 444 555 66puanlar daha kötü olur.

puanlama

Bu , bu yüzden en az bayt içindeki çözüm kazanır. Standart boşluklar geçerlidir.


İlgili zorluk: Ne bekliyorsun? (Mahjong çözücü)

Yanıtlar:


1

J (241 byes)

Yüklü J'nin en son sürümüne ihtiyacınız var .

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'

İşlevi sbir tamsayı listesi ile çağırın . Örneğin, aşağıdaki örnek komut dosyası yukarıdaki test senaryolarını doğrular:

#!/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''
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.