在一行上输入一个长度
,由大写字母、数字和分号(
)构成的字符串
,代表输入的指令序列。保证字符串中至少存在一个
,且末尾一定为
。
在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。
A10;S20;W10;D30;X;A1A;B10A11;;A10;
10,-10
对于这个样例,我们模拟小人的移动过程:
第一个指令
是合法的,向左移动
个单位,到达
点;
第二个指令
是合法的,向下移动
个单位,到达
点;
第三个指令
是合法的,向上移动
个单位,到达
点;
第四个指令
是合法的,向右移动
个单位,到达
点;
第五个指令
不合法,跳过;
第六个指令
不合法,跳过;
第七个指令
不合法,跳过;
第八个指令
不合法,跳过;
第九个指令
是合法的,向左移动
个单位,到达
点。
ABC;AKL;DA1;D001;W023;A100;S00;
0,0
在这个样例中,全部指令均不合法,因此小人不移动。
A00;S01;W2;
0,1
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-15 更新题面,新增几组hack数据(暂未进行重测)。
2. 2024-12-16 更新题面。
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);
好奇怪。。为啥我自己的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)
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(','));
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());
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(','))
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(','))
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的也直接跳过,个人观点,不是最优,但逻辑最直白简单
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);
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)
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)
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}`)