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.