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)
|