|
| 1 | +/** |
| 2 | + * Original file: |
| 3 | + * |
1 | 4 | // This problem involves playing cards: https://en.wikipedia.org/wiki/Standard_52-card_deck |
2 | 5 |
|
3 | 6 | // Implement a function getCardValue, when given a string representing a playing card, |
@@ -50,3 +53,124 @@ try { |
50 | 53 | } catch (e) {} |
51 | 54 |
|
52 | 55 | // What other invalid card cases can you think of? |
| 56 | +* |
| 57 | +*/ |
| 58 | + |
| 59 | +// Implementation |
| 60 | + |
| 61 | +function getCardValue(card) { |
| 62 | + // Validate input type |
| 63 | + if (typeof card !== 'string' || card.length < 2) { |
| 64 | + throw new Error('Invalid card format'); |
| 65 | + } |
| 66 | + |
| 67 | + // Define valid ranks and suits |
| 68 | + const validRanks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']; |
| 69 | + const validSuits = ['♠', '♥', '♦', '♣']; |
| 70 | + |
| 71 | + // Extract rank and suit |
| 72 | + let rank, suit; |
| 73 | + |
| 74 | + // Handle '10' which is 2 characters |
| 75 | + if (card.startsWith('10') && card.length === 3) { |
| 76 | + rank = '10'; |
| 77 | + suit = card[2]; |
| 78 | + } else if (card.length === 2) { |
| 79 | + rank = card[0]; |
| 80 | + suit = card[1]; |
| 81 | + } else { |
| 82 | + throw new Error('Invalid card format'); |
| 83 | + } |
| 84 | + |
| 85 | + // Validate rank and suit |
| 86 | + if (!validRanks.includes(rank) || !validSuits.includes(suit)) { |
| 87 | + throw new Error('Invalid card format'); |
| 88 | + } |
| 89 | + |
| 90 | + // Return value based on rank |
| 91 | + if (rank === 'A') { |
| 92 | + return 11; |
| 93 | + } else if (['J', 'Q', 'K'].includes(rank)) { |
| 94 | + return 10; |
| 95 | + } else { |
| 96 | + return parseInt(rank, 10); |
| 97 | + } |
| 98 | +} |
| 99 | + |
| 100 | +module.exports = getCardValue; |
| 101 | + |
| 102 | +function assertEquals(actualOutput, targetOutput) { |
| 103 | + console.assert( |
| 104 | + actualOutput === targetOutput, |
| 105 | + `Expected ${actualOutput} to equal ${targetOutput}` |
| 106 | + ); |
| 107 | +} |
| 108 | + |
| 109 | +// Helper function to test error throwing |
| 110 | +function assertThrowsError(fn, expectedErrorMessage) { |
| 111 | + try { |
| 112 | + fn(); |
| 113 | + console.error(`Error was not thrown. Expected: ${expectedErrorMessage}`); |
| 114 | + } catch (e) { |
| 115 | + console.assert( |
| 116 | + e.message === expectedErrorMessage, |
| 117 | + `Expected error message "${expectedErrorMessage}" but got "${e.message}"` |
| 118 | + ); |
| 119 | + } |
| 120 | +} |
| 121 | + |
| 122 | +// Tests for valid cards |
| 123 | +console.log('Testing valid cards:'); |
| 124 | +assertEquals(getCardValue('A♠'), 11); |
| 125 | +assertEquals(getCardValue('A♥'), 11); |
| 126 | +assertEquals(getCardValue('A♦'), 11); |
| 127 | +assertEquals(getCardValue('A♣'), 11); |
| 128 | + |
| 129 | +assertEquals(getCardValue('2♠'), 2); |
| 130 | +assertEquals(getCardValue('3♥'), 3); |
| 131 | +assertEquals(getCardValue('4♦'), 4); |
| 132 | +assertEquals(getCardValue('5♣'), 5); |
| 133 | +assertEquals(getCardValue('6♠'), 6); |
| 134 | +assertEquals(getCardValue('7♥'), 7); |
| 135 | +assertEquals(getCardValue('8♦'), 8); |
| 136 | +assertEquals(getCardValue('9♣'), 9); |
| 137 | +assertEquals(getCardValue('10♠'), 10); |
| 138 | +assertEquals(getCardValue('10♥'), 10); |
| 139 | +assertEquals(getCardValue('10♦'), 10); |
| 140 | +assertEquals(getCardValue('10♣'), 10); |
| 141 | + |
| 142 | +assertEquals(getCardValue('J♠'), 10); |
| 143 | +assertEquals(getCardValue('Q♥'), 10); |
| 144 | +assertEquals(getCardValue('K♦'), 10); |
| 145 | +assertEquals(getCardValue('J♣'), 10); |
| 146 | + |
| 147 | +// Tests for invalid cards |
| 148 | +console.log('\nTesting invalid cards:'); |
| 149 | + |
| 150 | +// Invalid format |
| 151 | +assertThrowsError(() => getCardValue(''), 'Invalid card format'); |
| 152 | +assertThrowsError(() => getCardValue('A'), 'Invalid card format'); |
| 153 | +assertThrowsError(() => getCardValue('10'), 'Invalid card format'); |
| 154 | +assertThrowsError(() => getCardValue('A♠♠'), 'Invalid card format'); |
| 155 | +assertThrowsError(() => getCardValue('10♠♠'), 'Invalid card format'); |
| 156 | + |
| 157 | +// Invalid rank |
| 158 | +assertThrowsError(() => getCardValue('1♠'), 'Invalid card format'); |
| 159 | +assertThrowsError(() => getCardValue('11♠'), 'Invalid card format'); |
| 160 | +assertThrowsError(() => getCardValue('B♠'), 'Invalid card format'); |
| 161 | +assertThrowsError(() => getCardValue('X♠'), 'Invalid card format'); |
| 162 | + |
| 163 | +// Invalid suit |
| 164 | +assertThrowsError(() => getCardValue('A♤'), 'Invalid card format'); // Using ♤ instead of ♠ |
| 165 | +assertThrowsError(() => getCardValue('A♡'), 'Invalid card format'); // Using ♡ instead of ♥ |
| 166 | +assertThrowsError(() => getCardValue('A♢'), 'Invalid card format'); // Using ♢ instead of ♦ |
| 167 | +assertThrowsError(() => getCardValue('A♧'), 'Invalid card format'); // Using ♧ instead of ♣ |
| 168 | + |
| 169 | +// Invalid type |
| 170 | +assertThrowsError(() => getCardValue(123), 'Invalid card format'); |
| 171 | +assertThrowsError(() => getCardValue(null), 'Invalid card format'); |
| 172 | +assertThrowsError(() => getCardValue(undefined), 'Invalid card format'); |
| 173 | +assertThrowsError(() => getCardValue({}), 'Invalid card format'); |
| 174 | + |
| 175 | +console.log('\nAll tests completed!'); |
| 176 | + |
0 commit comments