|
||||
|
||||
קוד בשפת רובי שעושה את העבודה: def sub_partitions(n,k,min = 1) (כדי להפעיל תתקין אצלך Ruby, שמור את הקוד לקובץ, נניח p.rb, ואז תריץ p.rb n כש-n הוא המספר שאתה רוצה לחשב עבורו את החלוקות).
return [] if k == 0 or n == 0 or (k == 1 and n<min) return [[n]] if k == 1 result = [] (min..n).inject([]) {|result, t| result += sub_partitions(n-t,k-1,t).collect{|p| [t]+p}} end def partitions(n) (1..n).inject([]){|result, k| result += sub_partitions(n,k)}.sort end def display_partitions(n) partitions(n).each{|p| puts p.collect{|x| x.to_s}.join("+") + "=#{n}"} end display_partitions(ARGV0.to_i) |
|
||||
|
||||
הי גדי תודה רבה ! אני מחשב כעת קבוע שיש בידי כבר את 3 הספרות הראשונות שלו. לצורך חישוב הספרות הבאות אני צריך לבצע רקורסיה פנימית על החלוקות של המספר. התקנתי את Ruby מהאינטרנט בחרתי בתפריט SCiTE שזה מעיין מעבד לוינדוס העתקתי את כל השורות שרשמת כאן אחר כך שמרתי את הקובץ עם סיום rb בתפרטי Tools לחצתי על Go ( ראיתי שעבור תוכניות דוגמא זה מריץ את התוכנית) נפתח לשניה חלון שחור ואז זה מסתיים ללא בקשה להכניס את n מה לדעתך הבעיה ? משה |
|
||||
|
||||
הוא לא קולט קלט מהמשתמש בזמן ריצת התוכנית, צריך לתת את n כפרמטר בשורת ההרצה. אולי יש ב-SciTE אפשרות להכניס פרמטרים - חפש כזו. אחרת, תריץ את הקובץ משורת הפקודה (ruby myfile.rb 5, למשל). |
|
||||
|
||||
לא הצלחתי ,אשלח לך מייל פרטי אולי תוכל לעזור לי משה |
|
||||
|
||||
בכל הכבוד, את זה לא היה טוב יותר לשלוח במייל? |
|
||||
|
||||
גדי אולי חשב שזה יכול לעניין גם אחרים, מה התירוץ שלך? |
|
||||
|
||||
אין ספק שעשרות, אם לא מאות, מקוראי האייל מחפשים קוד כזה בנרות. התירוץ שלי הוא שהפריע לי לראות קטע קוד באייל, ומפריע לי הגוון הגיקי עד-אימה שהאתר הזה עוטה. זה מרחיק ממנו ציבור גדול של מגיבים פוטנציאליים, חלקם היו עשויים להעשיר את עולמי התרבותי (הערות בקשר לעולמי התרבותי לא יתקבלו בברכה). ומה התירוץ שלך? |
|
||||
|
||||
שאלתי, מה התירוץ שלך לא לשלוח לו את התלונה בדוא''ל. אני מקווה שעכשיו גם ברור מה התרוץ שלי- לא נתת דוא''ל שאליו אפשר לשלוח. |
|
||||
|
||||
זאת לא היתה תלונה. זאת היתה הזמנה לפתוח דיון ציבורי בשאלה הזאת (אתה יכול לראות אותו מתקשר גם לדיון המקביל בשאלת ויקיפדיה). הדיון הקטן שהתפתח מראה שככל הנראה אני טועה ויש מקום להצגת קטעי קוד באייל, אם כי בינתיים המדגם קטן והתוצאות אינן מובהקות. |
|
||||
|
||||
מי שמתלונן על קטעי קוד, מוטב לו שלא ייכנס לדיונים הקשורים למתמטיקה. לא שכל חובבי המתימטיקה הם גם חובבי קוד, אך עדיף להיות זהיר. |
|
||||
|
||||
תוציא את המקל מישבנך, ותן לאחרים להנות. אתה לא חייב לקרוא את כל התגובות, ועולמי התרבותי התרחב כפליים מתגובתו של גדי מאשר מתגובתך. |
|
||||
|
||||
עוד תשעה כמוך ויש לנו מניין ראשון. למתעניינים בנושאים קרובים: public class GCD {
public static int gcd(int m, int n) { if (m < n) { int t = m; m = n; n = t; } int r = m % n; if (r == 0) { return n; } else { return gcd(n, r); } } } |
|
||||
|
||||
אבל למה בשפה כל כך מכוערת, למה? להשוואה: def gcd(a,b) (שים לב שאצלי מטפלים גם במספרים שליליים, בעוד שאצלך זה יגרום ככל הנראה לקריסת התוכנית).
a,b = a.abs, b.abs a,b = b,a if a<b return a if b == 0 return gcd(b, a % b) end |
|
||||
|
||||
סליחה אבל הכיעור הוא במימוש ולא בשפה, (כנראה בשני המקרים) אין צורך לבדוק למי יש יותר גדול ולהצריח - תוצאה נכונה תתקבל בכל מקרה. int gcd(int a, int b) { אם אפשר להניח ששניהם אי-שליליים, אוreturn (b == 0) ? a : gcd(b, a % b); } int gcd_abs(int a, int b) { אם אי אפשר.
return gcd(Math.Abs(a), Math.Abs(b)); } |
|
||||
|
||||
רובי היא אולי שפה יעילה, אולי שפה נוחה, אולי שפה מהירה.. אבל היא אחת מהמכוערות ביותר שראיתי (אם שופטים את יופי השפה לפי יופי הקוד). אין ספק שאם אתה קורא ל-Java מכוערת, אתה צריך לחשוב פעמיים לפני שאתה משתמש ברובי. |
|
||||
|
||||
וואו, אני כל כך לא מסכים. |
|
||||
|
||||
Math.Abs(a) לעומת:a.abs מה שכן, מתחרה פוטנציאלית אחת של רובי בכלל לא מועמדת כאן מסיבות טכניות - פייתון.
|
|
||||
|
||||
שתיהן מכוערות (לדעתי), אבל הרובי מכוערת יותר. abs(a) היה הרבה יותר יפה וברור.אין בעיה לכתוב בג'אווה מחלקה שתכיל מספר ומתודה שתתן את הערך המוחלט שלו ותראה דומה לרובי עד כדי סוגריים (שרק מייפים את העסק). אבל, בסופו של יום, אני רוצה את הערך המוחלט של a, ולא a ערך מוחלט של, לכן אני מעדיף לראות את הפונקציה לפני הערך (ושים לב שככה כותבים גם באנגלית וגם במתמטיקה). זה אינטואיטיבי יותר, קריא יותר ויפה יותר. |
|
||||
|
||||
מן הסתם abs(a) הוא משהו שאפשר לעשות גם ברובי, אבל כשמתחילים לעשות דברים טיפה יותר מורכבים זה מפסיק להיות קריא. אם אתה רוצה להתחיל לשרשר עכשיו פונקציות, הדרך הנכונה לעשות את זה היא ללכת משמאל לימין, במקום לפתוח עוד ועוד ועוד סוגריים (אפילו שבמתמטיקה זה מה שעושים) או לפצל לשמונה שורות שונות. אולי צריך קצת זמן כדי להסתגל לזה, אבל אני לא חושב שזה מכוער.אגב, אחת הסיבות המרכזיות שאני מעדיף את רובי על פייתון היא שבפייתון אין אחידות בקטע הזה - למשל, בשביל אורך של רשימה צריך להשתמש בפונקציה החיצונית len במקום במתודה של הרשימה (כמובן, העובדה שזו סיבה מרכזית בהעדפה שלי רק מראה עד כמה השפות הללו דומות ב"יופי" שלהן). |
|
||||
|
||||
אז, מה הופך את הרובי ליפה יותר מג'אווה וסי++? |
|
||||
|
||||
הגישה של ג'אווה במקרה הזה היא שהמספר אינו אובייקט. בניגוד לרוב שאר הדברים. מצד שני, במקרים רבים אומרים וכותבים "נצא מהפונקציה אם קיבלנו משהו קטן מדי" ולא "אם קיבלנו משהו קטן מדי, נצא מהפונקציה." return if (a<b) ולא:if (a<b) { יש (לפחות) שפה אחת שבה יש את abs(a) וגם התחביר האמור של if (וגם unless, למקרה הצורך) - פרל. שפה שנוצרה ע"ׁי בלשן שחושב שצריכים לכתוב קוד כמו שמדברים.return } (טוב, אז אולי כותבי פרל מקללים מדי פעם) |
|
||||
|
||||
ממש לא מדוייק, ג'אווה היא שפה גמישה שמאפשרת לך לייצר מספרים בתור אובייקטים. ברוב המקרים אומרים וחושבים (טוב, לפחות אני אומר וחושב) ככה: "מחר נעשה יום כיף, נלך לגן החיות, נאכיל את האריות, נטפס על הזברות, נאכול ארנבים, אם נהיה עייפים נחזור הביתה, אחרת נמשיך לפילים, לנמרים, לסוסים ובסוף היום נאכל גלידה אצל סבא וסבתא" ולא "מחר נעשה יום כיף, נלך לגן החיות, נאכיל את האריות, נטפס על הזברות, נאכול ארנבים, נחזור הביתה אם נהיה עייפים, נמשיך לפילים, לנמרים, לסוסים ובסוף היום נאכל גלידה אצל סבא וסבתא אחרת". שזה כמו בכל ספה נורמלית, כמו שאתה מסביר לילד מה יקרה מחר, ככה אתה מסביר למחשב מה לעשות, בסדר שבו הוא, המחשב, אמור לעשות אותו. |
|
||||
|
||||
תוכניתן חושב במשפטים כאלו ארוכים ומורכבים? ועוד טוען שככה מסבירים דברים למחשבים? אולי בשבילך המציאו את http://en.wikipedia.org/wiki/CouchDB |
|
||||
|
||||
אורך המשפט באמת לא משנה. תחשוב מתי, ביומיום, אתה מקדים את התנאי לתוצאה שלו, ומתי אתה מקדים את התוצאה לתנאי. |
|
||||
|
||||
(טוב, אז אולי כותבי פרל מקללים מדי פעם) מי ש*באמת* מקלל זה מי שצריך *לקרוא* פרל. (הכרתי אפילו מישהו שבסוף פשוט הרכיב מגבים על המסך) |
|
||||
|
||||
כנראה שהיופי, כמו עדשות המגע, הוא בעיני המתבונן. בעיני פרל מאוד קריאה. אם מדובר בקטע קוד מכוער במיוחד, יש דרכים לסדר אותו מחדש. perl -MO=Deparse ugly-script.pl המהדרין יכולים גם להתקין perltidy הוויכוח הזה מזכיר לי מאמר בשם "מה רע בפרל ולמה פיתון טובה יותר" (או משהו כזה, קראתי אותו ממש מזמן). המאמר הציג כדוגמא לאי הקריאות של פרל קטע קוד שנלקח מהספריה הסטנדרטית שלה. קטע הקוד המושמץ הזה היה עבורי הדבר הכי קריא במאמר.
|
|
||||
|
||||
נשמע בדיוק כמו יוסי ע. אחד שהכרתי פעם. אני מסכים שהיופי הוא אכן בעיני המתבונן. הסטראוטיפ שעובד בשבילי אומר שאכן פייתון קריא בהרבה מפרל. העקרון "יש יותר מדרך אחת לעשות זאת" נשמעת מושך ומזמין יצירתיות, ממש כמו העקרון של היידיש "יש יותר מדרך אחת לומר זאת". בילדותי, התירוץ האולטימטיבי לכל בדיחה שלא הצחיקה היה "ביידיש זה הרבה יותר מצחיק". כשבגרתי מעט ניסיתי פעם ללמוד יידיש ואני יכול להעיד שזה באמת נשמע מצחיק יותר ביידיש. אבל אולי לא כל מה שטוב לבדיחות טוב גם לשפות תכנות: ריבוי האידיומים באמת מאפשר הבעה יותר עשירה, אבל למע"ד לא תומך בּקְרִיאוּת. אם נחזור ליידיש, יש בה פתגם ציורי שאומר שאיש איש נהנה מריח נפיחותיו הוא, ואולי זה מסביר גם את הקונפליקט הקטן שלנו. |
|
||||
|
||||
I should have known it better with a guy like you
|
|
||||
|
||||
היופי הוא בעיני המתבונן: #v&< @.$<
:<\g05%p05:_^# |
|
||||
|
||||
לא. שגם אחרים ייהנו (הסיכוי הזניח שמישהו נוסף יהנה גובר בקלות מבחינתי על ה''נזק'' שבהימלטות ההמונים מהאתר הגיקי - כי כמובן, כשהם נכנסים לדיון על טרחנים מתמטיים, קוד כזה הוא הקש ששובר את גב הגמל). |
|
||||
|
||||
תודֶה שהסיבה האמתית היא שהפכת למסיונר רובי! |
|
||||
|
||||
רובים הם הילידים הכחולים מכוכב פנדורה? |
|
||||
|
||||
אולי. אבל שמעתי שכבשנו את אמריקה בעזרת רובים, חידקים ופלדה. |
|
||||
|
||||
אנחנו? מה פתאום. אנחנו כבשנו אותה בעזרת הלובי היהודי והרבה חוצפה. |
|
||||
|
||||
|
||||
|
||||
סקסוואנג צייד הקרקפות. זה נשמע מרשים. וברצינות, סקסוואנג זה באמת מאותגר קוד? באיזה שפה או סלנג? |
|
||||
|
||||
מסתבר שלא דייקתי בניקוד וצ"ל סְקסַוונְג. פרופ' לבלשנות פיתח את שפת הנא'בי (לא על בסיס קלינגון, למרות מה שקמרון הבמאי של אוואטר אמר). השפה מבוססת בין השאר על פרסית, מלאית, מנדרינית וגם עברית. שלושת העיצורים הנפוצים בשפה הם קקס, פקס ו-טקס ומהם יצרו את הקללה הזו שפרושה טיפש, מטומטם. |
חזרה לעמוד הראשי | המאמר המלא |
מערכת האייל הקורא אינה אחראית לתוכן תגובות שנכתבו בידי קוראים | |
RSS מאמרים | כתבו למערכת | אודות האתר | טרם התעדכנת | ארכיון | חיפוש | עזרה | תנאי שימוש | © כל הזכויות שמורות |