
謎解き: 謎の暗号を解読せよ
シナリオ
古代の呪文書には、特定のルールに基づいた暗号が記されています。以下の関数 decodeMessage を完成させて、指定された暗号文字列を解読してください。問題
- 入力は1つの文字列 message と、数列 key です。
- messageの文字は、対応するkeyの値に基づいて変換されます。 ルール: - 英字の場合: アルファベット順を基に、key の値分シフトする(ループする)。 例: key が 1 の場合 : 'a' → 'b'、key が 2 の場合'z' → 'b'。 - 数字の場合: key の値分加算し、結果を文字列に置き換える。 例: '4' → '7'(key が 3 の場合)。 その他の文字はそのまま。
- key の要素数が message より少ない場合、key を繰り返して適用する。
- messageと、keyの値は、毎回変更されてしまいます。
入力例
const message = "hello-world-123"
const key = 3
出力例
decodeMessage(message, key) の結果は次の文字列になります。"khoor-zruog-456"
解答プログラミングを打ち込む
※ decodeMessage関数を仕上げてください。ヒント
アルファベットのループ処理には、String.fromCharCode と charCodeAt を使用すると便利です。 key を繰り返すには、モジュロ演算(%)を活用してください。この問題で学べるポイント
- 文字列操作(正規表現の活用)
- ASCIIコードを使ったアルファベットのループ処理
- 配列のインデックス操作(モジュロ演算)
- 条件分岐と各種データ型の操作
解答サンプル
回答
function decodeMessage(message, key) {
const result = []
for(let i=0; i<message.length; i++){
const char = message[i]
if(/[a-z]/.test(char)){
const code = ((char.charCodeAt() - 97 + key) % 26) + 97
result.push(String.fromCharCode(code))
continue
}
if(/[A-Z]/.test(char)){
const code = ((char.charCodeAt() - 65 + key) % 26) + 65
result.push(String.fromCharCode(code))
continue
}
if(/[0-9]/.test(char)){
const code = ((char.charCodeAt() - 48 + key) % 10) + 48
result.push(String.fromCharCode(code))
continue
}
result.push(char)
}
return result.join("")
}
解説
mesageで与えられた文字を1文字ずつコード変換して、それをスライド処理、ループ処理するようにプログラムが書けるかがポイント。 部分的な処理は以下の通り。 - 文字列を数値(文字コード)に変換する方法 "文字列".charCodeAt() : 1文字ずつ処理する - 文字列の種別を判定 : 正規表現を使って真偽判定する /[a-z]/.test(文字列)
0 件のコメント:
コメントを投稿