Załóżmy, że mamy tablicę o długości ze wskaźnikami wskazującymi na pewne miejsce w tablicy: proces „ przeskakiwania wskaźnika ” ustawi każdy wskaźnik na lokalizację wskaźnika, na który wskazuje.
Dla celów tego wyzwania wskaźnikiem jest (liczony od zera) indeks elementu tablicy, co oznacza, że każdy element w tablicy będzie większy lub równy i mniejszy niż . Za pomocą tej notacji proces można sformułować w następujący sposób:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Oznacza to (dla tego wyzwania), że wskaźniki są aktualizowane na miejscu w kolejności sekwencyjnej (tj. Najpierw niższe wskaźniki).
Przykład
Przeanalizujmy przykład: :
Zatem po jednej iteracji „ przeskakiwania wskaźnika ” otrzymujemy tablicę .
Wyzwanie
Biorąc pod uwagę tablicę z wyjściowymi indeksami, tablica uzyskana przez iterację opisanego powyżej przeskakiwania wskaźnika, aż tablica się już nie zmieni.
Zasady
Twój program / funkcja pobierze i zwróci / wyśle ten sam typ, listę / wektor / tablicę itp., Które
- gwarantuje się, że będzie niepusty i
- na pewno zawiera tylko wpisy .
Warianty: możesz wybrać
- użyć indeksowania 1 lub
- używaj rzeczywistych wskaźników,
należy jednak wspomnieć o tym w zgłoszeniu.
Przypadki testowe
[0] → [0]
[1,0] → [0,0]
[1,2,3,4,0] → [2,2,2,2,2]
[0,1,1,1,0,3] → [0,1,1,1,0,1]
[4,1,3,0,3,2] → [3,1,3,3,3,3]
[5,1,2,0,4,5,6] → [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0] → [1,1,1,1,4,4,4,4,8,1,1,1]
n
jako dodatkowy wkład?#[[#]]&~FixedPoint~#&
.Odpowiedzi:
JavaScript, 36 bajtów
Zmienia oryginalną tablicę wejściową.
Wypróbuj online
źródło
Haskell, 56 bajtów
Aktualizacje Haskell i lokalne nie pasują do siebie.
Wypróbuj online!
źródło
Python 2 , 53 bajty
Wypróbuj online!
-6 dzięki HyperNeutrino .
Zmienia
l
na wynik w miejscu.źródło
C ++ 14 (gcc) , 61 bajtów
Jako nienazwana ogólna lambda. Wymaga sekwencyjnych kontenerów takich jak
std::vector
.Wypróbuj online!
źródło
Szybki ,
6853 bajtówWypróbuj online!
-15 dzięki BMO
źródło
f=
). Życzymy miłego pobytu tutaj!map
zamiastforEach
skracania?JavaScript (ES6), 41 bajtów
Wypróbuj online!
źródło
05AB1E (starsza wersja) , 8 bajtów
Wypróbuj online!
Wyjaśnienie
05AB1E , 14 bajtów
Wypróbuj online!
źródło
Japt,
15137 bajtówZmienia oryginalną tablicę wejściową.
Spróbuj (dodatkowe bajty mają zapisać zmodyfikowane dane wejściowe w konsoli)
źródło
Java 8,
10554 bajtówZmienia tablicę wejściową zamiast zwracać nową, aby zapisać bajty.
Wypróbuj online.
Wyjaśnienie:
źródło
Japt , 17 bajtów
Wypróbuj wszystkie przypadki testowe
Wydaje się, że powinien być krótszy, ale niestety moja początkowa myśl o
UmgU
tym nie działa, ponieważ każdyg
uzyskuje dostęp do oryginału,U
a nie modyfikuje go na każdym kroku. Odpowiednia konserwacja różnych komponentów kosztuje również garść bajtów.Wyjaśnienie:
źródło
C (clang) , 32-bit,
4944 bajtówWypróbuj online!
Wykorzystuje wskaźniki.
5045 bajtów z liczbami całkowitymi:Wypróbuj online!
źródło
Rubinowy ,
3734 bajtówWypróbuj online!
Zwraca przez modyfikację tablicy wejściowej w miejscu.
źródło
Czerwony , 63 bajty
Wypróbuj online!
Zmienia tablicę na miejscu
źródło
R ,
6058 bajtów-2 bajty dzięki @digEmAll za przeczytanie reguł.
Wypróbuj online!
1-indeksowany.
n
jest długością tablicy wejściowej.rep(1:n,n)
replikuje1:n
n
czasy (np.n=3 => 1,2,3,1,2,3,1,2,3
)Pętla
n
razy tablica . Stan ustalony na pewno zostanie osiągnięty do tego czasu, tak naprawdę do końca czasu n-1 poprzez, jak sądzę. Dowód pozostawiono czytelnikowi.źródło
+1
i po prostu wziąć dane oparte na 1, post stwierdza: Możesz wybrać indeksowanie oparte na 1scan()
dla wejścia. Zawsze uważam, że mojescan()
rozwiązania nie są optymalne, więc miej oko na krótszy sposób przypisaniax
in
razem:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
Wypróbuj online!Common Lisp,
5958 bajtówWypróbuj online!
źródło
Czysty , 80 bajtów
Wypróbuj online!
źródło
Clojure , 136 bajtów
Wypróbuj online!
źródło
loop [
nie możesz się staćloop[
?Perl 5,
353426 bajtówwykorzystując fakt, że konwergencja jest osiągana co najwyżej dla liczby wielkości iteracji
26 bajtów
34 bajty
35 bajtów
źródło
Clojure , 88 bajtów
Wypróbuj online!
źródło
Węgiel drzewny , 16 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Niestety, wszystkie zwykłe funkcje mapowania działają tylko na kopii tablicy, w wyniku czego po prostu permutują elementy, zamiast je przeskakiwać, więc kod musi zrobić wszystko ręcznie. Wyjaśnienie:
Powtórz wewnętrzną pętlę raz dla każdego elementu. To tylko zapewnia, że wynik się ustabilizuje.
Pętla nad wskaźnikami tablicowymi.
Pobierz element tablicy pod bieżącym indeksem, użyj go do zaindeksowania tablicy i zastąp bieżący element tą wartością.
Rzuć elementy na łańcuch i domyślnie wydrukuj każdy w osobnej linii.
źródło
F #,
7473 bajtówNic specjalnego. Wykorzystuje ideę modułu widoczną w innych odpowiedziach.
źródło
K, 27 bajtów
{..}/
stosuje lambda {..} do arg (do konwergencji)wewnątrz zewnętrznej lambda:
{..}/[x;y]
stosuje iteracyjnie lambda do x (aktualizowanego przy każdej iteracji) i elementu y (y jest listą wartości i używa elementu przy każdej iteracji). W tym przypadku arg y jest!#x
(do liczby x, czyli indeksów tablicy)@[x;y;:;x x y]
zmień tablicę x (przy indeksie y przypisz x [x [y]])źródło
APL (Dyalog Unicode) , 26 bajtów SBCS
Wymaga
⎕IO←0
Wypróbuj online!
źródło