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 . Я не маю приналежності до цього сайту

Ви можете переглянути список усіх викликів у серії, переглянувши розділ "Пов'язані" першого виклику тут .


Завжди всього 2 доки?
LiefdeWen

Чи можуть діапазони перекриватися?
RamenChef

@LiefdeWen Дивіться 3-й тестовий випадок.
Містер Xcoder

Чи завжди пари доків завжди будуть {small, big}
LiefdeWen

@RamenChef Ні ..
HyperNeutrino

Відповіді:



4

Желе , 4 байти

fЀẎ

Спробуйте в Інтернеті!

Вводиться як поданий список, повний діапазон.


yaay, це желе, яке я очікував: DDD
HyperNeutrino

@HyperNeutrino Hehe очікуване рішення виявляється не найкоротшим. Знайшовши спосіб роботи зовнішнього продукту 05ab1e, я зрозумів, що він fþFпрацює і в Jelly, на 3 байти . Кредит йде на Аднана .
Містер Xcoder

@ Mr.Xcoder Або ви, або Аднан, повинні опублікувати це.
Ерік Атголфер

@ Mr.Xcoder Я зачекаю трохи і побачу: P, але це виглядає значно інакше, якщо я закінчу його публікацію, я опублікую ще одну відповідь.
Ерік Аутгольфер


3

Pyth , 5 байт

s@Rvz

Спробуйте тут!

Pyth , 10 байт

s.gx}LkQ1E

Спробуйте тут!

Як вони працюють

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

  R | Правильна карта ...
 @ | ... За допомогою перехрестя.
   vz | Перший вхід з другим.
s | Вирівняти на один рівень.
s.gx} LkQ1E | Повна програма.

 .g E | Згрупуйте елементи на другому вході за ...
    } LkQ | Поставте карту над першим входом та перевірте, чи немає у списку поточного елемента.
   х 1 | Візьміть індекс першого елемента, що містить форму.
s | Згладити.

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



3

05AB1E , 3 байти

δØ

Спробуйте в Інтернеті! (дякую Аднану за те, що він повідомив мені, що δіснує, -1 байт)

Як це працює

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

δ | Двічі векторнізуйте наступну команду (щось на зразок зовнішнього продукту).
 Ã | Список перехрестя. Оскільки це діада, перший вхід відбувається автоматично
     | використовується для заповнення відсутнього аргументу (наскільки я знаю).
  ˜ | Згладити.

Ну, €Ã˜схоже, не працює.
Ерік Аутгольфер

Ні, немає. BTW причина €Ã˜провалюється в тому, що Ãбере два аргументи і очікує функцію з одним аргументом, тому він [[]]замість цього повертається (я думаю, що це помилка), тож потім ˜сплющується, повертаючись []. ε, однак, працює інакше. Для кожного елемента верхнього елемента він створює новий стек, а потім повертає верхню частину кожного нового стека, тому коли в ньому недостатньо елементів для функції, він замість цього вводить неявне введення.
Erik the Outgolfer

Я ще не перевіряв її, але δØщо ви шукаєте?
Аднан

@ Mr.Xcoder Я не думаю, що це саме діадична карта, яку має Pyth, вона більше поводиться на зовнішній продукт чи щось таке.
Ерік Аутгольфер

3

Сітківка , 37 36 байт

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

Спробуйте в Інтернеті! Приймає введення як список подарунків у першому рядку та список діапазонів у другому рядку; посилання включає в себе заголовок для розділення тестових випадків на потрібний формат. Редагувати: Збережено 1 байт завдяки @MartinEnder. Пояснення: Перший етап відповідає подарункам і знаходить відповідний док. Подарунки сортуються за підрядкою від початку рядка до пункту [, таким чином групуючи подарунки за доком. Потім другий етап видаляє доки.


2

Зарахувати , 3 байти

f₱Ẏ

Спробуйте в Інтернеті!

Як це працює

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

 ₱ | Аргумент на карті над правильним.
f | Використовуючи перетин переліку, рахуючи кратність.
  Ẏ | Затягнути (розрівняти на 1 рівень).

1
: D Рекрут не був забутий: D Насправді це було
якось

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= це в правильному діапазоні

]<@#~ копіює та зберігає подарунки, які знаходяться в поточному діапазоні

; - raze (розблокування)

Спробуйте в Інтернеті!


1
Я впевнений, що ви не можете зняти нулі, оскільки вхід є цілісним (наприклад, не вдалося зробити цей тестовий випадок (0 4,:_3 _1) f _2 _1 0 1 2)
cole

@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]].

Напевно, наївна відповідь, яку я повинен був прийти у віці тому; відбитки до stdout.


2

Japt , 6 байт

ñ@VbøX

Спробуй це


Пояснення

Неявне введення масиву U( подання ) та 2d-масиву V(повний діапазон). Сортуйте ( ñ) подарунки, передавши їх через функцію ( @), яка отримує індекс першого елемента ( b), Vщо містить ( ø) поточний подарунок ( 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


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редагується разом через коми, а не новий рядок, просто щоб показати відмінності.




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

Ви можете зберегти більше байтів, вимагаючи, щоб подарунки були аргументами командного рядка та використовувались (%*). Зробивши це, ви можете використовувати %0 %*для перезавантаження скрипту після обробки кожного діапазону. (Я фактично закінчився більшою кількістю байтів, тому що я використовував вашу інтерактивну версію з приємними штрихами &&, exit/bі echoяк мій вихідний пункт.)
Ніл

@Neil Приємно, дякую! Я спочатку намагався використовувати, %1але цитати "змушують простір не працювати як роздільники, тому я закінчив використовувати set /p.
user202729

О, $~1
уау


1

Мова Вольфрама (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з введенням, розширеним на декілька аргументів через ...вирівнювання отриманого вкладеного масиву.

Редагувати, -1Byte: Список розуміння замість map().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.