# Calculating the Maximum, Minimum and Average of Three Numbers

The title says it all. As always, I love to answer those homework questions with obfuscated solutions, for that is unsuitable to hand in those solutions.

A simple way to make a solution to entry-level question like this one harder to understand, is leveraging the fact that functions are first-class in python, so basically logic and I/O operations, almost everything we need here can be stuffed inside a single expression, like this:

```[f(n) for f, n in zip((max, min, lambda s: float(sum(s))/len(s)), ([list(map(int, map(raw_input, ':::')))]*3))]
```

This is the Python 2 version, for Python 3, substitute `raw_input` with `input`.

It works like so:

```>>> [f(n) for f, n in zip((max, min, lambda s: float(sum(s))/len(s)), ([list(map(int, map(raw_input, ':::')))]*3))]
:1
:2
:3
[3, 1, 2.0]
```

For extra fun, I use the number of `:` (Colon) to control how many numbers can be accepted, i.e, for six numbers instead of three, change `':::'` to `'::::::'`:

```>>> [f(n) for f, n in zip((max, min, lambda s: float(sum(s))/len(s)), ([list(map(int, map(raw_input, '::::::')))]*3))]
:12
:34
:56
:78
:90
:42
[90, 12, 52.0]
```

Because of the incompatible differences between Python 2 and Python 3, it can be a little bit shorter if I am only targeting specific branch of Python.

In Python 2, `map` returns a `list`, so explicit `list` conversion is not needed:

```[f(n) for f, n in zip((max, min, lambda s: float(sum(s))/len(s)), ([map(int, map(raw_input, ':::'))]*3))]
```

On the other hand, division operator returns floating-point numbers by default in Python 3, `float` function call is no longer necessary:

```[f(n) for f, n in zip((max, min, lambda s: sum(s)/len(s)), ([list(map(int, map(input, ':::')))]*3))]
```