אתגר מספרים ראשוניים
בפורום הצגנו את החידה הבאה - בתוך ריבוע קסם הכולל תשעה תאים (3X3) צריך לשבץ תשעה מספרים ראשוניים שונים (בין 0 ל-100 כולל המספר 1 שלא ברור למתמטיקאים אם הוא גם נחשב למספר ראשוני), באופן שכל שורה בריבוע, כל טור וכל אלכסון יהיה סכומם שווה ל- 111. לאחר שבונים פונקציה ליצירת כלל המספרים הראשוניים (אחת האפשרויות) מופיעה במדריך שלנו בפרק העוסק ברקורסיה, אנו מגלים שיש 26 אפשרויות שונות - [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
אנו זקוקים בסך הכל לתשעה מספרים. החידה מסקרנת ורוצים לפתור אותה מהר, לכן מייבאים את הספרייה itertools ומבקשים לייצר את כל האפשרויות (permutations) לתשעה מספרים מתוך 26 כאשר התשעה יכולים להיות גם אותם תשעה במיקומים שונים. כמה אפשרויות המחשב צריך לייצר לנו ? הנוסחה היא !26 לחלק ב- !(26-9) התוצאה היא 1,100,000,000,000 - גם אם המחשב שלכם מאוד מהיר, זה הרבה מאוד זמן לסיים את כל האפשרויות האלה, על זה תוסיפו את הסיפור שפייתון היא סביבת עבודה שלמה ונעדרת הידור (קומפילציה) ולכן מעט יותר איטית מתוכנות אחרות וקיבלתם נצח. ניסיון לברוח לרקורסיה גם הוא לא יניב תוצאות מהירות וטובות עם כל כך הרבה אפשרויות. ולכן אין מנוס מלשבת ולכתוב קוד שיצמצם לנו בכל פעם את מספר הפתרונות האפשריים באופן משמעותי. אם אנו יודעים למשל שהמספר הגדול ביותר ברשימה הוא 97 זה אומר לנו שסכום שני מספר שכנים לא יכול להיות קטן מ-14 משום שאז גם אם נוסיף את המספר הגדול ביותר שלנו, 97, לא נגיע ל- 111; כמו כן, סכומם של שני מספרים לא יכול לעלות על 110 משום שלא נותר מקום למספר שלישי בשורה בטור או באלכסון . וכאשר יש לנו כבר שני מספרים שכנים השלישי צריך להשלים ל- 111. עם הנתונים הללו או משתמשים באיטרציה באמצעות לולאות for הרצה על האפשרויות שלנו (רשימת המספרים הראשוניים), מחפשת אפשרויות יותר מדויקות עבורנו. ובכל סיבוב שאנו עוברים למספר הבא, מורידים מהרשימה את המספרים שכבר השתמשנו בהם. לכן, למרות שיש כל כך הרבה אפשרויות, כאשר יש לי שני מספרים בשורה ואני מחפש את השלישי - כאן יש לי רק אפשרות אחת - זו המשלימה ל- 111. למטה ישנו פתרון הדומה לפתרון של טבע מהפורום שלנו, תשומת ליבכם לכך, למי שירצה לנתח את הקוד, שבכל פעם שאנו משלימים סיבוב לגבי מספר בלוח שלנו, אנו עושים את הסיבוב הבא על רשימת הראשונים (פחות אלה שכבר השתמשנו בהם).
זה החלק הראשון של הקוד -
def primes(n):
""" prime numbers from 1 to n """
listPrime=[]
for num in range(1,n):
for other in range(2,num):
if num%other==0:
break
else:
listPrime.append(num)
return listPrime
potentials=primes(100) board=[0 for i in range(9)] #זו רשימת המספרים הראשונים
בחלק השני של הקוד כדאי לשים לב לשימוש ב- [::]potentials הפעולה הזאת מסמלת ברשימה לעבור על הפריטים מהתחלה עד הסוף, אבל חשוב מזה, היא מייצרת אובייקט חדש שלא תלוי בשינויים של רשימת הראשוניים שלנו בסיבוב הראשון. אם לא נוסיף את הסימן הזה [::] התוכנית לא תעבוד כמו שצריך, משום שכל פעם שנשנה את הרשימה ברמה אחת, היא תשתנה גם ברמה אחרת, משום שבפייתון נעשה שימוש במצביעים, ולעיתים גם כשנדמה לנו שיצרנו רשימה חדשה, בעצם יצרנו רק מצביע חדש. הסימן הזה מאפשר לנו ליצור אובייקט בלתי תלוי ולהריץ את האיטרציה עליו (ההסבר לאיטרציה במדריך) באמצעות לולאת for.
board=[0 for i in range(9)] #זה ריבוע הקסם שלנו הכולל תשע משבצות for first in potentials[::]: #זו הלולאה הראשונה שלנו indx=potentials.index(first) board[0]=first potentials.remove(first) for second in potentials[::]: if (board[0] + second) > 13 and 111>(board[0] + second) : indx = potentials.index(second) board[1] = second potentials.remove(second) for third in potentials[::]: if (board[0] + board[1]+ third) == 111: indx = potentials.index(third) board[2] = third potentials.remove(third) for forth in potentials[::]: if (board[0] + forth) >13 and 111>(board[0]+ forth): indx = potentials.index(forth) board[3] = forth potentials.remove(forth) for fifth in potentials[::]: if 111 > (board[1] + fifth) and (board[1] + fifth)> 13 and (board[3] + fifth) >13 and (board[3] + fifth)<111 : indx = potentials.index(fifth) board[4] = fifth potentials.remove(fifth) for sixth in potentials[::]: if (board[3] + board[4]+sixth) == 111: indx = potentials.index(sixth) board[5] = sixth potentials.remove(sixth) for seventh in potentials[::]: if (board[0] + board[3] + seventh) == 111 and board[2]+board[4]+seventh==111: indx = potentials.index(seventh) board[6] = seventh potentials.remove(seventh) for eighth in potentials[::]: if (board[1] + board[ 4] + eighth) == 111: indx = potentials.index( eighth) board[7] = eighth potentials.remove(eighth) for last in potentials[::]: if (board[ 2] + board[ 5] + last) == 111 and board[0]+board[4]+last==111: indx = potentials.index( last) board[ 8] = last print(board) #מדפיסים פתרון כשיש לוח מלא potentials.insert(indx,eighth) #כאן מתחילים להחזיר מה שהוצאנו potentials.insert(indx,seventh) potentials.insert(indx,sixth) potentials.insert(indx,fifth) potentials.insert(indx,forth) potentials.insert(indx,third) potentials.insert(indx,second) potentials.insert(indx,first)
פתרון החידה -
[7, 73, 31, 61, 37, 13, 43, 1, 67] [7, 61, 43, 73, 37, 1, 31, 13, 67] [31, 73, 7, 13, 37, 61, 67, 1, 43] [31, 13, 67, 73, 37, 1, 7, 61, 43] [43, 1, 67, 61, 37, 13, 7, 73, 31] [43, 61, 7, 1, 37, 73, 67, 13, 31] [67, 1, 43, 13, 37, 61, 31, 73, 7] [67, 13, 31, 1, 37, 73, 43, 61, 7]
התוכנית מניבה את כל שמונת הפתרונות שהם למעשה פתרון אחד עם סיבוב של הריבוע כל פעם לצלע אחרת ועם תמונת ראי
https://www.heilpraxis-antinaspringer.de/post/10-super-foods-for-your-hormonal-balance
https://www.heilpraxis-antinaspringer.de/post/stress-and-digestion-10-things-you-should-know
https://www.heilpraxis-antinaspringer.de/post/wie-st%C3%A4rke-ich-meine-ressourcen-ein-kleiner-ausflug-in-das-geheimnis-unseres-nervensystems
https://www.heilpraxis-antinaspringer.de/post/copy-of-stress-and-digestion-10-things-you-should-know
https://www.florencelife.co/post/exploring-florence-delving-into-the-heart-of-the-renaissance
https://www.florencelife.co/post/top-5-gelato-places-in-florence-italy
https://www.florencelife.co/post/deciphering-the-uffizi-an-intimate-exploration-of-florence-s-art-sanctuary
https://www.florencelife.co/post/discover-the-charming-tuscan-towns-day-trips-from-florence
https://www.florencelife.co/post/amazing-sandwich-shops-you-must-try-in-florence-italy
https://www.pythonisrael.com/single-post/functools
https://www.pythonisrael.com/single-post/%D7%97%D7%99%D7%93%D7%AA-8-%D7%94%D7%9E%D7%9C%D7%9B%D7%95%D7%AA
https://mez.ink/langt77
https://mez.ink/lngit77
https://mez.ink/lngt77
https://mez.ink/langitlogin
https://mez.ink/langit77ye
https://mez.ink/langit77one
https://mez.ink/langit7777
https://mez.ink/playslt77
https://mez.ink/plyslt77
https://mez.ink/playslot7
https://mez.ink/play77slott
https://mez.ink/playslot77slot
https://mez.ink/berass
https://mez.ink/beras11ku
https://mez.ink/beras11wd
https://mez.ink/berassss11
https://donidarti.website3.me/
https://mez.ink/merdek777
https://mez.ink/merdka777
https://mez.ink/mrdeka777
https://mez.ink/merdeka
https://mez.ink/merdeka777slt
https://mez.ink/merdeka777link
https://mez.ink/merdeka777one
https://datrounnifretouyuu.website3.me/
https://troittutribroubu5017.website3.me/
https://mez.ink/dewi188ind
https://mez.ink/dewi188login
https://mez.ink/dewi188ku
https://mez.ink/dewi188wd
https://mez.ink/dewi188slot
https://mez.ink/pulsa303log
https://mez.ink/pulsa303ku
https://mez.ink/pulsa303bandung
https://mez.ink/pulsa303dki
https://patritolloubesh.website3.me/
https://mez.ink/pulsa_303
https://mez.ink/link_maxwin88
https://mez.ink/maxwin88_slot
https://mez.ink/maxwin88_top
https://mez.ink/maxwin88_ind
https://mez.ink/maxwin88_gacor
https://mez.ink/slot_maxwin88
https://mez.ink/maxwn88
https://mez.ink/mxwin88
https://maxx88.website3.me/
https://mez.ink/istana_777
https://mez.ink/istan777
https://mez.ink/istana777_1
https://mez.ink/istana777_2
https://mez.ink/istana777_3
https://magic.ly/ISTANA_777
https://magic.ly/SGO_777
https://mez.ink/sgo_777
https://magic.ly/SGO777_login
https://mez.ink/sgo777_3
https://sgo777.website3.me
https://mez.ink/sgo777sl_
https://mez.ink/sgo777_gacor
https://mez.ink/sgo777_indonesia
https://mez.ink/sgo777_1
https://magic.ly/KM_777
https://mez.ink/km_777
https://magic.ly/KM777slot
https://mez.ink/km777_slt
https://km7775.website3.me/
https://magic.ly/KM777off
https://mez.ink/km777win
https://magic.ly/KM777_gas
https://mez.ink/km777_gas
https://mez.ink/km777_aman
https://mez.ink/topcer33.
https://mez.ink/abc123.
https://mez.ink/nenogym.
https://mez.ink/domba33.
https://mez.ink/posjp33.
https://mez.ink/vip33.
https://mez.ink/sip33.
https://mez.ink/ultra33
https://mez.ink/hebat33
https://mez.ink/gacor33.
https://mez.ink/to188.
https://mez.ink/royal188.
https://mez.ink/royal188slot1
https://mez.ink/tkp188wd
https://mez.ink/tkp188slot
https://mez.ink/mami188slot
https://mez.ink/ormas188slot
https://mez.ink/makaiu
https://mez.ink/barat4dwd
https://mez.ink/desta4d
https://mez.ink/gofar4d
https://mez.ink/joki4dwd
https://mez.ink/bolu4d
https://mez.ink/jaka4d
https://mez.ink/bantul4d
https://mez.ink/asu4dlogin
https://mez.ink/bangka4dwd
https://mez.ink/wa4dslot
https://mez.ink/neo4dwd
https://mez.ink/garuda138wd
https://mez.ink/badak69wd
https://mez.ink/gajah138wd
https://mez.ink/buaya138wd
https://mez.ink/harta138wd
https://mez.ink/sawer138wd
https://mez.ink/vip555dp
https://mez.ink/vip555loh
https://mez.ink/mdg188slot
https://mez.ink/mgd188login
https://mez.ink/mega188slot
https://mez.ink/mega188wd
https://mez.ink/pvjbet4
https://mez.ink/pvjbet5
https://mez.ink/pvjbet6
https://mez.ink/pvjbetmacau
https://mez.ink/pvjbetlink
https://mez.ink/pvjbetslot
https://magic.ly/pvjbet
https://mez.ink/pvj.bet
https://mez.ink/garudaplay88
https://mez.ink/garudaplay.88
https://mez.ink/wau.hugo123
https://mez.ink/link.hugo123
https://mez.ink/wa.hugo123
https://mez.ink/resmi.hugo123
https://mez.ink/playwn123
https://mez.ink/linkhugo123
https://mez.ink/linkplaywin123
https://mez.ink/playwin.123
https://mez.ink/dolar.138
https://mez.ink/link.dolar138
https://mez.ink/wd.dolar138
https://mez.ink/offc.dolar138
https://mez.ink/gacor.77
https://mez.ink/gacor77indonesia
https://mez.ink/gacor77.
https://mez.ink/gacor77link
https://mez.ink/ps123
https://mez.ink/playslt123
https://mez.ink/playslot.123
https://mez.ink/sedap666
https://mez.ink/sedap.666
https://mez.ink/sedap666id
https://mez.ink/sedap666.link
https://mez.ink/larisbet.303
https://mez.ink/lrisbet303
https://mez.ink/larisbt303
https://mez.ink/lsbet303
https://mez.ink/hoki666ih
https://mez.ink/hoki6666
https://mez.ink/hokii666
https://mez.ink/pasar.88
https://mez.ink/pasar88.
https://mez.ink/psar88
https://mez.ink/pasarrr88
https://mez.ink/alam88.
https://mez.ink/alamm88
https://mez.ink/pasaar88
https://mez.ink/markisawin
https://mez.ink/markisawinofc
https://mez.ink/markisawinindonesia
https://mez.ink/markisawin1
https://mez.ink/marksiawin2
https://mez.ink/marksiawinslot
https://mez.ink/markisa.win
https://mez.ink/idrhok
https://mez.ink/idrhki
https://mez.ink/idrhokii
https://mez.ink/idrkokiii
https://mez.ink/botk123
https://mez.ink/botak123wd
https://mez.ink/btak123
https://mez.ink/botakk123
https://mez.ink/putralangit88
https://mez.ink/putralangt88
https://mez.ink/putralangitt88
https://mez.ink/putrlangit88
https://mez.ink/ptralangit88
https://mez.ink/tempoo123
https://mez.ink/tempo123news
https://mez.ink/tempo123nih
https://mez.ink/tempo123id
https://mez.ink/tempo123doloe
https://magicly.bio/linkRUPIAH777
https://mez.ink/link.rupiah777
https://mez.ink/rupiah_777
https://magicly.bio/RUPIAH_777
https://mez.ink/rp777_jos
https://mez.ink/rupiah777_indonesia
https://mez.ink/rupiah777_idn
https://mez.ink/ruph777
https://mez.ink/mimi303
https://magicly.bio/MIMI303_offc
https://magicly.bio/RTPMIMI303
https://mez.ink/mimi303official
https://mez.ink/mimi303slot
https://mez.ink/mimi303_login
https://mez.ink/mimi303_1
https://mez.ink/link_prima77
https://rupiah777.website3.me/
https://mez.ink/prim77
https://mez.ink/link.prima77
https://mez.ink/situs.prima77
https://mez.ink/situsgacorprima77
https://mez.ink/prima77.slot
https://mez.ink/lotus.303
https://mez.ink/1.lotus303
https://mez.ink/lots303
https://mez.ink/lotus303.wadidauw
https://mez.ink/web.lotus303
https://mez.ink/prda188
https://mez.ink/.prada188
https://mez.ink/1.prada188
https://mez.ink/303prada
https://mez.ink/linkmega288
https://mez.ink/km777link
https://mez.ink/pasar123nih
https://mez.ink/pasar123slot
https://mez.ink/fonix3388link
https://mez.ink/slotonlinee
https://mez.ink/sltonline
https://mez.ink/slottonline
https://mez.ink/slotagcor
https://mez.ink/fonix3388slot
https://mez.ink/arwana123
https://mez.ink/sayangbet
https://mez.ink/jago11link
https://mez.ink/angkasa189login
https://mez.ink/dewi11jp
https://mez.ink/dewi11ku
https://mez.ink/dewi11slot
https://mez.ink/dewi.11
https://mez.ink/dewil11ogin
https://mez.ink/dewi11login
https://mez.ink/situsdewi
https://mez.ink/asihoki
https://mez.ink/asiahokigacor
https://mez.ink/asiahokiii77
https://mez.ink/asiahokijos
הסבר ממש מעניין על שילוב בין מתמטיקה לתכנות. מה שמרשים כאן הוא לא רק מציאת ריבוע הקסם עצמו, אלא הדרך שבה מצמצמים בעיה שנראית כמעט בלתי אפשרית מבחינת כמות האפשרויות. במקום לתת למחשב לבדוק מיליארדי צירופים, משתמשים בהיגיון מתמטי כדי להוריד מראש אפשרויות שלא יכולות לעבוד.
הדגש על עבודה נכונה עם רשימות בפייתון חשוב מאוד גם למתכנתים מתחילים. הרבה פעמים בעיות עם מצביעים והעתקות של אובייקטים גורמות לתוצאות לא צפויות, והבנה של פעולות כמו יצירת העתק עצמאי יכולה לחסוך שעות של איתור תקלות.
זה בדיוק היופי של תכנות טוב — לא רק לכתוב קוד שעובד, אלא לחשוב איך לגרום לו לעבוד בצורה חכמה ויעילה יותר. שילוב של אלגוריתמיקה, רקורסיה והבנה מתמטית הופך חידות כאלה לתרגיל מצוין בלמידה. אפשר למצוא גם…