Ruby가 점자 제조사의 프로그램 제작에 도전!Qiita Advent Calendar 2021〜
14993 단어 AdventCalendar앵두나무 뿌리Ruby
이 글에 대해
이 글은 이토 준일@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(/.{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 --
방법2convert 메서드
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판 출판을 축하합니다!
앞으로 가장 사랑하는 책이 될 거예요!〜
Reference
이 문제에 관하여(Ruby가 점자 제조사의 프로그램 제작에 도전!Qiita Advent Calendar 2021〜), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Paru871/items/6157937a80c2deb81e2c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)