math-quiz / app.py
yoon-gu's picture
Update app.py
c938c12
raw
history blame contribute delete
No virus
5.42 kB
import os
os.system("pip install gradio==3.47.1")
import gradio as gr
import pandas as pd
import random
import json
import time
USERS = ["June", "Sean", "Woojoo", "Taejoo", "Dummy"]
QUESTION_TEMPLATE = {"question": "λ‹€μŒ 포켓λͺ¬μ˜ 이름은 λ­˜κΉŒμš”?![]({img_url})", "answer": "{name}"}
def get_question_answer():
a = random.randint(0, 5)
b = random.randint(0, 6)
c = a + b
q = f"$${a} + {b} = \square$$"
a = f"{c}"
return q, a
info = {u: {"done" : True, "score": 0, "count": 0, "best_score": 0, "best_time": float("inf"), "time": 0.0} for u in USERS}
MD = """# μˆ˜ν•™ ν€΄μ¦ˆ
## μ‚¬μš©λ°©λ²•
1. μ‚¬μš©μžλ₯Ό μ„ νƒν•˜μ„Έμš”.
2. 총 ν€΄μ¦ˆ 개수λ₯Ό μ„ νƒν•˜μ„Έμš”.
## 점수판
{content}
"""
with gr.Blocks() as demo:
answer = gr.State(value="")
with gr.Row():
with gr.Column():
markdown = gr.Markdown(MD.format(content=''))
user = gr.Radio(USERS, value="Taejoo", label="μ‚¬μš©μž", info="당신은 λˆ„κ΅¬μ‹ κ°€μš”?")
quiz_count = gr.Radio([10, 20, 30], value=10, label="총 ν€΄μ¦ˆ 개수", info="ν€΄μ¦ˆλ₯Ό λͺ‡ 개 ν’€ μ˜ˆμ •μΈκ°€μš”?")
with gr.Column():
with gr.Row():
play = gr.Button(value="ν€΄μ¦ˆ μ‹œμž‘", label="ν€΄μ¦ˆ μ‹œμž‘")
skip = gr.Button(value="문제 λ„˜μ–΄κ°€κΈ°", label="문제 μŠ€ν‚΅")
stop = gr.Button(value="ν€΄μ¦ˆ μ’…λ£Œ", label="ν€΄μ¦ˆ μ’…λ£Œ")
chatbot = gr.Chatbot(bubble_full_width=False,
avatar_images=["https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/images/No_0001_이상해씨.png",
"https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/images/No_0155_λΈŒμΌ€μΈ.png"])
msg = gr.Textbox(placeholder="문제의 닡을 μž…λ ₯ν•˜μ„Έμš”.", label="λ‹΅")
def respond(message, chat_history, user, quiz_count, request: gr.Request):
message = message.strip()
done = info[user]['done']
if done:
if "ν€΄μ¦ˆμ‹œμž‘" == message.replace(" ", ""):
q, a = get_question_answer()
bot_message = f"ν€΄μ¦ˆλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€. λΉˆμΉΈμ— λ“€μ–΄κ°ˆ 숫자λ₯Ό λ§žμΆ°μ£Όμ„Έμš”.\n{q}"
answer.value = a
info[user]['done'] = False
info[user]['score'] = 0
info[user]['count'] = 0
info[user]['time'] = time.time()
else:
bot_message = "ν€΄μ¦ˆλ₯Ό μ‹œμž‘ν•˜κ³  μ‹ΆμœΌμ‹œλ©΄, **ν€΄μ¦ˆ μ‹œμž‘** λ²„νŠΌμ„ λˆ„λ₯΄μ„Έμš”."
else:
if answer.value == message:
q, a = get_question_answer()
answer.value = a
info[user]['score'] += 1
info[user]['count'] += 1
bot_message = f"πŸŽ‰μ •λ‹΅μž…λ‹ˆλ‹€! λ‹€μŒ λ¬Έμ œμž…λ‹ˆλ‹€.\n- ν˜„μž¬ 점수: {info[user]['score']}점\n- μ†Œμš” μ‹œκ°„: {time.time() - info[user]['time']:4.3f}초\nλΉˆμΉΈμ— λ“€μ–΄κ°ˆ 숫자λ₯Ό λ§žμΆ°μ£Όμ„Έμš”.{q}"
elif "ν€΄μ¦ˆμ’…λ£Œ" == message.replace(" ", ""):
bot_message = f"ν€΄μ¦ˆλ₯Ό κ°•μ œ μ’…λ£Œν•©λ‹ˆλ‹€."
info[user]['done'] = True
elif "문제 λ„˜μ–΄κ°€κΈ°" == message:
info[user]['count'] += 1
q, a = get_question_answer()
answer.value = a
bot_message = f"문제λ₯Ό λ„˜μ–΄κ°‘λ‹ˆλ‹€. λ‹€μŒ λ¬Έμ œμž…λ‹ˆλ‹€.\n{q}"
else:
bot_message = f"***{message}***!? 🧐 λ‹€μ‹œ ν•œλ²ˆ μƒκ°ν•΄λ³΄μ„Έμš”."
info[user]['score'] -= 0.1
if quiz_count == info[user]['count']:
bot_message = f"λͺ¨λ“  ν€΄μ¦ˆλ₯Ό λ‹€ ν’€μ—ˆμŠ΅λ‹ˆλ‹€. μ μˆ˜λŠ” {info[user]['score']:3.1f}점 μž…λ‹ˆλ‹€."
info[user]['done'] = True
if info[user]['score'] >= info[user]['best_score']:
info[user]['best_score'] = info[user]['score']
info[user]['best_time'] = min(time.time() - info[user]['time'], info[user]['best_time'])
chat_history.append((message, bot_message))
leader_board = sorted(info.items(), key=lambda x: (x[1]['best_score'], -x[1]['best_time']), reverse=True)
lbdf = pd.DataFrame([dict(**a[1], name=a[0]) for a in leader_board])
lbdf.index += 1
md = lbdf[['name', 'best_score', 'best_time']].to_markdown()
return "", chat_history, MD.format(content=md)
play.click(respond,
inputs=[play, chatbot, user, quiz_count],
outputs=[msg, chatbot, markdown])
skip.click(respond,
inputs=[skip, chatbot, user, quiz_count],
outputs=[msg, chatbot, markdown])
stop.click(respond,
inputs=[stop, chatbot, user, quiz_count],
outputs=[msg, chatbot, markdown])
def update_table():
leader_board = sorted(info.items(), key=lambda x: (x[1]['best_score'], -x[1]['best_time']), reverse=True)
lbdf = pd.DataFrame([dict(**a[1], name=a[0]) for a in leader_board])
lbdf.index += 1
md = lbdf[['name', 'best_score', 'best_time']].to_markdown()
return MD.format(content=md)
demo.load(update_table,
inputs=None,
outputs=markdown)
msg.submit(respond, [msg, chatbot, user, quiz_count], [msg, chatbot, markdown])
demo.queue(concurrency_count=1)
demo.launch()