File size: 7,121 Bytes
0f8e312
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import gradio as gr
import numpy as np

# MBTI 질문 리슀트 (50λ¬Έν•­)
questions = [
    # E vs I (13λ¬Έν•­)
    "1. λ‚˜λŠ” μƒˆλ‘œμš΄ μ‚¬λžŒλ“€κ³Ό λ§Œλ‚˜λŠ” 것을 즐긴닀.",
    "2. 혼자만의 μ‹œκ°„μ„ 더 μ„ ν˜Έν•œλ‹€.",
    "3. λŒ€ν™”λ₯Ό λ¨Όμ € μ‹œμž‘ν•˜λŠ” νŽΈμ΄λ‹€.",
    "4. λ§Žμ€ μ‚¬λžŒλ“€κ³Ό μ–΄μšΈλ¦¬λ©΄ μ—λ„ˆμ§€κ°€ μ†Œμ§„λœλ‹€.",
    "5. νŒŒν‹°λ‚˜ λͺ¨μž„μ—μ„œ μƒˆλ‘œμš΄ μ‚¬λžŒλ“€κ³Ό λŒ€ν™”ν•˜κΈ°λ₯Ό μ’‹μ•„ν•œλ‹€.",
    "6. μ‘°μš©ν•œ ν™˜κ²½μ—μ„œ 혼자 μΌν•˜λŠ” 것이 νŽΈν•˜λ‹€.",
    "7. κ·Έλ£Ή ν™œλ™μ΄λ‚˜ νŒ€ ν”„λ‘œμ νŠΈλ₯Ό μ„ ν˜Έν•œλ‹€.",
    "8. μ‚¬νšŒμ  λͺ¨μž„ ν›„μ—λŠ” 혼자만의 μ‹œκ°„μ΄ ν•„μš”ν•˜λ‹€.",
    "9. λ§Žμ€ μ‚¬λžŒλ“€ μ•žμ—μ„œ λ°œν‘œν•˜λŠ” 것이 즐겁닀.",
    "10. μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ μžˆμ„ λ•Œ κ°€μž₯ νŽΈμ•ˆν•˜λ‹€.",
    "11. μƒˆλ‘œμš΄ ν™˜κ²½μ— μ μ‘ν•˜λŠ” 것이 어렡지 μ•Šλ‹€.",
    "12. ν˜Όμžμ„œ μ—¬ν–‰ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "13. λͺ¨μž„μ—μ„œ 쀑심이 λ˜λŠ” 것이 μžμ—°μŠ€λŸ½λ‹€.",
    
    # S vs N (13λ¬Έν•­)
    "14. μ‹€μ œμ μ΄κ³  ꡬ체적인 것을 μ„ ν˜Έν•œλ‹€.",
    "15. μƒμƒν•˜κ³  μƒˆλ‘œμš΄ 아이디어λ₯Ό μƒκ°ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "16. 세뢀사항에 주의λ₯Ό κΈ°μšΈμΈλ‹€.",
    "17. 큰 그림을 λ³΄λŠ” 것을 μ„ ν˜Έν•œλ‹€.",
    "18. ν˜„μž¬μ— μ§‘μ€‘ν•˜λŠ” νŽΈμ΄λ‹€.",
    "19. 미래의 κ°€λŠ₯성을 μƒμƒν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "20. μ‹€μš©μ μ΄κ³  ν˜„μ‹€μ μΈ 해결책을 μ°ΎλŠ”λ‹€.",
    "21. μƒˆλ‘­κ³  ν˜μ‹ μ μΈ 방법을 μ‹œλ„ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "22. κ²½ν—˜μ— κΈ°λ°˜ν•œ νŒλ‹¨μ„ μ„ ν˜Έν•œλ‹€.",
    "23. 직관적인 λŠλ‚Œμ„ μ€‘μš”ν•˜κ²Œ μ—¬κΈ΄λ‹€.",
    "24. ꡬ체적인 사싀과 데이터λ₯Ό μ€‘μ‹œν•œλ‹€.",
    "25. 좔상적인 κ°œλ…μ„ νƒκ΅¬ν•˜λŠ” 것이 즐겁닀.",
    "26. 전톡적이고 κ²€μ¦λœ 방식을 μ„ ν˜Έν•œλ‹€.",
    
    # T vs F (12λ¬Έν•­)
    "27. 결정을 내릴 λ•Œ λ…Όλ¦¬μ μœΌλ‘œ λΆ„μ„ν•œλ‹€.",
    "28. λ‹€λ₯Έ μ‚¬λžŒμ˜ 감정을 잘 κ³ λ €ν•œλ‹€.",
    "29. 객관적인 사싀을 μ€‘μš”ν•˜κ²Œ μƒκ°ν•œλ‹€.",
    "30. 직감과 감정을 λ”°λ₯΄λŠ” νŽΈμ΄λ‹€.",
    "31. 감정보닀 이성을 더 μ€‘μš”ν•˜κ²Œ μ—¬κΈ΄λ‹€.",
    "32. λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 감정 μƒνƒœμ— λ―Όκ°ν•˜λ‹€.",
    "33. 논리적 일관성을 μ€‘μš”ν•˜κ²Œ μƒκ°ν•œλ‹€.",
    "34. 곡감λŠ₯λ ₯이 λ›°μ–΄λ‚œ νŽΈμ΄λ‹€.",
    "35. 감정적 결정을 λ‚΄λ¦¬λŠ” 것을 ν”Όν•œλ‹€.",
    "36. λ‹€λ₯Έ μ‚¬λžŒμ˜ μž…μž₯μ—μ„œ μƒκ°ν•˜λ € λ…Έλ ₯ν•œλ‹€.",
    "37. 객관적 뢄석을 톡해 결둠을 λ„μΆœν•œλ‹€.",
    "38. μ‚¬λžŒλ“€ κ°„μ˜ μ‘°ν™”λ₯Ό μ€‘μš”ν•˜κ²Œ μƒκ°ν•œλ‹€.",
    
    # J vs P (12λ¬Έν•­)
    "39. κ³„νšμ„ μ„Έμš°κ³  κ·ΈλŒ€λ‘œ μ‹€ν–‰ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "40. μœ΅ν†΅μ„± 있게 상황에 λŒ€μ²˜ν•˜λŠ” 것을 μ„ ν˜Έν•œλ‹€.",
    "41. λ§ˆκ°κΈ°ν•œμ„ μ •ν™•νžˆ μ§€ν‚€λŠ” νŽΈμ΄λ‹€.",
    "42. 일정을 미리 μ •ν•˜κΈ°λ³΄λ‹€ 즉ν₯적으둜 ν–‰λ™ν•œλ‹€.",
    "43. μ²΄κ³„μ μœΌλ‘œ 일을 μ²˜λ¦¬ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€.",
    "44. 상황에 따라 κ³„νšμ„ λ³€κ²½ν•˜λŠ” 것이 μžμ—°μŠ€λŸ½λ‹€.",
    "45. ν•  일을 미리 κ³„νšν•˜κ³  μ€€λΉ„ν•œλ‹€.",
    "46. μƒˆλ‘œμš΄ κ°€λŠ₯성을 μœ„ν•΄ μ—΄λ €μžˆλŠ” 것이 μ’‹λ‹€.",
    "47. 정해진 κ·œμΉ™κ³Ό 절차λ₯Ό 잘 λ”°λ₯Έλ‹€.",
    "48. κΈ‰μž‘μŠ€λŸ¬μš΄ 변화에도 잘 μ μ‘ν•œλ‹€.",
    "49. 일의 μ™„λ£Œλ₯Ό μ€‘μš”ν•˜κ²Œ μƒκ°ν•œλ‹€.",
    "50. μ—¬λŸ¬ 선택지λ₯Ό 였래 μ—΄μ–΄λ‘λŠ” 것을 μ„ ν˜Έν•œλ‹€."
]

def calculate_mbti(scores):
    try:
        # 점수λ₯Ό float둜 λ³€ν™˜ν•˜κ³  μœ νš¨μ„± 검사
        scores = [float(score) if score is not None else 3.0 for score in scores]
        if not all(1 <= score <= 5 for score in scores):
            return "였λ₯˜: λͺ¨λ“  μ μˆ˜λŠ” 1μ—μ„œ 5 사이여야 ν•©λ‹ˆλ‹€."
            
        # 역채점이 ν•„μš”ν•œ λ¬Έν•­ 처리
        reverse_questions = [2, 4, 6, 8, 12, 15, 17, 19, 21, 23, 25, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]
        for i in reverse_questions:
            scores[i-1] = 6 - scores[i-1]
        
        # 점수 계산
        E = sum(scores[0:13])    # 13λ¬Έν•­
        S = sum(scores[13:26])   # 13λ¬Έν•­
        T = sum(scores[26:38])   # 12λ¬Έν•­
        J = sum(scores[38:50])   # 12λ¬Έν•­
        
        # μ΅œλŒ€ 점수 계산
        max_ei = 13 * 5  # E/I μ΅œλŒ€μ μˆ˜
        max_sn = 13 * 5  # S/N μ΅œλŒ€μ μˆ˜
        max_tf = 12 * 5  # T/F μ΅œλŒ€μ μˆ˜
        max_jp = 12 * 5  # J/P μ΅œλŒ€μ μˆ˜
        
        # MBTI μœ ν˜• κ²°μ •
        mbti = ""
        mbti += "E" if E > max_ei/2 else "I"
        mbti += "S" if S > max_sn/2 else "N"
        mbti += "T" if T > max_tf/2 else "F"
        mbti += "J" if J > max_jp/2 else "P"
        
        # 각 νŠΉμ„±μ˜ 강도 계산 (λ°±λΆ„μœ¨)
        e_score = (E / max_ei) * 100
        s_score = (S / max_sn) * 100
        t_score = (T / max_tf) * 100
        j_score = (J / max_jp) * 100
        
        result = f"""
λ‹Ήμ‹ μ˜ MBTI μœ ν˜•μ€ {mbti}μž…λ‹ˆλ‹€.

μ„ΈλΆ€ μ„±ν–₯ 뢄석:
μ™Έν–₯(E) vs λ‚΄ν–₯(I): {e_score:.1f}% vs {100-e_score:.1f}%
감각(S) vs 직관(N): {s_score:.1f}% vs {100-s_score:.1f}%
사고(T) vs 감정(F): {t_score:.1f}% vs {100-t_score:.1f}%
νŒλ‹¨(J) vs 인식(P): {j_score:.1f}% vs {100-j_score:.1f}%

μ„±ν–₯ 강도 해석:
- 맀우 강함: 70% 이상
- 강함: 60-69%
- 보톡: 40-59%
- 약함: 31-39%
- 맀우 약함: 30% μ΄ν•˜

β€» 각 μ„±ν–₯이 50%에 κ°€κΉŒμšΈμˆ˜λ‘ μ–‘μͺ½ νŠΉμ„±μ„ κ· ν˜•μžˆκ²Œ μ‚¬μš©ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
β€» 검사 κ²°κ³ΌλŠ” 참고용이며, μ‹€μ œ 성격 μœ ν˜•κ³Ό λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
        """
        
        return result
        
    except Exception as e:
        return f"였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}\nλͺ¨λ“  μ§ˆλ¬Έμ— λ‹΅λ³€ν–ˆλŠ”μ§€ ν™•μΈν•΄μ£Όμ„Έμš”."

def create_test():
    with gr.Blocks(title="MBTI μ„±κ²©μœ ν˜• 검사") as app:
        gr.Markdown("""
        # MBTI μ„±κ²©μœ ν˜• 검사 (50λ¬Έν•­)
        각 μ§ˆλ¬Έμ— λŒ€ν•΄ 1(μ „ν˜€ μ•„λ‹ˆλ‹€)λΆ€ν„° 5(맀우 κ·Έλ ‡λ‹€)κΉŒμ§€ μ‘λ‹΅ν•΄μ£Όμ„Έμš”.
        λ”μš± μ •ν™•ν•œ κ²°κ³Όλ₯Ό μœ„ν•΄ λͺ¨λ“  μ§ˆλ¬Έμ— μ†”μ§ν•˜κ²Œ λ‹΅λ³€ν•΄ μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€.
        """)
        
        with gr.Column():
            # μ§ˆλ¬Έλ³„ μŠ¬λΌμ΄λ” 생성
            sliders = []
            for i, q in enumerate(questions, 1):
                slider = gr.Slider(
                    minimum=1,
                    maximum=5,
                    step=1,
                    value=3,
                    label=q,
                    info="1: μ „ν˜€ μ•„λ‹ˆλ‹€ ~ 5: 맀우 κ·Έλ ‡λ‹€"
                )
                sliders.append(slider)
        
        submit_btn = gr.Button("κ²°κ³Ό 확인")
        result_text = gr.Textbox(label="검사 κ²°κ³Ό", lines=12)
        
        # μ—λŸ¬ 처리λ₯Ό ν¬ν•¨ν•œ 제좜 ν•¨μˆ˜
        def safe_submit(*args):
            try:
                return calculate_mbti(args)
            except Exception as e:
                return f"였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
        
        submit_btn.click(
            fn=safe_submit,
            inputs=sliders,
            outputs=result_text
        )
    
    return app

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰
if __name__ == "__main__":
    app = create_test()
    app.launch()