Цель этой задачи - собрать выбранные элементы в списке и переместить их в определенное место в списке.
В качестве наглядного примера возьмем входные значения (представленные целыми числами в черных ящиках) и соответствующий список истинных значений, где true означает, что выбран элемент (представлен голубыми полями, где T
true и F
is falses):
Первый логический шаг - разделить элементы, помеченные как правдивые и не правдивые, в соответствующие списки. Обратите внимание, что относительный порядок в каждом списке должен поддерживаться (то есть порядок выбранных элементов должен быть 1,4,5
, а порядок невыбранных элементов должен быть 2,3,6,7
)!
Второй логический шаг - указание индекса в оставшемся списке невыбранных элементов, вставка всех выбранных элементов перед элементом с указанным индексом. Предполагая, что индексирование начинается с 0, предположим, что вы хотите вставить выборку с индексом 3. Это соответствует месту перед 7
полем, поэтому выбранные элементы должны быть вставлены перед 7
.
Окончательное решение тогда 2,3,6,1,4,5,7
.
Обратите внимание, что эта логическая диаграмма изображает один из способов, которым это можно сделать; вашей программе не нужно предпринимать одни и те же логические шаги, если выходные данные всегда дают один и тот же наблюдаемый результат.
вход
Ваша программа имеет 3 входа:
- Список целых чисел, представляющих элементы. Это может быть пустой список. Этот список всегда будет состоять из уникальных натуральных чисел, не обязательно в отсортированном порядке (т.е. 5 не будет в списке дважды).
- Список истинных / ложных значений такой же длины, что и список элементов, где истинное значение означает, что был выбран элемент с тем же индексом.
- Целое число, представляющее, куда вставить выбор. Вы можете выбрать индекс первого элемента списка, если он постоянен при каждом запуске вашей программы (например, первым элементом может быть индекс 0 или индекс 1). Пожалуйста, укажите, какой конвенции придерживается ваша программа. Этот индекс должен находиться в диапазоне
[starting_idx, ending_idx+1]
, т.е. он всегда будет действительным индексом. Для индекса случаяending_idx+1
, выбор должен быть вставлен в конец списка. Вы можете предположить, что это целое число будет соответствовать типу целого числа вашего языка.
Вход может поступать из любого желаемого источника (stdio, параметр функции и т. Д.)
Выход
Вывод представляет собой список, представляющий окончательную последовательность элементов. Это может быть любой источник (stdio, возвращаемое значение, выходной параметр функции и т. Д.). Вам разрешено изменять любые входные данные на месте (например, если список параметров можно изменить как параметр функции, а ваша функция должна работать на месте в этом списке).
Контрольные примеры
Все следующие тестовые примеры предполагают индексирование на основе 0. Я использовал 0 и 1, чтобы указать ложные / истинные значения соответственно для маски выбора.
В тестовых примерах списки отформатированы как [a,b,c]
, но пока ваши входные списки представляют собой конечную упорядоченную последовательность, это нормально.
Входные данные:
[]
[]
0
Выход:
[]
Входные данные:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3
Выход:
[2,3,6,1,4,5,7]
Входные данные:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0
Выход:
[1,4,5,2,3,6,7]
Входные данные:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4
Выход:
[2,3,6,7,1,4,5]
Входные данные:
[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0
Выход:
[1,2,3,4,5,6,7]
Входные данные:
[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5
Выход:
[1,2,3,4,5,6,7]
Входные данные:
[1,3,2,5,4,6]
[1,0,0,1,1,0]
3
Выход:
[3,2,6,1,5,4]
счет
Это код гольф; кратчайший ответ в байтах побеждает. Стандартные лазейки запрещены. Вам разрешено использовать любые встроенные модули по вашему желанию.