4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

プルリクエストのリンク

ロジックの解説

まず点字のしくみのページを見ました。
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文字目にアンダーバーをつけるようにしました。

説明ページの黒丸部分の番号を書いていくだけなので間違いは少ないはずです。

image.png

図の引用:全視情協:点字とは - 点字のしくみ

コードのアピールポイント

とにかく無駄のない最小限のコードで動作するようにしました。
以下が全コードです。

tenji_maker.rb
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特有の機能を多用する形になりそうだったので
最終的にシンプルにハッシュを使う形にしました。

工夫したところ

資料ページからできる限り直感的に
テーブルを定義できるようにしました。

自慢したいところ

コードの簡潔さ、点字の定義の作りやすさ

伊藤さんにメッセージ

通常のアドベントカレンダーとは一味違って楽しみながら記事を作成できました。
ありがとうございます。次回もあれば参加したいです。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?