24Game / utils.py
MrJShen's picture
Upload 103 files
db3ff10
# utils.py
import operator
from itertools import product, permutations
import ast
import sqlite3
from sqlite3 import Connection
import pandas as pd
import datetime
def mydiv(n, d):
if d==0:
r = 99999
else:
r = operator.truediv(n,d)
return r
def solve24(nums):
syms = [operator.add, operator.sub, operator.mul, mydiv]
op = {sym: ch for sym, ch in zip(syms, '+-*/')}
sols = [];
for x, y, z in product(syms, repeat=3):
for a, b, c, d in permutations(nums):
if round(x(y(a,b),z(c,d)),5) == 24:
sols.append(f"({a}{op[y]}{b}){op[x]}({c}{op[z]}{d})")
if round(x(a,y(b,z(c,d))),5) == 24:
sols.append(f"{a}{op[x]}({b}{op[y]}({c}{op[z]}{d}))")
if round(x(y(z(c,d),b),a),5) == 24:
sols.append(f"(({c}{op[z]}{d}){op[y]}{b}){op[x]}{a}")
if round(x(y(b,z(c,d)),a),5) == 24:
sols.append(f"({b}{op[y]}({c}{op[z]}{d})){op[x]}{a}")
if round(x(a,y(z(c,d),b)),5) == 24:
sols.append(f"{a}{op[x]}(({c}{op[z]}{d}){op[y]}{b})")
return sols
def check_extra(sol):
if eval(sol) == 24 and sol.count(")")==2:
return True
else:
return False
def get_connection(path: str):
return sqlite3.connect(path, check_same_thread=False)
def insert_value_user (conn, value:tuple):
q = f"INSERT INTO user (id, name) VALUES {value}"
conn.execute(q)
conn.commit()
def check_value_user (conn, id:int):
q = f"SELECT EXISTS(SELECT 1 FROM user WHERE id={id}) LIMIT 1;"
return pd.read_sql(q, con=conn).values[0][0] == 1
def insert_value_games (conn, value:tuple):
q = f"INSERT OR IGNORE INTO games (date, num, suit, sols, num_sols) VALUES {value}"
conn.execute(q)
conn.commit()
def insert_value_plays (conn, value:tuple):
q = f"INSERT INTO plays (id, date, num, suit, sol) VALUES {value}"
conn.execute(q)
conn.commit()
def update_value_plays(conn, id, date, num, value):
q = f"""
UPDATE plays
SET sol = '{value}'
WHERE id = {id}
AND date='{date}'
AND num='{num}'
;
"""
conn.execute(q)
conn.commit()
def check_plays_user (conn, id, date, num):
q = f"SELECT EXISTS(SELECT 1 FROM plays WHERE id={id} AND date = '{date}' AND num = '{num}') LIMIT 1;"
return pd.read_sql(q, con=conn).values[0][0] == 1
def get_plays_answer(conn, id, date, num):
q = f"""
SELECT sol
FROM plays
WHERE id = {id}
AND date = '{date}'
and num = '{num}';
"""
return pd.read_sql(q, con=conn)
def get_top_board(conn):
q = """
SELECT plays.sol as ans,
plays.date as Date,
user.name as name
FROM plays
INNER JOIN user ON plays.id = user.id
;
"""
return pd.read_sql(q, con=conn)
def top_board_df(df):
df['scores'] = df.ans.apply(ast.literal_eval).apply(len)
new = df.groupby('name')['scores'].sum().reset_index()
return new.head(10)