perl, 801 733 символів
Я вважаю, що це досить пряма реалізація. В основному для кожної руки ми сортуємо костюми та обличчя окремо. Тоді ми робимо ще одну копію обличчя з тузами, що може бути низькою, щоб ми могли перевірити наявність прямих з низькими тузами. Тоді ми визначаємо, чи є у нас флеш або прямо, і що таке висока карта. Потім ми просто перевіряємо на матчі в порядку забивання (спочатку перевіряємо на прямі флеші, потім на чотири види тощо). Фактична оцінка - це лише з'єднання типу руки з наступними номіналами карт у тому порядку, який вони мають значення (це _s () у неопущеній версії, u () у версії для гольфу). Ось:
@l{2..9,qw(T J Q K A)}=2..14;sub u{join"",map{$_>9?$_:"0$_"}shift,ref$_[0]?$$_[0]:map{$h[$_]}@_}sub e{$p[$_[0]-1]-1==$p[$_[0]]}sub f{@p=@_;e(1)&&e(2)&&e(3)&&e 4}sub h{$h[$_[0]]==$h[$_[1]]}sub i{h(@_[0,1])&&h @_[2,3]}sub t{@s=sort map{substr($_,1)}@_;$f=$s[0]eq$s[4];@l=@h=sort{$b<=>$a}map{$l{substr($_,0,1)}}@_;@l=(@l[1..4],1)while$l[0]==14;$s=0;if(f@l){$s=1;$h=$l[0]}else{$h=$h[0];$s=1 if f@h}$f&&$s?u 9,\$h:h(4,1)?u 7,4,0:h(3,0)?u 7,3,4:i(4,3,2,0)?u 6,0,4:i(4,2,1,0)?u 6,4,0:$f?u 5,0:$s?u 4,\$h:h(4,2)?u 3,4,0,1:h(3,1)?u 3,3,0,4:h(2,0)?u 3,2..4:i(4,3,2,1)?u 2,2,4,0:i(4,3,1,0)?u 2,1,4,2:i(3,2,1,0)?u 2,1,3,4:h(4,3)?u 1,4,0,1,2:h(3,2)?u 1,3,0,1,4:h(2,1)?u 1,2,0,3,4:h(1,0)?u 1,1..4:u 0,0..4}print t(@ARGV[0..4])gt t(@ARGV[5..9])?1:2
А ось і менш гольф-еквівалент:
use strict;
use warnings;
# ace high or low in straights, otherwise high
# T = ten, J = jack, Q = queen, K = king, A = ace
# 0 high card
# 1 one pair
# 2 two pair
# 3 3 of a kind
# 4 straight
# 5 flush
# 6 full house
# 7 four of a kind
# 9 straight flush (royal flush a subclass of straight flush)
my %l;@l{2..9,qw(T J Q K A)}=2..14;
sub score {
my @suits = sort map { substr($_,1) } @_;
my @faces_h = sort { $b <=> $a } map { $l{substr($_,0,1)} } @_;
my @faces_l = @faces_h;
@faces_l = (@faces_l[1..4], 1) while $faces_l[0] eq 14;
my $is_flush = $suits[0] eq $suits[4];
my ($is_straight, $high_card);
if($faces_l[0]-1==$faces_l[1] &&
$faces_l[1]-1==$faces_l[2] &&
$faces_l[2]-1==$faces_l[3] &&
$faces_l[3]-1==$faces_l[4]) {
$is_straight=1;
$high_card = $faces_l[0];
} else {
$high_card = $faces_h[0];
if($faces_h[0]-1==$faces_h[1] &&
$faces_h[1]-1==$faces_h[2] &&
$faces_h[2]-1==$faces_h[3] &&
$faces_h[3]-1==$faces_h[4]) {
$is_straight=1;
}
}
return _s(9, \$high_card) if $is_flush && $is_straight;
return _s(7, 4,0) if $faces_h[4] == $faces_h[1];
return _s(7, 3,4) if $faces_h[3] == $faces_h[0];
return _s(6, 0,4) if $faces_h[4] == $faces_h[3] && $faces_h[2] == $faces_h[0];
return _s(6, 4,0) if $faces_h[4] == $faces_h[2] && $faces_h[1] == $faces_h[0];
return _s(5, 0) if $is_flush;
return _s(4, \$high_card) if $is_straight;
return _s(3, 4,0,1) if $faces_h[4] == $faces_h[2];
return _s(3, 3,0,4) if $faces_h[3] == $faces_h[1];
return _s(3, 2,3,4) if $faces_h[2] == $faces_h[0];
return _s(2, 2,4,0) if $faces_h[4] == $faces_h[3] && $faces_h[2] == $faces_h[1];
return _s(2, 1,4,2) if $faces_h[4] == $faces_h[3] && $faces_h[1] == $faces_h[0];
return _s(2, 1,3,4) if $faces_h[3] == $faces_h[2] && $faces_h[1] == $faces_h[0];
return _s(1, 4,0,1,2) if $faces_h[4] == $faces_h[3];
return _s(1, 3,0,1,4) if $faces_h[3] == $faces_h[2];
return _s(1, 2,0,3,4) if $faces_h[2] == $faces_h[1];
return _s(1, 1,2,3,4) if $faces_h[1] == $faces_h[0];
return _s(0, 0..4);
}
sub _s {
join "", map { $_ > 9 ? $_ : "0$_" } shift,
ref $_[0] ? $$_[0] : map { $faces_h[$_] } @_
# my @a=@_;
# if(ref $a[1]) {
# $a[1]=${$a[1]};
# } else {
# $a[$_]=$faces_h[$a[$_]] for 1..$#a;
# }
# join "", map { $_ < 10 ? "0$_" : $_ } @a;
}
my @p1 = @ARGV[0..4];
my @p2 = @ARGV[5..9];
my $s1 = score(@p1);
my $s2 = score(@p2);
print $s1 gt $s2 ? 1 : 2;