3v4l.org

run code in 300+ PHP versions simultaneously
<?php function sortCardsBySortOrder(Array $cards, $reverse = false): Array { $changeAce = false; if (isLowStraight($cards)) { $reverse = true; $changeAce = true; } $cards = sortCards($cards, $reverse); if ($changeAce) { $ace = array_pop($cards); //rebuild the array with ace first $tmpArr = []; $tmpArr['A'.$ace['suite']] = $ace; foreach ($cards as $card => $details) { $tmpArr[$card] = $details; } $cards = $tmpArr; } return $cards; } function sortCards(Array $cards, $reverse = false): Array { uasort($cards, function($a, $b) use($reverse) { $result = $a['sort'] <=> $b['sort']; if (!$reverse) { $result *= -1; } if ($result == 0) { $result = $a['suite'] <=> $b['suite']; } return $result; }); return $cards; } function sortCardsBySuite(Array $cards, $reverse = false): Array { uasort($cards, function($a, $b) use($reverse) { $result = $a['suite'] <=> $b['suite']; if ($result == 0) { $result = $a['sort'] <=> $b['sort']; } if (!$reverse) { $result *= -1; } return $result; }); return $cards; } function shuffleCards(Array $cards): Array { $shuffled = []; while ($cards) { $key = array_rand($cards); $shuffled[$key] = $cards[$key]; unset($cards[$key]); } return $shuffled; } function dealCards(Array $cards, $num = 1) { $result = [null, null]; for ($i = 0; $i < $num; $i++) { $key = array_rand($cards); $result[1][$key] = $cards[$key]; unset($cards[$key]); } $result[0] = $cards; return $result; } function getLargestSuite(Array $cards): Array { $result = []; $lastSuite = ""; $streak = []; foreach ($cards as $card => $details) { $suite = $details['suite']; if ($suite != $lastSuite) { $lastSuite = $suite; } $streak[$suite][$card] = [$card => $details]; } uasort($streak, function ($a, $b) { $result = count($a) <=> count($b); if ($result == 0) { $a = array_map(function ($v) { $s = 0; foreach($v as $x) { $s += $x['sort']; } return $s; }, $a); $b = array_map(function ($v) { $s = 0; foreach($v as $x) { $s += $x['sort']; } return $s; }, $b); $result = array_sum($a) <=> array_sum($b); } return $result; }); return array_pop($streak); } function getLargestSet(Array $cards): Array { $result = []; $lastType = ""; $streak = []; foreach ($cards as $card => $details) { $type = substr($card, 0, 1); if ($type != $lastType) { $lastType = $type; } $streak[$type][$card] = [$card => $details]; } uasort($streak, function ($a, $b) { $result = count($a) <=> count($b); return $result; }); return array_pop($streak); } function groupBySet(Array $cards): Array { $result = []; $lastType = ""; $streak = []; $cards = sortCardsBySortOrder($cards); foreach ($cards as $card => $details) { $type = substr($card, 0, 1); if ($type != $lastType) { $lastType = $type; } $streak[$type][$card] = [$card => $details]; } uasort($streak, function ($a, $b) { $result = count($a) <=> count($b); return $result * -1; }); $cards = []; foreach ($streak as $streaks) { foreach($streaks as $card => $details) { $cards[$card] = reset($details); } } return $cards; } function isStraightFlush(Array $cards): bool { // straight flush return isStraight($cards) && isFlush($cards); } function isQuads(Array $cards): bool { // quads $hand = sortCardsBySortOrder($cards); $hand = getLargestSet($hand); return count($hand) == 4; } function isFullHouse(Array $cards): bool { // full house return isPair($cards) && isTrips($cards); } function isFlush(Array $cards) { // flush $hand = sortCardsBySortOrder($cards); $hand = sortCardsBySuite($hand); $largest = getLargestSuite($cards); if (count($largest) == 5) { return true; } return false; } function isLowStraight(Array $cards): bool { // Check for special case where Ace is low $cards = sortCards($cards, true); $lowStraight = ["2", "3", "4", "5", "A"]; $tmpArr = []; $hasAce = false; // check if ace is there foreach ($cards as $card => $details) { if (substr($card, 0, 1) === "A") { $hasAce = true; } } if ($hasAce) { $tmpArr[] = "A"; } foreach (array_slice($cards, 0, 4) as $card => $details) { $tmpArr[] = substr($card, 0, 1); } sort($tmpArr); if ($tmpArr === $lowStraight) { return true; } return false; } function isStraight(Array $cards) { // straight $hand = sortCards($cards); $h = array_slice($hand, 0, 5); foreach (traverseCardsByTwo($h) as [$card1, $card2]) { if ($card2) { $delta = $card1['sort'] - $card2['sort']; if ($delta !== 1) { if (isLowStraight($hand)) { return true; } return false; } } } return true; } function isTrips(Array $cards): bool { // trips $hand = sortCardsBySortOrder($cards); $hand = getLargestSet($hand); return count($hand) == 3; } function isTwoPair(Array $cards): bool { // pair $result = []; $lastType = ""; $streak = []; $pairs = 0; foreach ($cards as $card => $details) { $type = substr($card, 0, 1); if ($type != $lastType) { $lastType = $type; } $streak[$type][$card] = [$card => $details]; } uasort($streak, function ($a, $b) { $result = count($a) <=> count($b); return $result * -1; }); foreach($streak as $s) { if (count($s) == 2) { $pairs++; } } return $pairs >= 2; } function isPair(Array $cards): bool { // pair $result = []; $lastType = ""; $streak = []; foreach ($cards as $card => $details) { $type = substr($card, 0, 1); if ($type != $lastType) { $lastType = $type; } $streak[$type][$card] = [$card => $details]; } uasort($streak, function ($a, $b) { $result = count($a) <=> count($b); return $result * -1; }); foreach($streak as $s) { if (count($s) == 2) { return true; } } return false; } function traverseCardsByTwo(Array $cards) { reset($cards); while(key($cards) !== null) { $card1 = current($cards); $card2 = next($cards); yield [$card1, $card2]; } } function getCardsAsString(Array $cards): String { $s = []; foreach ($cards as $card => $details) { $s[] = $card; } return implode(",", $s); } function combineHands(Array $hand1, Array $hand2): Array { foreach ($hand2 as $card => $details) { $hand1[$card] = $details; } return $hand1; } function DetermineHand($board, $player) { $hand = combineHands($board, $player); $taxonomies = [ "Straight Flush" => ["Straight Flush" => 9], "Quads" => ["Quads" => 8], "Full House" => ["Full House" => 7], "Flush" => ["Flush" => 6], "Straight" => ["Straight" => 5], "Trips" => ["Trips" => 4], "Two Pair" => ["Two Pair" => 3], "Pair" => ["Pair" => 2], "High Card" => ["High Card" => 1], ]; $h = sortCardsBySortOrder($hand); if (isStraightFlush($h)) { $h = getLargestSuite($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Straight Flush"], "h" => $h]; } elseif (isQuads($h)) { $h = groupBySet($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Quads"], "h" => $h]; } elseif (isFullHouse($h)) { $h = groupBySet($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Full House"], "h" => $h]; } elseif (isFlush($h)) { $h = getLargestSuite($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Flush"], "h" => $h]; } elseif (isStraight($h)) { $handResult = ["t" => $taxonomies["Straight"], "h" => $h]; } elseif (isTrips($h)) { $h = groupBySet($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Trips"], "h" => $h]; } elseif (isTwoPair($h)) { $h = groupBySet($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Two Pair"], "h" => $h]; } elseif (isPair($h)) { $h = groupBySet($h); $h = array_slice($h, 0, 5); $handResult = ["t" => $taxonomies["Pair"], "h" => $h]; } else { $handResult = ["t" => $taxonomies["High Card"], "h" => $h]; } return $handResult; } function DetermineWinnerByTie($hand1, $hand2) { // hand score is equal to sum of value plus taxonomy $s1 = $s2 = 0; foreach($hand1 as $x) { $s1 += $x['value']; } foreach($hand2 as $x) { $s2 += $x['value']; } return $s1 <=> $s2; } function DetermineWinner($hand1, $hand2) { // hand score is equal to sum of sort order plus taxonomy if (reset($hand1['t']) == reset($hand2['t'])) { $result = DetermineWinnerByTie($hand1['h'], $hand2['h']); } else { $result = reset($hand1['t']) <=> reset($hand2['t']); } return $result; } $cards = [ "AS" => ["sort" => 14, "suite" => "S", "value" => 11], "AC" => ["sort" => 14, "suite" => "C", "value" => 11], "AD" => ["sort" => 14, "suite" => "D", "value" => 11], "AH" => ["sort" => 14, "suite" => "H", "value" => 11], "KS" => ["sort" => 13, "suite" => "S", "value" => 10], "KC" => ["sort" => 13, "suite" => "C", "value" => 10], "KD" => ["sort" => 13, "suite" => "D", "value" => 10], "KH" => ["sort" => 13, "suite" => "H", "value" => 10], "QS" => ["sort" => 12, "suite" => "S", "value" => 10], "QC" => ["sort" => 12, "suite" => "C", "value" => 10], "QD" => ["sort" => 12, "suite" => "D", "value" => 10], "QH" => ["sort" => 12, "suite" => "H", "value" => 10], "JS" => ["sort" => 11, "suite" => "S", "value" => 10], "JC" => ["sort" => 11, "suite" => "C", "value" => 10], "JD" => ["sort" => 11, "suite" => "D", "value" => 10], "JH" => ["sort" => 11, "suite" => "H", "value" => 10], "10S" => ["sort" => 10, "suite" => "S", "value" => 10], "10C" => ["sort" => 10, "suite" => "C", "value" => 10], "10D" => ["sort" => 10, "suite" => "D", "value" => 10], "10H" => ["sort" => 10, "suite" => "H", "value" => 10], "9S" => ["sort" => 9, "suite" => "S", "value" => 9], "9C" => ["sort" => 9, "suite" => "C", "value" => 9], "9D" => ["sort" => 9, "suite" => "D", "value" => 9], "9H" => ["sort" => 9, "suite" => "H", "value" => 9], "8S" => ["sort" => 8, "suite" => "S", "value" => 8], "8C" => ["sort" => 8, "suite" => "C", "value" => 8], "8D" => ["sort" => 8, "suite" => "D", "value" => 8], "8H" => ["sort" => 8, "suite" => "H", "value" => 8], "7S" => ["sort" => 7, "suite" => "S", "value" => 7], "7C" => ["sort" => 7, "suite" => "C", "value" => 7], "7D" => ["sort" => 7, "suite" => "D", "value" => 7], "7H" => ["sort" => 7, "suite" => "H", "value" => 7], "6S" => ["sort" => 6, "suite" => "S", "value" => 6], "6C" => ["sort" => 6, "suite" => "C", "value" => 6], "6D" => ["sort" => 6, "suite" => "D", "value" => 6], "6H" => ["sort" => 6, "suite" => "H", "value" => 6], "5S" => ["sort" => 5, "suite" => "S", "value" => 5], "5C" => ["sort" => 5, "suite" => "C", "value" => 5], "5D" => ["sort" => 5, "suite" => "D", "value" => 5], "5H" => ["sort" => 5, "suite" => "H", "value" => 5], "4S" => ["sort" => 4, "suite" => "S", "value" => 4], "4C" => ["sort" => 4, "suite" => "C", "value" => 4], "4D" => ["sort" => 4, "suite" => "D", "value" => 4], "4H" => ["sort" => 4, "suite" => "H", "value" => 4], "3S" => ["sort" => 3, "suite" => "S", "value" => 3], "3C" => ["sort" => 3, "suite" => "C", "value" => 3], "3D" => ["sort" => 3, "suite" => "D", "value" => 3], "3H" => ["sort" => 3, "suite" => "H", "value" => 3], "2S" => ["sort" => 2, "suite" => "S", "value" => 2], "2C" => ["sort" => 2, "suite" => "C", "value" => 2], "2D" => ["sort" => 2, "suite" => "D", "value" => 2], "2H" => ["sort" => 2, "suite" => "H", "value" => 2], ]; $board = $player1 = $player2 = []; shuffleCards($cards); [$cards, $player1] = dealCards($cards, 2); [$cards, $player2] = dealCards($cards, 2); [$cards, $board] = dealCards($cards, 5); $board1 = combineHands($board, $player1); $board2 = combineHands($board, $player2); $board1 = sortCardsBySortOrder($board1); $b1 = array_slice($board1, 0, 5); $board2 = sortCardsBySortOrder($board2); $b2 = array_slice($board2, 0, 5); echo "Board: ", getCardsAsString($board), "\n"; echo "Player 1: ", getCardsAsString($player1), "\n"; echo "Player 2: ", getCardsAsString($player2), "\n\n"; $hand1 = DetermineHand($player1, $board); $hand2 = DetermineHand($player2, $board); echo "Player 1 has: ", key($hand1['t']), " - ", getCardsAsString($hand1['h']), "\n"; echo "Player 2 has: ", key($hand2['t']), " - ", getCardsAsString($hand2['h']), "\n"; if (($win = DetermineWinner($hand1, $hand2)) == -1) { echo "Player 2 wins!\n"; } elseif ($win == 1) { echo "Player 1 wins!\n"; } else { echo "It's a tie!\n"; }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
7.4.40.0030.01516.61
7.4.30.0090.00916.55
7.4.20.0150.00316.63
7.4.10.0030.01316.76
7.4.00.0060.01316.77
7.3.160.0120.00916.64
7.3.150.0120.00616.86
7.3.140.0090.00916.70
7.3.130.0110.00716.78
7.3.120.0070.01016.70
7.3.110.0000.01616.74
7.3.100.0130.00316.61
7.3.90.0090.00916.66
7.3.80.0120.00416.52
7.3.70.0080.00916.59
7.3.60.0060.01016.47
7.3.50.0090.00916.50
7.3.40.0090.00916.51
7.3.30.0090.01316.70
7.3.20.0100.01416.67
7.3.10.0140.01116.36
7.3.00.0090.01216.59
7.2.290.0070.01016.98
7.2.280.0150.00316.92
7.2.270.0140.00316.70
7.2.260.0030.01616.70
7.2.250.0140.00316.96
7.2.240.0100.00716.77
7.2.230.0030.01416.86
7.2.220.0060.01416.70
7.2.210.0040.01416.89
7.2.200.0120.00616.78
7.2.190.0130.00416.78
7.2.180.0030.01416.83
7.2.170.0040.01716.68
7.2.160.0120.00616.89
7.2.150.0150.01116.89
7.2.140.0100.01016.96
7.2.130.0170.00316.87
7.2.120.0070.01316.81
7.2.110.0150.00916.86
7.2.100.0130.01316.94
7.2.90.0090.01616.91
7.2.80.0060.01616.83
7.2.70.0120.00916.90
7.2.60.0030.02216.97
7.2.50.0320.00316.87
7.2.40.0120.01517.15
7.2.30.0100.01016.79
7.2.20.0100.01616.98
7.2.10.0090.01216.90
7.2.00.0030.02316.97

preferences:
23.8 ms | 401 KiB | 5 Q