Ruby가 점자 제조사의 프로그램 제작에 도전!Qiita Advent Calendar 2021〜


이 글에 대해
이 글은 이토 준일@jnchito의 8일째(12/8) 글이다.
자기소개 및 참가 이유
처음 뵙겠습니다. 저는 Qita Advent Calendar 2021 "Ruby 도전 프로그래밍 질문! - 개정판·체리본 발매 기념 -"라고 합니다.Qita에 기고한 것은 이번이 처음이다.
저는 2021년 4월부터 paru라는 온라인 프로그래밍 학교에서 루비를 비롯한 프로그래밍과 웹 엔지니어가 되는 지식과 기술을 배웠습니다.
루비와 만나 공부한 지 8개월이 지났다.
아직 초보자이지만 매일 학교 동료들과 윤독회에 참석하는 체리본과 멘토 이토 씨에게 지금까지 공부한 것에 대한 감사의 마음을 전하고 싶어 이번 기획에 지원하기로 결심했다.
추천 요청
※ 테스트 코드는 추가되지 않습니다.
점자 이해
점자에 대한 지식이 전혀 없기 때문에 먼저 점자의 구성과 구성을 열심히 공부했고, 반가명은 모음+자음의 조합을 통해 점자로 표시할 수 있다는 것을 많이 알게 됐다.
페르도브토 캠프

이번 프로그램에서 변환할 문자의 대상은
-사랑, 쓰기, (생략), 지원, 지장
'모음+자음'으로 지정됐지만, 일부 문자의 작법은 위의 모음+자음이 표현하는 원칙과 다르다.
바로 다음 다섯 가지'지원, 역시, 지장'이다.
전시정협: 점자는 - 점자의 구성
프로그래밍의 추진 방법
상술한 내용을 바탕으로 이번에는 문자열과 배열을 사용하면서 프로그래밍을 하기로 했다.
- 다음 숫자(인덱스)를 사용하여 점자의 "●"위치를 식별합니다.

- 그런 다음 다음 다음 그림과 같이 모음과 자음의 조합 원칙으로 표현할 수 있는 문자에 대해 ●의 숫자를 테이블에 정의합니다.

- 다른 테이블에서 숫자를 정의하려면 특수 5자가 필요합니다.

이렇게 텐지메이커반 맨 위에 테이블을 정의했다.
숫자의 배열을 나타내는 숫자가 점자의 '○' 이 되는 부분.
  NORMAL_LETTERS = {
    'A' => [0],
    'I' => [0, 2],
    'U' => [0, 1],
    'E' => [0, 1, 2],
    'O' => [1, 2],
    'K' => [5],
    'S' => [3, 5],
    'T' => [3, 4],
    'N' => [4],
    'H' => [4, 5],
    'M' => [3, 4, 5],
    'R' => [3]
  }.freeze

  SPECIAL_LETTERS = {
    'YA' => [1, 4],
    'YU' => [1, 4, 5],
    'YO' => [1, 3, 4],
    'WA' => [4],
    'NN' => [3, 4, 5]
  }.freeze
그럼 제가 만든 프로그램의 논리를 설명하겠습니다.
논리적 설명
주 논리
def to_tenji(text)
  text_array = text.split.map(&:chars)
  braille_array = convert(text_array).map do |element|
    @braille_letter = +'------'
    make_braille(element)
    @braille_letter.scan(/.{1,2}/)
  end
  braille_array.transpose.map { |two_degits| two_degits.join(' ') }.join("\n")
end
(차근차근 설명하다)
text_array = text.split.map(&:chars)
입력한 문자열을 문자와 모음, 자음으로 나누어 배열합니다.
(예)'A HI RU'[["A"], ["H", "I"], ["R", "U"]]
braille_array = convert(text_array).map do |element|
  @braille_letter = +'------'
  make_braille(element)
  @braille_letter.scan(/.{1,2}/)
end
  • convert와 같은private 방법을 사용하여 상기 자모의 배열을 디지털 정보로 변환한다.(방법의 해설은 다음 항목에 쓰여 있다.)
    (예)[["A"], ["H", "I"], ["R", "U"]][[0], [4, 5, 0, 2], [3, 0, 1]]
  • 배열에서 원소를 하나씩 꺼내 make_braille의privete 방법을 사용하여 기본 문자열'-----'의 상응하는 부분을'o'로 변환한다.(방법의 해설은 다음 항목에 쓰여 있다.)
    (예)[4, 5, 0, 2]"o-o-oo"

  • 문자열을 두 문자로 나누어 새 배열을 만듭니다.
    (예)"o-o-oo"["o-", "o-", "oo"]
  • 문자열을 분할한 후 배열을 만들기 위해scan 방법을 사용했습니다.정규 표현식.scan(/.{1,2}/)을 사용했지만 두 글자밖에 없었기 때문에.scan(/../)가 더 간단하다는 것을 알게 되었다.
  • 모든 입력 문자의 처리가 끝나면 이런 배열이 나타납니다.
    (예)[["o-", "--", "--"], ["o-", "o-", "oo"], ["oo", "-o", "--"]]
  • braille_array.transpose.map { |two_degits| two_degits.join(' ') }.join("\n")
    
  • 마지막으로 수조를 행렬로 보고 줄과 열transpose을 바꾸는 방법으로 빈칸과 줄 바꾸기 문자를 추가합니다.이렇게 완성!!
  • (出力結果)
    o- o- oo
    -- o- -o
    -- oo --
    
    방법2
    convert 메서드
    def convert(text_array)
      text_array.map do |first, second|
        second ||= first
        SPECIAL_LETTERS[first + second] || (NORMAL_LETTERS[first] | NORMAL_LETTERS[second])
      end
    end
    
    이 방법은 표를 인용하여 알파벳 배열을 디지털 정보로 변환한다.  
    (예)[["A"], ["H", "I"], ["R", "U"]][[0], [4, 5, 0, 2], [3, 0, 1]]우선 매개 변수를 배열한 요소를 자음first과 모음second에 대입한다.
    (Nil 보호)
    모음이나'N'second만 니엘이면 ||=의 니엘 보호first의 문자를 second에 넣는다.
    (단거리 평가와 배열의 집합)
    먼저 SPECIALLETTERS 테이블에서 "first + second"를 키로 특수한 5글자를 찾아서 이 값을 되돌려줍니다.
    SPECIAL_LETTERS에서 찾을 수 없는 경우 NORMALLETTERS 표에서 자음과 모음을 키로 값을 얻고, 그룹의 화집 | 으로 배열을 구성한다.
    make_brille 방법
    def make_braille(element)
      element.each do |number|
        @braille_letter[number] = 'o'
      end
    end
    
    이 방법은 숫자가 지정한 부분을 기본 문자열인 '-' 이 아니라 'o' 로 변환합니다.
    (예)[4, 5, 0, 2]→"----"의 4,5,0,2개→"o-o-oo" 전환
    if __FILE__ == $PROGRAM_NAME
      text = ARGV[0]
      puts TenjiMaker.new.to_tenji(text)
    end
    
    조건으로 지정되지 않았지만 명령을 입력한 로마자를 점자로 변환할 수 있도록 이 파일을 직접 실행할 수 있는 코드가 추가되었습니다.
    [実行例]
     ruby lib/tenji_maker.rb 'A HI RU'
    o- o- oo
    -- o- -o
    -- oo --
    
    점자 제조사 프로그램을 만든 소감
    나는 여기저기 앵두책을 다시 읽으며 즐겁게 완성했다.
    지금까지 전혀 익숙하지 않은 점자 구조를 알 수 있었던 것도 큰 소득이다.
    이렇게 좋은 경험을 하게 해 주셔서 감사합니다!
    저는 점자에 많은 관심을 가지게 되었습니다. 여러분들이 자신이 만든 프로그램을 자세히 읽고 자유 연구에서 앞으로 모든 문자에 대응할 수 있는 절차를 써 주시기 바랍니다.
    이토 씨에게 보내는 메시지
    앵두본 개정 제2판 출판을 축하합니다!
    앞으로 가장 사랑하는 책이 될 거예요!〜

    좋은 웹페이지 즐겨찾기