File size: 3,017 Bytes
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
# 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)