Py.Cafe

jbwhit/

age-working-embedded

Lithuanian Language Exercise App

DocsPricing
  • app.py
  • requirements.txt
app.py
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
import solara
import pandas as pd
from io import StringIO

# Load the data from CSV files
pronouns_df = pd.read_csv(StringIO("""nominative,dative
aš,man
tu,tau
jis,jam
ji,jai
mes,mums
jūs,jums
jie,jiems
jos,joms"""))


numbers_df = pd.read_csv(StringIO("""number,neoficialiai,compound,years
1,vieni,,metai
2,du,,metai
3,trys,,metai
4,keturi,,metai
5,penki,,metai
6,šeši,,metai
7,septyni,,metai
8,aštuoni,,metai
9,devyni,,metai
10,dešimt,,metų
11,vienuolika,,metų
12,dvylika,,metų
13,trylika,,metų
14,keturiolika,,metų
15,penkiolika,,metų
16,šešiolika,,metų
17,septyniolika,,metų
18,aštuoniolika,,metų
19,devyniolika,,metų
20,dvidešimt,,metų
21,dvidešimt,vieni,metai
22,dvidešimt,du,metai
23,dvidešimt,trys,metai
24,dvidešimt,keturi,metai
25,dvidešimt,penki,metai
26,dvidešimt,šeši,metai
27,dvidešimt,septyni,metai
28,dvidešimt,aštuoni,metai
29,dvidešimt,devyni,metai
30,trisdešimt,,metų
31,trisdešimt,vieni,metai
32,trisdešimt,du,metai
33,trisdešimt,trys,metai
34,trisdešimt,keturi,metai
35,trisdešimt,penki,metai
36,trisdešimt,šeši,metai
37,trisdešimt,septyni,metai
38,trisdešimt,aštuoni,metai
39,trisdešimt,devyni,metai
40,keturiasdešimt,,metų
41,keturiasdešimt,vieni,metai
42,keturiasdešimt,du,metai
43,keturiasdešimt,trys,metai
44,keturiasdešimt,keturi,metai
45,keturiasdešimt,penki,metai
46,keturiasdešimt,šeši,metai
47,keturiasdešimt,septyni,metai
48,keturiasdešimt,aštuoni,metai
49,keturiasdešimt,devyni,metai
50,penkiasdešimt,,metų
51,penkiasdešimt,vieni,metai
52,penkiasdešimt,du,metai
53,penkiasdešimt,trys,metai
54,penkiasdešimt,keturi,metai
55,penkiasdešimt,penki,metai
56,penkiasdešimt,šeši,metai
57,penkiasdešimt,septyni,metai
58,penkiasdešimt,aštuoni,metai
59,penkiasdešimt,devyni,metai
60,šešiasdešimt,,metų
61,šešiasdešimt,vieni,metai
62,šešiasdešimt,du,metai
63,šešiasdešimt,trys,metai
64,šešiasdešimt,keturi,metai
65,šešiasdešimt,penki,metai
66,šešiasdešimt,šeši,metai
67,šešiasdešimt,septyni,metai
68,šešiasdešimt,aštuoni,metai
69,šešiasdešimt,devyni,metai
70,septyniasdešimt,,metų
71,septyniasdešimt,vieni,metai
72,septyniasdešimt,du,metai
73,septyniasdešimt,trys,metai
74,septyniasdešimt,keturi,metai
75,septyniasdešimt,penki,metai
76,septyniasdešimt,šeši,metai
77,septyniasdešimt,septyni,metai
78,septyniasdešimt,aštuoni,metai
79,septyniasdešimt,devyni,metai
80,aštuoniasdešimt,,metų
81,aštuoniasdešimt,vieni,metai
82,aštuoniasdešimt,du,metai
83,aštuoniasdešimt,trys,metai
84,aštuoniasdešimt,keturi,metai
85,aštuoniasdešimt,penki,metai
86,aštuoniasdešimt,šeši,metai
87,aštuoniasdešimt,septyni,metai
88,aštuoniasdešimt,aštuoni,metai
89,aštuoniasdešimt,devyni,metai
90,devyniasdešimt,,metų
91,devyniasdešimt,vieni,metai
92,devyniasdešimt,du,metai
93,devyniasdešimt,trys,metai
94,devyniasdešimt,keturi,metai
95,devyniasdešimt,penki,metai
96,devyniasdešimt,šeši,metai
97,devyniasdešimt,septyni,metai
98,devyniasdešimt,aštuoni,metai
99,devyniasdešimt,devyni,metai"""))

# Function to get a random nominative pronoun and a number
def get_random_exercise():
    nominative_pronoun = pronouns_df.sample(1).iloc[0]
    number_row = numbers_df.sample(1).iloc[0]
    return nominative_pronoun, number_row

# Function to fetch the dative and compound year
def get_answer(nominative_pronoun, number_row):
    dative = pronouns_df.loc[pronouns_df['nominative'] == nominative_pronoun['nominative'], 'dative'].values[0]
    year_phrase = f"{number_row['neoficialiai']} {number_row['compound']} {number_row['years']}" if pd.notna(number_row['compound']) else f"{number_row['neoficialiai']} {number_row['years']}"
    return f"{dative.title()} {year_phrase}."


@solara.component
def AnswerHistory(answers):
    with solara.Card():
        solara.Markdown("### History of Answers")
        for exercise, answer, correct in answers:
            result_text = "Correct" if correct else "Incorrect"
            solara.Markdown(f"- {exercise} -> {answer} ({result_text})")

@solara.component
def ProgressTracker(answers):
    total_exercises = len(answers)
    correct_answers = sum(1 for _, _, correct in answers if correct)
    incorrect_answers = total_exercises - correct_answers
    accuracy = (correct_answers / total_exercises) * 100 if total_exercises > 0 else 0

    with solara.Card():
        solara.Markdown("### Progress")
        solara.Markdown(f"Total Exercises: {total_exercises}")
        solara.Markdown(f"Correct Answers: {correct_answers}")
        solara.Markdown(f"Incorrect Answers: {incorrect_answers}")
        solara.Markdown(f"Accuracy: {accuracy:.2f}%")

        # with solara.ProgressLinear(value=accuracy, color="blue"):
        #     pass

@solara.component
def Page():
    nominative_pronoun, set_nominative_pronoun = solara.use_state(None)
    number_row, set_number_row = solara.use_state(None)
    show_answer, set_show_answer = solara.use_state(False)
    answers, set_answers = solara.use_state([])

    if nominative_pronoun is None or number_row is None:
        nominative_pronoun, number_row = get_random_exercise()
        set_nominative_pronoun(nominative_pronoun)
        set_number_row(number_row)

    exercise_text = f"{nominative_pronoun['nominative']}, {number_row['number']}"
    answer_text = get_answer(nominative_pronoun, number_row)

    with solara.Column(gap="20px"):
        with solara.Card():
            solara.Markdown(f"""### Exercise: Kiek tau metų?
({exercise_text})""")

            if solara.Button("Reveal Answer", on_click=lambda: set_show_answer(True)):
                if show_answer:
                    solara.Markdown(f"**Answer:** {answer_text}")
                    with solara.Row(gap="10px"):
                        solara.Button("Correct", on_click=lambda: set_answers(answers + [(exercise_text, answer_text, True)]), color='green')
                        solara.Button("Incorrect", on_click=lambda: set_answers(answers + [(exercise_text, answer_text, False)]), color='red')

                    with solara.Row(gap="10px"):
                        solara.Button("Next Question", on_click=lambda: (
                            set_nominative_pronoun(None),
                            set_number_row(None),
                            set_show_answer(False)
                        ))

        ProgressTracker(answers)
        AnswerHistory(answers)