Недавно мне пришлось решить проблему на работе, где у меня было два списка: основной список и меньший список, который содержит подмножество элементов в основном списке, потенциально в другом порядке. Мне нужно было изменить порядок главного списка таким образом, чтобы элементы в подмножестве отображались в том же порядке, не меняя порядок элементов, не найденных в списке, и сохраняя элементы в том же месте, когда это было возможно. Ладно, это может звучать странно, поэтому я разобью это:
- Основной список определяет порядок элементов по умолчанию.
- Список подмножеств определяет относительный порядок определенных элементов.
- Если основной список имеет два элемента не по порядку в соответствии со списком подмножеств, элемент, находящийся ранее в основном списке, должен быть перемещен в самый ранний индекс, где он находится в правильном положении относительно других элементов в списке подмножеств. (т.е. сразу после более позднего пункта)
Ваша задача - реализовать этот алгоритм переупорядочения.
Примеры тестовых случаев
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
правила
- Стандартные лазейки, Ядда Ядда, удобный ввод-вывод, бла-бла.
- Несмотря на то, что в примерах используются числа и строки, вам нужно поддерживать только один тип элемента, будь то целые числа, строки или что-то еще с четко определенной семантикой равенства, включая гетерогенные списки, если это удобно на вашем языке.
- Вы можете предположить, что и главный список, и список подмножеств не содержат дубликатов
- Вы можете предположить, что все элементы, найденные в списке подмножеств, находятся в основном списке
- Любой список может быть пустым
- Вы должны, как минимум, поддерживать массивы длиной до 100 элементов.
- Переупорядочение может быть реализовано на месте или путем создания нового списка / массива.
Счастливого гольфа!
code-golf
array-manipulation
Beefster
источник
источник
8 1 3 4 5 6 7 2 9 12 11 10
ли правильное решение для второго до последнего?Ответы:
Сетчатка 0.8.2 , 51 байт
Попробуйте онлайн! Принимает ввод как разделенный запятыми список подслов в первой строке и разделенный запятыми основной список слов во второй строке. Объяснение:
Найдите два смежных подслов, где второе слово предшествует первому в главном списке.
Переместите второе слово, чтобы оно появилось после первого слова в основном списке.
Повторяйте, пока слова не появятся не по порядку.
Удалить подслов.
источник
JavaScript (ES6),
96 89 7471 байтЭто началось как громоздкий беспорядок и в конечном итоге сократилось до довольно лаконичной и элегантной формы. Я хотел бы поблагодарить .splice () за его плодотворное сотрудничество. ;)
Принимает вход как
(master)(subset)
. Выходы путем обновления основного списка.Попробуйте онлайн!
Как?
комментарии
источник
Haskell, 79 байтов
Попробуйте онлайн!
источник
Рубин ,
7368 байтПопробуйте онлайн!
Как?
a
иb
содержит все элементыb
, но в том порядке, в котором мы их нашли быa
b
выполняем параллельное пересечение и пересечение, как только мы находим различие, мы можем переместить один элемент.a
позиции элемента, который мы нашли вb
, затем удаления элемента, который мы нашли в пересечении, и затем добавления остатка от a.b
будут в правильном порядке вa
источник
0while
?Python 2 ,
1241091069996 байтПопробуйте онлайн!
источник
Perl 6 , 40 байт
Попробуйте онлайн!
Блок анонимного кода, который принимает ввод карри (например,
f(subList)(masterList)
, и находит первую лексографическую перестановку индексов основного списка, где элементы из подсписка расположены в правильном порядке.Интуитивно понятно, что первая удовлетворительная перестановка оставит правильно упорядоченные элементы в исходном порядке, в то время как неправильно расположенные элементы будут перемещены на минимально необходимое расстояние вперед, чтобы расположить их в правильном порядке, что позволит разместить их непосредственно после предыдущего элемента в подмножестве.
Объяснение:
источник
Желе , 9 байт
Попробуйте онлайн! или тестовый набор
Неэффективно, особенно с большими списками мастеров. Создает все возможные перестановки, отфильтровывает те, где подмножество находится в неправильном порядке, а затем возвращает первое.
объяснение
источник
J , 49 байт
Попробуйте онлайн!
объяснение
Мы принимаем подмножество в качестве левого аргумента, а полный ввод - в качестве правого.
Мы проработаем код с конкретным примером для ясности:
Возьмите штучные инфиксы второго размера из подмножества:
производство:
добавьте их к исходному вводу и полностью измените
Мы получаем:
Решение проблемы становится справа налево сокращение выше. Нам нужно только найти правильный глагол, чтобы вставить
/
между элементами.Каждая итерация сокращения обновляет крайний правый блок (полный ввод, который мы преобразуем), чтобы он соответствовал ограничению порядка, представленному парой слева. Когда сокращение будет завершено, вход будет соответствовать полному порядку подмножества.
Если упорядочение пары совпадает с упорядочением на входе, следующее будет иметь значение 0, и мы ничего не будем делать:
В противном случае он будет равен 1, и мы применим глагол слева от
^:
который перемещает левый элемент вправо от правого элемента. Это движение просто циклическая перестановка всех элементов между (и включая) двумя этими элементами.
J имеет примитив для применения такой циклической перестановки:
и остаток от глагола ничего не делает, кроме как выбирает индексы, которые нам нужны для циклического цикла:
что кажется длиннее, чем должно быть, но я не смог продвинуть эту фразу дальше.
Наконец мы перезагружаем результат
<@
и все готово.источник
Желе , 24 байта
Попробуйте онлайн! или тестовый набор
объяснение
Диадическая ссылка, которая принимает подмножество в качестве левого, а основной список - в качестве правого аргумента. В приведенном ниже примере 9001, 42, 69, 1337, 420, 99, 255 в качестве главного и 69, 9001, 1337 в качестве подмножества.
источник
C # (интерактивный компилятор Visual C #) , 118 байт
Попробуйте онлайн!
Использование некоторых классов в
System.Collections.Generic
пространстве имен. Мастер - это,List<T>
а подмножество -Queue<T>
.источник