プルリクエストのリンク
ロジックの解説
まず点字のしくみのページを見ました。
http://www.naiiv.net/braille/?tenji-sikumi
1文字は6つの部分(マス)で構成されていて点を打つか打たないかで文字を表現します。
50音を表す際、大部分は母音と子音がそれぞれ3マスずつ使って組み合わせて表現しているようです。
ですので、母音と子音の点を打つ場所をテーブルとして持たせて変換する形としました。
できる限り、ページの説明通りにテーブルを作るようにして以下のようにしました。
TABLE = {
A: [1],
I: [1, 2],
U: [1, 4],
E: [1, 2, 4],
O: [2, 4],
K_: [6],
S_: [5, 6],
T_: [3, 5],
N_: [3],
H_: [3, 6],
M_: [3, 5, 6],
R_: [5],
YA: [3, 4],
YU: [3, 4, 6],
YO: [3, 4, 5],
WA: [3],
WO: [3, 5],
N: [3, 5, 6],
}
はじめ、子音も一文字で表そうとしましたが、「ん」とな行が区別できないので、子音は2文字目にアンダーバーをつけるようにしました。
説明ページの黒丸部分の番号を書いていくだけなので間違いは少ないはずです。
図の引用:全視情協:点字とは - 点字のしくみ
コードのアピールポイント
とにかく無駄のない最小限のコードで動作するようにしました。
以下が全コードです。
class TenjiMaker
# http://www.naiiv.net/braille/?tenji-sikumi
TABLE = {
A: [1],
I: [1, 2],
U: [1, 4],
E: [1, 2, 4],
O: [2, 4],
K_: [6],
S_: [5, 6],
T_: [3, 5],
N_: [3],
H_: [3, 6],
M_: [3, 5, 6],
R_: [5],
YA: [3, 4],
YU: [3, 4, 6],
YO: [3, 4, 5],
WA: [3],
WO: [3, 5],
N: [3, 5, 6],
}
def to_tenji text
lines = [[], [], []]
text.split(' ').each do |t|
@indexes = TABLE[t.to_sym] || TABLE[(t[0] + '_').to_sym] + TABLE[t[1].to_sym]
draw.each_with_index{|line, i| lines[i] << line }
end
lines.map{|line| line.join(' ') }.join("\n")
end
def draw
[
mark(1) + mark(4),
mark(2) + mark(5),
mark(3) + mark(6),
]
end
def mark index
@indexes.include?(index) ? 'o' : '-'
end
end
処理としては、まずテーブルにそのまま一致するものがあれば採用し、
なければ1文字目+アンダーバーで子音を取得、2文字目で母音を取得し結合したものを表示形式に成形しています。
頑張ったところ
テーブルの構造をシンプルにして簡単に作れる形にするまで何度か考えました。
苦労したところ
初めはクラス内の定数として実装しようとしましたが、
ruby特有の機能を多用する形になりそうだったので
最終的にシンプルにハッシュを使う形にしました。
工夫したところ
資料ページからできる限り直感的に
テーブルを定義できるようにしました。
自慢したいところ
コードの簡潔さ、点字の定義の作りやすさ
伊藤さんにメッセージ
通常のアドベントカレンダーとは一味違って楽しみながら記事を作成できました。
ありがとうございます。次回もあれば参加したいです。