# 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. ### Represent a single combination lock

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

``````[]
``````
• 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.

``````()
``````

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)]
)
``````
``````(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

``````()
``````

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?

``````()
``````

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.