Rustでモールス信号を変換する

某CTFでモールス信号を変換する問題があったので, Rustで変換するプログラムを書いてみました。

0. 開発環境

OS:Windows10 Home
rustc -vV
・rustc 1.39.0 (4560ea788 2019-11-04)
・binary: rustc
・commit-hash: 4560ea788cb760f0a34127156c78e2552949f734
・commit-date: 2019-11-04
・host: x86_64-pc-windows-msvc
・release: 1.39.0
・LLVM version: 9.0

1. 仕様

・モールス信号からもとの文字列に変換するのみの機能(逆はない)
・「英字大文字」「数字」「.」「,」「:」「?」「「」「(」「)」「_」に変換可能
・変換不能な文字は「*」で表す
・短音は「.」, 長音は「-」で表す
・各信号の間には, 半角スペース1個を置く(例:「.- -… -.-.」)

2. ソースコード

use std::collections::HashMap;

fn getline() -> String {
    let mut __ret = String::new();
    std::io::stdin().read_line(&mut __ret).ok();
    return __ret;
}

fn morsecode_to_text(morsecode: &str) -> String {
    let mut morsecode_table = HashMap::new();
    morsecode_table.insert(".-", 'A');
    morsecode_table.insert("-...", 'B');
    morsecode_table.insert("-.-.", 'C');
    morsecode_table.insert("-..", 'D');
    morsecode_table.insert(".", 'E');
    morsecode_table.insert("..-.", 'F');
    morsecode_table.insert("--.", 'G');
    morsecode_table.insert("....", 'H');
    morsecode_table.insert("..", 'I');
    morsecode_table.insert(".---", 'J');
    morsecode_table.insert("-.-", 'K');
    morsecode_table.insert(".-..", 'L');
    morsecode_table.insert("--", 'M');
    morsecode_table.insert("-.", 'N');
    morsecode_table.insert("---", 'O');
    morsecode_table.insert(".--.", 'P');
    morsecode_table.insert("--.-", 'Q');
    morsecode_table.insert(".-.", 'R');
    morsecode_table.insert("...", 'S');
    morsecode_table.insert("-", 'T');
    morsecode_table.insert("..-", 'U');
    morsecode_table.insert("...-", 'V');
    morsecode_table.insert(".--", 'W');
    morsecode_table.insert("-..-", 'X');
    morsecode_table.insert("-.--", 'Y');
    morsecode_table.insert("--..", 'Z');
    morsecode_table.insert(".-.-.-", '.');
    morsecode_table.insert("--..--", ',');
    morsecode_table.insert("---...", ':');
    morsecode_table.insert("..--..", '?');
    morsecode_table.insert(".-.-..", '「');
    morsecode_table.insert("-.--.", '(');
    morsecode_table.insert("-.--.-", ')');
    morsecode_table.insert("..--.-", '_');
    morsecode_table.insert("-----", '0');
    morsecode_table.insert(".----", '1');
    morsecode_table.insert("..---", '2');
    morsecode_table.insert("...--", '3');
    morsecode_table.insert("....-", '4');
    morsecode_table.insert(".....", '5');
    morsecode_table.insert("-....", '6');
    morsecode_table.insert("--...", '7');
    morsecode_table.insert("---..", '8');
    morsecode_table.insert("----.", '9');

    let mut text = String::new();

    let morsecode_parts: Vec<_> = morsecode.split(" ").collect();

    for morsecode_part in morsecode_parts {
        let c = morsecode_table.get(morsecode_part);
        if c == None {
            text += "*";
        } else {
            text += &c.unwrap().to_string();
        }
    }
    text
}

fn main() {
    let line = getline();
    let morsecode = line.trim();
    let text = morsecode_to_text(morsecode);

    println!("{}", morsecode);
    println!("{}", text);
}

3. おわりに

morsecode_tableを変更すれば, ひらがななどにも対応できるのでモールス信号が出てきたら使用してみてください。
スポンサーリンク
レクタングル広告(大)
レクタングル広告(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする