Skip to content

Instantly share code, notes, and snippets.

@AlexLynd
Last active September 24, 2021 13:13
Show Gist options
  • Save AlexLynd/1a835d688eba168ef4c69f32274b2d7e to your computer and use it in GitHub Desktop.
Save AlexLynd/1a835d688eba168ef4c69f32274b2d7e to your computer and use it in GitHub Desktop.
ACSL Senior Contest 3 [2019-20]
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