אפליקציה יחסית חדשה (עכשיו אמצע 2021) משחק שבו צריך למיין כדורים בתוך מבחנות כך שבסוף המשחק במבחנות רק כדורים באותו צבע. מותר להעביר כדור למבחנה ריקה או למבחנה שאינה מלאה ושהכדור העליון בתוכה זהה לכדור שמעבירים לתוכה.
זה הקוד שלנו:
from copy import deepcopy
Grid=[[2,3,2,1],[2,3,4,1],[1,3,5,5],[4,5,3,2],[4,1,5,4],[],[]]
# 1=red, 2=purple, 3=green, 4=blue, 5= yellow
def MovePossibilities (alltubes):
g=deepcopy(alltubes)
possgrid=[]
grids=[]
for ind,t in enumerate (g):
for i, o in enumerate(g):
if i!=ind:
if len(t) > 0 and len(o) < 4 and (len(o) == 0 or t[-1] == o[-1]):
possgrid.append([ind,i])
for i in possgrid:
g[i[1]].append(g[i[0]].pop())
grids.append(g)
g=deepcopy(alltubes)
return grids
def Complete(tube):
state=0
if len(tube)==0 or (len(tube)==4 and tube[0]==tube[1]==tube[2]==tube[3]):
state=1
return state
def Check (grid):
for tube in grid:
if Complete(tube)==1:
continue
else: return 0
return 1
glib=[]
def Solve (grid):
global glib
if Check(grid):
print("Finished:")
for t in grid:
print(t)
print("Very Good!")
quit()
for g in (MovePossibilities(grid)):
if g not in glib:
glib.append(g)
print(g)
Solve(g)
Solve(Grid)
הצלחתי גם ברמה 45 - זה היה יותר קשה למחשב כי הגיע למקסימום עומק רקורסיה (אלף מחזורים) בדוגמא שלהלן נראה איך אפשר למתוח את גבול עומק הרקורסיה כדי לקבל קצת יותר כוח:
הקוד:
from copy import deepcopy #זה מיועד להעתקה של רשימות בתוך רשימות import sys #זה על מנת להגדיל את מחזורי הרקורסיה sys.setrecursionlimit(1000) Grid=[[10,7,1,10],[1,5,7,10],[6,2,2,1],[3,4,10,4],[8,7,5,3],[7,1,6,2],[5,4,3,4],[3,5,8,8],[2,6,8,6],[],[]] #Grid זה שורת המבחנות שלנו כאשר כל מספר מייצג צבע # מספרי הצבעים בצילום def MovePossibilities (alltubes): """ הפונקציה הזאת מסייעת לנו למצוא את כל האפשריות השונות להעביר כדור אחד ממבחנה אחת לאחרת """ g=deepcopy(alltubes) possgrid=[] #לכאן נזרוק את כל הצירופים של זוגות מבחנות שכדורים יכולים לעבור מאחת לאחרת grids=[] #כאן אנו אוספים את כל המציאויות (שבע מבחנות בכל מציאות) האפשריות כתוצאה ממה שלמדנו קודם for ind,t in enumerate (g): for i, o in enumerate(g): if i!=ind: if len(t) > 0 and len(o) < 4 and (len(o) == 0 or t[-1] == o[-1]): possgrid.append([ind,i])#אנו אוספים רק את האינדקסים של המבחנות שמזיזות כדורים for i in possgrid: g[i[1]].append(g[i[0]].pop()) grids.append(g)#לכאן מצרפים סטים של 7 מבחנות אפשריות בכל פעם g=deepcopy(alltubes)#זה מאפשר לאפס את התמונה על מנת שנמשיך בסדר שקבענו מראש מהמציאות הראשונה return grids def Complete(tube):#בודק אם מבחנה מושלמת = ריקה או עם ארבעה כדורים באותו צבע state=0 if len(tube)==0 or (len(tube)==4 and tube[0]==tube[1]==tube[2]==tube[3]): state=1 return state def Check (grid):#בודק אם סט מבחנות מושלם for tube in grid: if Complete(tube)==1: continue else: return 0 return 1 glib=[] #את זה חייבים כי אחרת מקבלים אופציות שחוזרות על עצמן כדור עובר בלי סוף ממבחנה לאחרת ובחזרה def Solve (grid): global glib if Check(grid): print("Finished:") for t in grid: print(t) print("Very Good!") quit() for g in (MovePossibilities(grid)): if g not in glib:#זה כאמור לעיל כדי שלא יהיה לופ אינסופי של אופציות גרועות שחוזרות על עצמן בלי סוף glib.append(g) print(g) Solve(g) Solve(Grid)