, ,

HJ17 坐标移动

描述 我们定义一个无限大的二维网格上有一个小人,小人初始位置为 (0,0)(0,0) 点,…

描述

我们定义一个无限大的二维网格上有一个小人,小人初始位置为 (0,0)(0,0) 点,小人可以读取指令上下左右移动。一个合法的指令由三至四个符号组成:
∙第一个符号为 “A/D/W/S”“A/D/W/S” 中的一个,代表小人移动的方向;分别代表向左、向右、向上、向下移动;记某个时刻小人的坐标为 (x,y)(x,y),向左移动一格即抵达 (x1,y)(x−1,y)、向右移动一格即抵达 (x+1,y)(x+1,y)、向上移动一格即抵达 (x,y+1)(x,y+1)、向下移动一格即抵达 (x,y1)(x,y−1)。
∙最后一个符号为 ‘;’‘;’,代表指令的结束,该符号固定存在;
∙中间为一个大于 00 且小于 100100 的数字,代表小人移动的距离。特别地,如果这个数字小于 1010,那么它可能包含一个前导零,此时也视为合法。

如果你遇到了一个不合法的指令,则直接忽略;例如,指令 “A100;”“A100;” 是不合法的,因为 100100 超出了规定的数字范围;“Y10;”“Y10;” 也是不合法的,因为 YY 不是 “A/D/W/S”“A/D/W/S” 中的一个。
输出小人最终的坐标。

输入描述:

在一行上输入一个长度 1length(s)1041≦length(s)≦104,由大写字母、数字和分号(‘;’‘;’)构成的字符串 ss,代表输入的指令序列。保证字符串中至少存在一个 ‘;’‘;’,且末尾一定为 ‘;’‘;’。

输出描述:

在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。

示例1

输入:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出:

10,-10

说明:

对于这个样例,我们模拟小人的移动过程:
∙第一个指令 "A10;""A10;" 是合法的,向左移动 1010 个单位,到达 (10,0)(−10,0) 点;
∙第二个指令 "S20;""S20;" 是合法的,向下移动 2020 个单位,到达 (10,20)(−10,−20) 点;
∙第三个指令 "W10;""W10;" 是合法的,向上移动 1010 个单位,到达 (10,10)(−10,−10) 点;
∙第四个指令 "D30;""D30;" 是合法的,向右移动 3030 个单位,到达 (20,10)(20,−10) 点;
∙第五个指令 "X;""X;" 不合法,跳过;
∙第六个指令 "A1A;""A1A;" 不合法,跳过;
∙第七个指令 "B10A11;""B10A11;" 不合法,跳过;
∙第八个指令 ";"";" 不合法,跳过;
∙第九个指令 "A10;""A10;" 是合法的,向左移动 1010 个单位,到达 (10,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)
}()

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor