#   Borus Benedek
#   9. évfolyam (9. c osztály)
#
#   Bonyhádi Petőfi Sándor Evangélikus Gimnázium és Kollégium
#   Bonyhád 7150, Kossuth Lajos u. 4
#
#   Feladat száma: I. 468.
#
#   A forrásállomány Windows 10 Home operációs rendszeren
#   Python 3.7.0 mellett készült és fordítható Python 3 bármely verziójában
#
#############################################################################


import urllib.request as url
from random import sample

def simulate(secret, guess):					# Ez a függvény "szimulálja", hogy adott szám esetén a tippre milyen válasz érkezne
	tgondolt = []								# Az ellenfel.php fájl alapján készített implementáció a szimuláció pontosságáért
	for i in range(6):
		tgondolt.append(0)
	for i in range(4):
		tgondolt[int(secret[i])-1] += 1
		

	tertek = []
	for i in range(6):
		tertek.append(0)
	for i in range(4):
		tertek[int(guess[i])-1] += 1
	
	johelyen = 0
	for i in range(4):
		if secret[i] == guess[i]:
			johelyen += 1

	bennevan = 0
	for i in range(6):
		bennevan += min(tertek[i], tgondolt[i])
		
	szerepelmeg = bennevan - johelyen
	
	return (johelyen, szerepelmeg)

possible = set(str(n1) + str(n2) + str(n3) + str(n4) for n1 in range(1,7) for n2 in range(1,7) for n3 in range(1,7) for n4 in range(1,7)) # a lehetőségek listája
results = [(right, wrong) for right in range(5) for wrong in range(5 - right) if not (right == 3 and wrong == 1)] # a lehetséges válaszok listája; a valószínűség számításában játszik majd szerepet

_guess = '1111'


def attempt(S, first=False):					# Rekurzív függvény, amely elvégzi a feladatot (a Knuth öt tipp algoritmusa alapján)
	global _guess
	
	if first:									# Knuth az '1122' számot ajánlja kezdőlépésnek, mivel így sokkal kevesebb tipp szükséges a szám kitalálásához
		a = '1122'
	elif len(S) == 1:							# Ha egy lehetőség maradt rögtön ugrunk a rákérdezésre, mert biztosan a megmaradó szám a megoldás
		_guess = S.pop()
		return
	else:
		a = sample(possible, 1)[0]				# A megmaradt lehetőségek közül véletlenszerűen választ
		#a = max(possible, key=lambda x: min(sum(1 for p in S if simulate(p, x) != res) for res in results)) # ez egy lassabb de biztosabb lehetőség: azt a számot választja ki, amelyik válasza a legtöbb másik számot zárna ki
	_guess = a									# Elmenti a tippet késöbbi használatra
	sc = requestAttempt(a)						# Elküldi a megtippelt számot a másik számítógépnek
	
	if sc != (4, 0):							# ha a visszaérkezett válasz 4 0 akkor nyertünk, nincs szükség további tippelgetésre
		S.difference_update(set(p for p in S if simulate(p, a) != sc))	# az algoritmus alapja; a visszaérkezett válasz alapján kiszűri azokat a számokat, amelyek NEM lehetnek megoldások, ha a tippre a kapott választ kapta
		attempt(S)								# meghívja újra a fügvényt (rekurzió) és átadja a megmaradt lehetőségek listáját

def requestAttempt(a):							# a függvény egy GET típusú kérelemben elküldi a tippet a kiszolgálónak majd a kapott választ feldolgozza
	sc = url.urlopen("http://localhost/mm/ellenfel.php?muvelet=kerdes&ertek="+str(a)).read().decode().strip()
	return (int(sc[0]), int(sc[2]))

	

url.urlopen("http://localhost/mm/ellenfel.php?muvelet=kezdes").read() # Jelzi a számítógépnek, hogy készen áll a játékra	
attempt(possible, True)							# elindítja az algoritmust
url.urlopen("http://localhost/mm/ellenfel.php?muvelet=rakerdezes&ertek="+str(_guess)).read() # az algoritmus végeztével rákérdez a számra a legutolsó tippel