7-21 试试手气
原题:
我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:
- 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
- 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。
那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。
输入格式:
输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。
输出格式:
在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。
解题思路:
- 引入
readline
模块并创建接口对象:首先将readline
模块引入,并使用createInterface
方法创建一个接口对象rl
。该对象设置了输入流为标准输入。 - 读取输入并存储:通过监听
'line'
事件,将输入存储在数组buf
中。 - 解析输入并处理数字序列:将数组
buf
中的第一个元素(即索引为0的位置)赋值给变量arr
,将其根据空格分隔成字符串数组,再使用map
方法将每个字符串转换成数字。将数组buf
中的第二个元素赋值给变量n
,转换为整数类型。 - 初始化结果数组:将一个由六个6组成的数组赋值给变量
res
作为初始结果。 - 更新结果数组:遍历输入的数字序列
arr
,如果当前元素与对应位置的结果数组元素相等,则将结果数组对应位置的元素减1。 - 循环更新结果数组:使用两个嵌套的循环,外层循环从0到
n-1
,内层循环遍历结果数组,并将每个元素减1,然后检查结果数组对应位置的元素是否与输入数字序列对应位置的元素相等,如果相等,则将结果数组对应位置的元素减1。 - 构造输出字符串:使用一个变量
str
作为结果字符串的容器,遍历结果数组res
,将每个元素以空格分隔拼接到str
中。 - 输出结果:使用
console.log
输出去除首尾空格的结果字符串。
.
JavaScript(node)代码:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin
});
let buf = [];
rl.on('line', (input) => {
buf.push(input);
});
rl.on('close', () => {
let arr = buf[0].split(" ").map(Number)
let n = parseInt(buf[1])
const res = [6, 6, 6, 6, 6, 6]
for (let i = 0; i < arr.length; i++) {
if (arr[i] == res[i]) {
res[i]--
}
}
for (let i = 0; i < n - 1; i++) {
for (let j = 0; j < arr.length; j++) {
res[j]--
if (res[j] == arr[j]) {
res[j]--
}
}
}
let str = ""
for (let i of res) {
str += i + " "
}
console.log(str.trim());
});
.