חידת N מלכות בגרסה קצת שונה

גרסה קצת שונה לחידת N מלכות המפורסמת:
בלוח של 5 על 5 יש להציב 3 מלכות ו 5 מלכים מבלי שאף מלך יהיה מאויים (כל מלכה על משבצת שונה)

הקוד שלי
import itertools

board = [[0] * 5] * 5
board_options = []
a = list(range(5))
for i in a:
    for j in a:
        board_options.append((i, j)) 

three_queens = list(itertools.combinations(board_options, 3))

new = {}
for point in three_queens:
    for q in board_options:
        if q not in point:
            if q[0] != point[0][0] and q[0] != point[1][0] and q[0] != point[2][0]:
                if q[1] != point[0][1] and q[1] != point[1][1] and q[1] != point[2][1]:
                    if abs(q[0] - point[0][0]) != abs(q[1] - point[0][1]):
                        if abs(q[0] - point[1][0]) != abs(q[1] - point[1][1]):
                            if abs(q[0] - point[2][0]) != abs(q[1] - point[2][1]):
                                if point in new:
                                    new[point] += 1
                                else:
                                    new[point] = 1
for i, j in new.items():
    if j > 4:
        print(i, j)

אשמח גם להצעות ייעול או הערות לגבי הקוד שכתבתי

הנקודות הכי חשובות:

  1. לפצל לפונקציות
  2. להקפיד על שמות משתנים
  3. לחזור על החומר של iterables, אתה ממיר הרבה פעמים דברים לרשימות כשאין בכך צורך

זה סופר מסוכן – אתה יוצר 5 רשימות זהות בזיכרון. גם לא השתמשת במשתנה עצמו אח"כ

הקפד על שמות משתנים. כמו כן אין סיבה להמיר את a לרשימה

ניתן לכתוב את כל הקוד הזה כ־`board_options = [(i, j) for i in range(5) for j in range(5)]

כנ"ל – אין סיבה להמיר לרשימה

אם הגעת לרמת הזחה כזו – משהו בעייתי. צריך לחשוב על איך משפרים את הלוגיקה, מה מוציאים לפונקציות או מה חוזר על עצמו ואפשר להוריד.
לדוגמה:

  1. אפשר להוציא את כל התנאים האלו לפונקציה
  2. אפשר לעשות ביניהם and
  3. אפשר להכניס את ה־3 הראשונים ל־for אחד, ואת ה־3 האחרונים ל־for שני.

זה מרפרוף קצר, אחרי שתתקן יהיה אפשר לתת עוד פידבק :slight_smile:

3 לייקים