Cel
Wygeneruj oryginalną zaszyfrowaną listę na podstawie ruchów, które wykonałby Sortowanie wstawiania , aby ją posortować. Oryginalna lista będzie zawierać wszystkie liczby od 0
do N-1
(włącznie), gdzie N
jest rozmiar danych wejściowych.
Wejście
Lista zawierająca niezbędne ruchy do posortowania listy. Każda wartość reprezentuje liczbę miejsc przesuniętych przez pierwotną (zaszyfrowaną) liczbę, aby znalazły się na swojej właściwej pozycji, pamiętaj, że ten proces odbywa się od lewej do prawej.
Wartość w pozycji (indeksowanej 0) i
na liście danych wejściowych będzie pomiędzy 0
i i
włącznie.
Nie musisz obsługiwać nieprawidłowych danych wejściowych, w tym przypadku dopuszczalne jest dowolne zachowanie (awaria, nieskończona pętla itp.).
Wynik
Zakodowana lista
Krok po kroku, aby wygenerować ruchy
Scrambled List | Moves to sort
[4,0,2,1,3,5] | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5] | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5] | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5] | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5] | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]
Tak więc dla danych wejściowych [0,1,1,2,1,0]
twój program musi generować dane wyjściowe [4,0,2,1,3,5]
.
Pamiętaj, że ruchy nie są w pozycji na (końcowej) posortowanej liście, ale w posortowanym segmencie (pogrubiona sekcja)
Przypadki testowe
[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]
Zwycięski
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź.
źródło
Odpowiedzi:
Galaretka , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Zasadniczo możemy zobaczyć dwie listy (wejściową i wyjściową) jako kodujące liczbę całkowitą; wejście koduje liczbę całkowitą w podstawie silni, a wyjście koduje liczbę całkowitą jako permutację. Na szczęście Jelly ma wbudowane funkcje, które są już bardzo zbliżone do obu tych kodowań, więc wystarczy napisać małe fragmenty kodu, aby przekonwertować je na liczbę całkowitą, a następnie z powrotem na inne kodowanie.
W przypadku podstawowej silni możemy zaobserwować, że pierwszy element listy musi wynosić 0, drugi może wynosić 0 lub 1, trzeci musi wynosić 0/1/2 i tak dalej. Dlatego musimy odwrócić dane wejściowe, aby wprowadzić elementy do normalnej kolejności zapisu dla konwersji podstawowej.
Ponadto, aby względne porządki konwersji czynnikowej i konwersji permutacji były zgodne z operacją stosowaną przez sortowanie przy wstawianiu, musimy dokonać dwóch korekt: odwrócić sekwencję permutacji i odwrócić kolejność listy wyników. Odwrócenie listy wyników jest dość łatwe, wymaga tylko
U
końca programu. Aby odwrócić sekwencję permutacji, odejmujemy od silni długości wejściowej (działa to, ponieważ silnia podstawowa daje liczbę w zakresie od 0 do (długość! -1), podczas gdy permutacje są ponumerowane przez galaretkę od 1 do długości! , generując niejawne rozwiązanie off-by-one, które anuluje działanie off-by-one, które normalnie uzyskuje się po odjęciu indeksu permutacji od silni).Galaretka , 9 bajtów, we współpracy z @JonathanAllan
Ta wersja programu jest bardzo podobna, ale wykorzystuje inną metodę odwracania sekwencji permutacji; wystarczy po prostu zanegować dane wejściowe za pomocą
N
, aby wykonaćœ?
kolejność w odwrotnej kolejności. Poza tym działa identycznie jak w poprzednim programie.Wypróbuj online!
źródło
Æ¡
iœ?
atomy na to zadziałają (już wcześniej próbowałem wykorzystać je do tego wyzwania - byłem tak blisko, potrzebowałem tylkoL!
tam).UÆ¡Nœ?L’U
ponieważ zaimplementowałemœ?
(i podobnie), aby działać modułowo (tak jakby korzystały z list Jelly). WN
zaledwie w indeksy z wartością ujemną. Uwaga: ZmieniłemJ
naL
- to tylko dlatego, że podany numer i tak sprawia, że zasięg jest pod maską).Mathematica, 92 bajty
Czysta funkcja przyjmuje na wejściu listę nieujemnych liczb całkowitych i zwraca listę nieujemnych liczb całkowitych. Powyższy kod zawiera
©
niepoprawny: jest to symbol zastępczy 3-bajtowego symbolu U + F3DE, który Mathematica reprezentuje okręgiem z kropką, i który reprezentuje układ permutacji.c=Cycles@{#}&
definiuje funkcję, która konwertuje listę liczb całkowitych naCycles
obiekt reprezentujący permutację; na przykładc[{3,4}]
to elementy zamiany transpozycji 3 i 4 listy.c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]
pobiera listę danych wejściowych i generuje permutacje niezbędne do cofnięcia sortowania wstawiania. Następniec@{}©##&@@
składa wszystkie te permutacje razem, zaczynając od permutacji tożsamościc@{}
. Na koniecPermute[Range[l=Length@#]-1,...]
stosuje tę permutację do zindeksowanej listy o odpowiedniej długości.źródło
@{#}&)@{}©##&@@
wygląda strasznie.Python 2,
7968 bajtówDzięki Krazorowi za zaoszczędzenie 10 bajtów
Dzięki TuukkaX za zapisanie 1 bajtu
Działa poprzez generowanie ruchów w odwrotnej kolejności
źródło
a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]
. Zrób listę ftw!for
, więc zrób 65 Myślę, że: DJavaScript (ES6),
696563 bajtówIrytujące jest to, że dane wejściowe i wyjściowe są w niewłaściwej kolejności. Edycja: Zapisano 4 bajty dzięki @Arnauld. Zaoszczędź 2 bajty dzięki @ETHproductions.
źródło
i
, prawda?i
...o=>+b.splice(~o,1)
JavaScript (ES6),
7371 bajtówZaoszczędzono 2 bajty dzięki produktom ETH
Przypadki testowe
Pokaż fragment kodu
źródło
a=m.map(_=>j++,j=0)
, ale to ta sama długość i jestem pewien, że już próbowałeś.j
toa.length
raczej naa.length-1
i wymagałobya.splice(--j,0,a.splice(j-m[j],1)[0])
)+a.splice(j-m[j--],1)
Haskell , 85 bajtów
Wypróbuj online! Przykładowe użycie:
f [0,1,1,2,1,0]
daje[4,0,2,1,3,5]
.f x
wywołuje funkcję#
zx
odwróconą listą i listą[length x - 1, length x - 2, ... , 0]
.(n:r)#l
wykonuje sortowanie z odwrotnym wstawieniem, rekurencyjnie wyjmującn
element th zl
, gdziel!!n
zwracan
element th itake n l++drop(n+1)l
zwraca listęl
zn
usuniętym elementem th.źródło
perl, 61 bajtów
Dane wyjściowe kończą się w tablicy @o. Przykład z tablicą wejściową jako argumentami wiersza poleceń:
źródło
Ruby, 49 bajtów
Wykonuje „wstawianie wsteczne” w miejscu na liście, zaczynając od największej liczby.
źródło