Skip to content

Commit

Permalink
feat: add high-scores exercise (#176)
Browse files Browse the repository at this point in the history
* feat: add high-scores exercise

* Refactor high-scores example

High scores example solution uses int array
instead of a struct, as the HighScores type.

* Simplify personal_top_three
  • Loading branch information
keiravillekode authored Jul 1, 2024
1 parent 3c69e3a commit cd39532
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,14 @@
"prerequisites": [],
"difficulty": 4
},
{
"slug": "high-scores",
"name": "High Scores",
"uuid": "694ade58-8851-4050-afa0-81fad339e21f",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "resistor-color-duo",
"name": "Resistor Color Duo",
Expand Down
6 changes: 6 additions & 0 deletions exercises/practice/high-scores/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Instructions

Manage a game player's High Score list.

Your task is to build a high-score component of the classic Frogger game, one of the highest selling and most addictive games of all time, and a classic of the arcade era.
Your task is to write methods that return the highest score from the list, the last added score and the three highest scores.
21 changes: 21 additions & 0 deletions exercises/practice/high-scores/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"authors": [
"keiravillekode"
],
"contributors": [
"1ethanhansen"
],
"files": {
"solution": [
"high-scores.v"
],
"test": [
"run_test.v"
],
"example": [
".meta/example.v"
]
},
"blurb": "Manage a player's High Score list.",
"source": "Tribute to the eighties' arcade game Frogger"
}
28 changes: 28 additions & 0 deletions exercises/practice/high-scores/.meta/example.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
module main

import arrays

type HighScores = []int

// build a new HighScores
pub fn HighScores.new(scores []int) HighScores {
return scores.clone()
}

pub fn (mut high_scores HighScores) scores() []int {
return high_scores
}

pub fn (mut high_scores HighScores) latest() int {
return high_scores.last()
}

pub fn (mut high_scores HighScores) personal_best() int {
return arrays.max(high_scores) or { 0 }
}

pub fn (mut high_scores HighScores) personal_top_three() []int {
mut result := high_scores.sorted(b < a)
result.trim(3)
return result
}
39 changes: 39 additions & 0 deletions exercises/practice/high-scores/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# This is an auto-generated file. Regular comments will be removed when this
# file is regenerated. Regenerating will not touch any manually added keys,
# so comments can be added in a "comment" key.

[1035eb93-2208-4c22-bab8-fef06769a73c]
description = "List of scores"

[6aa5dbf5-78fa-4375-b22c-ffaa989732d2]
description = "Latest score"

[b661a2e1-aebf-4f50-9139-0fb817dd12c6]
description = "Personal best"

[3d996a97-c81c-4642-9afc-80b80dc14015]
description = "Top 3 scores -> Personal top three from a list of scores"

[1084ecb5-3eb4-46fe-a816-e40331a4e83a]
description = "Top 3 scores -> Personal top highest to lowest"

[e6465b6b-5a11-4936-bfe3-35241c4f4f16]
description = "Top 3 scores -> Personal top when there is a tie"

[f73b02af-c8fd-41c9-91b9-c86eaa86bce2]
description = "Top 3 scores -> Personal top when there are less than 3"

[16608eae-f60f-4a88-800e-aabce5df2865]
description = "Top 3 scores -> Personal top when there is only one"

[2df075f9-fec9-4756-8f40-98c52a11504f]
description = "Top 3 scores -> Latest score after personal top scores"

[809c4058-7eb1-4206-b01e-79238b9b71bc]
description = "Top 3 scores -> Scores after personal top scores"

[ddb0efc0-9a86-4f82-bc30-21ae0bdc6418]
description = "Top 3 scores -> Latest score after personal best"

[6a0fd2d1-4cc4-46b9-a5bb-2fb667ca2364]
description = "Top 3 scores -> Scores after personal best"
20 changes: 20 additions & 0 deletions exercises/practice/high-scores/high-scores.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module main

struct HighScores {
}

// build a new HighScores
pub fn HighScores.new(scores []int) HighScores {
}

pub fn (mut high_scores HighScores) scores() []int {
}

pub fn (mut high_scores HighScores) latest() int {
}

pub fn (mut high_scores HighScores) personal_best() int {
}

pub fn (mut high_scores HighScores) personal_top_three() []int {
}
73 changes: 73 additions & 0 deletions exercises/practice/high-scores/run_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
module main

fn test_list_of_scores() {
mut high_scores := HighScores.new([30, 50, 20, 70])
expect := [30, 50, 20, 70]
assert high_scores.scores() == expect
}

fn test_latest_score() {
mut high_scores := HighScores.new([100, 0, 90, 30])
assert high_scores.latest() == 30
}

fn test_personal_best() {
mut high_scores := HighScores.new([40, 100, 70])
assert high_scores.personal_best() == 100
}

fn test_top_3_scores__personal_top_three_from_a_list_of_scores() {
mut high_scores := HighScores.new([10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70])
expect := [100, 90, 70]
assert high_scores.personal_top_three() == expect
}

fn test_top_3_scores__personal_top_highest_to_lowest() {
mut high_scores := HighScores.new([20, 10, 30])
expect := [30, 20, 10]
assert high_scores.personal_top_three() == expect
}

fn test_top_3_scores__personal_top_when_there_is_a_tie() {
mut high_scores := HighScores.new([40, 20, 40, 30])
expect := [40, 40, 30]
assert high_scores.personal_top_three() == expect
}

fn test_top_3_scores__personal_top_when_there_are_less_than_3() {
mut high_scores := HighScores.new([30, 70])
expect := [70, 30]
assert high_scores.personal_top_three() == expect
}

fn test_top_3_scores__personal_top_when_there_is_only_one() {
mut high_scores := HighScores.new([40])
expect := [40]
assert high_scores.personal_top_three() == expect
}

fn test_top_3_scores__latest_score_after_personal_top_scores() {
mut high_scores := HighScores.new([70, 50, 20, 30])
high_scores.personal_top_three()
assert high_scores.latest() == 30
}

fn test_top_3_scores__scores_after_personal_top_scores() {
mut high_scores := HighScores.new([30, 50, 20, 70])
high_scores.personal_top_three()
expect := [30, 50, 20, 70]
assert high_scores.scores() == expect
}

fn test_top_3_scores__latest_score_after_personal_best() {
mut high_scores := HighScores.new([20, 70, 15, 25, 30])
high_scores.personal_best()
assert high_scores.latest() == 30
}

fn test_top_3_scores__scores_after_personal_best() {
mut high_scores := HighScores.new([20, 70, 15, 25, 30])
high_scores.personal_best()
expect := [20, 70, 15, 25, 30]
assert high_scores.scores() == expect
}

0 comments on commit cd39532

Please sign in to comment.