ארכיון הקטגוריה: תרגילי תכנות

חיפוש מהיר של מיקומי GPS בקובץ

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

המקום היחיד ש-GPS עובד בו (צילום מסך מתוך Google Earth)
המקום היחיד ש-GPS עובד בו (צילום מסך מתוך Google Earth)

להמשיך לקרוא חיפוש מהיר של מיקומי GPS בקובץ

CodeMonkey, טוב למתכנתים צעירים?

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

הקישור ל-Codemonkey באתר "אופק יסודי"
הקישור ל-Codemonkey באתר "אופק יסודי"

להמשיך לקרוא CodeMonkey, טוב למתכנתים צעירים?

איך ליצור שעון אקראי וגם מדויק

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

להמשיך לקרוא איך ליצור שעון אקראי וגם מדויק

איך עובדת הקצאה דינמית בארדואינו

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

להמשיך לקרוא איך עובדת הקצאה דינמית בארדואינו

כאשר בוטים עושים ספינינג

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

להמשיך לקרוא כאשר בוטים עושים ספינינג

סיפורי אופטימיזציה: 5-6-5

מזה זמן רב אני מנהל מלחמת חורמה עקרונית נגד האיטיות של מסך TFT-LCD קטן ושל הספריות שנכתבו עבורו על ידי Adafruit. כבר הצגתי בעבר את אופטימיזציית ציור הקווים הקצרים, אך כידוע, עם האוכל בא התיאבון: גם האתגר עצמו מרתק, וגם יש לעיסוק הזה משמעות אמתית עבור פרויקט ספציפי שאני עובד עליו (וכנראה גם עבור פרויקטים עתידיים). אז אחרי הפסקה ממושכת אני חוזר אל המסך, והפעם אציג אופטימיזציה של הפעולה הבסיסית ביותר – ציור פיקסל יחיד.

להמשיך לקרוא סיפורי אופטימיזציה: 5-6-5

אתגר התכנות 5: הרפתקת טקסט!

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

אם הסגנון הזה נראה לכם מוכר, זה לא במקרה. התקופה שבין סוף שנות השבעים לאמצע שנות השמונים, פלוס מינוס, היתה תור הזהב של "הרפתקאות הטקסט" (Text Adventures) –  משחקי קווסט מורכבים להפליא ועתירי דמיון, שהתנהלו במלואם באמצעות תיאורים כתובים ופקודות כתובות של המשתמש. משחקים אלה הותירו רושם כה עז, שגם אם נולדתם מאוחר מכדי להתנסות בז'אנר בעצמכם, רוב הסיכויים שלפחות שמעתם עליו.

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

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

להמשיך לקרוא אתגר התכנות 5: הרפתקת טקסט!

אתגר התכנות 4: מיון ערמה

חידת התכנות הרביעית שלי היא פחות חידה ויותר מטלת תכנות שחורה ומשעממת: פשוט לממש בקוד "מיון ערמה". למה? כי נתקלתי בו עכשיו בספר שאני קורא, ומכיוון שלא התעמקתי בו בעבר, ההיגיון שמאחוריו לא היה מובן מאליו כמו במיונים הבסיסיים יותר. כדי להפוך את המשימה לקצת יותר מאתגרת (למשל, אם אתם רוצים שהיא תשרוף לכם קצת זמן ביום כיפור), אשאיר לכם לגלות לבד מה זה מיון ערמה (Heapsort) ואיך הוא אמור לעבוד. בהצלחה!

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

להמשיך לקרוא אתגר התכנות 4: מיון ערמה

אתגר התכנות 3: קוף על רשת!

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

אז יש לנו קוף שמטפס על רשת שתי-וערב של חבלים. כל צומת (מפגש בין שני חבלים) מסומן על ידי שני מספרים שלמים – קואורדינטות X ו-Y. הקוף מתחיל בצומת 0,0 ויכול לנוע בכל פעם צעד אחד בלבד לכיוון אחד בלבד – כלומר לעבור לצומת עם X גדול ב-1 מהקודם, או עם X קטן ב-1 מהקודם, או עם Y גדול ב-1 מהקודם, או עם Y קטן ב-1 מהקודם (גם מספרים שליליים מותרים). לא ניתן לנוע באלכסון.

יש מגבלה נוספת וחשובה מאד: הקוף אינו יכול לנוע לצומת שסכום הספרות של הקואורדינטות שלו גדול מ-19. לדוגמה, הוא לעולם לא יוכל להגיע לצומת 96,51 כי 9+6+5+1 יותר גדול מ-19. במקרה של קואורדינטה שלילית, אנחנו פשוט מתעלמים מהסימן ומחשבים את הסכום כאילו היא היתה חיובית.

והנה השאלה: כאמור, הקוף מתחיל בצומת 0,0. לכמה צמתים שונים, כולל זה ההתחלתי, הוא יכול להגיע בסך הכל?

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