---
# System prepended metadata

title: '[C]alphabetBoardPath'
tags: [LeetCode, codeReview]

---

###### tags: `codeReview` `LeetCode`
# [C]alphabetBoardPath

### Demo
```typescript=
const START_CHAR = 'a'
const LAST_CHAR = 'z'
const COLUMN_COUNT = 5
const SELECTOR = '!'
const MOVE_X = { axis: 'x', forward: 'R', back: 'L' }
const MOVE_Y = { axis: 'y', forward: 'D', back: 'U' }
const START_CHAR_CODE_AT = START_CHAR.charCodeAt() //97
const LAST_ROW = Math.floor((LAST_CHAR.charCodeAt() - START_CHAR_CODE_AT) / COLUMN_COUNT)
const MEMORY_CHAR_POINT_DIC = {}

const findCharPoint = ({ char }) => {
  if (MEMORY_CHAR_POINT_DIC[char]) return MEMORY_CHAR_POINT_DIC[char]
  const charDistance = char.charCodeAt() - START_CHAR_CODE_AT
  return MEMORY_CHAR_POINT_DIC[char] = {
    x: charDistance % COLUMN_COUNT,
    y: Math.floor(charDistance / COLUMN_COUNT)
  }
}
const findMoveModes = ({ nextAt }) => {
  if (nextAt.y != LAST_ROW) return [MOVE_Y, MOVE_X]
  return [MOVE_X, MOVE_Y]
}
const findMovePath = ({ currentAt, nextAt }) => {
  const modes =  findMoveModes({nextAt}) // [MOVE_X, MOVE_Y]
  return modes.map(({ axis, forward, back }) => {
    const distance = nextAt[axis] - currentAt[axis]
    if (distance === 0) return ''
    if (distance > 0) return forward.repeat(distance)
    return back.repeat(-distance)
  })
}
const alphabetBoardPath = target => {
  let currentAt = findCharPoint({ char: START_CHAR }) // {x:0,y:0}
  const charPaths = target.split('').map(char => {
    const nextAt = findCharPoint({ char }) // {x:1,y:2},
    const path = findMovePath({ currentAt, nextAt }) //[D,D,R]
    currentAt = nextAt
    return path.join('') + SELECTOR //DDR!
  })
  return charPaths.join('')
}
alphabetBoardPath('leet')
```

### 偉恩
[[TypeScript] For Bginners From Taiwanese](https://leetcode.com/problems/alphabet-board-path/discuss/783054/TypeScript-For-Bginners-From-Taiwanese)
### 政儒
#### #2
```typescript=
function alphabetBoardPath(target: string): string {
    const boardRow = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"];
    const targetArr = target.split('');
    const targetLen = targetArr.length;
    let currentRow = 0;
    let currentCol = 0;
    let output = ''

    // 幾個字母
    for(let i=0; i<targetLen; i++){
        // row
        /*找rowNo*/
        const rowNo = boardRow.findIndex(x => x.includes(targetArr[i]));
        /*算rowGap*/
        const rowGap = rowNo-currentRow;
        /*給currentRow*/
        currentRow = currentRow+rowGap;

        // column
        /*找column*/
        const boardCol = boardRow[rowNo].split('');
        const colNo = boardCol.findIndex(x => x === targetArr[i]);
        /*算colGap*/
        const colGap = colNo-currentCol;
        /*給currentCol*/
        currentCol = currentCol+colGap;
        
        // 列印 #row[U|D] #col[L|R]
        output += rowNo+1 !== boardRow.length ? print(rowGap, 1) : print(colGap, 3);
        output += rowNo+1 !== boardRow.length ? print(colGap, 3) : print(rowGap, 1);
        output += '!';
    }
    
    return output;
};


// # count # dire 方向(橫:1[U、D]|直:3[L、R])
function print(count: number, dire: number) {
    const moveWord = ['U', 'D', 'L', 'R'];
    let pri = '';
    while (count !== 0) {
        if (count > 0) {
            pri += moveWord[dire];
            count--;
        }else {
            pri += moveWord[dire-1];
            count++;
        }
    }
    return pri
}
```

#### #1: 錯誤"zbz"
```typescript=
const boardRow = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"];

function alphabetBoardPath(target: string): string {
    const targetArr = target.split('');
    const targetLen = targetArr.length;
    let currentRow = 0;
    let currentCol = 0;
    let output = ''

    // 幾個字母
    for(let i=0; i<targetLen; i++){
        // row
        /*找rowNo*/
        const rowNo = boardRow.findIndex(x => x.includes(targetArr[i]));
        /*列印*/
        const rowGap = rowNo-currentRow;
        output += print(rowGap, 1);
        currentRow = currentRow+rowGap;
        // column
        /*找column*/
        const boardCol = boardRow[rowNo].split('');
        const colNo = boardCol.findIndex(x => x === targetArr[i]);
        /*列印*/
        const colGap = colNo-currentCol;
        output += print(colNo-currentCol, 3);
        currentCol = currentCol+colGap;
        
        output += '!';
    }
    
    return output;
};

// # count # dire 方向(橫U、D:1|直L、R:3)
function print(count: number, dire: number) {
    const moveWord = ['U', 'D', 'L', 'R'];
    let pri = '';
    while (count !== 0) {
        if (count > 0) {
            pri += moveWord[dire];
            count--;
        }else {
            pri += moveWord[dire-1];
            count++;
        }
    }
    return pri
}
```