ב-Online
 
 
 
 
 
 
 
לפרק את הבייט 
איזה יום היום? 
 
 לוח שנה במחשב    צילום: פליקר, dougww, רשיון CC by    
לפרק את הבייט |
 
עידו גנדל

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

 
 
 
 
 
 
 
 
 
 
סלחי לי, איזה יום היום?
 סלחי לי, איזה יום היום? 
 צילום: GettyImages 
 
לפניכם שאלה בתכנות, ואפילו לא נדירה במיוחד: האם ניתן לכתוב פונקציה שמקבלת כקלט תאריך חוקי (שנה, חודש ויום לפי הלוח הלועזי) ומחזירה מספר יחיד, בין 1 ל-7, שמייצג את היום בשבוע? לדוגמה, הקלט 3/11/2008 יפיק פלט 2, כלומר יום שני. לכאורה מדובר בחישוב מורכב מעט אך אפשרי בהחלט. בפועל, אם אנו מעוניינים בפונקציה שתהיה מדויקת לחלוטין עבור כל תאריך שהוא, נגלה מהר מאד שהדבר אינו אפשרי כלל, ולא מטעמים חישוביים אלא מסיבות היסטוריות.
 

החישוב הבסיסי והשנה המעוברת

 
בשנה "רגילה", כל חודש מכיל 31 או 30 יום פרט לפברואר בו יש 28 ימים. אם נדע איזה יום בשבוע היה היום הראשון בשנה, נוכל בקלות להוסיף לו את מספר הימים שעברו ממנו ועד לתאריך היעד, לחלק בשבע, להוסיף לשארית את היום-בשבוע של תחילת השנה ולהוציא כפלט את התוצאה (או את התוצאה מינוס שבע, אם היא גדולה משבע). לדוגמה, התאריך 1/1/2007 נפל על יום שני. עד לתאריך 3/1/2007 עברו יומיים. שארית מחלוקה בשבע – שתיים, פלוס יום שני המקורי, והתוצאה היא 4 – יום רביעי. עד ל-23/4/2007, לעומת זאת, עברו ינואר (31 יום), פברואר (28) ומרץ (שוב 31), ועוד 23 ימים באפריל – סה"כ 113, אבל צריך להפחית אחד כי היום הראשון בשנה גם הוא חלק מינואר. 112 חלקי 7 נותן שארית אפס, ועוד שתיים – יום שני.

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

אנו רגילים לומר שיש 365 ימים בשנה, ואם נסכם את מספר הימים בחודשים השונים נראה שזהו אכן הסכום. הבעיה היא שהשנה האמיתית, כלומר הזמן שלוקח לכדור הארץ לחזור לאותה נקודה בדיוק במסלולו סביב השמש, היא ארוכה יותר ברבע יום כמעט. לכן, בתוך ארבע שנים בספירה רגילה, נגלה שלוח השנה מפגר ביום שלם אחרי השנה האמיתית. לשם כך מוסיפים, אחת לארבע שנים, את ה-29 בפברואר שמאזן את הסטיה הזו.
 
רגע, אז כמה ימים יש בשנה?
 רגע, אז כמה ימים יש בשנה?   צילום: פליקר, wili_hybrid, רשיון CC by 
 
 

לוח יוליאני, לוח גריגוריאני

בקיצור, אם אתם רוצים לחשב יום בשנה שאחרי 1582 - הסתבכתם. לוח שנה
 בקיצור, אם אתם רוצים לחשב יום בשנה שאחרי 1582 - הסתבכתם. לוח שנה 
 צילום: פליקר, chaojikazu, רשיון CC by 
 
זהו, למעשה, לוח השנה היוליאני שהוכרז על ידי יוליוס קיסר ונכנס לתוקפו בשנת 45 לפני הספירה – אם כי אז, כמובן, עדיין לא ספרו את השנים לפי הספירה הנוצרית, שהגיעה מאוחר יותר. לוח זה שירת את העולם המערבי נאמנה למשך אלף ושש-מאות שנים כמעט, וכדי שהפונקציה שלנו תהיה מדויקת היא צריכה להתחשב בו, לבדוק כמה שנים מעוברות חלפו בין תאריך הבסיס הידוע לבין תאריך היעד המבוקש, ולהוסיף ימים בהתאם. לשמחתנו, השנים המעוברות הן פשוט אלה שמתחלקות בארבע.

אבל הסיפור לא נגמר כאן, משום שאורך השנה האמיתית אינו בדיוק 365.25 ימים אלא קצת פחות, משהו כמו 365.242374. כל 29 בפברואר גורם ללוח השנה היוליאני למהר ב-0.03 ימים, או 43.2 דקות. לא הפרש ניכר, אבל מצטבר. הדבר הורגש במיוחד בחג הפסחא הנוצרי, שנחגג בליל הירח המלא הראשון שאחרי ה-20 במרץ (אחד משני ימי השוויון בין אורך היום לאורך הלילה). חג זה קשור באופן הדוק לעונת האביב ומועדו המדויק מחושב, כאמור, לפי הירח ולא לפי לוח השנה שמבוסס על השמש. הבעיה היתה שבגלל ההפרש הנ"ל, החג הלך ונדד מטווח התאריכים המקובל במידה מסוכנת. בשנת 1582 קם האפיפיור גרגוריוס ה-13 והחליט לתקן את לוח השנה.

הלוח החדש, ה"גריגוריאני", ביטל את השנה המעוברת בשנים שמתחלקות במאה, פרט לשנים שמתחלקות בארבע-מאות. משום כך, ה-29 בפברואר של שנת 2000 היה מאורע יוצא דופן שקורה אחת לארבע-מאות שנה. התיקון הזה פיגר, ביחס ללוח היוליאני, בשלושה ימים כל ארבע-מאות שנה – כמעט בדיוק הזמן העודף שהצטבר בו. הלוח הגריגוריאני מדויק עד כדי כך, שלא יהיה עוד צורך לשנותו לעולם מפני שהסטיות בו קטנות יותר מהסטיות שנגרמות משינויים במסלול של כדור הארץ עצמו. הפונקציה שלנו תצטרך לקחת זאת בחשבון ולחשב לפי הלוח הגרגוריאני לתאריכים שאחרי 1582, ולפי הלוח היוליאני לתאריכים מוקדמים יותר.
 

הימים שלא היו

מקפיצים ימים, מעברים שנים, מחסירים ומכפילים - אז מה התאריך היום?
 מקפיצים ימים, מעברים שנים, מחסירים ומכפילים - אז מה התאריך היום? 
 צילום: אייקון לוח השנה באייפון 
 
עם זאת, הבעיה של הימים העודפים עדיין נותרה ולכן, בנוסף על שינוי אופן החישוב של לוח השנה, הוחלט להקפיץ את התאריך באופן חד פעמי עשרה ימים קדימה. האנשים הלכו לישון ביום חמישי, הרביעי באוקטובר 1582, והתעוררו ביום שישי ה-15 בחודש. הסתכלו על יומן הפגישות והאירועים שלכם ותבינו עד כמה צעד כזה הוא בעייתי, במיוחד בתקופה ההיא, כשלא היו מיילים וטלפונים כדי לתאם שינויים על המקום. וכאן מתברר שהתשובה לשאלה ששאלנו בתחילת הטור דווקא שלילית, מפני שהפונקציה אינה יכולה לתת פלט נכון עבור הימים החסרים הללו. עלינו להוסיף לה את האפשרות של תאריך לא קיים.

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

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

פתרונות חלקיים

קשה מאד, אולי אפילו בלתי אפשרי, ליצור פונקציה אוניברסלית שתסיק את היום בשבוע מתוך תאריך לועזי. בעולם המחשבים, בעיה זו נפתרה בצורה האלגנטית ביותר: התעלמות. פונקציות קיימות פשוט מגבילות את טווח התאריכים שהן בודקות (למשל ב-Excel), או מחשבות לפי הלוח הגריגוריאני כאילו התקיים מאז ומעולם בכל מקום. זה טוב ויפה לתאריכים מודרניים, אך אם אתם היסטוריונים שחוקרים מסמכים עתיקים, היזהרו לא לסמוך יותר מדי על המחשב: הדבר עלול להוביל אתכם לסתירות ולשיבושים מביכים עד הרסניים. אגב, גם אנשים שמסוגלים "לחשב תאריכים" עושים זאת בצורה מתמטית, לא על-טבעית, ולכן גם הם צפויים לטעות במקרים הקיצוניים שהזכרנו.
 
ומה לגבי לוחות אחרים, כגון הלוח העברי? לדברי ויקיפדיה, לוח זה נקבע סופית בשנת 359 לספירת הנוצרים והוא אמנם הפכפך יותר בטווח הקצר (אורך שנה אחת יכול לנוע בין 353 ל-385 ימים), אך ההפרשים מתקזזים לאורך מחזורים של 19 שנים ויוצרים שנה בת 365.24682 ימים. גם כאן יש הפרש זעיר ומצטבר לעומת השנה האמיתית. הפרש זה לא יפריע לחישוב הנכון של היום בשבוע, אבל ייתכן שבעתיד הוא יתגלה כבעייתי משום שחג הפסח – חג האביב – הולך ומתרחק לאיטו מהאביב.
 
בפעם הבאה נדבר על בעיה חמורה עוד יותר הקשורה לתאריכים ולמחשבים – באג אלפיים המפורסם, ועוד באגים אחרים ואיומים לא פחות שעוד מחכים לנו.
 
 
 
@@@@@@@@@@@@@@@@@@@ ilan @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
@@@@@@@@@@@@@@@@@@@ ilan @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 
תגובות
הוסף תגובה0 תגובות
הוספת תגובה
מאת
 
נושא
 
תוכן
 
 
 
 
תודה! תגובתך התקבלה.
התגובה תתפרסם בכפוף לתנאי האתר.
 
 
 
 
 

כל הזכויות שמורות 2011 © נענע 10 בע"מ
 
 
 
 
כל הזכויות שמורות © Nana10 בע"מ
Video powered by