Skip to content

Commit

Permalink
Add grade-school (#310)
Browse files Browse the repository at this point in the history
  • Loading branch information
BNAndras authored Jul 22, 2024
1 parent d5fc26b commit 280267a
Show file tree
Hide file tree
Showing 7 changed files with 334 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,14 @@
"prerequisites": [],
"difficulty": 4
},
{
"slug": "grade-school",
"name": "Grade School",
"uuid": "17234e84-78aa-4afc-9bad-aa1ca0483d28",
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "hamming",
"name": "Hamming",
Expand Down
21 changes: 21 additions & 0 deletions exercises/practice/grade-school/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Instructions

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?"
- "Let me think.
We have Anna, Barb, and Charlie in grade 1, Alex, Peter, and Zoe in grade 2 and Jim in grade 5.
So the answer is: Anna, Barb, Charlie, Alex, Peter, Zoe and Jim"

Note that all our students only have one name (It's a small town, what do you want?) and each student cannot be added more than once to a grade or the roster.
In fact, when a test attempts to add the same student more than once, your implementation should indicate that this is incorrect.
18 changes: 18 additions & 0 deletions exercises/practice/grade-school/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"authors": [
"BNAndras"
],
"files": {
"solution": [
"grade_school.vim"
],
"test": [
"grade_school.vader"
],
"example": [
".meta/example.vim"
]
},
"blurb": "Given students' names along with the grade that they are in, create a roster for the school.",
"source": "A pairing session with Phil Battos at gSchool"
}
51 changes: 51 additions & 0 deletions exercises/practice/grade-school/.meta/example.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
function! GradeSchool() abort
return {
\ 'values': {},
\ 'Add': function('s:Add'),
\ 'Grade': function('s:Grade'),
\ 'Roster': function('s:Roster')}
endfunction

function! s:Add(student, grade) abort dict
if has_key(self.values, a:student)
return v:false
endif

let self.values[a:student] = a:grade
return v:true
endfunction

function! s:Grade(grade) abort dict
let l:result = []

for l:item in items(self.values)
if l:item[1] == a:grade
call add(l:result, l:item[0])
endif
endfor

let l:sorted = sort(l:result)
return l:sorted
endfunction

function! s:Roster() abort dict
let l:result = []

let l:grades = sort(s:Unique(values(self.values)))
for l:grade in l:grades
call extend(l:result, self.Grade(l:grade))
endfor

return l:result
endfunction

function s:Unique(list) abort
let l:result = []
for l:item in a:list
if index(l:result, l:item) == -1
call add(l:result, l:item)
endif
endfor

return l:result
endfunction
86 changes: 86 additions & 0 deletions exercises/practice/grade-school/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[a3f0fb58-f240-4723-8ddc-e644666b85cc]
description = "Roster is empty when no student is added"

[9337267f-7793-4b90-9b4a-8e3978408824]
description = "Add a student"

[6d0a30e4-1b4e-472e-8e20-c41702125667]
description = "Student is added to the roster"

[73c3ca75-0c16-40d7-82f5-ed8fe17a8e4a]
description = "Adding multiple students in the same grade in the roster"

[233be705-dd58-4968-889d-fb3c7954c9cc]
description = "Multiple students in the same grade are added to the roster"

[87c871c1-6bde-4413-9c44-73d59a259d83]
description = "Cannot add student to same grade in the roster more than once"

[c125dab7-2a53-492f-a99a-56ad511940d8]
description = "A student can't be in two different grades"
include = false

[a0c7b9b8-0e89-47f8-8b4a-c50f885e79d1]
description = "A student can only be added to the same grade in the roster once"
include = false
reimplements = "c125dab7-2a53-492f-a99a-56ad511940d8"

[d7982c4f-1602-49f6-a651-620f2614243a]
description = "Student not added to same grade in the roster more than once"
reimplements = "a0c7b9b8-0e89-47f8-8b4a-c50f885e79d1"

[e70d5d8f-43a9-41fd-94a4-1ea0fa338056]
description = "Adding students in multiple grades"

[75a51579-d1d7-407c-a2f8-2166e984e8ab]
description = "Students in multiple grades are added to the roster"

[7df542f1-57ce-433c-b249-ff77028ec479]
description = "Cannot add same student to multiple grades in the roster"

[6a03b61e-1211-4783-a3cc-fc7f773fba3f]
description = "A student cannot be added to more than one grade in the sorted roster"
include = false
reimplements = "c125dab7-2a53-492f-a99a-56ad511940d8"

[c7ec1c5e-9ab7-4d3b-be5c-29f2f7a237c5]
description = "Student not added to multiple grades in the roster"
reimplements = "6a03b61e-1211-4783-a3cc-fc7f773fba3f"

[d9af4f19-1ba1-48e7-94d0-dabda4e5aba6]
description = "Students are sorted by grades in the roster"

[d9fb5bea-f5aa-4524-9d61-c158d8906807]
description = "Students are sorted by name in the roster"

[180a8ff9-5b94-43fc-9db1-d46b4a8c93b6]
description = "Students are sorted by grades and then by name in the roster"

[5e67aa3c-a3c6-4407-a183-d8fe59cd1630]
description = "Grade is empty if no students in the roster"

[1e0cf06b-26e0-4526-af2d-a2e2df6a51d6]
description = "Grade is empty if no students in that grade"

[2bfc697c-adf2-4b65-8d0f-c46e085f796e]
description = "Student not added to same grade more than once"

[66c8e141-68ab-4a04-a15a-c28bc07fe6b9]
description = "Student not added to multiple grades"

[c9c1fc2f-42e0-4d2c-b361-99271f03eda7]
description = "Student not added to other grade for multiple grades"

[1bfbcef1-e4a3-49e8-8d22-f6f9f386187e]
description = "Students are sorted by name in a grade"
143 changes: 143 additions & 0 deletions exercises/practice/grade-school/grade_school.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
Before:
let g:school = GradeSchool()

Execute (Roster is empty when no student is added):
let g:expected = []
AssertEqual g:expected, g:school.Roster()

Execute (Add a student):
Assert g:school.Add('Aimee', 2)

Execute (Student is added to the roster):
call g:school.Add('Aimee', 2)
AssertEqual ['Aimee'], g:school.Roster()

Execute (Adding multiple students in the same grade in the roster):
Assert g:school.Add('Blair', 2)
Assert g:school.Add('James', 2)
Assert g:school.Add('Paul', 2)

Execute (Multiple students in the same grade are added to the roster):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('Paul', 2)

let g:expected = ['Blair', 'James', 'Paul']
AssertEqual g:expected, g:school.Roster()

Execute (Cannot add student to same grade in the roster more than once):
call g:school.Add('Blair', 2)
Assert g:school.Add('James', 2)
Assert !g:school.Add('James', 2)
call g:school.Add('Paul', 2)

Execute (Student not added to same grade in the roster more than once):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('James', 2)
call g:school.Add('Paul', 2)

let g:expected = ['Blair', 'James', 'Paul']
AssertEqual g:expected, g:school.Roster()

Execute (Adding students in multiple grades):
Assert g:school.Add('Chelsea', 3)
Assert g:school.Add('Logan', 7)

Execute (Students in multiple grades are added to the roster):
call g:school.Add('Chelsea', 3)
call g:school.Add('Logan', 7)

let g:expected = ['Chelsea', 'Logan']
AssertEqual g:expected, g:school.Roster()

Execute (Cannot add same student to multiple grades in the roster):
let g:students = [['Blair', 2], ['James', 2], ['James', 3], ['Paul', 3]]
call g:school.Add('Blair', 2)
Assert g:school.Add('James', 2)
Assert !g:school.Add('James', 3)
call g:school.Add('Paul', 3)

Execute (Student not added to multiple grades in the roster):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('James', 3)
call g:school.Add('Paul', 3)

let g:expected = ['Blair', 'James', 'Paul']
AssertEqual g:expected, g:school.Roster()

Execute (Students are sorted by grades in the roster):
call g:school.Add('Jim', 3)
call g:school.Add('Peter', 2)
call g:school.Add('Anna', 1)

let g:expected = ['Anna', 'Peter', 'Jim']
AssertEqual g:expected, g:school.Roster()

Execute (Students are sorted by name in the roster):
call g:school.Add('Peter', 2)
call g:school.Add('Zoe', 2)
call g:school.Add('Alex', 2)

let g:expected = ['Alex', 'Peter', 'Zoe']
AssertEqual g:expected, g:school.Roster()

Execute (Students are sorted by grades and then by name in the roster):
call g:school.Add('Peter', 2)
call g:school.Add('Anna', 1)
call g:school.Add('Barb', 1)
call g:school.Add('Zoe', 2)
call g:school.Add('Alex', 2)
call g:school.Add('Jim', 3)
call g:school.Add('Charlie', 1)

let g:expected = ['Anna', 'Barb', 'Charlie', 'Alex', 'Peter', 'Zoe', 'Jim']
AssertEqual g:expected, g:school.Roster()

Execute (Grade is empty if no students in the roster):
AssertEqual [], g:school.Grade(1)

Execute (Grade is empty if no students in that grade):
call g:school.Add('Peter', 2)
call g:school.Add('Zoe', 2)
call g:school.Add('Alex', 2)
call g:school.Add('Jim', 3)

let g:expected = []
AssertEqual expected, g:school.Grade(1)

Execute (Student not added to same grade more than once):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('James', 2)
call g:school.Add('Paul', 2)

let g:expected = ['Blair', 'James', 'Paul']
AssertEqual expected, g:school.Grade(2)

Execute (Student not added to multiple grades):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('James', 3)
call g:school.Add('Paul', 3)

let g:expected = ['Blair', 'James']
AssertEqual expected, g:school.Grade(2)

Execute (Student not added to other grade for multiple grades):
call g:school.Add('Blair', 2)
call g:school.Add('James', 2)
call g:school.Add('James', 3)
call g:school.Add('Paul', 3)

let g:expected = ['Paul']
AssertEqual expected, g:school.Grade(3)

Execute (Students are sorted by name in a grade):
call g:school.Add('Franklin', 5)
call g:school.Add('Bradley', 5)
call g:school.Add('Jeff', 1)

let g:expected = ['Bradley', 'Franklin']
AssertEqual expected, g:school.Grade(5)
7 changes: 7 additions & 0 deletions exercises/practice/grade-school/grade_school.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"
" Returns an object representing a school roster, which can add a student,
" list students in a grade, or list all students
"
function! GradeSchool() abort
" your implementation goes here
endfunction

0 comments on commit 280267a

Please sign in to comment.