Celem tego wyzwania jest zebranie wybranych pozycji z listy i przeniesienie ich do określonego miejsca na liście.
Jako wizualny przykład weź wartości wejściowe (reprezentowane przez liczby całkowite w czarnych polach) i odpowiadającą im listę prawdziwych wartości, gdzie prawda oznacza, że element został wybrany (reprezentowany przez niebieskie pola, gdzie T
jest prawdą i F
jest fałszem):
Pierwszym logicznym krokiem jest rozdzielenie pozycji oznaczonych jako prawdziwe i niezgodne z prawdą na odpowiadające im listy. Zauważ, że względna kolejność na każdej liście musi być zachowana (tzn. Kolejność wybranych pozycji musi być 1,4,5
, a kolejność niezaznaczonych pozycji musi być 2,3,6,7
)!
Drugi logiczny krok otrzymuje indeks na pozostałej liście niewybranych elementów, wstaw wszystkie wybrane elementy przed pozycją o danym indeksie. Zakładając, że indeksowanie rozpoczyna się od 0, załóżmy, że chcesz wstawić zaznaczenie o indeksie 3. To odpowiada miejscu przed 7
polem, więc wybrane elementy należy wstawić przed 7
.
Tak więc ostateczne rozwiązanie 2,3,6,1,4,5,7
.
Zauważ, że ten logiczny schemat przedstawia jeden ze sposobów, w jaki można to zrobić; twój program nie musi wykonywać tych samych logicznych kroków, o ile dane wyjściowe zawsze dają taki sam możliwy do zaobserwowania wynik.
Wejście
Twój program ma 3 wejścia:
- Lista liczb całkowitych reprezentujących elementy. To może być pusta lista. Ta lista zawsze będzie się składać z unikalnych dodatnich liczb całkowitych, niekoniecznie w posortowanej kolejności (tj. 5 nie będzie na liście dwa razy).
- Lista wartości prawdy / fałszu o tej samej długości co lista przedmiotów, przy czym wartość prawdy oznacza, że wybrano element o tym samym indeksie.
- Liczba całkowita reprezentująca miejsce wstawienia zaznaczenia. Możesz wybrać, jaki jest indeks pierwszego elementu listy, o ile jest on stały w każdym uruchomieniu programu (np. Pierwszym elementem może być indeks 0 lub indeks 1). Określ konwencję, której przestrzega Twój program. Indeks ten powinien mieścić się w zakresie
[starting_idx, ending_idx+1]
, tzn. Zawsze będzie prawidłowym indeksem. W przypadku indeksu sprawyending_idx+1
wybór należy wstawić na końcu listy. Możesz założyć, że ta liczba całkowita będzie pasować do rodzimego typu liczb całkowitych twojego języka.
Dane wejściowe mogą pochodzić z dowolnego żądanego źródła (standard, parametr funkcji itp.)
Wynik
Dane wyjściowe to lista reprezentująca końcową sekwencję elementów. Może to być dowolne źródło (standardowe, zwracana wartość, parametr wyjściowy funkcji itp.). Możesz modyfikować dowolne dane wejściowe w miejscu (na przykład, biorąc pod uwagę listę modyfikowalną jako parametr funkcji i pozwalając twojej funkcji działać w miejscu na tej liście).
Przypadki testowe
Wszystkie poniższe przypadki testowe zakładają indeksowanie w oparciu o 0. Użyłem 0 i 1, aby wskazać odpowiednio wartości fałszu / prawdy dla maski wyboru.
Przypadki testowe mają tak sformatowane listy [a,b,c]
, ale tak długo, jak długo listy wejściowe reprezentują skończoną uporządkowaną sekwencję, jest w porządku.
Wejście:
[]
[]
0
Wynik:
[]
Wejście:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3
Wynik:
[2,3,6,1,4,5,7]
Wejście:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0
Wynik:
[1,4,5,2,3,6,7]
Wejście:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4
Wynik:
[2,3,6,7,1,4,5]
Wejście:
[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0
Wynik:
[1,2,3,4,5,6,7]
Wejście:
[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5
Wynik:
[1,2,3,4,5,6,7]
Wejście:
[1,3,2,5,4,6]
[1,0,0,1,1,0]
3
Wynik:
[3,2,6,1,5,4]
Punktacja
To jest kod golfowy; najkrótsza odpowiedź w bajtach wygrywa. Standardowe luki są zabronione. Możesz używać dowolnych wbudowanych elementów.
Odpowiedzi:
MATL, 9 bajtów
To rozwiązanie przyjmuje tablicę wartości
T
(prawda) iF
(fałsz) jako drugie dane wejściowe. Również w pierwszym przypadku testowym, z pustymi tablicami, nie generuje danych wyjściowych.Wypróbuj online! i nieco zmodyfikowana wersja dla wszystkich przypadków testowych.
Wyjaśnienie
źródło
Mathematica,
6662 bajtówZapisano 4 bajty z @MartinEnder .
Funkcja anonimowa. Pobiera dane wejściowe na podstawie indeksu 1, listy i znaczników, a na liście zwraca uporządkowaną listę.
źródło
Haskell, 70 bajtów
Przykład użycia:
([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3
->[2,3,6,1,4,5,7]
.Jak to działa:
źródło
JavaScript (ES6), 76 bajtów
źródło
Galaretka , 10 bajtów
Wypróbuj online!
Jak to działa
źródło
C #, 132 bajty
bez golfa:
Doceniane pomysły na ulepszenia.
źródło
Python 3, 91 bajtów
gdzie
a
jest lista elementów / liczb,x
jestTrue/False
listą ii
indeksem.Wersja wielowierszowa dla lepszej czytelności:
Jak to działa?
Wezwanie do
zip(a,x)
wyników w postaci listy krotek, gdzie każdy z nich zawiera informacje o:(element,0|1)
. Następnie stosowane jest zrozumienie listy w celu ustalenia elementów, które mają0/False
powiązaną wartość i zapisuje je w zmiennejb
.[c for c,z in zip(a,x)if z<1]
Tworzy więc listę, która zawiera wszystkie elementy, które są powiązane z wartością0
(False
).Następnie lista elementów, które mają
True|1
wartość związaną (który poprzez sprawdzenie, które elementya
nie występują wb
:[c for c in a if(c in b)<1]
) dodaje się do wykazu wszystkich elementów, które mają0
(False
wartości) związany (listab
) w określonym indeksiei
i wynikowa lista jest zwracana.źródło
Python 3,
10693 bajtówStarsza wersja:
źródło