שלום לכולם.
אני עובד על מחשב שלא מחובר לאינטרנט, כך שלא כל שאלה אני ישר מחפש ב-stack.
כשעלה לי הצורך בתרגיל הזה ניסיתי לחשוב איך לעשות את, בהתחלה חשבתי על לולאה או פונקציה שתעשה את זה, אבל תוך כדי החשיבה צצו לי בראש כמה רעיונות לבצע את זה בשורה אחת, חלקם היו קצת לא יעילים, אז לכן פתחתי פה נושא במחשבה שאולי יש פה משהו שימצא פתרון יצירתי לתרגיל.
כל זה היה לפני שפתחתי את גוגל.
אחרי שפתחתי את גוגל ראיתי הרבה פתרונות לתרגיל וזה עכשיו הופך את הנושא ללא רלוונטי, כי כבר כל הפתרונות היצירתיים נמצאים שם (לא יודע, אולי משהו פה ימצא רעיון יותר יצירתי).
בכל אופן לפני שראיתי ב-stack זה הפתרון הכי יעיל שמצאתי:
int[] keys = Enumerable.Range(1, 9).Select(v => v * 100).ToArray(); // 100 200 300 ...
int input = 673;
int rounded = keys.MinBy(key => Math.Max(key - input, input - key));
הסבר: אני עובר על כל המספרים ולוקח את המקסימום מבין שני החישובים הבאים: קלט - מפתח, מפתח - קלט, תמיד אחד מהם יהיה מספר חיובי והשני שלילי, אז אני לוקח את המקסימום שזה המספר החיובי, ומחפש כזה מספר שהוא הכי נמוך, שזה אומר שהוא הכי קרוב למספר מפתח כלשהו.
אחר כך ראיתי ב-stack אפשרות יותר יצירתית:
int rounded = keys.MinBy(key => Math.Abs(key - input));
זה אותו רעיון אבל זה משתמש בפונקציה שהופכת את המספר השלילי לחיובי.
הפתרון הזה עובד על גם על מספרים לא ממוינים.
יכול להיות שבמספרים ממוינים תהיה דרך יותר יצירתית (בטוח שיש), אז אתם מוזמנים לנסות (בלי לפתוח גוגל!).
יש לציין שהפתרון שלי הוא רק בשפות של NET., אבל בטוח יש דרכים יצירתיות גם בשפות אחרות. אז אתם גם מוזמנים לנסות
(כמובן בלי גוגל).