def meddling_middlepoint(perm): n = len(perm) inv = inverse_0(perm) neigh = [{perm[(i-1) % n], perm[(i+1) % n]} for i in range(n)] for O in range(n): val = lambda x : (x - O) % n p,q = get_significant_adjacent_points(O,perm,inv,neigh,n,val) if val(p) - val(q) == 1: val = lambda x : (x - q) % n pp,qq = get_significant_adjacent_points(q,perm,inv,neigh,n,val) if (qq,pp) == (O, (O+1)%n): return True return False
def test_star_property(orig): from sympy import S n = len(orig) for i in range(n): val = lambda x : (x - i) % n perm = [val(x) for x in orig] neigh = [{perm[(i-1) % n], perm[(i+1) % n]} for i in range(n)] inv = inverse_0(perm) q = min(neigh[inv[0]]) p = max(neigh[inv[1]]) if not p > q: #print(i, "semistar") return False for r in range(p+1, n): sprime = triple_intersection(n,p,q,r) #print(sprime) s_set = neigh[inv[r]] if any(0 < sprime - S(s) and s > 1 for s in s_set): #print(i, "star", p,q,r,s_set,float(sprime)) return False return True
def main(): drawing = True starLis = [] while 1: if drawing: try: line = input() lis = line.split(',') lis = [int(i) for i in lis] UnicursalPolygon(lis).draw(save=True) except EOFError: break else: try: line = input() lis = line.split(',') lis = [int(i) for i in lis] a = UnicursalPolygon(lis) b = UnicursalPolygon(inverse_0(lis)) try: tmp = a.is_star() tmp2 = b.is_star() except: print("b failed is_star()," + str(b.perm)) continue if tmp and tmp2: print("star: {} inverses into a star {}".format(str(lis),str(b.perm))) starLis.append(a) starLis.append(b) elif tmp: print("star: {} does not inverse into a star {}".format(str(lis),str(b.perm))) elif tmp2: print("non-star: {} inverses into a star {}".format(str(lis),str(b.perm))) else: print(str(lis) + " neither are stars: " + str(unicursalpolygon.inverse_0(lis))) except EOFError: break for perm in starLis: perm.draw()
def nova_badness(orig): res = [] n = len(orig) for i in range(n): val = lambda x : (x - i) % n invval = lambda x : (x + i) % n perm = [val(x) for x in orig] neigh = [{perm[(i-1) % n], perm[(i+1) % n]} for i in range(n)] inv = inverse_0(perm) q = min(neigh[inv[0]]) p = max(neigh[inv[1]]) if not p > q: #print(i, "semistar") return -1 # not a semistar if n-p-1 > 0 and q-2 > 0: pass tmp = 0 for r in range(p+1, n): lis = [s for s in neigh[inv[r]] if 1 < s and s < q] tmp += len(lis) res.append(tmp) return sum(res),res
def embeddingless_star(orig): res = 1 reslis = [] n = len(orig) for i in range(n): val = lambda x : (x - i) % n invval = lambda x : (x + i) % n perm = [val(x) for x in orig] neigh = [{perm[(i-1) % n], perm[(i+1) % n]} for i in range(n)] inv = inverse_0(perm) q = min(neigh[inv[0]]) p = max(neigh[inv[1]]) if not p > q: #print(i, "semistar") return False if n-p-1 > 0 and q-2 > 0: reslis.append(i) res = 2 for r in range(p+1, n): lis = [s for s in neigh[inv[r]] if 1 < s and s < q] if len(lis): #print("O:{} I:{} p:{} q:{} r:{} s:{}".format(i, i+1, invval(p), invval(q), invval(r), [invval(_) for _ in lis])) return False return res
def test_semistar_property(perm): n = len(perm) inv = inverse_0(perm) neigh = [{perm[(i-1) % n], perm[(i+1) % n]} for i in range(n)] return all(semistar_property(i, perm, inv, neigh, n) for i in range(n))