인공지능 공부/남박사의 파이썬 실전

(인프런) 07. 파이썬 실전 스마트 타자연습기 만들기

import os
import random
import time
os.system("cls")

'''
한글 = ((초성*21) + 중성) *28 +종성 +44032
이렇게하면 아스키 코드값에 들어가면 한글이 나옴

반대로 초성을 구하려면
((x-44032)/28) / 21

중성
((x-44032)/28) % 21

종성
((x-44032)%28
'''
CHO = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ", "ㅁ","ㅂ","ㅃ","ㅅ",
        "ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
JUNG = ["ㅏ", "ㅐ", "ㅏ", "ㅒ","ㅓ", "ㅔ", "ㅕ","ㅖ", "ㅗ", 
        "ㅘ", "ㅙ", "ㅚ","ㅛ", "ㅜ", "ㅝ", "ㅞ","ㅟ","ㅠ",
        "ㅡ", "ㅢ", "ㅣ"]
JONG = ["", "ㄱ", "ㄲ", "ㄳ", "ㄴ","ㄵ","ㄶ", "ㄷ","ㄹ","ㄺ",
        "ㄻ", "ㄼ", "ㄽ", "ㄾ", 
        "ㄿ", "ㅀ", "ㅁ","ㅂ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅊ",
        "ㅋ","ㅌ","ㅍ","ㅎ"]

def break_korean(string):

        word_list = list(user_input)
        break_word = []
        for k in word_list:
                if ord(k) >= ord("가") and ord(k) <= ord("힝"):
                        #유니코드상 몇번쨰 글자인지 인덱스를 구합니다.
                        char_index = ord(k) - ord('가') ##44032임
                        
                        #초성 = ((문자코드 -44032)/28)/21
                        char1 = int((char_index/28)/21)
                        break_word.append(CHO[char1])

                        #중성 = (인덱스/28) %21
                        char2 = int((char_index/28)%21)
                        break_word.append(JUNG[char2])

                        #종성 = (인덱스%28)
                        char3 = int(char_index%28)

                if char3>0:
                        break_word.append(JONG[char3])
                        
                else:
                        break_word.append(k)
        return break_word     

WORD_LIST = [
    "남박사의 파이썬 100% 실전 프로그래밍 강좌",
    "파이썬에서는 ord() 함수는 문자의 유니코드 값을 알아오는 함수로 10진수 값을 리턴합니다.",
    "chr(x)는 유니코드 10진수 값을 입력하면 해당하는 문자를 리턴합니다.",
    "UTF-8은 유니코드를 8비트 기반으로 저장하는 인코딩 방식입니다",
    "CP949는 윈도우에서 사용하기 위해 EUC-KR 확장해서 만든 문자셋 입니다.",
    "파이썬은 코드가 짧고 유연하여 가독성과 생산성이 좋은 프로그래밍 언어 입니다.",
    "코딩하세요 코딩~",
    "독도는 우리땅"
]
random.shuffle(WORD_LIST)

for q in WORD_LIST:
    start_time = time.time()
    user_input = str(input(q + '\n')).strip()
    end_time = time.time() - start_time

    src = break_korean(q)
    tar = break_korean(user_input)
    if user_input == "/exit":
        break
    correct =0

    for i,c in enumerate(tar):
        if i>=len(src):
            break
        if c == src[i]:
            correct +=1
    total_len = len(src)
    c = correct/total_len*100
    e = (total_len - correct)/total_len*100
    speed = (correct/end_time) *60

    print("속도 : {:0.2f} 정확도 : {:0.2f} 오타율 : {:0.2f}".format(speed, c,e))