gpt4 book ai didi

language-agnostic - Code Golf : Who has the best poker hand?

转载 作者:行者123 更新时间:2023-12-01 18:17:13 27 4
gpt4 key购买 nike

锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。








我喜欢这样的挑战,我希望尽快提交我的答案。

哪位玩家拥有最好的 7 张牌?

给定 9 张牌的无序列表(用空格分隔),找出哪个玩家的牌手最好。 Here is a list of poker hand rankings .示例输入:

2C 5H AS KS 2D 4D QD KH 3S
(ie: [[2C 5H] [AS KS] [2D 4D QD KH 3S]])

数组中的前 2 张牌代表玩家 1 的手牌,数组中的第二张牌代表玩家 2 的手牌。最后 5 张牌代表公共(public)牌,双方玩家共用的牌。实际上,两位玩家都有 7 张牌,您必须确定哪位玩家拥有最好的 5 张牌。

一张牌被定义为一个字符串,第一个字符代表牌面值,第二个值代表花色。总是大写。没有卡片可以出现两次。

该函数将计算这手牌对任一玩家来说是平局还是获胜。它将在输入结束时输出总数。输出格式将在本文后面定义。

示例
2C 5H AS KS 2D 4D QD KH 3S
(ie: [[2C 5H] [AS KS] [2D 4D QD KH 3S]])
Player 2 wins this hand. Player 1 has a pair of 2's, player 2 has a pair of kings.

5S 6S 8H 9D 7S 8S JH TS 2H
(ie: [[5S 6S] [8H 9D] [7S 8S JH TS 2H]])
Player 1 wins this hand Player 1 has a flush, player 2 has a straight.

2S 2H AC AS 2C AH 9H TS 2D
(ie: [[2S 2H] [AC AS] [2C AH 9H TS 2D]])
Player 1 wins this hand. Player 1 has quads, player 2 has a full house

5S 6S 2D 4D 9S AS KD JC 9D
(ie: [[5S 6S] [2D 4D] [9S AS KD JC 9D]])
A draw. Both players have Ace high.

更多信息

感谢 mgroves 提供了与 Project Euler 有类似问题的以下链接:
http://projecteuler.net/index.php?section=problems&id=54

测试数据

我们将使用 Project Euler 测试数据:

http://projecteuler.net/project/poker.txt

您的解决方案应该接受该文本文件作为输入,并输出总的赢和平局。

示例输出

输出必须采用以下格式:
1: 45
2: 32
D: 12

玩家 1 赢了 45 手,玩家 2 赢了 32 手,共有 12 局平局。 (非实际结果)

规则
  • 不必返回中奖手型,谁赢谁赢
  • 卡片列表输入无特定顺序
  • 输入中没有卡片出现两次
  • 输入始终为大写
  • 将 Project Euler 测试数据作为输入
  • 输出一个计数,在
  • 以上给定格式中,哪个玩家赢得最多手牌和总平局

    最佳答案

    Perl,414 398 370/458 344/416 字符

    换行不重要。

    %M=map{$_,$Z++}0..9,T,J,Q,K,A;sub N{/.$/;$M{$`}.$&}

    sub B{$s=@p=();
    for$m(@_){$m-$_||($s+=2,++$p[$m])for@_}
    @_=sort{$p[$b]-$p[$a]||$b-$a}@_;
    $s=23 if$s<11&&($_[0]-$_[4]<5||$_[0]-$_[1]>8&&push@_,shift);
    "@_"=~/.$/;$s+=14*(4<grep/$&/,@_);
    $s=100*$s+$_ for@_;$s}

    ++$X{B((@c=map{N}split)[0..4])<=>B(@c[5..9])}for<>;
    printf"1: %d\n2: %d\nD: %d\n",@X{1,-1,0}

    这解决了“10 张牌”问题(发了 10 张牌,玩家 1 有前 5 张牌,玩家 2 有后 5 张牌)。

    第一部分定义了一个子程序 N可以转换每张卡片,使其具有数值。对于非人脸牌,这是一个简单的映射(5H ==> 5H),但它确实转换了人脸牌(KC => 13C,AD => 14D)。

    最后一部分将输入的每一行解析为卡片,将卡片转换为包含数值,将卡片分成两个玩家的不同手牌,然后分析和比较这些手牌。每手增加一个哈希值 %X .解析完所有输入后, %X包含玩家 1 获胜、玩家 2 获胜或平局的手数。

    中间部分是一个子程序,它将一组五张卡片作为输入并产生一个
    12 位数字,具有更强的扑克手将具有更高值(value)的数字的特性。以下是它的工作原理:
        for$m(@_){$m-$_||($s+=2,++$p[$m])for@_}

    这是“对”检测器。如果任意两张卡片具有相同的数值,则为其中一张卡片增加一个哈希元素并增加“分数”变量 $s由两个。请注意,我们最终会将每张卡片与其自身进行比较,因此 $s至少为 10 和 $p[$x]每张卡至少有一个 $x .如果手牌包含三张,那么这三张牌将与另外两张牌匹配——这就像这三张牌中有 9 次匹配,“分数”至少为 18。
        @_=sort{$p[$b]-$p[$a]||$b-$a}@_;

    按 (1) 该卡是“对”的一部分的次数和 (2) 卡的值(value)对卡进行排序。因此,在有两个 7 和两个 3 的手牌中,两个 7 将首先出现,然后是两个 3,然后是起脚牌。在有两个 7 和三个 3 的一手牌中,三个 3 将首先出现在两个 7 之后。此排序的目的是区分具有相同分数的两只手 - 一对 8 的手和一对 7 的手都有一对,但我们需要能够分辨出一对 8更好。
        $s=23 if$s<11&&($_[0]-$_[4]<5||$_[0]-$_[1]>8&&push@_,shift);

    这条线是“直线”检测器。顺子值(value) 23 点,出现在手上没有对子( $s<11 表示仅找到 5 个“对子”——每张与自己匹配的牌)并且 (1) 最高牌的值正好是 4大于最低牌的值(value) ( $_[0]-$_[4]==4),或 (2) 最高值(value)的牌是 A,次高的牌是 5 ( $_[0]-$_[1]==9),这意味着手牌是 A-2-3 -4-5 直。在后一种情况下,A 现在是手中最不值钱的牌,所以我们操纵 @_反射(reflect)这一点( push@_,shift)
        "@_"=~/.$/;$s+=14*(4<grep/$&/,@_);

    这条线是冲洗检测器。当每张牌的最后一个字符相同时,同花就值 14 点以上。第一个表达式( "@_"=~/.$/ )具有设置 $& 的副作用。到手上最后一张牌的最后一个字符(花色)。当且仅当 4<grep/$&/,@_ 的所有元素时,最终表达式 ( @_ ) 才会为真具有相同的最后一个字符。
        $s=100*$s+$_ for@_;$s}

    创建并返回一个以手牌得分开始的值,然后按卡片的重要性顺序包含卡片的值。不同手牌的分数将是
    Hand           Score
    ---------- ------
    High card 10 (each card matches itself for two points)
    One pair 14 (2 additional matches)
    Two pair 18 (4 additional matches)
    Three of a kind 22 (6 additional matches)
    Straight 23 (no pair, but 23 points for straight)
    Flush 24 (no pair, but 14 additional points for the flush)
    Full house 26 (8 additional matches)
    4 of a kind 34 (12 additional matches)
    Straight flush 37 (23 + 14 points)

    这符合扑克规则。相同分数的手牌可以通过手牌的值(value)来区分,按照对手牌的重要性,一直到手牌中最不值钱的牌。

    解决 9 张牌问题(玩家 1 两张牌,玩家 2 两张牌,玩家分享接下来的 5 张牌并建立他们最好的 5 张牌手)需要大约 70 次以上的笔画才能从中选出最好的 5 张牌手。 7张牌可供每位玩家使用:
    %M=map{$_,$Z++}0..9,T,J,Q,K,A;sub N{/./;$M{$&}.$'}

    sub A{my$I;
    for$k(0..41){@d=@_;splice@d,$_,1for$k%7,$k/7;$s=@p=();
    for$m(grep$_=N,@d){$m-$_||($s+=2,$p[$m]++)for@d}
    @d=sort{$p[$b]-$p[$a]||$b-$a}@d;
    $s=23 if$s<11&&($d[0]-$d[4]<5||$d[0]-$d[1]>8&&push@d,shift@d);
    "@d"=~/.$/;$s+=14*(4<grep/$&/,@d);
    $s=100*$s+$_ for@d;
    $I=$s if$s>$I}$I}

    ++$X{A((@c=split)[0,1,4..8])<=>A(@c[2..8])}for<>;
    printf"1: %d\n2: %d\nD: %d\n",@X{1,-1,0}

    关于language-agnostic - Code Golf : Who has the best poker hand?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364869/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com