ruby - grade-school
This commit is contained in:
		
							
								
								
									
										65
									
								
								ruby/grade-school/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								ruby/grade-school/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| # Grade School | ||||
|  | ||||
| Given students' names along with the grade that they are in, create a roster | ||||
| for the school. | ||||
|  | ||||
| In the end, you should be able to: | ||||
|  | ||||
| - Add a student's name to the roster for a grade | ||||
|   - "Add Jim to grade 2." | ||||
|   - "OK." | ||||
| - Get a list of all students enrolled in a grade | ||||
|   - "Which students are in grade 2?" | ||||
|   - "We've only got Jim just now." | ||||
| - Get a sorted list of all students in all grades.  Grades should sort | ||||
|   as 1, 2, 3, etc., and students within a grade should be sorted | ||||
|   alphabetically by name. | ||||
|   - "Who all is enrolled in school right now?" | ||||
|   - "Grade 1: Anna, Barb, and Charlie. Grade 2: Alex, Peter, and Zoe. | ||||
|     Grade 3…" | ||||
|  | ||||
| Note that all our students only have one name.  (It's a small town, what | ||||
| do you want?) | ||||
|  | ||||
| ## For bonus points | ||||
|  | ||||
| Did you get the tests passing and the code clean? If you want to, these | ||||
| are some additional things you could try: | ||||
|  | ||||
| - If you're working in a language with mutable data structures and your | ||||
|   implementation allows outside code to mutate the school's internal DB | ||||
|   directly, see if you can prevent this. Feel free to introduce additional | ||||
|   tests. | ||||
|  | ||||
| Then please share your thoughts in a comment on the submission. Did this | ||||
| experiment make the code better? Worse? Did you learn anything from it? | ||||
|  | ||||
| * * * * | ||||
|  | ||||
| For installation and learning resources, refer to the | ||||
| [exercism help page](http://exercism.io/languages/ruby). | ||||
|  | ||||
| For running the tests provided, you will need the Minitest gem. Open a | ||||
| terminal window and run the following command to install minitest: | ||||
|  | ||||
|     gem install minitest | ||||
|  | ||||
| If you would like color output, you can `require 'minitest/pride'` in | ||||
| the test file, or note the alternative instruction, below, for running | ||||
| the test file. | ||||
|  | ||||
| Run the tests from the exercise directory using the following command: | ||||
|  | ||||
|     ruby grade_school_test.rb | ||||
|  | ||||
| To include color from the command line: | ||||
|  | ||||
|     ruby -r minitest/pride grade_school_test.rb | ||||
|  | ||||
|  | ||||
| ## Source | ||||
|  | ||||
| A pairing session with Phil Battos at gSchool [http://gschool.it](http://gschool.it) | ||||
|  | ||||
| ## Submitting Incomplete Solutions | ||||
| It's possible to submit an incomplete solution so you can see how others have completed the exercise. | ||||
							
								
								
									
										20
									
								
								ruby/grade-school/grade_school.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								ruby/grade-school/grade_school.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| class School | ||||
|   def initialize | ||||
|     @roster = {} | ||||
|   end | ||||
|  | ||||
|   def students(grade) | ||||
|     @roster[grade] || [] | ||||
|   end | ||||
|  | ||||
|   def add(name, grade) | ||||
|     if @roster[grade].nil? | ||||
|       @roster[grade] = [] | ||||
|     end | ||||
|     @roster[grade].push(name).sort! | ||||
|   end | ||||
|  | ||||
|   def students_by_grade | ||||
|     @roster.sort.map {|key, value| {grade: key, students: value}} | ||||
|   end | ||||
| end | ||||
							
								
								
									
										89
									
								
								ruby/grade-school/grade_school_test.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								ruby/grade-school/grade_school_test.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| require 'minitest/autorun' | ||||
| require_relative 'grade_school' | ||||
|  | ||||
| class SchoolTest < Minitest::Test | ||||
|   def test_empty_grade | ||||
|     school = School.new | ||||
|     expected = [] | ||||
|     assert_equal expected, school.students(1) | ||||
|   end | ||||
|  | ||||
|   def test_add_student | ||||
|     # skip | ||||
|     school = School.new | ||||
|     assert school.add('Aimee', 2) | ||||
|     expected = ['Aimee'] | ||||
|     assert_equal expected, school.students(2) | ||||
|   end | ||||
|  | ||||
|   def test_add_students_to_different_grades | ||||
|     # skip | ||||
|     school = School.new | ||||
|     school.add('Aimee', 3) | ||||
|     school.add('Beemee', 7) | ||||
|     assert_equal ['Aimee'], school.students(3) | ||||
|     assert_equal ['Beemee'], school.students(7) | ||||
|   end | ||||
|  | ||||
|   def test_grade_with_multiple_students | ||||
|     # skip | ||||
|     school = School.new | ||||
|     grade    = 6 | ||||
|     students = %w(Aimee Beemee Ceemee) | ||||
|     students.each { |student| school.add(student, grade) } | ||||
|     assert_equal students, school.students(grade) | ||||
|   end | ||||
|  | ||||
|   def test_grade_with_multiple_students_sorts_correctly | ||||
|     # skip | ||||
|     school = School.new | ||||
|     grade    = 6 | ||||
|     students = %w(Beemee Aimee Ceemee) | ||||
|     students.each { |student| school.add(student, grade) } | ||||
|     expected = students.sort | ||||
|     assert_equal expected, school.students(grade) | ||||
|   end | ||||
|  | ||||
|   def test_empty_students_by_grade | ||||
|     # skip | ||||
|     school = School.new | ||||
|     expected = [] | ||||
|     assert_equal expected, school.students_by_grade | ||||
|   end | ||||
|  | ||||
|   def test_students_by_grade | ||||
|     # skip | ||||
|     school = School.new | ||||
|     grade    = 6 | ||||
|     students = %w(Beemee Aimee Ceemee) | ||||
|     students.each { |student| school.add(student, grade) } | ||||
|     expected = [{ grade: grade, students: students.sort }] | ||||
|     assert_equal expected, school.students_by_grade | ||||
|   end | ||||
|  | ||||
|   def test_students_by_grade_sorted | ||||
|     # skip | ||||
|     school = School.new | ||||
|     everyone.each do |grade| | ||||
|       grade[:students].each { |student| school.add(student, grade[:grade]) } | ||||
|     end | ||||
|     expected = everyone_sorted | ||||
|     assert_equal expected, school.students_by_grade | ||||
|   end | ||||
|  | ||||
|   def everyone | ||||
|     [ | ||||
|       { grade: 3, students: %w(Deemee Eeemee) }, | ||||
|       { grade: 1, students: %w(Effmee Geemee) }, | ||||
|       { grade: 2, students: %w(Aimee Beemee Ceemee) } | ||||
|     ] | ||||
|   end | ||||
|  | ||||
|   def everyone_sorted | ||||
|     [ | ||||
|       { grade: 1, students: %w(Effmee Geemee) }, | ||||
|       { grade: 2, students: %w(Aimee Beemee Ceemee) }, | ||||
|       { grade: 3, students: %w(Deemee Eeemee) } | ||||
|     ] | ||||
|   end | ||||
| end | ||||
		Reference in New Issue
	
	Block a user