Ostatnio miałem problem do rozwiązania w pracy, gdzie miałem dwie listy: listę główną i mniejszą listę, która zawiera podzbiór elementów na liście głównej potencjalnie w innej kolejności. Musiałem zmienić kolejność listy głównej w taki sposób, aby elementy w podzestawie pojawiały się w tej samej kolejności, bez zmiany kolejności elementów nie znajdujących się na liście i utrzymywania elementów w tej samej lokalizacji, gdy tylko jest to możliwe. Okej, to chyba brzmi myląco, więc podzielę to:
- Lista główna określa domyślną kolejność elementów.
- Lista podzbiorów określa względną kolejność niektórych elementów.
- W przypadku, gdy lista główna zawiera dwa elementy niesprawne zgodnie z listą podzbiorów, element znajdujący się wcześniej na liście głównej powinien zostać przeniesiony do najwcześniejszego indeksu, gdzie znajduje się we właściwej lokalizacji względem innych elementów na liście podzbiorów. (tj. natychmiast po późniejszym elemencie)
Twoim zadaniem jest wdrożenie tego algorytmu zmiany kolejności.
Przykładowe przypadki testowe
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]
Zasady
- Standardowe luki, yadda yadda, wygodne we / wy, bla bla.
- Mimo że w przykładach używane są liczby i ciągi, wystarczy tylko jeden typ elementu, niezależnie od tego, czy są to liczby całkowite, ciągi, czy cokolwiek innego z dobrze zdefiniowaną semantyką równości, w tym listy heterogeniczne, jeśli jest to wygodne w twoim języku.
- Możesz założyć, że zarówno lista główna, jak i lista podzbiorów nie zawierają duplikatów
- Możesz założyć, że wszystkie elementy znajdujące się na liście podzbiorów znajdują się na liście głównej
- Każda lista może być pusta
- Musisz co najmniej obsługiwać tablice o długości do 100 elementów.
- Zmiana kolejności może być realizowana w miejscu lub poprzez utworzenie nowej listy / tablicy.
Wesołego golfa!
code-golf
array-manipulation
Wołowina
źródło
źródło
8 1 3 4 5 6 7 2 9 12 11 10
ważne jest rozwiązanie od drugiego do ostatniego?Odpowiedzi:
Retina 0.8.2 , 51 bajtów
Wypróbuj online! Pobiera dane wejściowe jako rozdzieloną przecinkami listę słów podrzędnych w pierwszym wierszu i rozdzieloną przecinkami główną listę słów w drugim wierszu. Wyjaśnienie:
Znajdź dwa sąsiednie słowa, w których drugie słowo poprzedza pierwsze na liście głównej.
Przenieś drugie słowo, aby pojawiło się po pierwszym słowie na liście głównej.
Powtarzaj, aż żadne słowa nie pojawią się w porządku.
Usuń słowa podrzędne.
źródło
JavaScript (ES6),
96 89 7471 bajtówZaczęło się od nieporęcznego bałaganu i ostatecznie zostało zmniejszone do dość zwięzłej i eleganckiej formy. Chciałbym podziękować metodzie .splice () za owocną współpracę w tej dziedzinie. ;)
Pobiera dane wejściowe jako
(master)(subset)
. Dane wyjściowe poprzez aktualizację listy głównej.Wypróbuj online!
W jaki sposób?
Skomentował
źródło
Haskell, 79 bajtów
Wypróbuj online!
źródło
Ruby ,
7368 bajtówWypróbuj online!
W jaki sposób?
a
ib
zawiera wszystkie elementyb
, ale w takiej samej kolejności, w jakiej byśmy je znaleźlia
b
równolegle na skrzyżowaniu, gdy tylko znajdziemy różnicę, możemy przenieść pojedynczy element.a
pozycji elementu, w którym znaleźliśmyb
, a następnie usunięcie elementu, który znaleźliśmy na skrzyżowaniu, a następnie dodanie pozostałej części znaku.b
będą w odpowiedniej kolejnościa
źródło
0while
?Python 2 ,
1241091069996 bajtówWypróbuj online!
źródło
Perl 6 , 40 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera dane wejściowe curry (jak
f(subList)(masterList)
i znajduje pierwszą permutację leksykalną indeksów listy głównej, w której elementy z listy podrzędnej są w odpowiedniej kolejności.Intuicyjnie pierwsza satysfakcjonująca permutacja pozostawi poprawnie uporządkowane elementy w pierwotnej kolejności, przesuwając niepoprawnie rozmieszczone elementy minimalną potrzebną odległość do przodu, aby uzyskać je we właściwej kolejności, co umieszcza je bezpośrednio za poprzednim elementem w podzbiorze.
Wyjaśnienie:
źródło
Galaretka , 9 bajtów
Wypróbuj online! lub pakiet testowy
Nieefektywne, szczególnie w przypadku dużych list głównych. Generuje wszystkie możliwe permutacje, odfiltrowuje te, w których podzbiór ma niewłaściwą kolejność, a następnie zwraca pierwszy.
Wyjaśnienie
źródło
J , 49 bajtów
Wypróbuj online!
wyjaśnienie
Przyjmujemy podzbiór jako lewy argument, a pełne dane wejściowe jako prawy.
Przeanalizujemy kod z konkretnym przykładem dla przejrzystości:
Weź pudełkowe przyrostki rozmiaru drugiego podzbioru:
produkujący:
dołącz je do oryginalnych danych wejściowych i odwróć całość:
Otrzymujemy:
Rozwiązanie powyższego problemu staje się od prawej do lewej. Musimy tylko znaleźć odpowiedni czasownik do wstawienia
/
między elementy.Każda iteracja redukcji aktualizuje skrajnie prawe pole (pełne wejście, które przekształcamy), aby było zgodne z ograniczeniem porządkowania reprezentowanym przez parę po jego lewej stronie. Po zakończeniu redukcji dane wejściowe będą respektować całą kolejność podzbiorów.
Jeśli kolejność pary jest taka sama jak kolejność na wejściu, następujące wartości zostaną ocenione na 0 i nie zrobimy nic:
W przeciwnym razie będzie miało wartość 1 i zastosujemy czasownik po lewej stronie
^:
który przesuwa lewy element na prawo od prawego elementu. Ten ruch jest po prostu cykliczną permutacją wszystkich elementów pomiędzy (i włącznie) dwoma przedmiotowymi elementami.
J ma prymitywne zastosowanie takiej cyklicznej permutacji:
a pozostała część czasownika nie robi nic poza wybraniem indeksów, które musimy cyklicznie zmieniać:
co wydaje się dłuższe niż powinno, ale nie mogłem dalej grać w golfa.
Wreszcie ponownie przepakowujemy wynik
<@
i gotowe.źródło
Galaretka , 24 bajty
Wypróbuj online! lub pakiet testowy
Wyjaśnienie
Dyadyczny link, który przyjmuje podzbiór jako lewą, a główną listę jako prawe argumenty. Poniższy przykład wykorzystuje 9001, 42, 69, 1337, 420, 99, 255 jako master i 69, 9001, 1337 jako podzbiór.
źródło
C # (interaktywny kompilator Visual C #) , 118 bajtów
Wypróbuj online!
Wykorzystanie niektórych klas w
System.Collections.Generic
przestrzeni nazw. Wzorzec to a,List<T>
a podzbiór toQueue<T>
.źródło