Driftsort to prosty sposób na „sortowanie” tablicy. Działa poprzez „przesuwanie” lub „obracanie” elementów w tablicy, dopóki tablica nie zostanie posortowana lub dopóki tablica nie zostanie posortowana.
Przejrzyjmy dwa przykłady. Najpierw rozważ tablicę [10, 2, 3, 4, 7]
. Ponieważ tablica nie jest posortowana, obracamy ją raz. (Może się to zdarzyć w dowolnym kierunku, pod warunkiem, że pozostaje ten sam kierunek.) Następnie tablica staje się:
[7, 10, 2, 3, 4]
To nie jest posortowane, więc obracamy ponownie.
[4, 7, 10, 2, 3]
I jeszcze raz:
[3, 4, 7, 10, 2]
I ostatni raz:
[2, 3, 4, 7, 10]
I to jest posortowane! Tak więc tablica [10, 2, 3, 4, 7]
jest przenośna. Oto wszystkie obroty tablicy, dla przejrzystości:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
Rozważ teraz tablicę [5, 3, 9, 2, 6, 7]
. Spójrz na jego obroty:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
Żadna z tych tablic nie jest sortowana, więc tablicy [5, 3, 9, 2, 6, 7]
nie można przenosić.
Cel Biorąc pod uwagę niepustą tablicę / listę liczb całkowitych jako dane wejściowe do programu / funkcji, zaimplementuj driftsort na wejściu i wyślij go, lub wypisz wartość falsey ( lub pustą tablicę / listę), jeśli nie można go posortować. Liczby całkowite są przypisane do twoich języków max / min, ale musi to być co najmniej 255 dla maksimum i 0 dla min.
Możesz użyć wbudowanych metod sortowania, ale nie wbudowanego, który rozwiązuje problem.
To jest golf golfowy , więc najkrótszy program w bajtach.
Przypadki testowe
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
sorted(l)
jest ciągła podlistal+l
.shiftsort
?shift
operacji, która usuwa pierwszy element tablicy.Odpowiedzi:
Galaretka , 6 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Ruby, 33
a.any?
odpala jeden raz dla każdego elementu w tablicy, z wyjątkiem tego, że zatrzymuje się (i zwraca wartość true), gdy tylko tablica zostanie zmutowana w posortowany stan. Jeśli tak się stanie, zwracamy zmutowaną tablicę. W przeciwnym razie zwracamy zwracaną wartość falseany?
.źródło
Python 2, 51 bajtów
Nie przeszkadza w obracaniu. Zamiast tego sortuje listę, a następnie sprawdza, czy oryginał można posortować dryfując, sprawdzając, czy występuje co najmniej jeden spadek między kolejnymi elementami cyklicznej listy. Liczy się,
<3
ponieważ uzupełniamap
krótszą listęNone
na końcu, dodając fałszywy spadek.źródło
[1, 3, 2, 4]
ma tylko jeden spadek między kolejnymi elementami, ale nie można go posortować.<3
też<3
unikniesz konieczności precyzyjnego obracania listy.Pyth, 9 bajtów
Wyjaśnienie:
Wypróbuj tutaj!
Lub użyj pakietu testowego!
źródło
.:
. Kombinacje obejmowałyby niesąsiadujące elementy.Matlab,
614741 bajtówDzięki @Suever za -6 bajtów!
Jeśli
strfind([a,a],sort(a))
spróbuje znaleźć posortowany wektor wejściowy jako „podłańcuch” nieposortowanego, zostanie on dołączony do siebie. Jeśli to prawda, dane wejściowe można przenosić i otrzymujemy wektor o długości 2, jeśli nie, otrzymujemy pusty wektor.min
po prostu przekształca to w wektor liczbowy / pusty. Dodanie posortowanego wektora do 0 po prostu wyświetla go, dodanie go do pustego wektora powoduje błąd.źródło
[2, 3]
nie obsługuje podlisty[12, 34]
?strfind
może pracować bezpośrednio z liczbami, nie tylko z znakami (nawet jeśli nie jest to udokumentowane). Gdyby liczby były interpretowane jako znaki, byłyby ograniczone do65535
(spróbuj na przykład+char(1e5)
)Julia,
716652 bajtówJest to anonimowa funkcja, która przyjmuje tablicę i zwraca tablicę lub wartość logiczną. Aby go wywołać, przypisz go do zmiennej.
Dla tablicy wejściowej x tworzymy zestaw wszystkich obrotów x i sprawdzamy, czy posortowana wersja x jest elementem tej listy. Jeśli tak, zwracamy x posortowane, w przeciwnym razie zwracamy fałsz.
Zaoszczędź 19 bajtów dzięki Dennis!
źródło
Pip , 15 + 1 =
1716 bajtówUgh, inne języki gry w golfa wydmuchują to z wody. Jednak skoro już to napisałem ...
Pobiera dane wejściowe jako rozdzielone spacjami argumenty wiersza polecenia. Wymaga
-p
lub innej flagi formatującej tablicę, aby wyświetlać wynik czytelnie, a nie konkatenowany. Fałszywy przypadek wyświetla pusty ciąg znaków, który jest widoczny dzięki końcowemu znakowi nowej linii.źródło
JavaScript (ES6),
727065 bajtówZwraca
0
w przypadku awarii. Poprzednia858380-bajtowa wersja unikała wywoływaniasort
:Edycja: Zapisano 2 bajty, inicjując
c
na-1
zamiast0
. Zapisane 5 bajtów poprzez przełączenie odreduce
celumap
, ech ...źródło
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
i[75, 230, 30, 42, 50]
.sort
niedopatrzenie, które spowodowało trzeci błąd testu. Pozostałe dwie porażki testowe były spowodowane przez mnie nadmiernym golfem; Wróciłem do poprzedniej wersji.05AB1E , 12 bajtów
Kod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
Snowman 1.0.2 , 27 bajtów
Jest to podprogram, który pobiera dane wejściowe i wyjściowe do bieżącego permawaru.
Wypróbuj online!
źródło
MATL,
1312109 bajtówTen sam pomysł, co odpowiedź @ flawr, w której przechwytujemy
strfind
(Xf
), aby znaleźć posortowaną wersję danych wejściowych w ramach konkatenacji dwóch kopii danych wejściowych.Wypróbuj online!
Wyjaśnienie
źródło
g
? Lub zastąpng
przeza
n
ponieważn
może być> 1.a
zdecydowanie działa. Uznałem, że jest lepszy sposób. Dzięki!Julia, 33 bajty
Wypróbuj online!
Jak to działa
To konkatenuje tablicę x z samym sobą i zlicza liczbę par, które są nieuporządkowane, tj. Liczbę sąsiadujących podrzędnych [a, b], dla których b - a <0 . Jeśli c jest liczbą nieuporządkowanych par samego x , a t wynosi 1, jeśli ostatni element x jest większy niż jego pierwszy,
sum
zwróci 2c + t .Tablica x nadaje się do dryfowania iff (c, t) = (1, 0) ( x należy obrócić do mniejszej wartości jedynej nieuporządkowanej pary), (c, t) = (0, 1) ( x jest sortowane) lub (c, t) = (0, 0) ( x jest posortowane, a wszystkie jego elementy są równe), co jest prawdą, jeśli iff 2c + t <3 .
źródło
JavaScript ES6,
484543 znakówTest:
źródło
(x+[,x])
a kolejny bajt, używając~
zamiast1+
w twoim stanie.Brachylog , 39 bajtów
Naprawdę muszę dodać opcjonalny argument, aby
$( - circular permute left
permutować więcej niż raz ... To byłoby 13 bajtów. Poczeka to po wdrożeniu nowego stabilnego transpilera w Prologu.Wyjaśnienie
źródło
Ruby, 47 bajtów
Funkcja rekurencyjna. Zwraca,
nil
jeśli tablica wejściowa nie może być dzielona.źródło
CJam,
17 lat13 bajtówDzięki Dennis za oszczędność 4 bajtów.
Nienazwany blok (funkcja), który pobiera i zwraca listę.
Zestaw testowy.
Wyjaśnienie
Zasadniczo wykorzystuje to obserwację xnor, że posortowana lista pojawia się dwukrotnie na liście oryginalnej, jeśli można ją posortować:
źródło
C ++ 14, 242 znaków
Jeśli nie mogę pozostawić pustego wyjścia, 252 znaków http://ideone.com/HAzJ5V
Wersja bez golfa http://ideone.com/Dsbs8W
PS: W oparciu o pomysł @ MichelfrancisBustillos .
źródło
Java 7, 207 bajtów
Szczegółowe spróbuj tutaj
źródło
Java 175
wypisuje dane wyjściowe jako wartości oddzielone spacjami lub drukuje
f
dla wartości falsey.przechodzi przez wszystkie kombinacje tablicy liczb całkowitych, aż znajdzie prawidłową sekwencję lub zabraknie kombinacji. tablica nie jest modyfikowana, ale zamiast tego posortowana sekwencja jest przechowywana jako ciąg rozdzielany spacjami.
nieco bardziej czytelny:
spróbuj online
źródło
C, 105 bajtów
Akceptuje to wejściowe liczby całkowite jako osobne argumenty wiersza poleceń i drukuje listę wyników jako jedną liczbę całkowitą w wierszu.
Jeśli listy nie można przenosić, program kończy pracę przedwcześnie z powodu wyjątku zmiennoprzecinkowego, więc jego puste dane wyjściowe reprezentują pustą listę.
Weryfikacja
źródło
Ruby, 28 lat
Zwraca albo posortowaną tablicę, albo
nil
(co jest wartością falsy), jeśli danych wejściowych nie można posortować.źródło
Python, 53 bajty
Jeśli chcesz przetestować to, przejdź na https://www.repl.it/languages/python3 i skopiuj to:
Jak to działa:
s
to zmienna przechowująca funkcjęsorted
pythona, która sortuje listyN
jest główną funkcjąs(x)
Posortowana lista wejściowa: jest mnożona przez to, czy lista jest dostępna do driftustr(s(x))[1:-1]in str(x+x)
do driftu (dzięki @xnor)[1,2,3,4]*false
powoduje powstanie pustej listy[]
[1,2,3,4]*true
wyniki w[1,2,3,4]
źródło
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
44 bajtów.Python, 83 bajty
Zawstydzają to inne odpowiedzi pytona, ale i tak mogę to opublikować. Naprawdę nie lubię
część. Czy istnieje szybszy sposób na iterację po liście?
źródło
l.append(l.pop(0))or g==l for _ in l
oszczędza bajt w stosunku do podejścia opartego na zakresie zasięgu. Użycie alambda
zaoszczędziłoby 14 dodatkowych bajtów.MATLAB / Octave, 118 bajtów
źródło
input('')
. Unikaj także niepotrzebnych spacji i nawiasów! Możesz ponownie zrzucić trochę bajtów, najpierw definiującf=@issorted
.PowerShell v2 +,
8780 bajtówPrzechodzi przez listę wprowadzania
$a
, sprawdzając każdy element parami (w tym ostatni i pierwszy), aby sprawdzić, czy istnieje więcej niż jedna para malejąca. Jeśli konkretna para maleje, zmniejszamy$c
. Zwraca posortowaną listę lub pojedynczy element0
na podstawie wartości$c
na końcu. Jeśli występuje więcej niż jedna „zła” para, to++$c
nadal będzie ona ujemna, w przeciwnym razie będzie co najmniej0
, więc wybierany jest drugi element pseudo-trójki ($a|sort
).Widzę, że Xnor zrobił coś podobnego , ale wymyśliłem to niezależnie.
źródło
Współczynnik, 47 bajtów
połącz sekwencję z sobą, a następnie sprawdź, czy posortowane tłumaczenie oryginału jest podsekwencją.
źródło
dup dup append \\ natural sort \\ dip subseq?
pasuje nawet do wzoru 4-4-3 :)C ++, 313
359370bajtówOgromne pozdrowienia dla @Qwertiy za to, że działał i nauczył mnie kilku świetnych metod gry w golfa!
Gra w golfa:
Nie golfowany:
źródło
using namespace std;
jest 20 znaków, gdystd::
6 razy to 30.bool s = False;
- dlaczego nie=0
? Możesz upuścićreturn 0;
. Dlaczego nawiasy są tutaj!s&&(c<=v.size())
? Nawiasy klamrowe bez przecinków ...std::
ireturn 0;
) stało się nawykiem z zajęć z programowania. Naprawdę muszę lepiej sprawdzać moje programy.True
iFalse
zamiasttrue
ifalse
. ideone.com/kVTI25 - twoja wersja, ideone.com/y8s44A - naprawiona i przygotowana do gry w golfa.True
iFalse
pochodzi z Python. Nawet nie wiedziałem, że możesz tak pisaćif
!Mathcad, TBD
W Mathcad 0 (skalar) == false.
(Równoważna) liczba bajtów to TBD, dopóki nie zostanie uzgodniona metoda liczenia. Około 52 bajtów przy użyciu równoważnika bajt = operator / symbol.
źródło
Mathematica
55 50 6158 bajtówZ 3 bajtami zaoszczędzonymi dzięki Martinowi Büttnerowi.
Moje wcześniejsze próby nie przeszły wszystkich przypadków testowych. Musiałem dodać,
Union
aby uniknąć powtórzeń na liście, które były wprowadzane w kolejności.Testy
Wyjaśnienie
Obróć listę wejściową w prawo od 1 do
n
razy, gdzien
jest długość listy wejściowej. Jeśli posortowana lista wejściowa znajduje się wśród wyjściowych list obróconych, zwróć ją; w przeciwnym razie zwróć pustą listę.źródło
@@
i/@
na pustych listach.Join@@
powinien być jeszcze krótszy niżFlatten@
chociaż.PHP, 98 bajtów
Wyprowadza,
1
jeśli można dryfować, w przeciwnym razie nicźródło