A = [75, 31, 80, 40, 48, 40] # любой список
# Готовые решения для этих задач:
print(sum(A)) # Сумма
# Произведение
A = [35, 2, 82, 10, 44, 42]
import functools
import operator # содержит все возможные операции
print(functools.reduce( # reduce - применить операцию ко всем элементам списка поочерёдно
operator.mul, # операция умножения
A))
# Через цикл
# Сумма:
S = 0
for i in A: S += i # Сложить все элементы A, результатом будет переменная S
print(S)
# Произведение:
M = 1 # Если будет 0, то всё выражение тоже будет 0
for i in A: M *= i
# Или
if 0 in A: M = 0
else:
for i in A: M *= i
print(M)
Первая строка описывает импорт функции permutations из модуля itertools. Теперь мы можем ее использовать.
Далее, конструкция ''.join(b) используется для преобразования кортежа/массива в строку. Например, у нас есть кортеж ('1','2','3') и мы хотим получить из него строчку '123'. Для этого нам надо пройтись по каждому элементу кортежа и присоединять(по-английски join) их к изначально пустой строке. Проход по каждому элементу кортежа в данном случае описан как "({присоединение} for b in {собственно сам кортеж})", где b - элемент кортежа. Теперь про то, что здесь используют в качестве кортежа: permutations - с англ. значит перестановки. То есть, условно, у нас есть слово КОТ, применяем permutations(КОТ) и получаем такие вариации как КОТ, КТО, ОКТ, ОТК, ТКО, ТОК (само слово тоже учитывается, как и в задании).
Однако функция permutations возвращает все эти варианты перестановок как кортежи, то есть, как ('К', 'О', 'Т'), ('К', 'Т', 'О') и т.д. Поэтому-то мы и используем join, чтоб получить из кортежей строки для удобной работы. Теперь стоит заметить, что при наличии в слове одинаковых букв в вариациях перестановок могут получиться совпадающие позиции, так как для компьютера перестановка, например, в слове "ЛОТО" второй и четвертой буквы "О" будет давать новую вариацию, а для нас это все еще будет то же слово ЛОТО, ведь были поменяны местами две одинаковые буквы. Для избежания этой проблемы стоит прописать перед всем массивом с перестановками функцию set, которая просто уберет из него повторяющиеся элементы.
В следующей строке мы создаем массив только из тех строк полученного нами ранее массива с перестановками, которые удовлетворяют условию задания, а именно: не имеют одинаковых соседних букв. Почему это прописано как "if "ОО" not in b"(если "ОО" не в b)? Все просто: в перестановке слова ОДЕКОЛОН две соседние буквы могут быть только ОО, ведь у других букв банально нет пары. В итоге мы проходимся по каждому элементу нашего кортежа с вариациями, и смотрим есть ли в очередной вариации подстроки с двумя буквами О подряд. Если нет - то добавляем в массив, если есть - пропускаем.
В третьей строке выводится количество элементов (len(сокращение length - англ. длина) для массива - кол-во элементов в нем) в полученном массиве, то есть количество вариантов перестановок, где нет слов с одинаковыми соседними буквами.
Поделитесь своими знаниями, ответьте на вопрос:
C++. разобраться с программой! дайте комментарий к каждой строке и команде к ней , опишите принцип действия. int comb(vector sort) { int n = 0; // количество перестановок double fakt = 1.2473309; // фактор уменьшения int step = sort.size() - 1; while (step > = 1) { for (int i = 0; i + step < sort.size(); ++i) { if (sort[i] > sort[i + step]) { swap(sort[i], sort[i + step]); n++; } } step /= fakt; } // сортировка пузырьком for (int i = 0; i < sort.size() - 1; i++) { bool swapped = false; for (int j = 0; j < sort.size() - i - 1; j++) { if (sort[j] > sort[j + 1]) { swap(sort[j], sort[j + 1]); swapped = true; ++n; } } if (! swapped) break; } return n; }
{
int n = 0; // количество перестановок
double fakt = 1.2473309; // фактор уменьшения
int step = sort.size() - 1;
while (step >= 1)
{
for (int i = 0; i + step < sort.size(); ++i)
{
if (sort[i] > sort[i + step])
{
swap(sort[i], sort[i + step]);
n++;
}
}
step /= fakt;
}
// сортировка пузырьком
for (int i = 0; i < sort.size() - 1; i++)
{
bool swapped = false;
for (int j = 0; j < sort.size() - i - 1; j++)
{
if (sort[j] > sort[j + 1]) {
swap(sort[j], sort[j + 1]);
swapped = true;
++n;
}
}
if (!swapped)
break;
}
return n;
}