File size: 5,432 Bytes
db3ff10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27e26d0
 
 
 
db3ff10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from PIL import Image
import random, operator, ast, sqlite3, datetime, json, math
from itertools import product, permutations
from utils import *
from sqlite3 import Connection
import pandas as pd

@st.cache_data()
def static_variables():
    suits = ["hearts","spades","diamonds","clubs"]; jo = "_of_"; path = "static/"
    return suits, jo, path

@st.cache_data(ttl=3600*4)
def static_layout_top():
    st.header("24 Game!")
    st.markdown(f"""Welcome! Today is {st.session_state.date}""")

    st.markdown("""
    #### How to play:
                
        - Using +, -, *, / , and () on 4 cards to get 24;
        - Each card represent a number as shown, where J=11, Q=12, K=13, and A=1
        - You will have 3 operations, and you have to express the first and second 
            operation explicitly, e.g. even though you have 6, 6, 6, 6 and you know that
            6 + 6 + 6 + 6 = 24, you need to type your expression clearly as ((6+6)+6)+6 or 
            (6+6)+(6+6) to specify your first two operations.
        - The algorithm encourage thinking of associativity, so, (12/6)*(11+1) and 
            (12/6)*(1+11) would be counted as two different and correct answers.    
            
    """)
    c0, c1, c2, c3 = st.columns([0.25,0.25,0.25,0.25]); cs = [c0,c1,c2,c3]
    for idx, x in enumerate(cs):
        with x:
            im = Image.open(path+str(st.session_state.nums[idx])+jo+st.session_state.su[idx]+".png")
            st.image(im)
                
@st.cache_resource(ttl=3600*4)
def get_cards():
    i = True
    while i:
        nums = random.sample(range(1,14),4)
        suit = random.sample(suits,4)
        sols = solve24(nums)
        i = (len(sols) == 0)
    conn = get_connection("data24.db"); date = str(datetime.date.today())
    value = (date, str(nums), str(suit), str(sols), len(sols))
    insert_value_games(conn, value)
    return nums, suit, sols, date, conn

def check_ans_default(inp): # for non-id player
    if inp in st.session_state.sols:
        if st.session_state.get('ans') == None:
            st.session_state['ans'] = {inp}
            
        else:
            s1 = st.session_state['ans']
            s1.add(inp)
            st.session_state['ans'] = s1
        a1, a2 = st.columns([0.5,0.5])
        with a1:
            st.markdown(f"Got one! :green[${inp}=24$]")
        with a2:
            st.markdown(f"There are {len(st.session_state.sols)} expressions in total. :chart_with_upwards_trend:")
    else:    
        st.write("Oop! Incorrect.....")
    return

def check_ans_user(inp): # On session, but data on cache_resource
    id = int(st.session_state.u_id); date = st.session_state.date; 
    nums = str(st.session_state.nums); suit = str(st.session_state.su)
    df = get_plays_answer(st.session_state.conn, id, date, nums)
    if len(df) > 0:
        st.session_state['ans'] = set(ast.literal_eval(df.values[0][0]))
    else:
        st.session_state['ans'] = set()
    if inp in st.session_state.sols:
        s1 = st.session_state['ans']
        if len(s1) > 0:
            s1.add(inp)
        else:
            s1 = {inp}
        st.session_state['ans'] = s1
        if st.session_state.u_id is not None:
            if not check_plays_user(st.session_state.conn, id, date, nums):
                value = (id, date, nums, suit, json.dumps(s1,default=tuple))
                insert_value_plays(st.session_state.conn, value)
            else:
                update_value_plays(st.session_state.conn, id, date, nums, json.dumps(s1,default=tuple))
    else:
        st.write("Oop! Incorrect.....")

    
# Call statics and session variables
suits, jo, path = static_variables()
st.session_state['nums'], st.session_state['su'], st.session_state['sols'], st.session_state['date'], st.session_state['conn'] = get_cards()


# Call page layout
#with  st.sidebar:
#    df = get_top_board(st.session_state.conn)
#    df = top_board_df(df)
#    st.write(df)

static_layout_top()

# User data collecting
#with st.expander("If you want to join the competition"):
#    u1, u2 = st.columns([0.5,0.5])
#    with u1:
#        st.text_input("Enter your TGS id for prize:", key="u_id")
#    with u2:
#        st.text_input("The user name, one per TGS id", key="u_name")
#    if st.button("Join Weekly Competition"):
#        conn = st.session_state.conn; u_id = int(st.session_state.u_id); u_name = st.session_state.u_name
#        if check_value_user(conn, u_id):
#            st.write("You already joined the competition, good luck! :smile:")
#        else:
#            insert_value_user(conn, (u_id, u_name))
#            st.write(f"Welcome {u_name}! You just signed up for this week's competition! Good Luck!")

# User plays collecting            
inp = st.text_input("Enter your expression here: ").replace(" ", "")
if st.button("Try your luck!"):
    #if st.session_state.u_id:
    #    check_ans_user(inp)
    #else:
    check_ans_default(inp)
        
#st.write(st.session_state.ans) #-- local testing only
# Display session answers
if st.session_state.get('ans') == None:
    pass
else:
    st.markdown("### Your correct answers: ")
    col = 4; n = len(st.session_state.ans)
    row = math.ceil(n / col)
    for i in range(row):
        cols = st.columns(col)
        for m in range(min(4, n-4*i)):
            cols[m].latex(list(st.session_state.ans)[m+i*4].replace("/","\div"))
        st.markdown("##")

#st.write(st.session_state.sols)