Advent Challenge 5: Przenieś prezenty do doków transportowych!


9

<< Poprzedni Następny >>

Dzięki społeczności PPCG Mikołajowi udało się zregenerować wszystkie prezenty, a po linii montażowej prezenty są teraz gotowe do przeniesienia do doków transportowych!

Każdy z doków transportowych Świętego Mikołaja ma tylko zakres obecnych rozmiarów, ponieważ sanie transportowe są wyspecjalizowane dla określonego rozmiaru (każda lżejsza i byłoby to marnotrawstwem, każda cięższa i sanie nie byłyby w stanie wytrzymać ładunku). Dlatego potrzebuje ciebie, abyś pomógł mu wziąć prezenty i posortować je do odpowiednich doków transportowych.

Wyzwanie

Biorąc pod uwagę listę i zakresy doków transportowych, stabilnie uporządkuj prezenty w odpowiedniej kolejności.

Weźmy na przykład: prezenty są [5, 3, 8, 6, 2, 7]i zakresy dokowania [[1, 5] and [6, 10]].

Prezenty 5, 3i 2iść do pierwszej stacji dokującej i prezenty 8, 6i 7przejść do drugiego doku. Można to pokazać jako [[5, 3, 2], [8, 6, 7]]. Ta lista będzie bliżej sortowania niż danych wejściowych, ale stablyoznacza, że ​​w każdej stacji dokowania kolejność prezentów musi być taka sama jak kolejność danych wejściowych (w przeciwnym razie możesz po prostu posortować całą listę).

Twój końcowy wynik dla tej sprawy byłby [5, 3, 2, 8, 6, 7](jako płaska lista).

Specyfikacja formatowania

Będziesz mieć wkład w postaci płaskiej listy liczb całkowitych i listę zakresów w jakimkolwiek rozsądnym formacie (na przykład zakres powyższym przypadku mogą być podane jako [[1, 5], [6, 10]], [1, 5, 6, 10], lub [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Twój wynik powinien być płaską listą liczb całkowitych w dowolnym rozsądnym formacie.

Dane wejściowe mogą zawierać zduplikowane wartości; w takim przypadku musisz zwrócić wszystkie ich wystąpienia. Wszystkie obecne rozmiary będą dokładnie w jednym zakresie rozmiarów i możesz założyć, że zakresy nigdy się nie pokrywają. Mogą występować przerwy w zakresach, o ile wszystkie obecne rozmiary są objęte zakresem.

Zasady

  • Obowiązują standardowe luki
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach
  • Żadna odpowiedź nie zostanie zaakceptowana
  • Możesz założyć, że nie będzie pustych zakresów ( [7, 4]byłoby niepoprawne, ponieważ zakresy wzrosły)

Przypadki testowe

[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]

Uwaga: Inspirację do tej serii wyzwań czerpałem z Advent Of Code . Nie mam powiązań z tą stroną

Możesz zobaczyć listę wszystkich wyzwań w serii, patrząc na sekcję „Połączone” pierwszego wyzwania tutaj .


Zawsze tylko 2 doki?
LiefdeWen,

Czy zakresy mogą się pokrywać?
RamenChef,

@LiefdeWen Zobacz 3. przypadek testowy.
Pan Xcoder,

Czy pary doków zawsze będą {małe, duże}
LiefdeWen,

@RamenChef No ..
HyperNeutrino

Odpowiedzi:



4

Galaretka , 4 bajty

fЀẎ

Wypróbuj online!

Pobiera dane wejściowe jako aktualną listę, pełne zakresy.


tak, to jest oczekiwane rozwiązanie: DDD
HyperNeutrino

@HyperNeutrino Hehe oczekiwane rozwiązanie okazuje się nie być najkrótsze. Odkrywając sposób działania zewnętrznego produktu 05ab1e, doszedłem do wniosku, że fþFdziała również w galarecie , przez 3 bajty . Kredyt trafia do Adnana .
Pan Xcoder,

@ Mr.Xcoder Albo ty, albo Adnan powinieneś to opublikować.
Erik the Outgolfer,

@ Mr.Xcoder Poczekam chwilę i zobaczę: P, ale wygląda to zupełnie inaczej, jeśli skończę, opublikuję to, opublikuję inną odpowiedź.
Erik the Outgolfer,

4

Mathematica, 39 bajtów

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

-22 bajty od JungHwan Min.
-4 bajty od Martina

Wypróbuj online!


Możesz także pozbyć się całej Rangerzeczy, biorąc po prostu rozszerzone zakresy jako dane wejściowe.
Martin Ender

3

Pyth , 5 bajtów

s@Rvz

Wypróbuj tutaj!

Pyth , 10 bajtów

s.gx}LkQ1E

Wypróbuj tutaj!

Jak oni pracują

s @ Rvz | Pełny program

  R | Prawa mapa ...
 @ | ... Używając skrzyżowania.
   vz | Z pierwszego wejścia z drugim.
s | Spłaszcz o jeden poziom.
s.gx} LkQ1E | Pełny program

 .g E | Pogrupuj elementy na drugim wejściu według ...
    } LkQ | Zamapuj na pierwszym wejściu i sprawdź, czy bieżący element znajduje się na liście.
   x 1 | Weź indeks pierwszego prawdziwego elementu.
s | Spłaszczyć.

Najpierw pobiera doki ze wszystkimi liczbami całkowitymi w zakresach, a następnie prezenty w nowej linii.



3

05AB1E , 3 bajty

δØ

Wypróbuj online! (podziękowania dla Adnana za poinformowanie mnie o δistnieniu, -1 bajt)

Jak to działa

˜Ã˜ | Pełny program

δ | Dwukrotnie wektoryzuj następne polecenie (coś w rodzaju produktu zewnętrznego).
 Ã | Przecięcie listy. Ponieważ jest to diada, pierwsze wejście jest automatycznie
     | używane do uzupełnienia brakującego argumentu (o ile mi wiadomo).
  ˜ | Spłaszczyć.

Cóż, €Ã˜nie działa.
Erik the Outgolfer,

Nie, nie ma. BTW, przyczyną €Ã˜niepowodzenia jest to, że Ãbierze dwa argumenty i oczekuje funkcji z jednym argumentem, więc zwraca [[]]zamiast tego (myślę, że to błąd), więc wtedy ˜spłaszczy się, powróci []. εdziała jednak inaczej. Dla każdego elementu najwyższego elementu tworzy nowy stos, a następnie zwraca górę każdego nowego stosu, więc jeśli nie ma w nim wystarczającej liczby elementów dla funkcji, pobiera niejawne dane wejściowe.
Erik the Outgolfer,

Jeszcze go nie testowałem, ale δØczy szukasz tego?
Adnan

@ Mr.Xcoder Nie sądzę, że jest to dokładnie mapa, którą ma Pyth, zachowuje się bardziej jak produkt zewnętrzny czy coś takiego.
Erik the Outgolfer,

3

Siatkówka , 37 36 bajtów

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

Wypróbuj online! Pobiera dane wejściowe jako listę prezentów w pierwszym wierszu i listę zakresów w drugim wierszu; link zawiera nagłówek umożliwiający podział przypadków testowych na żądany format. Edycja: Zapisano 1 bajt dzięki @MartinEnder. Objaśnienie: Pierwszy etap dopasowuje prezenty i znajduje pasującą stację dokującą. Prezenty są sortowane według podciągów od początku linii do [, w ten sposób grupując prezenty według doku. Drugi etap usuwa następnie doki.


2

Zapisz , 3 bajty

f₱Ẏ

Wypróbuj online!

Jak to działa

f ₱ Ẏ | Pełny program

 ₱ | Odwzoruj właściwy argument.
f | Używając przecięcia listy, licząc krotności.
  Ẏ | Dokręcić (spłaszczyć o 1 poziom).

1
: D Enlist nie został zapomniany: D Właściwie to było trochę, po prostu nie przez społeczność, ale raczej przeze mnie :(: P
HyperNeutrino

2

APL + WIN, 29 bajtów

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

Monity o wprowadzenie ekranu dla liczb całkowitych i zakresów. Liczby całkowite jako płaska lista, a zakresy jako wektor zagnieżdżony, np. Przypadek 3:

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

Wyjaśnienie:

(×/⍴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 bajtów

Weź dane jako dwie tablice reprezentowane przez pary wskaźników [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];});}

Wypróbuj online!


C ++ ma wbudowane narzędzie do wszystkiego ... a może? / Biorąc pod uwagę, że zakresy wejściowe nie zawierają 0, możliwe jest przechodzenie w dół niektórych bajtów za pomocą tablicy B zakończonej zerem, chociaż można to uznać za oszustwo. / Niestety [&](int a)->int{a=a>=zamiast [&](int a){return a>=nie zapisuje żadnych bajtów. / #import<algorithm>może być #import<regex>, przynajmniej na TIO. Odkryłem, że po wyczerpującym wyszukiwaniu („ręczne wyszukiwanie binarne”) wszystkie nagłówki wymienione na tej stronie, a ta jest najkrótsza. / Również +1 ode mnie.
user202729,

2

J, 15 bajtów

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

Traktuje dane wejściowe jako lewy argument, a zakresy jako prawy argument. Zakresy to pudełkowe listy pełnych zakresów.

np. dla pierwszego zakresu:

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

Wypróbuj online!

Wyjaśnienie

[/:[: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 bajtów

2 bajty dzięki Cole

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

Jak to działa:

Lewy argument zawiera zakresy.

-&1 0"1@[ zmniejsza dolną granicę każdego zakresu o 1

I."1] sprawdza, w jakim zakresie pasuje do każdego prezentu

1= czy jest w prawidłowym zakresie?

]<@#~ kopiuje i umieszcza prezenty w bieżącym zakresie

; - Raze (rozpakowanie)

Wypróbuj online!


1
Jestem pewien, że nie można usunąć zer, ponieważ dane wejściowe są integralne (np. Nie udaje się ten przypadek testowy (0 4,:_3 _1) f _2 _1 0 1 2)
cole

@cole Hm, całkowicie zaniedbałem te przypadki. Będę musiał o nich pomyśleć.
Galen Iwanow,

1
Tak, myślę, że najłatwiejszym sposobem byłoby prawdopodobnie boksowanie, a następnie zrównanie z ziemią. 24 bajty w ten sposób.
cole

@cole Dziękujemy! Jest nie tylko krótszy, ale łatwo rozwiązuje problem z 0.
Galen Iwanow

2

R , 113 48 55 41 bajtów

Poprzednia wersja nie sortowała poprawnie obiektów, gdy doki nie były w porządku rosnącym.

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

Wypróbuj online!

Przyjmuje się Djako listę wektorów zakresów, tj. list(4:7,1:3)Byłoby [[4, 7], [1, 3]].

Prawdopodobnie naiwna odpowiedź, na którą powinienem był odpowiedzieć przed wiekami; drukuje na standardowe wyjście.


2

Japt , 6 bajtów

ñ@VbøX

Spróbuj


Wyjaśnienie

Domniemane wprowadzanie tablicy U(przedstawia) i tablicy 2d V(pełne zakresy). Sortuj ( ñ) prezenty, przepuszczając je przez funkcję ( @), która pobiera indeks pierwszego elementu ( b), Vktóry zawiera ( ø) bieżącą teraźniejszość ( X).


1

Python 2, 97 85 bajtów

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 bajtów z ovs

-1 bajt od pana Xcodera

Wypróbuj online!

Sortuje listę za pomocą rekurencyjnej lambda jako klucza. Wyjaśnienie wkrótce ™ poniżej.

Wyjaśnienie:

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 bajtów

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

Wypróbuj online!

Przyjmuje się $ajako dosłowną tablicę prezentów i $btablicę, z których każda ma pełny zakres (np. @(1,2,3,4,5)Zamiast @(1,5)). Następnie zapętlamy każdy element za $bpomocą |%{...}. Wewnątrz musimy ustawić pomocnika, $iaby był bieżącym przedmiotem, a następnie użyć Where-Objectklauzuli przeciwko, $aaby wyciągnąć tylko te przedmioty, które są -inbieżącą $btablicą.

Pozostają one w przygotowaniu, a dane wyjściowe są niejawne. Ponieważ domyślne zachowanie Write-Outputwstawia nową linię między elementami tablicy, otrzymujemy to. Oto nieco ulepszona wersja, która jest -joinedytowana razem przecinkami zamiast nowego wiersza, tylko w celu pokazania różnic.




1

Windows Batch (CMD), 90 79 bajtów

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

Użyj formatu końca linii LF. Każdy znak końca wiersza może być liczony jako 1 bajt.

Brak TIO (ponieważ TIO używa Linuksa)

Weź listę z argumentów wiersza poleceń i zakres od stdin .

Na przykład, jeśli program jest uruchomiony (załóżmy, że plik ma nazwę r1.cmd)

r1 7 3 5 4 6 1 2

i z stdinwejściem

1
3
4
5
6
7

, program wyświetli stderrformat w formacie

'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.

(odpowiada sekwencji wyjściowej 3 1 2 5 4 7 6)


Wyjaśnienie:

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

Nieskluczony kod (z włączoną interakcją, jeśli truejest przekazywany jako argument 1; monit o listę z stdin, użyj, gotoaby uniknąć przepełnienia stosu - w rzeczywistości próbowałem uruchomić skrypt, który wywołuje się ponad 70000 razy, nie widząc żadnego problemu, więc myślę, że powinno być całkiem bezpieczne):

@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

Możesz zaoszczędzić więcej bajtów, wymagając, aby prezenty były argumentami wiersza poleceń i używały (%*). Po wykonaniu tej czynności możesz %0 %*ponownie uruchomić skrypt po przetworzeniu każdego zakresu. (I rzeczywiście skończyło się z większej liczby bajtów, ponieważ użyłem interaktywną wersję z miłych akcentów &&, exit/ba echojako punkt wyjściowy.)
Neil

@Neil Nice, dzięki! Początkowo próbowałem użyć, %1ale cudzysłowy "sprawiają, że przestrzeń nie działa jako separatory, więc ostatecznie skończyłem set /p.
user202729,

Och wow, jest nawet $~1...
user202729


1

Wolfram Language (Mathematica) , 34 bajty

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

Wypróbuj online!

jest Function operatorem.

Jest to nienazwana funkcja curry, którą należy wywołać najpierw z listą (rozszerzonych) zakresów dokowania, a następnie z listą prezentów. Na przykład, jeśli przypiszesz funkcję do f:

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

Lista prezentów jest posortowana według pozycji pierwszego poziomu wartości na liście zakresów dokowania. Musimy zawinąć SortByfunkcję w listę, aby sortowanie było stabilne.


1

Julia 0.6 , 31 30 bajtów

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

Wypróbuj online!

Redefiniuje %operatora i odwzorowuje ustawione skrzyżowanie ∩()nad dokami, dzachowując porządek i mnożnik pierwszego imputu, listy prezentów p. vcatz danymi wejściowymi rozszerzonymi do wielu argumentów za pośrednictwem... spłaszczenie wynikowej zagnieżdżonej tablicy.

Edytuj, -1Byte: Zrozumienie listy zamiast map().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.