描述
我们定义一个无限大的二维网格上有一个小人,小人初始位置为 (0,0) 点,小人可以读取指令上下左右移动。一个合法的指令由三至四个符号组成:
∙第一个符号为 “A/D/W/S” 中的一个,代表小人移动的方向;分别代表向左、向右、向上、向下移动;记某个时刻小人的坐标为 (x,y),向左移动一格即抵达 (x−1,y)、向右移动一格即抵达 (x+1,y)、向上移动一格即抵达 (x,y+1)、向下移动一格即抵达 (x,y−1)。
∙最后一个符号为 ‘;’,代表指令的结束,该符号固定存在;
∙中间为一个大于 0 且小于 100 的数字,代表小人移动的距离。特别地,如果这个数字小于 10,那么它可能包含一个前导零,此时也视为合法。
如果你遇到了一个不合法的指令,则直接忽略;例如,指令 “A100;” 是不合法的,因为 100 超出了规定的数字范围;“Y10;” 也是不合法的,因为 Y 不是 “A/D/W/S” 中的一个。
输出小人最终的坐标。
输入描述:
在一行上输入一个长度 1≦length(s)≦104,由大写字母、数字和分号(‘;’)构成的字符串 s,代表输入的指令序列。保证字符串中至少存在一个 ‘;’,且末尾一定为 ‘;’。
输出描述:
在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。
示例1
输入:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
输出:
10,-10
说明:
对于这个样例,我们模拟小人的移动过程:
∙第一个指令 "A10;" 是合法的,向左移动 10 个单位,到达 (−10,0) 点;
∙第二个指令 "S20;" 是合法的,向下移动 20 个单位,到达 (−10,−20) 点;
∙第三个指令 "W10;" 是合法的,向上移动 10 个单位,到达 (−10,−10) 点;
∙第四个指令 "D30;" 是合法的,向右移动 30 个单位,到达 (20,−10) 点;
∙第五个指令 "X;" 不合法,跳过;
∙第六个指令 "A1A;" 不合法,跳过;
∙第七个指令 "B10A11;" 不合法,跳过;
∙第八个指令 ";" 不合法,跳过;
∙第九个指令 "A10;" 是合法的,向左移动 10 个单位,到达 (10,−10) 点。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
const cmdList = ['A','D','W','S'];
let x = 0;
let y = 0;
while(line = await readline()){
let tokens = line.split(';');
for(let i=0;i<tokens.length;i++){
let temp = tokens[i];
if(temp){
const pre = temp.substring(0, 1);
const left = temp.substring(1);
//console.log(pre);
//console.log(left);
if(!cmdList.includes(pre) || !/^\d+$/.test(left)){
continue;
}
// if(left <=0 || left >=100){
// continue;
// }
if(left <=0 || left.length > 2 ){
continue;
}
switch(pre){
case 'A':
x -= parseInt(left);
break;
case 'D':
x += parseInt(left);
break;
case 'W':
y += parseInt(left);
break;
case 'S':
y -= parseInt(left);
break;
}
}
}
}
console.log(x+","+y)
}()




