In Clojure, Lists are collections, just like lists in other languages. Similar to other languages in the Lisp family, Clojure uses parentheses to express lists.
Clojure lists can be created in one of two ways. The list
function can create a list, or you can quote
a literal list.
Lists are special because Clojure will treat them as calls. It expects the call to start with an operator, which is usually a function. The remaining items of the list are considered operands, meaning they become the function's arguments.
Clojure's special treatment of lists is why we cannot create a list literal directly. Quoting a list using quote
or its shorthand '
indicates that the list should not be evaluated.
Unlike some modern languages, Clojure lists are heterogeneous, meaning they can contain multiple types of items internally e.g., '(2 "a" "b" 3)
.
Unlike other Lisps, an empty list in Clojure is truthy and is not equivalent to nil
or false
.
Elyse is really looking forward to playing some poker (and other card games) during her upcoming trip to Vegas. Being a big fan of "self-tracking" she wants to put together some small functions that will help her with tracking tasks and has asked for your help thinking them through.
Elyse is especially fond of poker, and wants to track how many rounds she plays - and which rounds those are. Every round has its own number, and every table shows the round number currently being played. Elyse chooses a table and sits down to play her first round. She plans on playing three rounds.
Implement a function rounds
that takes the current round number and returns a single list
with that round and the next two that are coming up:
(rounds 27)
;;=> (27 28 29)
Elyse played a few rounds at the first table, then took a break and played some more rounds at a second table ... but ended up with a different list for each table! She wants to put the two lists together, so she can track all of the poker rounds in the same place.
Implement a function concat-rounds
that takes two lists and returns a single list
consisting of all the rounds in the first list
, followed by all the rounds in the second list
:
(concat-rounds '(27 28 29) '(35 36))
;;=> (27 28 29 35 36)
Talking about some of the prior Poker rounds, another player remarks how similarly two of them played out. Elyse is not sure if she played those rounds or not.
Implement a function contains-round?
that takes two arguments, a list of rounds played and a round number.
The function will return true
if the round is in the list of rounds played, false
if not:
(contains-round? '(27 28 29 35 36) 29)
;;=> true
(contains-round? '(27 28 29 35 36) 30)
;;=> false
Elyse wants to try out a new game called Black Joe. It's similar to Black Jack - where your goal is to have the cards in your hand add up to a target value - but in Black Joe the goal is to get the average of the card values to be 7. The average can be found by summing up all the card values and then dividing that sum by the number of cards in the hand.
Implement a function card-average
that will return the average value of a hand of Black Joe.
(card-average '(5 6 7))
;;=> 6.0
In Black Joe, speed is important. Elyse is going to try and find a faster way of finding the average.
She has thought of two ways of getting an average-like number:
Implement the function approx-average?
, given hand
, a list containing the values of the cards in your hand.
Return true
if either one or
both of the, above named, strategies result in a number equal to the actual average.
Note: The length of all hands are odd, to make finding a median easier.
(approx-average? '(1 2 3))
;;=> true
(approx-average? '(2 3 4 8 8))
;;=> true
(approx-average? '(1 2 3 5 9))
;;=> false
Intrigued by the results of her averaging experiment, Elyse is wondering if taking the average of the cards at the even positions versus the average of the cards at the odd positions would give the same results. Time for another test function!
Implement a function average-even-odd?
that returns a Boolean indicating if the average of the cards at even indexes is the same as the average of the cards at odd indexes.
(average-even-odd? '(1 2 3))
;;=> true
(average-even-odd? '(1 2 3 4))
;;=> false
Every 11th hand in Black Joe is a bonus hand with a bonus rule: if the last card you draw is a Jack, you double its value.
Implement a function maybe-double-last
that takes a hand and checks if the last card is a Jack (11).
If the last card is a Jack (11), double its value before returning the hand.
(maybe-double-last '(5 9 11))
;;=> '(5 9 22)
(maybe-double-last '(5 9 10))
;;=> '(5 9 10)
Sign up to Exercism to learn and master Clojure with 12 concepts, 85 exercises, and real human mentoring, all for free.