Last active
September 24, 2021 13:13
-
-
Save AlexLynd/1a835d688eba168ef4c69f32274b2d7e to your computer and use it in GitHub Desktop.
ACSL Senior Contest 3 [2019-20]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
vars = [['A','A','~A','~A'],['B','B','~B','~B'],['~C','C','C','~C'],['~D','D','D','~D']] | |
def parseHex(hex): return (np.argwhere(np.array([[int(y) for y in x] for x in [list(bin(int(char, 16))[2:].zfill(4)) for char in hex]]) == 1).tolist()) # return int matrix with hex string | |
def getCoordLetter(coord): return [vars[0][coord[1]],vars[1][coord[0]],vars[2][coord[1]],vars[3][coord[0]]] #return letters from coordinates [1,1] = [A,B,C,D] | |
def getTerm(points): # return a boolean operation given coordinates | |
letters = sorted(list(set([element for point in points for element in getCoordLetter(point)]))) | |
return "".join(sorted([letter for letter in letters if not("~"+letter in letters or (len(letter)==2 and letter[1] in letters))], key=lambda x: x.strip('~'))) | |
def hasNum(var, pos, times, clist): return sum(1 for coord in clist if (coord[pos]==var)) >= times , [coord for coord in clist if (coord[pos]==var)] | |
def checkCond(conds,aux): | |
global coords, str | |
if (all(num == True for num in [cond[0] for cond in conds]) and aux): | |
terms = [j for i in [cond[1] for cond in conds] for j in i] | |
str+= getTerm(terms)+"+" | |
coords = [j for j in coords if j not in terms] | |
def scan8(): | |
for i in range (3): checkCond( [hasNum(i,0,4,coords),hasNum(i+1,0,4,coords)] ,True) # row | |
for i in range (3): checkCond( [hasNum(i,1,4,coords),hasNum(i+1,1,4,coords)], True) # col | |
checkCond([hasNum(0,0,4,coords), hasNum(3,0,4,coords)],True) # end row | |
checkCond([hasNum(0,1,4,coords), hasNum(3,1,4,coords)],True) # end col | |
def scan4(): | |
for i in range (4): checkCond([hasNum(i,0,4,coords)],True) # full row | |
for i in range (4): checkCond([hasNum(i,1,4,coords)],True) # full col | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,1,1,hasNum(i,0,2,coords)[1]),hasNum(j+1,1,1,hasNum(i,0,2,coords)[1]),hasNum(j,1,1,hasNum(i+1,0,2,coords)[1]),hasNum(j+1,1,1,hasNum(i+1,0,2,coords)[1])],len(hasNum(j,1,1,hasNum(i,0,2,coords)[1])[1]+hasNum(j+1,1,1,hasNum(i,0,2,coords)[1])[1])==2 and len(hasNum(j,1,1,hasNum(i+1,0,2,coords)[1])[1]+hasNum(j+1,1,1,hasNum(i+1,0,2,coords)[1])[1])==2) # block | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,1,1,hasNum(i,0,2,coords)[1]) , hasNum(j+3,1,1,hasNum(i,0,2,coords)[1]),hasNum(j,1,1,hasNum(i+1,0,2,coords)[1]) , hasNum(j+3,1,1,hasNum(i+1,0,2,coords)[1])],len(hasNum(j,1,1,hasNum(i,0,2,coords)[1])[1]+hasNum(j+3,1,1,hasNum(i,0,2,coords)[1])[1])==2 and len(hasNum(j,1,1,hasNum(i+1,0,2,coords)[1])[1]+hasNum(j+3,1,1,hasNum(i+1,0,2,coords)[1])[1])==2) # end row | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,0,1,hasNum(i,1,2,coords)[1]) , hasNum(j+3,0,1,hasNum(i,1,2,coords)[1]),hasNum(j,0,1,hasNum(i+1,1,2,coords)[1]) , hasNum(j+3,0,1,hasNum(i+1,1,2,coords)[1])],len(hasNum(j,0,1,hasNum(i,1,2,coords)[1])[1]+hasNum(j+3,0,1,hasNum(i,1,2,coords)[1])[1])==2 and len(hasNum(j,0,1,hasNum(i+1,1,2,coords)[1])[1]+hasNum(j+3,0,1,hasNum(i+1,1,2,coords)[1])[1])==2) # end col | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,0,1,hasNum(i,1,2,coords)[1]) , hasNum(j+3,0,1,hasNum(i,1,2,coords)[1]),hasNum(j,0,1,hasNum(i+3,1,2,coords)[1]) , hasNum(j+3,0,1,hasNum(i+3,1,2,coords)[1])],len(hasNum(j,0,1,hasNum(i,1,2,coords)[1])[1]+hasNum(j+3,0,1,hasNum(i,1,2,coords)[1])[1])==2 and len(hasNum(j,0,1,hasNum(i+3,1,2,coords)[1])[1]+hasNum(j+3,0,1,hasNum(i+3,1,2,coords)[1])[1])==2) # 4 corners | |
def scan2(): | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,1,1,hasNum(i,0,2,coords)[1]) , hasNum(j+1,1,1,hasNum(i,0,2,coords)[1])],len(hasNum(j,1,1,hasNum(i,0,2,coords)[1])[1]+hasNum(j+1,1,1,hasNum(i,0,2,coords)[1])[1])==2) # row | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,0,1,hasNum(i,1,2,coords)[1]) , hasNum(j+1,0,1,hasNum(i,1,2,coords)[1])],len(hasNum(j,0,1,hasNum(i,1,2,coords)[1])[1]+hasNum(j+1,0,1,hasNum(i,1,2,coords)[1])[1])==2) # col | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,1,1,hasNum(i,0,2,coords)[1]) , hasNum(j+3,1,1,hasNum(i,0,2,coords)[1])],len(hasNum(j,1,1,hasNum(i,0,2,coords)[1])[1]+hasNum(j+3,1,1,hasNum(i,0,2,coords)[1])[1])==2) # end row | |
for i in range (4): | |
for j in range(3): checkCond([hasNum(j,0,1,hasNum(i,1,2,coords)[1]) , hasNum(j+3,0,1,hasNum(i,1,2,coords)[1])],len(hasNum(j,0,1,hasNum(i,1,2,coords)[1])[1]+hasNum(j+3,0,1,hasNum(i,1,2,coords)[1])[1])==2) # end col | |
def scan1(): | |
for i in range (4): checkCond([hasNum(i,0,1,coords)],True) | |
for i in range(5): | |
coords = parseHex(input("str:")) | |
str="" | |
scan8() | |
scan4() | |
scan2() | |
scan1() | |
print(str[:-1]+"\n") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment