אתגר אויילר 45
בהמשך לפוסט מלמטה אני מציע אתגר: מציאת כל השלשות שעונות על אוילר 45 בין 0 לבין 10M, והדפסתם ל -stdout.
מטרת האתגר היא לא מציאת האלגוריתם הטוב ביותר אלא מימוש אלגוריתם ספציפי, בדיקת יכולת תכנותיות והשוואה בין שפות תכנות.
החוקים:
האלגוריתם:
גיא
בהמשך לפוסט מלמטה אני מציע אתגר: מציאת כל השלשות שעונות על אוילר 45 בין 0 לבין 10M, והדפסתם ל -stdout.
מטרת האתגר היא לא מציאת האלגוריתם הטוב ביותר אלא מימוש אלגוריתם ספציפי, בדיקת יכולת תכנותיות והשוואה בין שפות תכנות.
החוקים:
- האלגוריתם למציאת המספרים נתון. הוא לא אופטמימלי אבל יש בו הרבה בשר, והוא לוקח מספיק זמן כדי לבדוק ביצועים מצד אחד, אבל מהיר מספיק כדי שלא ימרוט לנו את העצבים.
- כל אחד רשאי לממש את האלגוריתם בשפת התכנות החביבה
- כל אחד רשאי לספק את סביבת הריצה והקומפילציה המלאה: מי שיעבוד עם JAVA רשאי לספק JRE משלו, סקריפט שיריץ את האפליקציה עם דגלים ככל העולה על רוחו וכו'. מי שממש ב-C או בC++ רשאי לספק makefile, gcc וכו' (זמן קומפילציה כמובן לא נחשב חלק מהאתגר).
- מותר ורצוי למקבל את העבודה.
- ניתן להשתמש בספריות חיצוניות ככל העולה על רוחכם, מלבד כמובן ספריות שפותרות את הבעיה במפורש.
- השורה הראשונה במתודת MAIN תהיה הדפסת זמן המערכת הנוכחי.
- לאחר סיום הריצה, סגירת thread-ים והדפסת המספרים, יש להדפיס את זמן המערכת הנוכחי.
- השוואת זמני הריצה תהיה על בבסיס הפרשי זמני המערכת שהודפסו.
- כל אחד יספק תכנית (או סקריפט שמריץ תכנית) שתקבל שני ארגומנטים. הראשון הוא המספר המקסימלי עד אליו יש לחפש מספרים והשני הוא מספר ה-threads המקסימלי. אין צורך לעשות בדיקת קלט.
- אין צורך בהדפסות נוספות.
- כדי לשמור על הגינות, כל אחד רשאי להריץ את כתניות של האחרים כדי להשוות את הריצה באותה סביבה ובאותו ברזל.
האלגוריתם:
- עבור על כל המספרים בין 0 ל-10M ולכל i הכנס למפה את השורה Triangle(i) -> i
- עבור על כל המספרים בין 0 ל-10M. ועבור כל j
- אם pentagonal(j) zz נמצא במפה הקודמת, הכנס את השורה pentagonal(j) -> j למפה שנייה.
- עבור על כל המספרים בין 0 ל-10M ועבור כל k:
- אם hexagonal(k) zz נמצא במפה השנייה, שמור את הרביעיה שהתקבלה (הכוונה ברביעיה לשלשת המספרים ולערך שלהם).
גיא