Fun Challenge - smallest block of code you can devise to build a deck of cards

Just for fun, seeing if anyone can make a block that defines a standard 52 card deck faster than this.


function createDeck() {
  $deck = array();
  for ($i = 0, $i < 52; $i++) {
    switch(floor($i / 13)) {
      case 0: $suit = 'S'; break;
      case 1: $suit = 'H'; break;
      case 2: $suit = 'D'; break;
      case 3: $suit = 'C'; break;
    }

    switch($i % 13) {
      case 0: $pip = 'A'; break;
      case 12: $pip = 'K'; break;
      case 11: $pip = 'Q'; break;
      case 10: $pip = 'J'; break;
      default: $pip = $i + 1; break;
    }
    $deck[$i] = $pip.$suit;
  }

  return $deck;
}

The challenge is - while keeping it legible, find a solution in fewer lines.

DISCLAIMER - Code above untested.


<?php
$deck = array();
foreach(array('S', 'H', 'D', 'C') as $suit)
{
    $pips = array_merge(
        array('A'),
        range(2, 10),
        array('J', 'Q', 'K')
    );
    
    foreach($pips as $pip){
        $deck[] = $pip . $suit;
    }
}


function createDeck()
{
    $suits = array('S','H','D','C');
    $pips  = array('A','K','Q','J','10','9','8','7','6','5','4','3','2');
    $deck  = array();
    foreach($suits as $suit)
    {
        foreach($pips as $pip)
        {
            $deck[] = $suit . $pip;
        }
    }
    return $deck;
}

Should

range(2, 9),

be

range(2, 10),
 

I don’t see where the 10 of any suit is defined.


    return array
    (
        'SA','SK','SQ','SJ','S10','S9','S8','S7','S6','S5','S4','S3','S2',
        'HA','HK','HQ','HJ','H10','H9','H8','H7','H6','H5','H4','H3','H2',
        'DA','DK','DQ','DJ','D10','D9','D8','D7','D6','D5','D4','D3','D2',
        'CA','CK','CQ','CJ','C10','C9','C8','C7','C6','C5','C4','C3','C2',
    );

:stuck_out_tongue:

I think ahundiak wins :slight_smile:


<?php
$deck = array();
foreach(array('S', 'H', 'D', 'C') as $suit)
{
    array_map(
        function($pip) use ($suit, &$deck) {
            $deck[] = $suit . $pip;
        },
        array_merge(array('A', 'J', 'Q', 'K'), range(2, 10))
    );
}


function cardDeck() {
	$deck = '';
	foreach( array('C', 'D', 'H', 'S') as $suit ) {
		foreach( array_merge(array('A', 'J', 'Q', 'K'),range( 2, 10 )) as $card ) {
			$deck[] = $suit . '_' . $card;
		}
	}
	return $deck;
}

$cardDeck = cardDeck();
shuffle($cardDeck);
print_r($cardDeck);


$tpl = '#A,#K,#Q,#J,#10,#9,#8,#7,#6,#5,#4,#3,#2,';
return explode(',',
    str_replace('#','C',$tpl) . 
    str_replace('#','D',$tpl) . 
    str_replace('#','H',$tpl) . 
    str_replace('#','S',$tpl));

Heh heh heh – I’ll take the second entry now. That is clever.

I like entry 3 better :slight_smile:

The next step now would be to create a stack of multiple decks and shuffle the whole stack.