※注意!原神の一部ネタバレを含みます。
やったこと
- 攻略wikiの暗号解読方法をそのままTypeScriptで実装
スクリプト
import * as fs from 'fs';
// ファイル読み込み
const cipherText = readFile('cipherText.txt');
const lineArray = cipherText.split('\r\n');
for (const line of lineArray) {
// 暗号文を3進数に変換
const ternaryText = mapToTernary(line);
const ternaryArray = ternaryText.split(' ');
// 3進数を10進数に変換
let numberArray: number[] = [];
for (const ternary of ternaryArray) {
if (parseInt(ternary, 3)) {
numberArray.push(parseInt(ternary, 3));
}
}
// 10進数を、13文字ずらしたアルファベットに変換
let alphabets: string = '';
for (const number of numberArray) {
if (96 + number + 13 <= 96 + 26) {
alphabets += String.fromCharCode(96 + number + 13);
} else {
alphabets += String.fromCharCode(96 + (96 + number + 13) % (96 + 26));
}
}
console.log(alphabets);
}
/**
* ファイルを読み込む
* @param inputFile 読み込むファイルのパス
* @return 読み込まれたファイル内のテキスト
*/
function readFile(inputFile: string) {
return fs.readFileSync(inputFile, 'utf8');
}
/**
* 暗号文を3進数に変換する
* @param cipherText 暗号文
* @return 変換後の3進数の配列
*/
function mapToTernary(cipherText: string): string {
const map = new Map<string, string>([
[".", "0"],
["-", " "],
["2", "1"],
["3", "2"],
]);
let ternaryText: string = '';
// 暗号文を1文字ずつ取り出し、mapに従って変換
for (var i = 0; i < cipherText.length; i++) {
if (map.get(cipherText.charAt(i))) {
ternaryText += map.get(cipherText.charAt(i));
} else {
// mapにない文字は変換しない
ternaryText += cipherText.charAt(i);
}
}
return ternaryText;
}
使い方
- cipherText.txtに暗号文を書いて、スクリプトと同じディレクトリに置く
3.2-..3-.23-.32-32.-3..- ..2-223-.32-322-..3-..2-
- スクリプトを実行すると解読結果が表示される
forthe nation
なんでやったの
- 仕事でTypeScript使うことになったので軽く予習するため
- スメールにいる遺跡守衛の暗号解読結果がwikiに未記載で、同じやり方で解読できそうと思ったけど手でやるのが面倒なため
↑普通に別のwikiにあって草。しかも解読方法全然違う