裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

モールス符号

2014年12月27日 | ブログラミング

小学校5,6年のとき,担任の先生にモールス信号の覚え方を教わった。「イ」は「伊藤」,「ロ」は「路上歩行」,「ハ」は「ハーモニカ」など。それ以外は数字とSOSは覚えている。

灯火信号と言えば,まずはモールス信号だろう。

モールス信号の「ツー」を 1,「トン」を 0 として,1 文字を 1 文字列で表す。
モールス信号をカタカナの文字列に変換する関数 mk と,その逆関数 km を作る(簡単なんだけどね)。

実用にするには,モールス信号を感知して 0/1 文字列に直して,mk 関数に放り込んだり,カタカナ文字列を入力して,灯火信号を発するようなシステムを繋げばよいのだが。

# モールス符号(カタカナ,数字)
m = c(
"01", "0101", "1000", "1010", "100", "0", "00100",
"0010", "110", "0000", "10110", "0111",
"101", "0100", "11", "10", "111", "1110",
"0110", "1101", "010", "000", "1",
"001", "01001", "0011", "01000", "0001", "011", "1001",
"1011", "1100", "1111", "10111", "01011",
"11011", "10101", "10100", "10011", "10001", "00101", "11010",
"01100", "11001", "10010", "01110", "11101","01010",
"00", "00110", "01101", "010101", "010100",
"01111", "00111", "00011", "00001", "00000",
"10000", "11000", "11100", "11110", "11111")
# カタカナ,数字
k = c(
"イ", "ロ", "ハ", "ニ", "ホ", "ヘ", "ト",
"チ", "リ", "ヌ", "ル", "ヲ",
"ワ", "カ", "ヨ", "タ", "レ", "ソ",
"ツ", "ネ", "ナ", "ラ", "ム",
"ウ", "ヰ", "ノ", "オ", "ク", "ヤ", "マ",
"ケ", "フ", "コ", "エ", "テ",
"ア", "サ", "キ", "ユ", "メ", "ミ", "シ",
"ヱ", "ヒ", "モ", "セ", "ス", "ン",
"゛", "゜", "ー", "、", "。",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
# カタカナ,数字 → モールス符号
km = function(str) {
    m[sapply(unlist(strsplit(str, "")), grep, k)]
}
# モールス符号 → カタカナ,数字
mk = function(str) {
    paste(k[sapply(str, function(s) grep(sprintf("^%s$", s), m))], collapse="")
}
# 実行例
reibun = c("1111", "01010", "011", "0100", "111", "01101", "000", "01",
"11101", "11101", "0001", "00", "0100", "10111", "111")
mk(reibun)
km(mk(reibun))

> mk(reibun)
[1] "コンヤカレーライススク゛カエレ"
> km(mk(reibun))
 [1] "1111"  "01010" "011"   "0100"  "111"   "01101" "000"   "01"    "11101"
     "11101" "0001"  "00"    "0100"  "10111" "111"  

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 圧力が不正を生む? | トップ | 乱数の実装を問題にする? »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事