7-21 運試し
原題:
サイコロには 6 つの面があり、それぞれの面に 1 ~ 6 つの点が刻まれていることがわかります。以下は 6 つのサイコロの初期状態、つまり上向きの点を示しており、サイコロを掴んで振って別の結果を生み出すことができます。サイコロを非常に上手に振って、それぞれの目の出目が次の 2 つの条件を満たしたとします。
- 1. 各サイコロで出た数字は、前に出た数字とは異なります。
- 2. 条件 1 が満たされるという前提の下で、各サイコロは毎回最大の得点を獲得できます。
そうすれば、 n回目に得られる結果を予測できるはずです(1≤ n ≤5)。
入力形式:
入力の最初の行は、6 つのサイコロの初期数、つまり [1,6] の間の整数を与え、数字はスペースで区切られます。2 行目は、出目の数 n (1≤ n ≤5)を与えます。
出力フォーマット:
n回目に振られた各サイコロの点を順番に行にリストします。数字は 1 つのスペースで区切る必要があり、行の先頭に余分なスペースがあってはなりません。
問題解決のアイデア:
- モジュールをインポートし
readline
てインターフェイス オブジェクトを作成します。まずreadline
モジュールを導入し、createInterface
メソッドを使用してインターフェイス オブジェクトを作成しますrl
。このオブジェクトは、入力ストリームを標準入力に設定します。 - 入力を読み取り、保存する:
'line'
イベントをリッスンすることにより、入力は配列に保存されますbuf
。 - 入力を解析して一連の数値を処理します。
buf
配列の最初の要素 (つまり、インデックス 0 の位置) を変数に割り当てarr
、それをスペースに基づいて文字列の配列に分割し、map
メソッドを使用してそれぞれを変換します。文字列を数値に変換します。配列buf
の 2 番目の要素を変数に代入しn
、整数型に変換します。 - 結果の配列を初期化します。6 つの 6 の配列を
res
初期結果として変数に割り当てます。 - 結果配列を更新します: 入力された数値シーケンスを走査します
arr
。現在の要素が、対応する位置にある結果配列の要素と等しい場合は、結果配列の対応する位置にある要素を 1 だけデクリメントします。 - 結果配列を更新するループ: 2 つのネストされたループを使用します。外側のループは 0 から に進み
n-1
、内側のループは結果配列を走査して各要素を 1 ずつ減分し、結果配列の対応する位置にある要素が に対応するかどうかを確認します。入力された数値シーケンス。の要素は等しい。それらが等しい場合、結果の配列の対応する位置の要素が 1 ずつ減分される。 str
出力文字列を構築します。結果文字列のコンテナとして変数を使用し、結果配列を走査しres
、スペースで区切られた各要素を連結しますstr
。- 出力結果:
console.log
先頭と末尾のスペースを削除した結果文字列を出力するために使用します。
。
JavaScript (ノード) コード:
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());
});
。