Skip to content

Commit

Permalink
Add high-scores exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
BNAndras committed Oct 25, 2023
1 parent 83c2ac4 commit a200f07
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,14 @@
"prerequisites": [],
"difficulty": 1
},
{
"slug": "high-scores",
"name": "High Scores",
"uuid": "0d19dee3-f4a8-4035-a436-388b71364202",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "list-ops",
"name": "List Ops",
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.
18 changes: 18 additions & 0 deletions exercises/practice/high-scores/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"authors": [
"BNAndras"
],
"files": {
"solution": [
"high-scores.rkt"
],
"test": [
"high-scores-test.rkt"
],
"example": [
".meta/example.rkt"
]
},
"blurb": "Manage a player's High Score list.",
"source": "Tribute to the eighties' arcade game Frogger"
}
17 changes: 17 additions & 0 deletions exercises/practice/high-scores/.meta/example.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#lang racket

(provide high-scores%)

(define high-scores%
(class object%
(init values)
(define current-values values)
(super-new)
(define/public (scores) current-values)
(define/public (latest) (car (reverse (scores))))
(define/public (personal-best) (apply max (scores)))
(define/public (personal-top-three)
(define sorted (sort (scores) >))
(if (< (length sorted) 3)
sorted
(take sorted 3)))))
46 changes: 46 additions & 0 deletions exercises/practice/high-scores/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# 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.

[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"
88 changes: 88 additions & 0 deletions exercises/practice/high-scores/high-scores-test.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#lang racket

(require "high-scores.rkt")

(module+ test
(require rackunit rackunit/text-ui)

(define suite
(test-suite
"high score tests"

(test-equal? "List of scores"
(let* ([values '(30 50 20 70)]
[high-scores (new high-scores% [values values])])
(send high-scores scores))
'(30 50 20 70))

(test-equal? "Latest scores"
(let* ([values '(100 0 90 30)]
[high-scores (new high-scores% [values values])])
(send high-scores latest))
30)

(test-equal? "Personal-best scores"
(let* ([values '(40 100 70)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-best))
100)

(test-equal? "Top 3 scores -> Personal top three from a list of scores"
(let* ([values '(10 30 90 30 100 20 10 0 30 40 40 70 70)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-top-three))
'(100 90 70))

(test-equal? "Top 3 scores -> Personal top highest to lowest"
(let* ([values '(20 10 30)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-top-three))
'(30 20 10))

(test-equal? "Top 3 scores -> Personal top when there is a tie"
(let* ([values '(40 20 40 30)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-top-three))
'(40 40 30))

(test-equal? "Top 3 scores -> Personal top when there are less than 3"
(let* ([values '(30 70)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-top-three))
'(70 30))

(test-equal? "Top 3 scores -> Personal top when there is only one"
(let* ([values '(40)]
[high-scores (new high-scores% [values values])])
(send high-scores personal-top-three))
'(40))

(test-equal? "Top 3 scores -> Latest score after personal top scores"
(let* ([values '(70 50 20 30)]
[high-scores (new high-scores% [values values])])
(and (send high-scores personal-top-three)
(send high-scores latest)))
30)

(test-equal? "Top 3 scores -> Scores after personal top scores"
(let* ([values '(30 50 20 70)]
[high-scores (new high-scores% [values values])])
(and (send high-scores personal-top-three)
(send high-scores scores)))
'(30 50 20 70))

(test-equal? "Top 3 scores -> Latest score after personal best"
(let* ([values '(20 70 15 25 30)]
[high-scores (new high-scores% [values values])])
(and (send high-scores personal-best)
(send high-scores latest)))
30)

(test-equal? "Top 3 scores -> Scores after personal best"
(let* ([values '(20 70 15 25 30)]
[high-scores (new high-scores% [values values])])
(and (send high-scores personal-best)
(send high-scores scores)))
'(20 70 15 25 30))))

(run-tests suite))
8 changes: 8 additions & 0 deletions exercises/practice/high-scores/high-scores.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#lang racket

(provide high-scores%)

(define high-scores%
(class object%
; implement me!
(super-new)))

0 comments on commit a200f07

Please sign in to comment.