* feat(tools): add seed/solution restore script * chore(curriculum): remove empty sections' markers * chore(curriculum): add seed + solution to Chinese * chore: remove old formatter * fix: update getChallenges parse translated challenges separately, without reference to the source * chore(curriculum): add dashedName to English * chore(curriculum): add dashedName to Chinese * refactor: remove unused challenge property 'name' * fix: relax dashedName requirement * fix: stray tag Remove stray `pre` tag from challenge file. Signed-off-by: nhcarrigan <nhcarrigan@gmail.com> Co-authored-by: nhcarrigan <nhcarrigan@gmail.com>
		
			
				
	
	
		
			137 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 594810f028c0303b75339acc
 | |
| title: ABC Problem
 | |
| challengeType: 5
 | |
| forumTopicId: 302220
 | |
| dashedName: abc-problem
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| You are given a collection of ABC blocks (e.g., childhood alphabet blocks). There are 20 blocks with two letters on each block. A complete alphabet is guaranteed amongst all sides of the blocks. The sample collection of blocks:
 | |
| 
 | |
| <pre>(B O)
 | |
| (X K)
 | |
| (D Q)
 | |
| (C P)
 | |
| (N A)
 | |
| (G T)
 | |
| (R E)
 | |
| (T G)
 | |
| (Q D)
 | |
| (F S)
 | |
| (J W)
 | |
| (H U)
 | |
| (V I)
 | |
| (A N)
 | |
| (O B)
 | |
| (E R)
 | |
| (F S)
 | |
| (L Y)
 | |
| (P C)
 | |
| (Z M)
 | |
| </pre>
 | |
| 
 | |
| # --instructions--
 | |
| 
 | |
| Implement a function that takes a string (word) and determines whether the word can be spelled with the given collection of blocks.
 | |
| 
 | |
| Some rules to keep in mind:
 | |
| 
 | |
| <ul>
 | |
|   <li>Once a letter on a block is used, that block cannot be used again.</li>
 | |
|   <li>The function should be case-insensitive.</li>
 | |
| </ul>
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| `canMakeWord` should be a function.
 | |
| 
 | |
| ```js
 | |
| assert(typeof canMakeWord === 'function');
 | |
| ```
 | |
| 
 | |
| `canMakeWord` should return a boolean.
 | |
| 
 | |
| ```js
 | |
| assert(typeof canMakeWord('hi') === 'boolean');
 | |
| ```
 | |
| 
 | |
| `canMakeWord("bark")` should return true.
 | |
| 
 | |
| ```js
 | |
| assert(canMakeWord(words[0]));
 | |
| ```
 | |
| 
 | |
| `canMakeWord("BooK")` should return false.
 | |
| 
 | |
| ```js
 | |
| assert(!canMakeWord(words[1]));
 | |
| ```
 | |
| 
 | |
| `canMakeWord("TReAT")` should return true.
 | |
| 
 | |
| ```js
 | |
| assert(canMakeWord(words[2]));
 | |
| ```
 | |
| 
 | |
| `canMakeWord("COMMON")` should return false.
 | |
| 
 | |
| ```js
 | |
| assert(!canMakeWord(words[3]));
 | |
| ```
 | |
| 
 | |
| `canMakeWord("squAD")` should return true.
 | |
| 
 | |
| ```js
 | |
| assert(canMakeWord(words[4]));
 | |
| ```
 | |
| 
 | |
| `canMakeWord("conFUSE")` should return true.
 | |
| 
 | |
| ```js
 | |
| assert(canMakeWord(words[5]));
 | |
| ```
 | |
| 
 | |
| # --seed--
 | |
| 
 | |
| ## --after-user-code--
 | |
| 
 | |
| ```js
 | |
| const words = ['bark', 'BooK', 'TReAT', 'COMMON', 'squAD', 'conFUSE'];
 | |
| ```
 | |
| 
 | |
| ## --seed-contents--
 | |
| 
 | |
| ```js
 | |
| function canMakeWord(word) {
 | |
| 
 | |
| }
 | |
| ```
 | |
| 
 | |
| # --solutions--
 | |
| 
 | |
| ```js
 | |
| function canMakeWord(word) {
 | |
|   const characters = 'BO XK DQ CP NA GT RE TG QD FS JW HU VI AN OB ER FS LY PC ZM';
 | |
|   const blocks = characters.split(' ').map(pair => pair.split(''));
 | |
| 
 | |
|   const letters = [...word.toUpperCase()];
 | |
|   let length = letters.length;
 | |
|   const copy = new Set(blocks);
 | |
| 
 | |
|   letters.forEach(letter => {
 | |
|     for (let block of copy) {
 | |
|       const index = block.indexOf(letter);
 | |
| 
 | |
|       if (index !== -1) {
 | |
|         length--;
 | |
|         copy.delete(block);
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   });
 | |
|   return !length;
 | |
| }
 | |
| ```
 |