Цель этой задачи - собрать выбранные элементы в списке и переместить их в определенное место в списке.
В качестве наглядного примера возьмем входные значения (представленные целыми числами в черных ящиках) и соответствующий список истинных значений, где 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]
счет
Это код гольф; кратчайший ответ в байтах побеждает. Стандартные лазейки запрещены. Вам разрешено использовать любые встроенные модули по вашему желанию.
Ответы:
MATL, 9 байт
Это решение принимает массив значений
T
(true) иF
(false) в качестве второго ввода. Также для первого тестового примера, с пустыми массивами, он не производит вывод.Попробуйте онлайн! и немного измененная версия для всех тестовых случаев.
объяснение
источник
Mathematica,
6662 байтаСохранено 4 байта из @MartinEnder .
Анонимная функция. Принимает индекс на основе 1, список и маркеры в качестве входных данных и возвращает переупорядоченный список в качестве выходных данных.
источник
Haskell, 70 байт
Пример использования:
([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3
->[2,3,6,1,4,5,7]
.Как это устроено:
источник
JavaScript (ES6), 76 байт
источник
Желе , 10 байт
Попробуйте онлайн!
Как это устроено
источник
C #, 132 байта
ungolfed:
Идеи по улучшению приветствуются.
источник
Python 3, 91 байт
где
a
список элементов / номера,x
являетсяTrue/False
список иi
является индексом.Многострочная версия для улучшения читаемости:
Как это работает?
Вызов
zip(a,x)
результатов в виде списка кортежей , где каждый из них содержит информацию:(element,0|1)
. Затем используется понимание списка, чтобы определить элементы, которым присвоено0/False
значение, и сохранить их в переменнойb
.Таким образом,
[c for c,z in zip(a,x)if z<1]
создается список, который содержит все элементы, с которыми связано значение0
(False
).После этого, список элементов , которые имеют
True|1
значение , связанное (которая определяется проверкой , какие элементыa
не присутствуют вb
:[c for c in a if(c in b)<1]
) вставляется в списке со всеми элементами , которые имеют0
(False
значение) , связанное (списокb
) по указанному индексуi
и полученный список возвращается.источник
Python 3,
10693 байтаСтарая версия:
источник