כמו כל כישור ויכולת (חוץ מאשר רכיבה על אופניים…), גם היכולת לתכנת פוחתת כשלא עושים בה שימוש ולא מתרגלים אותה. זה יכול להתבטא באופן טריוויאלי, כמו לשכוח שם או תחביר של פונקציית ספריה מסוימת, או באופנים מהותיים יותר. לאחרונה, למרות התכנות של לוחות הארדואינו לפרויקטים שונים, הרגשתי צורך להסיר קצת חלודה מעל יכולות התכנות שלי ו"לחזור לכושר". השיטה פשוטה: לבחור בעיות תכנות שונות ומשונות, מהרשת או מכל מקור אחר, ולנסות להתמודד איתן. רוצים גם?
פוסט זה מתחיל את הסדרה לתיעוד של בעיות תכנות שאני מוצא ומנסה לפתור, בכלים שונים לפי איך שצריך או מתחשק. הכוונה לבעיות שונות מאלה שפיתוח למיקרו-בקרים נוטה להציב בפני המפתח: בעיות מופשטות יותר ומורכבות יותר, כאלה שאינן תלויות בפלטפורמה או בשפה ספציפית. כמובן, אני עשוי לבחור גם בבעיות טריוויאליות (כידוע, אף אחד אינו חסין מטעויות, גם בדברים הפשוטים) או מוכרות מאד. אין לי צורך בינתיים בהפניות ומקורות – יש די והותר תרגילים בתכנות בכל פינה. אתם מוזמנים פשוט לעקוב אחרי הפוסטים הללו ולנסות להתמודד עם התרגילים בעצמכם.
שימו לב: כדי למנוע עניין של ספוילרים, לא יפורסמו בתגובות פתרונות או כיוונים לפתרון! התגובות המותרות הן רק הערות כלליות, שאלות הבהרה ודברים אחרים שאינם קשורים לפתרון. כל חידת תכנות תישאר ללא מענה עד לפוסט הבא בסדרה, אז אפרסם את הפתרון שלי (או לפחות את העיקרון שעליו הוא מבוסס) ואתם תוזמנו להוסיף משלכם.
חידת התכנות הראשונה, שפתרתי זה עתה על מחשב הלינוקס שלי, בשפת Object Pascal (סביבת הפיתוח FPC/Lazarus), מופיעה ברמז בכותרת: ממיר מספרים מייצוג עשרוני לרומי ולהיפך. חשבתי על התרגיל הזה בעקבות הערה שנזרקה סתם כך בספר Algorithms + Data Structures = Programs שאני קורא כעת. למי שלא מכיר את הייצוג הרומי, הנה הסבר והנה דוגמאות. הממיר מקבל כקלט מחרוזת, מפענח לבד אם מדובר במספר עשרוני או רומי, ומוציא את התשובה בייצוג האחר. אין צורך לבדוק את תקינות הקלט, ואפשר להניח שטווח המספרים הוא 1-3999. בהצלחה!
לא הבנתי כלום!!!!!!!!!! 🙁
בקיצור, כתוב תוכנה שמסוגלת להמיר מספרים מייצוג רומי לייצוג עשרוני ולהיפך. יש לינקים עם הסברים ודוגמאות לקראת סוף הפוסט. בהצלחה!
מעניין, במקרה ראיתי מישהו אחר לפני שבועיים שקיבל בדיוק את אותו אתגר (כולל ההנחה של 4000 כערך מירבי). אני מעריך שהאתגר הגיע מאותו מקור (גם אם בדרך עקיפה, כי אתה אומר שמדובר בהערת אגב בספר).
בכל מקרה, הנה הערה רלוונטית – למרות שיש דרך מקובלת לכתוב מספרים בייצוג רומי, ניתן לכתוב אותם גם בדרכים אחרות (למשל 4 יכול להיות IV או IIII). אלגוריתם מלא ידע להמיר גם מספרים כאלה, למרות שניתן גם להניח שהקלט מגיע בפורמט המקובל, כמו שאמרת.
אני מתאר לעצמי שזה תרגיל די סטנדרטי, בדומה אולי לתרגיל שבו צריך להמיר מספר עשרוני לייצוג המילולי שלו (172 => "מאה שבעים ושתיים"). המגבלה של 3999 נובעת כמובן מכך שאי אפשר לייצג מספרים גדולים יותר בייצוג רומי, אלא אם נעזרים בכל מיני טריקים ושיטות נידחות שאף אחד לא מכיר…
ואכן, צריך לשים את הגבול איפשהו, בין האתגר העקרוני שבתרגיל לבין ירידה מוגזמת לפרטים ואפשרויות קצה למיניהן. אפרופו, הפתרון שלי – דווקא מכיוון שאינו בודק את תקינות הקלט – יתמודד בהצלחה גם עם IIII 🙂