Exercise: Tumbler Wheels Lock combinations

You have just bought a new safe to keep all the riches you will gain from becoming a Clojure developer (hopefully). The safe has a 3 tumbler wheel combination lock to protect your new found wealth. Each tumbler wheel has the numbers 0 to 9.

Combination locks

Represent a single combination lock

How would you represent the possible numbers in just one of the tumbler wheels

[]
Reveal answer...
  • The combination is managed by three tumbler wheels
  • Each tumbler wheel has the same range of numbers on then, 0 to 9

Each tumbler wheel could have all the numbers it contains within a Collection in Clojure. The simplest approach would be to put the numbers 0 to 9 into a Vector (an array-like collection).

[0 1 2 3 4 5 6 7 8 9]

Generating the number range

As the numbers on the tumbler wheel are just a range between 0 and 9, then rather than type out all the numbers, is there a function to generate all the numbers for us.

()
Reveal answer...

When we give the range function one argument, it will create all the whole numbers from 0 to the number before that of the argument. In the following example, we give range the argument of 10 and we receive the numbers from 0 to 9.

(range 10)

You can also give range two arguments, such as '(range 5 15)'.

Be careful not to call the range function by itself, or it will try and generate an infinite range of numbers (until your computer memory is all used up).


Create all the Combinations

Generate all the possible combinations of the lock using three tumbler wheels We have given you a bit of a clue

(for [tumbler-one (range 10)]
)
Reveal answer...
(for [tumbler-1 (range 10)
      tumbler-2 (range 10)
      tumbler-3 (range 10)]
 [tumbler-1 tumbler-2 tumbler-3])

Total number of combinations

You did the hard work already, now return just the total number of combinations

()
Reveal answer...

Take the code from the combinations and wrap it in the count function

;; now count the possible combinations
(count
  (for [tumbler-1 (range 10)
        tumbler-2 (range 10)
        tumbler-3 (range 10)]
   [tumbler-1 tumbler-2 tumbler-3]))

Make the combinations harder to guess

To make our lock harder to break into, we should only allow the combinations where each tumbler wheel has a different number. So you should exclude combinations like 1-1-1, 1-2-2, 1-2-1, etc.

How many combinations does that give us?

()
Reveal answer...

Complete the following code to create a 3-tumbler wheel combination lock, where none of the numbers are the same

Hint: Beware not to enter (range) without an argument as Clojure may try and evaluate infinity

(count
 (for [tumbler-1 (range 10)
      tumbler-2 (range 10)
      tumbler-3 (range 10)
      :when (or (= tumbler-1 tumbler-2)
                (= tumbler-2 tumbler-3)
                (= tumbler-3 tumbler-1))]
  [tumbler-1 tumbler-2 tumbler-3]))

Here is a suggested example of the completed 3-lock challenges.

results matching ""

    No results matching ""