#!/usr/bin/env python # -*- coding: UTF-8 -*- import random, socket, signal, sys, re, os, time from copy import copy, deepcopy FLAG="328df3b4525e060de963a20d3cc86579" PORT=3 Timeout=10 slow="""__________________________________________________________________ __________________________________________________________________ ______________________________________†888888‡†___________________ _______________________________8†_†††††††††††††††††8†_____________ ___________________________†‡_____††††††††††††††††††††8___________ ________________________‡†_______†‡‡‡‡‡‡‡8††††††††††††_†‡†________ ____________________‡†____†‡‡†_______________‡††††††††††††8_______ _______________________________________________†‡†††††††††‡‡______ _________________________________________________8†††††††††‡‡†____ ___________________________________________________††††††††‡‡†8___ ___________________________________________________8†††††††‡‡‡‡___ ___________________________________________________8†††††††‡‡‡†___ ___________________________________________________8††††††‡‡‡††___ ___________________________†‡‡†††††††††††††‡8†_____††††††‡‡‡‡‡†___ _______________________†8††††††††††††††††††††††8†_8‡††††‡‡‡‡‡‡‡___ ____________________‡††††††††††††††††††††††††††††††‡†††‡‡‡‡‡‡†8___ ________‡‡††‡_†8‡††††††††††88†‡8†††‡8†††††††††††††††‡‡‡‡†‡‡‡‡‡____ ______††††††8††††††††††††††††8†††888††8††††††††††††‡‡†8††††††‡____ ______8†‡†8††††††††††††††††††‡†8††††††8††††††††††††‡‡‡‡¶††††8_____ _______‡‡__8†††††††††8____‡‡††††‡†††††‡†††††††††††‡‡‡‡††8†††______ ________‡¶_8††††††_†8_______†††††‡8888††††††††††‡‡‡‡‡‡††‡8†_______ _______‡†‡†________‡8________‡††††††‡8†††††††‡‡‡‡‡‡‡‡‡‡‡‡‡________ _____8†________________†8‡__‡†††††‡‡‡‡†††‡‡‡‡‡‡‡‡‡‡†‡†‡‡†8________ ___‡________________________‡8†††‡‡‡‡††‡‡†‡‡‡‡‡‡‡‡‡‡‡†‡†‡‡†_______ __†____‡_____‡_______________†8†‡‡‡††††‡‡‡‡‡‡‡‡‡†‡‡8††††‡††_______ ___†_________________________†8††††††††††‡‡‡‡‡‡‡‡‡††††††‡‡†_______ _____8_‡__‡888‡††____††‡¶‡____‡‡†††††††††††‡‡†‡‡†¶†††††‡†‡________ _______†_¶8¶†††††††‡_†††8___†8‡‡††††††††††‡†8‡‡8_¶‡‡†††††‡________ ________‡††¶¶††††††‡†8‡__†‡‡‡‡††8†††††††††‡†8______8‡‡__‡_________ ________8‡‡____††††_____88††††††††‡‡‡†††††‡†8_____________________ ______†††‡‡__‡‡†___‡‡8______________8‡‡‡888‡†_____________________ ______________________________________†¶___‡______________________""" class Sudoku: def __init__(self): a=[[''for j in range(9)]for i in range(9)] t=range(1,10) random.seed() random.shuffle(t) k=0 for i in range(9): if i==3 or i==6: k+=1 for j in range(9): a[i][j]=str(t[(j+k)%9]) k+=3 for t in range(20): i=random.choice([0,3,6]) j=random.choice(filter(lambda x: x!=i,[0,3,6])) for k in range(9): for l in range(3): a[k][i+l],a[k][j+l]=a[k][j+l],a[k][i+l] i=random.choice([0,3,6]) j=random.choice(filter(lambda x: x!=i,[0,3,6])) for k in range(9): for l in range(3): a[i+l][k],a[j+l][k]=a[j+l][k],a[i+l][k] for s in [[0,1,2],[3,4,5],[6,7,8]]: i=random.choice(s) j=random.choice(filter(lambda x: x!=i,s)) for k in range(9): a[i][k],a[j][k]=a[j][k],a[i][k] i=random.choice(s) j=random.choice(filter(lambda x: x!=i,s)) for k in range(9): a[k][i],a[k][j]=a[k][j],a[k][i] self.a=deepcopy(a) #print self.prov(a) #print "solution "+''.join([''.join(i) for i in a]) t=0 k=random.randint(30,60) while t!=k: i=random.randint(0,8) j=random.randint(0,8) if a[i][j]!='_': a[i][j]='_' t+=1 self.field=deepcopy(a) self.game=deepcopy(a) def prov(self, a): b=[0]*27 for i in range(9): for j in range(9): b[i]+=int(a[i][j]) b[9+j]+=int(a[i][j]) b[18+(i/3)*3+j/3]+=int(a[i][j]) return b.count(45)==27 def restart(self): self.game=deepcopy(self.field) def check(self,x,y,t): a=self.game gor=a[x-1] ver=[a[k][y-1] for k in range(9)] i,j=((x-1)/3)*3,((y-1)/3)*3 sq=[a[i][j],a[i][j+1],a[i][j+2],a[i+1][j],a[i+1][j+1],a[i+1][j+2],a[i+2][j],a[i+2][j+1],a[i+2][j+2]] return not(t in gor or t in ver or t in sq) def final_check(self): return ''.join([''.join(i) for i in self.game]).find('_')==-1 def full(self, m): a=[[''for j in range(9)]for i in range(9)] for i in range(9): for j in range(9): if self.field[i][j]==m[i*9+j] or self.field[i][j]=='_': a[i][j]=m[i*9+j] else: return "Error" if self.prov(a): self.game=deepcopy(a) return "Wow!!!" else: return "Error" def step(self,x,y,t): if self.field[x-1][y-1]=='_' and self.check(x,y,t): self.game[x-1][y-1]=t return "Nice step" return 'Impossible step' def write(self, client): a=self.game[:][:] s='' for i in range(9): if i%3==0: s+='-------------\n' s+='|'+''.join(a[i][0:3])+'|'+''.join(a[i][3:6])+'|'+''.join(a[i][6:9])+'|\n' s+='-------------\n' client.send(s) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('', PORT)) sock.listen(10) signal.signal(signal.SIGCHLD, signal.SIG_IGN) while 1: client, addr = sock.accept() if os.fork() == 0: break client.close() sock.close() f = Sudoku() client.send( """Have a nice time with sudoku Format: a) "[1-9] [1-9] [1-9]" - coords and input digit b) "solution [1-9]{81}" - full solution Other: "restart" to start current game again "[QqXx]" to exit """) def handle(line): if len(line) < 1: return (True, None) if len(line) == 1 and line[0] in "qxQX": return (False, "Bye") global f if line=='restart': f.restart() return (True,'Start again') m = re.match("^solution [1-9]{81}$",line) if m != None: m=re.findall("[1-9]{81}",line)[0] return(True, f.full(m)) m = re.match("^[1-9] [1-9] [1-9]$",line) if m != None: m=re.findall("[1-9]",line) return (True, f.step(int(m[0]),int(m[1]),m[2])) return (True, "Error input") data = "" client.settimeout(Timeout) games=0 try: while 1: if f.final_check(): games+=1 f = Sudoku() if games==100: client.send("the flag is: "+FLAG+"\n") sys.exit(0) client.send("Solved!!! Have a fun and finally you will get a flag\n") f.write(client) data=client.recv(4096) if len(data)==0: sys.exit(0) cont, msg = handle(data.replace('\n','')) if msg!=None: client.send(msg + "\n") if cont==False: client.close() sys.exit(0) except socket.timeout: client.send("So sloooow\n"+slow+"\n") sys.exit(0) sys.exit(0)