Menu
Coddy logo textTech

group_by ו־partition

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 25 מתוך 56.

לפעמים רוצים לפצל אוסף במקום לסנן אותו. שתי שיטות מכסות את רוב המקרים.

המתודה group_by מקבלת בלוק ומחזירה גיבוב. כל תוצאה ייחודית של הבלוק הופכת למפתח, שממפה למערך של האיברים שהפיקו אותה:

words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}

זו הדרך הנקייה ביותר לקבץ פריטים במעבר אחד.

partition היא הגרסה הבינארית: היא מחזירה זוג מערכים, את האיברים שעבורם הבלוק החזיר true ואת השאר:

evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect   # [2, 4]
puts odds.inspect    # [1, 3, 5]

השתמשו ב־partition כשיש בדיוק שני דליים, וב־group_by כשיכולים להיות רבים.

challenge icon

אתגר

בינוני

קרא רשימה של ערכים בפורמט name:score המופרדים בפסיקים (למשל Alice:88,Bob:42,Charlie:75). השתמש ב-group_by ואחריו ב-partition כדי ליצור דוח קצר.

שלבים:

  1. נתח כל ערך לזוג [name, score] (הציון הוא מספר שלם)
  2. קבץ לפי האות הראשונה של name שבזוג (באותיות גדולות) באמצעות group_by
  3. עבור כל קבוצת אותיות, לפי סדר אלפביתי, חלק את הערכים באמצעות partition לעוברים (score >= 60) ונכשלים, ואז הדפס שורה אחת לכל קבוצה:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

בכל קבוצה, השמות מופיעים בסדר המקורי שלהם. אם באחד הצדדים אין שמות, השאר אותו ריק (למשל fail=).

עבור הקלט Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, הפלט הוא:

A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=

נסו בעצמכם

entries = gets.chomp.split(",").map do |s|
  name, score = s.split(":")
  [name, score.to_i]
end

# TODO: לקבץ לפי האות הראשונה (גדולה), לחלק כל קבוצה לפי score >= 60,
#       להדפיס 'X: pass=... fail=...' לפי סדר אלפביתי של האותיות
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר Ruby אונליין