首页 > 试题广场 >

坐标移动

[编程题]坐标移动
  • 热度指数:563949 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。

下面是一个简单的例子 如:

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

处理过程:

起点(0,0)

+   A10   =  (-10,0)

+   S20   =  (-10,-20)

+   W10  =  (-10,-10)

+   D30  =  (20,-10)

+   x    =  无效

+   A1A   =  无效

+   B10A11   =  无效

+  一个空 不影响

+   A10  =  (10,-10)

结果 (10, -10)

数据范围:每组输入的字符串长度满足 ,坐标保证满足 ,且数字部分仅含正数

输入描述:

一行字符串



输出描述:

最终坐标,以逗号分隔

示例1

输入

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

输出

10,-10
示例2

输入

ABC;AKL;DA1;

输出

0,0
let str = readline().split(";");
let lastdata = [0, 0];
for (let j = 0; j < str.length; j++) {
  // 空字符串剔除
  if (str[j]) {
    let [one, two] = [(str[j].slice(0, 1)).toUpperCase(), str[j].slice(1)];
    // 第一个字符必须是A/S/W/D,第二个字符必须是纯数字,不能使用parseInt
    // parseInt('12e')会输出12,Number('12e')会输出NaN
    if (['A', 'S', 'W', 'D'].includes(one) && Number(two)) {
      if (one === "A") {
        lastdata[0] = lastdata[0] - Number(two);
      }
      if (one === "S") {
        lastdata[1] = lastdata[1] - Number(two);
      }
      if (one === "W") {
        lastdata[1] = lastdata[1] + Number(two);
      }
      if (one === "D") {
        lastdata[0] = lastdata[0] + Number(two);
      }
    }
  }
}
console.log(lastdata);

发表于 2022-08-31 11:24:10 回复(0)
function zuobiao(str){
    let arr=str.split(";")
    let x=0,y=0
    for(let i=0;i<arr.length;i++){
        let fx=arr[i].slice(0,1)
        let sz=arr[i].slice(1)
        if(!sz.match(/[^0-9]/g)){
            sz=parseInt(sz)
            if(fx==='A'){
                x=x-sz
            }else if(fx==='S'){
                y=y-sz
            }else if(fx==='D'){
                x=x+sz
            }else if(fx==='W'){
                y=y+sz
            }else{
                
            }
        } 
    }
    console.log([x,y].join(",")) 
}
let str=readline()
zuobiao(str)
发表于 2022-08-25 19:14:21 回复(0)

好奇怪。。为啥我自己的IDE运算的结果就是对的,在这个上面就不对。但是只要在中间添加一行console.log(temp1,temp2,reg.test(item))就又能神奇的显示正确答案了。。求解

let reg=/^(A|S|W|D)[0-9][0-9]/g
let str=readline().split(';')
let loc=new Array(2).fill(0)
str.forEach((item)=>{
    if(reg.test(item)){
        let temp1=item.substring(0,1)
        let temp2=parseInt(item.substring(1,3))
        if(temp1==='A'){
            loc[0]-=temp2
        }else if(temp1==='S'){
            loc[1]-=temp2
        }else if(temp1==='W'){
            loc[0]+=temp2
        }else{
            loc[1]+=temp2
        }
    }
})
console.log(loc)
发表于 2022-08-18 00:06:12 回复(0)
let coord = [0, 0];
let code = ["A", "W", "S", "D"];
let arr = readline().split(";");
let nArr = [];
let regNum = /^\d+$/;
for (let i = 0; i < arr.length; i++) {
  //删除不合规的移动
  if (code.indexOf(arr[i][0]) !== -1) {
    //如果第一个字母是方向键
    let box = arr[i].split("");
    let first = box.shift();
    if (regNum.test(Number(box.join("")))) {
      //如果剩下的是数字
      let lastNum = Number(box.join(""));
      if (first === "A") {
        coord[0] -= lastNum;
      }
      if (first === "D") {
        coord[0] += lastNum;
      }
      if (first === "W") {
        coord[1] += lastNum;
      }
      if (first === "S") {
        coord[1] -= lastNum;
      }
    }
  }
}
console.log(coord)
发表于 2022-07-22 15:01:18 回复(0)
let input = readline();
let arr = input.split(";");
let result = arr.reduce((pre,cur,index,arr)=>{
    let firstWord = cur.slice(0,1);
    let num = +cur.slice(1,3);
    if (isVaild(cur)) {
        firstWord === 'A' && (pre[0] -= num);
        firstWord === 'D' && (pre[0] += num);
        firstWord === 'W' && (pre[1] += num);
        firstWord === 'S' && (pre[1] -= num);
    }
    return pre;
}, [0,0]);

function isVaild(str) {
    return /^(A|W|S|D)+\d{1,2}$/.test(str);
}

print(result.join(','));

发表于 2022-07-14 08:06:01 回复(0)
被 `switch case` 坑苦了,match 出来的和列举的 case 不能 ===
function solution(str) {
  let arr1 = str.split(";");
  let reg1 = /^[W|A|S|D]\d+$/;
  let resultArr = [];
  arr1.forEach((item) => {
    if (item.match(reg1)) resultArr.push(item);
  });
  let reg2 = /[W|A|S|D]/;
  let reg3 = /\d+/;
  let x = 0;
  let y = 0;
  resultArr.forEach((item) => {
    let dir = item.match(reg2).toString();
    let step = Number(item.match(reg3));
    switch (dir) {
      case "W":
        y += step;
        break;
      case "A":
        x -= step;
        break;
      case "S":
        y -= step;
        break;
      case "D":
        x += step;
        break;
      default:
        break;
    }
  });
  console.log(`${x},${y}`);
}
solution(readline());


发表于 2022-07-11 22:54:19 回复(0)
var line = readline()
var steps = line.split(';')
var reg = /^([ADWS]{1})(\d{1,2})$/
var res = steps.reduce((res, step) => {
    if (reg.test(step)) {
        var d = RegExp.$1
        var n = +RegExp.$2
        if (d === 'A') {
            res[0] -= n
        } else if (d === 'D') {
            res[0] += n
        } else if (d === 'W') {
            res[1] += n
        } else if (d === 'S') {
            res[1] -= n
        }
    }
    return res
}, [0, 0])
print(res.join(','))

发表于 2022-07-08 21:16:42 回复(0)
const arr = readline().split(";")
let reg = /^[ASWD]\d{1,2}$/
let newArr = arr.filter(item=> reg.test(item))
let res = [0,0]
newArr.forEach(item=>{
    let moveP = item.slice(0,1)
    switch(moveP){
        case 'A':
            res[0] = res[0]-item.slice(1)*1
            break;
        case 'D':
            res[0] = res[0]+item.slice(1)*1
             break;
        case 'W':
            res[1] = res[1]+item.slice(1)*1
             break;
        case 'S':
            res[1] = res[1]-item.slice(1)*1
             break;
    }
})
console.log(res.join(','))

发表于 2022-07-04 10:40:33 回复(0)
var arr = readline().split(';');
var x = 0;
var y = 0;

arr.map((item,index) => {
    if(item){
        let pos = item.substring(0,1);
        let num = Number(item.substring(1));
        if (num > 0) {
            switch(pos){
                case 'A':
                    x = x - num;
                    break;
                case 'D':
                    x = x + num;
                    break;
                case 'W':
                    y = y + num;
                    break;
                case 'S':
                    y = y - num;
                    break;
                default:
                    break;
            }
        } 
        
    }
    if (index == (arr.length - 1)){
        console.log(x+','+y)
    }
     
})
PS:转化数组,map循环,空值直接跳过,Number可以判断是否是纯数字还可以使数据类型变成init型,不大于0的也直接跳过,个人观点,不是最优,但逻辑最直白简单
发表于 2022-06-29 15:53:51 回复(0)
let inputStr = readline().toUpperCase();
let arr = inputStr.split(";");
let res = arr.reduce(
  (acc, next) => {
    let direction = next[0];
    let str = next.slice(1);
    let num = parseInt(str);
    if (str != num) {
      return acc;
    }
    switch (direction) {
      case "A":
        acc.x -= num;
        break;
      case "D":
        acc.x += num;
        break;
      case "W":
        acc.y += num;
        break;
      case "S":
        acc.y -= num;
        break;
    }
    return acc;
  },
  { x: 0, y: 0 }
);
console.log(res.x + "," + res.y);

发表于 2022-06-28 19:20:44 回复(0)
let inputStr = readline();
let calcPoint = function (str) {
  let strArr = str.split(";"),
    x = 0,
    y = 0;
  for (let i = 0; i < strArr.length; i++) {
    let num = Number(strArr[i].slice(1, 3));
    if (!!num) {
      if (strArr[i][0] == "A") {
        x -= num;
      } else if (strArr[i][0] == "S") {
        y -= num;
      } else if (strArr[i][0] == "W") {
        y += num;
      } else if (strArr[i][0] == "D") {
        x += num;
      }
    }
  }
  return x + "," + y;
};

console.log(calcPoint(inputStr));
//先判断是不是数字,另一种思想,哈哈
发表于 2022-06-21 16:20:46 回复(0)
let s = readline();
s = s.split(";");
let reg = /^[ASDW][0-9]{1,2}$/;
let res = [0, 0];
for (i of s) {
  if (reg.test(i)) {
    let num = Number(i.substring(1));
    switch (i[0]) {
      case "A":
        res[0] = res[0] - num;
        break;
      case "D":
        res[0] = res[0] + num;
        break;
      case "W":
        res[1] = res[1] + num;
        break;
      case "S":
        res[1] = res[1] - num;
        break;
      default:
        res[0] = res[0] + 0;
        break;
    }
  }
}
console.log(res)

发表于 2022-06-08 16:46:40 回复(0)
优雅~
合理使用三元表达式能够让代码看起来简洁
let strArr = readline().split(';')
let reg = /^(A|W|S|D){1}[0-9]{1,2}$/
let arr = []

strArr.forEach(item => reg.test(item) ? arr.push(item) : '')

let x = 0, y = 0
arr.forEach(item => {
    let key = item[0]
    let value = parseInt(item.slice(1))
    x = key == 'A' ? x - value : x
    x = key == 'D' ? x + value : x
    y = key == 'W' ? y + value : y
    y = key == 'S' ? y - value : y
})

console.log(x + ',' + y)


发表于 2022-06-02 15:37:07 回复(0)
let input = readline();
let op_type = ['A','D','W','S']
let t_ops = input.split(';')
let ops = t_ops.filter(r => {
    return /^[A,D,S,W][1-9][0-9]*$/.test(r);
}) 
let xy = {
    'x': 0,
    'y': 0
}
for(r of ops) {
    let prefix = r.substring(0,1);
    let val = new Number(r.substring(1, r.length));
    if(prefix == 'A' || prefix == 'D') {
        xy.x = xy.x + (prefix == 'D' ? val : val * -1)
    }
    if(prefix == 'W' || prefix == 'S') {
        xy.y = xy.y + ( prefix == 'W' ? val : val * -1) 
    }
}
console.log(xy.x + ',' + xy.y)
/**
ops.forEach(r => {
    let prefix = r.subStr(0,1);
    let val = r.substr(1, r.length -1)
    console.log(prefix, val)
})
**/
发表于 2022-05-25 15:31:42 回复(0)
let a = readline().split(';');

let x = 0; let y = 0;
a.forEach(e => {
    if (!e) return;
    let fx = e.slice(0, 1);
    let nu = Number(e.slice(1));
    if (!['A', 'S', 'W', 'D'].includes(fx)) return;
    if (!nu) return;
    
    switch(fx) {
        case 'A':
            x -= nu;
            break;
        case 'D':
            x += nu;
            break;
        case 'S':
            y -= nu;
            break;
        case 'W':
            y += nu;
            break;
    }
})

console.log(`${x},${y}`)

发表于 2022-05-22 16:18:26 回复(0)

问题信息

难度:
36条回答 92826浏览

热门推荐

通过挑战的用户

查看代码