top of page

רעננו את הדף והקליקו למעבר לנושא הבא:

אתגר מספרים ראשוניים

Jan 1, 2019
4 min read

בפורום הצגנו את החידה הבאה - בתוך ריבוע קסם הכולל תשעה תאים (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]


התוכנית מניבה את כל שמונת הפתרונות שהם למעשה פתרון אחד עם סיבוב של הריבוע כל פעם לצלע אחרת ועם תמונת ראי






 
 
 

Related Posts

See All
הספריה operator

הספריה operator מאפשרת שורה של פונקציות המקבילות לאופרטורים ההשוואתיים והאחראים לפעולות המתמטיות, המובנים בפייתון (כמו שווה, גדול, קטן,...

 
 
 

4 Comments



andti yuma
2 days ago

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

Like

andti yuma
2 days ago

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

Like

הסבר ממש מעניין על שילוב בין מתמטיקה לתכנות. מה שמרשים כאן הוא לא רק מציאת ריבוע הקסם עצמו, אלא הדרך שבה מצמצמים בעיה שנראית כמעט בלתי אפשרית מבחינת כמות האפשרויות. במקום לתת למחשב לבדוק מיליארדי צירופים, משתמשים בהיגיון מתמטי כדי להוריד מראש אפשרויות שלא יכולות לעבוד.

הדגש על עבודה נכונה עם רשימות בפייתון חשוב מאוד גם למתכנתים מתחילים. הרבה פעמים בעיות עם מצביעים והעתקות של אובייקטים גורמות לתוצאות לא צפויות, והבנה של פעולות כמו יצירת העתק עצמאי יכולה לחסוך שעות של איתור תקלות.

זה בדיוק היופי של תכנות טוב — לא רק לכתוב קוד שעובד, אלא לחשוב איך לגרום לו לעבוד בצורה חכמה ויעילה יותר. שילוב של אלגוריתמיקה, רקורסיה והבנה מתמטית הופך חידות כאלה לתרגיל מצוין בלמידה. אפשר למצוא גם…

Like
Single Post: Blog_Single_Post_Widget
bottom of page