TimeTableMaker

TagyL·2021년 3월 29일
2

조합가능한 모든 시간표를 내뱉어줍니다.

만든지도 오래되고 코드자체도 난해해서 잘 기억은 안나지만 잘 동작합니다.

# author Young
# sets_maker.py
# set_trial_3
"""
set_trial.py 의 결과와 동일함
sequence 알아낼 방법 찾기 ==>> 해결함
sequence 알아내는 과정에서 함수기능 지저분해짐 통일시키는 방법찾기 ==>> 해결함
"""
from sets_to_tables.tables_maker import Sort


class SetMaker(Sort):
    def __init__(self):
        super().__init__()

    def matcher_excute(self, input_list, name_list):
        """
        :param input_list: 2차원 리스트 속의 1차원 셋 총 3차원
        :param name_list: 버튼 리스트
        :return:
        """
        # 수업 이름들 변환
        for n in name_list:
            if n.text():
                self.name_list.append(n.text())
        for n in name_list:
            self.name_list += (n,)
        for i in input_list:
            if i:
                self.input_matcher(i)

        for j, seq in enumerate(self.class_seq):
            self.name_time.append([])
            for num, v in enumerate(seq):
                for ele in input_list[num][v]:
                    self.name_time[j].append(f"{num}_{ele}")

        for one_table_set in self.name_time:
            self.time_sorted_list.append(self.sort_with_time(one_table_set))  # 리스트에 각시간별로 분류해 정리
        for i in self.time_sorted_list:  # 시간별로 정리된 시간표를 출력
            self.table(i)

    def input_matcher(self, input):
        if not self.class_set:      # input = first 일때 만 동작
            for l, set_1 in enumerate(input):
                self.class_set.append(set_1)
                self.class_seq.append([l])
            return
        # set_temp 에 self.class_set 옮기고 self.class_set 은 초기화
        set_temp = self.class_set
        # seq_temp 에 self.class_seq 옮기고 self.class_seq 은 초기화
        seq_temp = self.class_seq
        self.reset()     # self.class_set, self.class_seq 초기화
        for m, temp_set in enumerate(set_temp):
            for k, input_set in enumerate(input):
                if temp_set.isdisjoint(input_set):
                    # SET
                    unioned_set = temp_set.union(input_set)
                    self.class_set.append(unioned_set)
                    added_seq = seq_temp[m] + [k]
                    self.class_seq.append(added_seq)


if __name__ == '__main__':
    pass
# tables_maker.py
# 상속에대한 위계를 반대로 부여했으면 더 좋았을듯...

class Sort:

    """
    set_trial 에서 출력한 data 를 table 에 올려줌
    """
    def __init__(self):
        # lines 리스트 내부의 리스트 갯수: 첫째줄 + N교시 = 10
        # 10 교시 위해 한줄 더 추가하기
        self.lines = []
        self.show = ""
        self.time_sorted_list = []
        self.show_list = []
        self.class_seq = []
        self.class_set = []
        self.time_sorted_list = []
        self.name_time = []
        self.input_list = []
        self.name_list = []

    def reset(self):
        self.class_seq = []
        self.class_set = []

    def sort_with_time(self, set_1):
        """
        :param set_1:
        :return:
        """
        list_time = []
        for j in range(10):
            list_time.append([])

        for i in set_1:
            if int(i[2:]) % 10 == 0:
                list_time[0].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 1:
                list_time[1].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 2:
                list_time[2].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 3:
                list_time[3].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 4:
                list_time[4].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 5:
                list_time[5].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 6:
                list_time[6].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 7:
                list_time[7].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 8:
                list_time[8].append(i)
        for i in set_1:
            if int(i[2:]) % 10 == 9:
                list_time[9].append(i)
        return list_time

    def table(self, set_3):
        """
                2차원 리스트의 수업시간표를 받아서 테이블을 만들어줌.
                :param set_3: 하나의 시간표 (2차원 리스트)
                :return: ...
                """
        # 한글 시간표 출력
        if ord('가') <= ord(self.name_list[0][0]) <= ord('힣'):
            dash = "{0:^12}".format('-')
            first_line = "     {0:^12}{1:^12}{2:^12}{3:^12}{4:^12}".format('mon', 'tue', 'wed', 'thu', 'fri')
            self.lines.append(str(first_line))
            for j in range(10):
                a, b, c, d, e = dash, dash, dash, dash, dash
                for i in set_3[j]:
                    name = self.name_list[int(i[0])][:5]
                    length = len(name)
                    space = name.count(' ')
                    x = 12 - length + space
                    if int(i[2:]) // 10 == 0:
                        a = f"{name}"
                    if int(i[2:]) // 10 == 1:
                        b = f"{name}"
                    if int(i[2:]) // 10 == 2:
                        c = f"{name}"
                    if int(i[2:]) // 10 == 3:
                        d = f"{name}"
                    if int(i[2:]) // 10 == 4:
                        e = f"{name}"
                class_line = "({0:^3}){1}{2}{3}{4}{5}".format(j + 1, a.center(x),
                                                              b.center(x), c.center(x), d.center(x), e.center(x))
                self.lines.append(str(class_line))
            for i in range(11):
                self.show += str(self.lines[i]) + '\n'
        # 영어시간표 출력
        elif ord('a') <= ord(self.name_list[0][0].lower()) <= ord('z'):
            dash = "{0:^11}".format('-')
            first_line = "     {0:^11}{1:^11}{2:^11}{3:^11}{4:^11}".format('mon', 'tue', 'wed', 'thu', 'fri')
            self.lines.append(str(first_line))
            for j in range(10):
                a, b, c, d, e = dash, dash, dash, dash, dash
                for i in set_3[j]:
                    name = self.name_list[int(i[0])][:9]
                    if int(i[2:]) // 10 == 0:
                        a = f"{name}"
                    if int(i[2:]) // 10 == 1:
                        b = f"{name}"
                    if int(i[2:]) // 10 == 2:
                        c = f"{name}"
                    if int(i[2:]) // 10 == 3:
                        d = f"{name}"
                    if int(i[2:]) // 10 == 4:
                        e = f"{name}"
                class_line = "({0:^3}){1:^11}{2:^11}{3:^11}{4:^11}{5:^11}".format(j + 1, a, b, c, d, e)
                self.lines.append(str(class_line))
            for i in range(11):
                self.show += str(self.lines[i]) + '\n'

        show = ""
        for i in range(10):
            show += str(self.lines[i]) + '\n'
        self.show_list.append(show)     #


if __name__ == '__main__':
    pass

전체 코드 및 다운로드는 여기서
https://github.com/ltyiz07/project_timetable

profile
개발자

0개의 댓글