Требуемый результат:
Рабочее решение

Решение:
Рабочее решение
PS вполне вероятно что это уже классика, не проверял.