Menu
Coddy logo textTech

Veri Dönüştürücü

Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 56 / 56.

Bitirme projesi meydan okuması: bir veri kümesini özet bir rapora dönüştürün. Filtreleme, eşleme, gruplandırma, hata yönetimi ve metot tanımlamayı tek bir programda birleştirin.

challenge icon

Görev

Orta

students dizisi verilmiştir. Her girdi; :id, :grades (tamsayılardan oluşan, boş olabilen bir dizi) ve :subjects (dizgelerden oluşan bir dizi) anahtarlarını içeren bir hash yapısıdır.

İki anahtar içeren bir hash döndüren transform_dataset(students) metodunu tanımlayın:

  • :qualified_ids: En az bir notu olan ve tüm notları kesinlikle 70 değerinin üzerinde olan (all? kullanın) öğrencilerin :id'lerinden oluşan sıralı dizi.
  • :subject_counts: Kalifiye olan öğrencilerin aldığı her bir dersi, o dersi alan kalifiye öğrenci sayısıyla eşleştiren bir hash.

Eğer bir öğrencinin :grades dizisi boşsa, bu öğrenci kalifiye değildir, sessizce atlayın.

Ardından metodu çağırın ve şunları yazdırın:

  1. Qualified: önekiyle birlikte, aralarına , konularak birleştirilmiş kalifiye ID'ler. Eğer hiç yoksa, Qualified: (none) yazdırın.
  2. Her ders için (alfabetik olarak sıralanmış) <subject>: <count> formatında bir satır.

Varsayılan students verisi için çıktı şöyledir:

Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1

Kopya kağıdı

Ruby'de filtreleme, eşleme (mapping), gruplama ve çıktı biçimlendirmeyi birleştirin:

def transform_dataset(students)
  qualified = students.select do |s|
    s[:grades].any? && s[:grades].all? { |g| g > 70 }
  end

  qualified_ids = qualified.map { |s| s[:id] }.sort

  subject_counts = Hash.new(0)
  qualified.each do |s|
    s[:subjects].each { |subj| subject_counts[subj] += 1 }
  end

  { qualified_ids: qualified_ids, subject_counts: subject_counts }
end

Sonuçları varsayılan değer (fallback) ve sıralanmış anahtarlarla yazdırın:

result = transform_dataset(students)

ids = result[:qualified_ids]
puts "Qualified: #{ids.any? ? ids.join(', ') : '(none)'}"

result[:subject_counts].sort.each do |subject, count|
  puts "#{subject}: #{count}"
end
  • all? boş dizilerde false döndürür — boş notlara karşı korunmak için önce any? kullanın.
  • Hash.new(0) eksik anahtarları 0 ile başlatır, bu sayma işlemleri için kullanışlıdır.
  • Bir hash üzerinde .sort kullanımı, alfabetik olarak sıralanmış [key, value] çiftleri döndürür.

Kendin dene

students = [
  { id: "S1", grades: [85, 92, 78], subjects: ["math", "physics"] },
  { id: "S2", grades: [65, 80, 90], subjects: ["math", "biology"] },
  { id: "S3", grades: [],          subjects: ["art"] },
  { id: "S4", grades: [88, 95],    subjects: ["math", "biology", "history"] },
  { id: "S5", grades: [70, 75],    subjects: ["chemistry"] }
]

# YAPILACAK: def transform_dataset(students), { qualified_ids:, subject_counts: } döndür
# YAPILACAK: nitelikli kimlikleri (ID'leri) ve ders sayılarını yazdır
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler