Немного усовершенствован алгоритм