Advent Challenge 5: переместите подарки в транспортные доки!

9

<< Пред. След. >>

Благодаря сообществу PPCG, Санта сумел восстановить все свои подарки, и после конвейера, подарки теперь готовы к отправке в транспортные доки!

Каждый из транспортных доков Санта-Клауса вмещает только ряд существующих размеров, потому что транспортные сани специализированы для определенного размера (любой легче, и он будет расточительным, тяжелее, и сани не смогут справиться с грузом). Таким образом, он нуждается в вас, чтобы помочь ему взять его подарки и отсортировать их в правильные транспортные доки.

Вызов

Учитывая список и дальности дока транспорта, стабильно организуйте подарки в правильном порядке.

Давайте возьмем это для примера: подарки [5, 3, 8, 6, 2, 7]и диапазоны стыковки [[1, 5] and [6, 10]].

Присутствующие 5, 3и 2идти в первый док - станции и подарки 8, 6и 7идти во второй док. Это может быть показано как [[5, 3, 2], [8, 6, 7]]. Этот список будет ближе к сортировке, чем вход, но stablyозначает, что в каждой док-станции порядок подарков должен быть таким же, как порядок ввода (в противном случае вы можете просто отсортировать весь список).

Ваш окончательный вывод для этого случая будет [5, 3, 2, 8, 6, 7](как плоский список).

Спецификации форматирования

Вам будет предоставлена ввод в виде плоского списка целых чисел и список диапазонов в любом приемлемом формате (например, диапазон для приведенного выше случая может быть задан как [[1, 5], [6, 10]], [1, 5, 6, 10]или [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Ваш вывод должен быть простым списком целых чисел в любом приемлемом формате.

Входные данные могут содержать повторяющиеся значения; в этом случае вам необходимо вернуть все их экземпляры. Все существующие размеры будут находиться в одном диапазоне размеров, и вы можете предположить, что диапазоны никогда не будут перекрываться. В диапазонах могут быть промежутки, если охватываются все существующие размеры.

правила

  • Применяются стандартные лазейки
  • Это поэтому выигрывает самый короткий ответ в байтах
  • Ответ не будет принят
  • Вы можете предположить, что не будет пустых диапазонов ( [7, 4]будет недействительным, потому что диапазоны увеличиваются)

Тестовые случаи

[1, 2, 3, 4, 5, 6, 7] ; [[1, 3], [4, 7]] => [1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] ; [[4, 7], [1, 3]] => [4, 5, 6, 7, 1, 2, 3]
[7, 3, 5, 4, 6, 1, 2] ; [[1, 3], [4, 5], [6, 7]] => [3, 1, 2, 5, 4, 7, 6]
[4, 7, 6, 3, 5, 2, 1] ; [[1, 4], [5, 7]] => [4, 3, 2, 1, 7, 6, 5]
[1, 1, 3, 3, 6, 4, 7] ; [[1, 4], [6, 7]] => [1, 1, 3, 3, 4, 6, 7]

Примечание: я черпал вдохновение для этой серии испытаний из Advent Of Code . У меня нет связи с этим сайтом

Вы можете увидеть список всех испытаний в серии, посмотрев раздел «Связанные» первой задачи здесь .

HyperNeutrino
источник
Всегда только 2 дока?
LiefdeWen
Могут ли диапазоны перекрываться?
RamenChef
@LiefdeWen Смотрите 3-й контрольный пример.
г-н Xcoder
Будут ли пары доков {маленькими, большими}
LiefdeWen
@RamenChef Нет ..
HyperNeutrino

Ответы:

4

Желе , 4 байта

fЀẎ

Попробуйте онлайн!

Принимает ввод как настоящий список, полный диапазон.

Эрик Аутгольфер
источник
да, это желе решение, которое я ожидал: DDD
HyperNeutrino
@HyperNeutrino Хехе ожидаемое решение оказывается не самым коротким. Найдя способ работы внешнего продукта 05ab1e, я понял, что он fþFработает и в Jelly, на 3 байта . Кредит идет на Аднана .
г-н Xcoder
@ Mr.Xcoder Либо ты, либо Аднан должны опубликовать это.
Эрик Outgolfer
@ Mr.Xcoder Я подожду немного и посмотрю: P, но это выглядит значительно иначе, если я в конечном итоге отправлю это, я опубликую другой ответ.
Эрик Outgolfer
4

Mathematica, 39 байт

x##&@@Cases[x,#|##&@@Range@##]&@@@#&

-22 байта от JungHwan Мин.
-4 байта от Мартина

Попробуйте онлайн!

J42161217
источник
Вы также можете избавиться от всего Rangeэтого, просто взяв расширенные диапазоны в качестве входных данных.
Мартин Эндер
3

Pyth , 5 байт

s@Rvz

Попробуй это здесь!

Pyth , 10 байт

s.gx}LkQ1E

Попробуй это здесь!

Как они работают

s @ Rvz | Полная программа.

  R | Правильная карта ...
 @ | ... используя пересечение.
   VZ | Из первого ввода со вторым.
с | Свести на один уровень.
s.gx} LkQ1E | Полная программа.

 .g E | Сгруппируйте элементы во втором входе по ...
    } LkQ | Сопоставьте первый вход и проверьте, есть ли текущий элемент в списке.
   х 1 | Возьмите указатель первого правдивого элемента.
с | Свести.

Сначала занимает доки со всеми целыми числами в диапазонах, а затем представляет подарки в новой строке.

Мистер Xcoder
источник
3

05AB1E , 3 байта

δØ

Попробуйте онлайн! (спасибо Аднану за сообщение, что он δсуществует, -1 байт)

Как это работает

δØ | Полная программа.

δ | Дважды векторизовать следующую команду (что-то вроде внешнего произведения).
 М | Пересечение списка. Поскольку это диада, первый вход автоматически
     | используется для заполнения недостающего аргумента (насколько я знаю).
  ˜ | Свести.
Мистер Xcoder
источник
Ну, €Ã˜похоже, не работает.
Эрик Outgolfer
Нет, нет Кстати, причина €Ã˜неудачи в том, что она Ãпринимает два аргумента и ожидает функцию с одним аргументом, поэтому она возвращает [[]]вместо этого (я думаю, что это ошибка), поэтому затем ˜сгладится и вернется []. εВпрочем, работает по-другому. Для каждого элемента верхнего элемента он создает новый стек, а затем возвращает верх каждого нового стека, поэтому, когда в нем недостаточно элементов для функции, вместо этого он принимает неявный ввод.
Эрик Outgolfer
Я еще не проверял, но δØвы ищете?
Аднан
@ Mr.Xcoder Я не думаю, что это именно диадическая карта, которую имеет Пит, она ведет себя скорее как внешний продукт или что-то в этом роде.
Эрик Outgolfer
3

Retina , 37 36 байт

O$`(\d+)(?=.*¶(.*)\[.*\b\1\b)
$2
G1`

Попробуйте онлайн! Вводит в виде списка подарков в первой строке и списка диапазонов во второй строке; ссылка содержит заголовок для разделения тестовых случаев в желаемый формат. Редактировать: 1 байт сохранен благодаря @MartinEnder. Объяснение: Первый этап сопоставляет подарки и находит соответствующий док. Подарки сортируются по подстроке от начала строки до [, тем самым группируя подарки по доку. Затем второй этап удаляет доки.

Нил
источник
2

Подключить , 3 байта

f₱Ẏ

Попробуйте онлайн!

Как это работает

f ₱ Ẏ | Полная программа.

 ₱ | Карта над правильным аргументом.
f | Использование пересечения списка, подсчет кратностей.
  Ẏ | Затянуть (сгладить на 1 уровень).
Мистер Xcoder
источник
1
: D Записаться не забыли: D На самом деле это вроде как, только не сообществом, а скорее мной :(: P
HyperNeutrino
2

APL + WIN, 29 байт

(,⍉<\p←n∘.≤∊¯1↑¨⎕)/(×/⍴p)⍴n←⎕

Запрашивает ввод с экрана целых чисел и диапазонов. Целые числа как плоский список, а диапазоны как вложенный вектор, например, случай 3:

(1 3) (4 5) (6 7)

Объяснение:

(×/⍴p)⍴n←⎕ prompt for screen input of integers and replicate by the number of ranges 

∊¯1↑¨⎕ prompt for screen input of ranges and select the top of each

p←n∘.≤ create a boolean matrix using outer product with less than the top of each range

,⍉<\ identify the first range which each element fits in and ravel into a partition vector

(.....)/.... use the partition vector to select the elements in each range in order
Грэхем
источник
2

C ++, 127 байт

Возьмите входные данные в виде двух массивов, представленных парами указателей [start, end).

#import<algorithm>
[](int*A,int*x,int*B,int*y){for(;B!=y;B+=2)A=std::stable_partition(A,x,[&](int a){return a>=*B&&a<=B[1];});}

Попробуйте онлайн!

Колера Су
источник
Ну, C ++ имеет встроенный для всего ... или нет? / Принимая во внимание, что входные диапазоны не содержат 0, можно уменьшить количество байтов, используя массив B с нулевым символом в конце, хотя это может считаться мошенничеством. / К сожалению, [&](int a)->int{a=a>=вместо того, [&](int a){return a>=чтобы не сохранять байты. / #import<algorithm>может быть #import<regex>, хотя бы на TIO. Я обнаружил, что после исчерпывающего поиска («ручной двоичный поиск») все заголовки перечислены на этой странице, и этот самый короткий. / Также +1 от меня.
user202729
2

J 15 байт

[/:[:I.e.&>"0 1

Принимает входные данные в качестве левого аргумента, а диапазоны - в качестве правого аргумента. Диапазоны являются коробочными списками полных диапазонов.

например, для первого диапазона:

   NB. This produces the range
   (1 2 3 ; 4 5 6 7)
┌─────┬───────┐
│1 2 3│4 5 6 7│
└─────┴───────┘

Попробуйте онлайн!

объяснение

[/:[:I.e.&>”0 1
          >”0 1  Pair each element on the left with each range on the right
       e.        Is the element in the range?
     I.          Indices of ones
[/:              Sort the elements by this array
капуста
источник
2

J , 26 24 байта

2 байта благодаря Коул

[:;]<@#~1=-&1 0"1@[I."1]

Как это работает:

Левый аргумент содержит диапазоны.

-&1 0"1@[ уменьшает нижнюю границу каждого диапазона на 1

I."1] проверяет, в каком диапазоне подходит каждый подарок

1= это в правильном диапазоне

]<@#~ копии и коробки подарков, которые находятся в текущем ассортименте

; - никак (распаковка)

Попробуйте онлайн!

Гален Иванов
источник
1
Я почти уверен, что вы не можете удалить нули, так как вход является целым (например, не проходит этот тестовый пример (0 4,:_3 _1) f _2 _1 0 1 2)
Коул
@cole Хм, я полностью пренебрег этими случаями. Мне нужно подумать о них.
Гален Иванов
1
Да, я думаю, что самый простой способ, вероятно, будет боксировать, а затем никак. 24 байта таким образом.
Коул
@cole Спасибо! Это не только короче, но и легко решает проблему с 0.
Гален Иванов
2

R , 113 48 55 41 байт

Предыдущая версия неправильно сортировала объекты, когда доки были не в порядке возрастания.

function(P,D)for(d in D)cat(P[P%in%d],"")

Попробуйте онлайн!

Берет Dза список векторов диапазонов, т. list(4:7,1:3)Е. Будет [[4, 7], [1, 3]].

Вероятно, наивный ответ, который я должен был получить давным-давно; печатает на стандартный вывод.

Giuseppe
источник
2

Japt , 6 байт

ñ@VbøX

Попробуй это


объяснение

Неявный ввод массива U(представлены) и 2d-массива V(полные диапазоны). Сортируйте ( ñ) подарки, передавая их через функцию ( @), которая получает индекс первого элемента ( b), Vкоторый содержит ( ø) текущий present ( X).

мохнатый
источник
1

Python 2, 97 85 байт

l,d=input()
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)
print sorted(l,key=k)

-11 байт из ов

-1 байт от мистера Xcoder

Попробуйте онлайн!

Сортирует список, используя рекурсивную лямбду в качестве ключа. Объяснение в ближайшее время ™ ниже.

Объяснение:

l,d=input()             # l is the lsit of presents, d is the list of ranges
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)# recursive lambda to sort with
k=lambda i,j=0:                                    # i is the present
                                                   # j is the index in the list of ranges
               -~j*(d[j][0]<=i<=d[j][1])           # return the index of the list of
                                                   # ranges(plus one) if the present is
                                                   # in the range
                                        or k(i,j+1)# if the present is not in the range,
                                                   # try the next range
print sorted(i,key=k)   # print the list of presents sorted by the lambda
pizzapants184
источник
1

PowerShell , 37 байт

param($a,$b)$b|%{$i=$_;$a|?{$_-in$i}}

Попробуйте онлайн!

Воспринимается $aкак буквальный массив подарков и $bкак массив массивов, каждый из которых является полным диапазоном (например, @(1,2,3,4,5)вместо @(1,5)). Затем мы перебираем каждый элемент $bс |%{...}. Внутри нам нужно установить помощника $iв качестве текущего элемента, а затем использовать Where-Objectпредложение против, $aчтобы извлечь только те элементы, которые являются -inтекущим $bмассивом.

Они остаются на конвейере и вывод неявный. Так как стандартное поведение Write-Outputвставляет новую строку между элементами массива, это то, что мы получаем. Вот слегка измененная версия, которая -joinобъединена через запятую вместо новой строки, чтобы показать различия.

AdmBorkBork
источник
1

Пакет Windows (CMD), 90 79 байтов

set/pX=||exit
set/pY=
for %%n in (%*)do if %X% LEQ %%n if %%n LEQ %Y% %%n
%0 %*

Используйте формат конца строки LF. Каждый символ конца строки может быть посчитан как 1 байт.

Нет TIO (потому что TIO использует Linux)

Возьмите список из аргументов командной строки и диапазон от stdin.

Например, если программа запущена (предположим, файл назван r1.cmd)

r1 7 3 5 4 6 1 2

и с stdinвводом

1
3
4
5
6
7

программа выведет в stderrформате

'3' is not recognized as an internal or external command,
operable program or batch file.
'1' is not recognized as an internal or external command,
operable program or batch file.
'2' is not recognized as an internal or external command,
operable program or batch file.
'5' is not recognized as an internal or external command,
operable program or batch file.
'4' is not recognized as an internal or external command,
operable program or batch file.
'7' is not recognized as an internal or external command,
operable program or batch file.
'6' is not recognized as an internal or external command,
operable program or batch file.

(соответствует выходной последовательности 3 1 2 5 4 7 6)


Объяснение:

set /p X=       Prompt for variable X (min range)
   ||exit       If failed (end of file), exit - similar to short-circuit of logical OR
set /p Y=       Prompt for variable Y
for %%n in (%*)do     For each number %%n in all command-line arguments
   if %X% LEQ %%n     If X <= n
      if %%n LEQ %Y%  and n <= Y
         %%n          run command named "n", which lead to an error.

%0 %*           Call itself, process other ranges

Разгруженный код (с включенным взаимодействием, если trueпередается в качестве аргумента 1; запрашивать список stdin, используйте, gotoчтобы избежать переполнения стека - на самом деле я только что попытался запустить скрипт, который вызывает себя более 70000 раз, не видя никаких проблем, поэтому я предполагаю, что это должно быть довольно безопасно):

@echo off

set INTERACTIVE=%1

if "%INTERACTIVE%" == "true" (
    set rangeMinPrompt=Enter range min: 
    set rangeMaxPrompt=Enter range max: 
    set listPrompt=Enter list: 
) else (
    set rangeMinPrompt=
    set rangeMaxPrompt=
    set listPrompt=
)


set /p list=%listPrompt%

:loop_label

set /p rangeMin=%rangeMinPrompt%&& set /p rangeMax=%rangeMaxPrompt%|| exit /b

for %%n in (%list%) do (
    if %rangeMin% LEQ %%n (
        if %%n LEQ %rangeMax% (
            echo %%n
        )
    )
)

goto :loop_label
user202729
источник
Вы можете сохранить больше байтов, требуя, чтобы подарки были аргументами командной строки и использовались (%*). Сделав это, вы можете затем использовать %0 %*для перезапуска сценария после обработки каждого диапазона. (Я фактически закончил с большим количеством байтов, потому что я использовал вашу интерактивную версию с приятными штрихами &&, exit/bи в echoкачестве моей отправной точки.)
Нил
@ Нил Хорошо, спасибо! Первоначально я пытался использовать, %1но кавычки "делают пространство не работает как разделители, поэтому я в конечном итоге использовать set /p.
user202729
$~1
Ого
1

Wolfram Language (Mathematica) , 34 байта

r#~SortBy~{#&@@@r~Position~#&}&

Попробуйте онлайн!

это Functionоператор.

Это безымянная карри функция, которая должна вызываться сначала со списком (расширенных) диапазонов дока, а затем со списком подарков. Например, если вы назначите функцию f:

f[ {{4,5,6,7},{1,2,3}} ][ {1,2,3,4,5,6,7} ]

Список подарков просто отсортирован по позиции первого уровня значения в списке диапазонов дока. Нам нужно обернуть SortByфункцию в список, чтобы сделать сортировку стабильной.

Мартин Эндер
источник
1

Юлия 0,6 , 31 30 байт

p%d=vcat((∩(p,x)for x=d)...)

Попробуйте онлайн!

Переопределяет %оператор и отображает пересечение множества ∩()по докам, dсохраняя порядок и кратность первого импульса, списка подарков p. vcatс расширением ввода до нескольких аргументов с помощью ...выравнивания результирующего вложенного массива.

Edit, -1Byte: список понимания вместо map().

LUKEŠ
источник