Wyzwanie
To naprawdę bardzo proste, posortuj listę liczb.
Detale
Musisz posortować listę liczb w porządku rosnącym, bez korzystania z wbudowanych funkcji sortujących / bibliotek / etc (tj. list.sort()
W Pythonie).
Wejścia / wyjścia można wykonać dowolną wybraną metodą, o ile jest to czytelne dla człowieka.
Standardowe luki są jak zwykle niedozwolone.
Najkrótszy kod w bajtach wygrywa.
Musisz wyjaśnić / wymienić zastosowaną metodę sortowania (Bubble, Insertion, Selection itp.)
Dane wejściowe nie będą zawierać duplikatów.
Przykładowe wejście / wyjście
Wkład: 99,-2,53,4,67,55,23,43,88,-22,36,45
Wydajność: -22,-2,4,23,36,43,45,53,55,67,88,99
Uwaga: prawie bezpośrednie przeciwieństwo sortowania listy liczb
[7 2 4 1] -> [4 2 3 1]
. Czy lista CSV może także znajdować się w nawiasach? Ponadto określony format wejściowy jest bardzo odpowiedni dla niektórych języków, a zły dla innych. To sprawia, że parsowanie danych wejściowych stanowi dużą część dla niektórych zgłoszeń, a dla innych jest niepotrzebne.Odpowiedzi:
05AB1E , 2 bajty
Kod:
Ten sam algorytm co odpowiedź Jelly . Oblicza wszystkie permutacje danych wejściowych i wyskakuje najmniejszy.
Wypróbuj online!
Bardziej wydajną metodą jest:
Dokonuje sortowania wyboru . Wykorzystuje kodowanie CP-1252 .
Wypróbuj online!
źródło
Galaretka, 3 bajty
Generuje to wszystkie permutacje z listy danych wejściowych, a następnie wybiera najmniejszą leksykograficzną permutację. Bardzo wydajny
Kredyty dla @Adnan, który miał ten sam pomysł niezależnie.
Wypróbuj online!
Galaretka, 4 bajty
To buduje zakres od minimum listy do maksimum listy, a następnie odrzuca elementy zakresu nieobecne na oryginalnej liście. Technicznie jest to rodzaj łyżki , z bardzo małymi łyżkami. Nie znam nazwy tego konkretnego wariantu.
Wypróbuj online!
Jak to działa
źródło
Python,
4645 bajtówProsty wybór sortowania.
źródło
l[:]
może być1*l
Brachylog ,
127 bajtówUżywa to sortowania permutacyjnego, co jest oczywiście okropne, ale hej, jest krótsze niż Pyth!
Wyjaśnienie
źródło
Haskell, 38 bajtów
Funkcja binarna
%
wstawia nowy elementh
do posortowanej listyt
, dzieląct
go na prefiksa
elementów<h
i sufiksb
elementów>h
i wsuwając sięh
między nimi.Operacja
foldr(%)[]
następnie tworzy posortowaną listę z pustych przez wielokrotne wstawianie elementów z listy wejściowej.Jest to jeden bajt krótszy niż bezpośrednia rekurencyjna implementacja
Kolejna strategia dla 41 bajtów:
źródło
%
jako wewnętrzną pętlą wstawiania ifoldr
zastosowania jej jako zewnętrznej pętli.JavaScript (ES6), 51 bajtów
Każda pętla znajduje najmniejszą liczbę, która dotychczas nie została znaleziona.
źródło
[1,2,3,4,5,4,3,2,1]
produkuje[1, 2, 3, 4, 5, Infinity, Infinity, Infinity, Infinity]
Python 2, 34 bajty
Pobiera dane wejściowe jako zestaw, drukuje elementy w porządku rosnącym, kończąc z błędem.
Czyste zakończenie można wykonać w 41 bajtach:
lub
Dane wejściowe można traktować jako listę dla 39 bajtów lub 38 bajtów w Pythonie 3.5:
źródło
m=min(s)
/s - (m)
jako wewnętrzną pętlę do znajdowania i usuwania min z nieposortowanych elementów oraz rekurencję jako zewnętrzną.Haskell,
424138 bajtówPętle przechodzą przez wszystkie liczby całkowite (podpisane 64-bitowe, na moim komputerze) i zatrzymują te, które są
u
. Oczywiście nie kończy się w rozsądnym czasie.Poprzednia wersja była zapętlona i
[minimum u..maximum u]
ma ten sam najgorszy czas działania.Edycja: @xnor zapisał bajt. Dzięki!
źródło
filter
jest jeden krótszy:f u=filter(`elem`u)[minimum u..maximum u]
[minimum u..]
działa z przyczyn typu?f [1,3,0]
, elementy domyślnieInteger
wpisują to, co jest niezwiązane, więc..
nigdy się nie kończy. Jeśli trzeba to tak nazwać, tof ([1, 3, 0]::[Int])
chyba licznik bajtów musi zawierać adnotację typu.Oracle SQL 11.2, 205 bajtów
Nie grał w golfa
Jeśli chodzi o metodę sortowania, nie mam pojęcia,
ORDER BY
upewniłem się, że je zapomniałem.źródło
kod maszynowy x86-16 (BubbleSort int8_t),
2019 bajtówKod maszynowy x86-64 / 32 (JumpDownSort)
2119 bajtówDziennik zmian:
Dziękuję @ ped7g za pomysł
lodsb
/cmp [si],al
i łącząc to ze zwiększaniem / resetowaniem wskaźnika, na który patrzyłem. Nie potrzebujemyal
/ah
pozwala nam używać prawie tego samego kodu dla większych liczb całkowitych.Nowy (ale pokrewny) algorytm, wiele zmian implementacyjnych: Bubbly SelectionSort pozwala na mniejszą implementację x86-64 bajtów lub dwordów; break-even na x86-16 (bajty lub słowa). Pozwala także uniknąć błędu rozmiaru = 1, który ma mój BubbleSort. Patrz poniżej.
Okazuje się, że mój Bubbly Selection Sort z zamianą za każdym razem, gdy znajdziesz nową min, jest już znanym algorytmem, JumpDown Sort. Jest wspomniany w Bubble Sort: An Archeological Algorytmic Analysis (tj. Jak Bubble Sort stał się popularny pomimo ssania).
Sortuje 8-bitowe liczby całkowite ze znakiem na miejscu . (Unsigned ma ten sam rozmiar kodu, wystarczy zmienić na
jge
ajae
). Duplikaty nie stanowią problemu. Zamieniamy za pomocą 16-bitowego obrotu o 8 (z miejscem docelowym pamięci).Sortowanie bąbelkowe wymaga wydajności , ale przeczytałem, że jest to jedna z najmniejszych możliwości implementacji w kodzie maszynowym. Wydaje się to szczególnie prawdziwe, gdy istnieją specjalne triki do zamiany sąsiednich elementów. Jest to w zasadzie jego jedyna zaleta, ale czasami (w prawdziwych systemach wbudowanych) jest to wystarczająca zaleta, aby użyć jej do bardzo krótkich list.
Pominąłem wcześniejsze zakończenie bez zamiany . Użyłem „zoptymalizowanej” pętli BubbleSort z Wikipedii, która unika oglądania ostatnich
n − 1
elementów podczas biegu pon
raz -ty, więc licznik pętli zewnętrznej jest górną granicą dla pętli wewnętrznej.Lista NASM (
nasm -l /dev/stdout
) lub zwykłe źródłopush / pop
cx
wokół wewnętrznej pętli oznacza, że działa zcx
= outer_cx w dół do 0.Zauważ, że
rol r/m16, imm8
nie jest to instrukcja 8086, została dodana później (186 lub 286), ale nie jest to próba kodu 8086, tylko 16-bitowy x86. Jeśliphminposuw
pomoże SSE4.1 , skorzystam z niego.Wersja 32-bitowa (wciąż działająca na 8-bitowych liczbach całkowitych, ale z 32-bitowymi wskaźnikami / licznikami) ma 20 bajtów (prefiks wielkości operandu włączony
rol word [esi-1], 8
)Błąd: rozmiar = 1 jest traktowany jako rozmiar = 65536, ponieważ nic nie powstrzymuje nas przed wejściem do zewnętrznego do / while z cx = 0. (Zazwyczaj
jcxz
używałbyś do tego.) Ale na szczęście 19-bajtowy Sort JumpDown ma 19 bajtów i nie ma tego problemu.Oryginalna 20-bajtowa wersja x86-16 (bez pomysłu Ped7g). Pominięto, aby zaoszczędzić miejsce, zobacz historię edycji z opisem.
Wydajność
Częściowo zachodzące na siebie zapisywanie / przeładowanie (w rotacji miejsca docelowego w pamięci) powoduje zatrzymanie przekazywania magazynu na nowoczesnych procesorach x86 (z wyjątkiem Atomu w kolejności). Kiedy wysoka wartość rośnie w górę, to dodatkowe opóźnienie jest częścią łańcucha zależności przenoszonego przez pętlę. Przechowywanie / przeładowywanie jest w pierwszej kolejności zasysane (np. 5-cyklowe opóźnienie przekazywania do sklepu w Haswell), ale przeciągnięcie przekazywania powoduje więcej niż 13 cykli. Wykonanie poza kolejnością będzie miało problem z ukryciem tego.
Zobacz także: Przepełnienie stosu: sortowanie bąbelkowe do sortowania łańcucha dla wersji tego z podobną implementacją, ale z wczesnym wyprzedzeniem, gdy nie są potrzebne żadne zamiany. Używa
xchg al, ah
/mov [si], ax
do zamiany, która jest dłuższa o 1 bajt i powoduje częściowe zatrzymanie rejestru na niektórych procesorach. (Ale wciąż może być lepszy niż rotacja pamięci-dst, która musi ponownie załadować wartość). Mój komentarz zawiera kilka sugestii ...x86-64 / x86-32 JumpDown Sort, 19 bajtów (sortuje int32_t)
Można wywoływać z C przy użyciu konwencji wywoływania Systemu x86-64 jako V
int bubblyselectionsort_int32(int dummy, int *array, int dummy, unsigned long size);
(wartość zwracana = maks. (Tablica [])).Jest to https://en.wikipedia.org/wiki/Selection_sort , ale zamiast zapamiętywać pozycję elementu min, zamień bieżącego kandydata na tablicę . Po znalezieniu min (region nieposortowany) zapisz go na końcu posortowanego regionu, tak jak normalne sortowanie selekcji. To powiększa posortowany region o jeden. (W kodzie
rsi
wskazuje jeden za końcem posortowanego regionu;lodsd
przesuwa go imov [rsi-4], eax
zapisuje min w nim).Nazwa Sortuj w dół jest używana w Sortowaniu bąbelkowym: archeologiczna analiza algorytmiczna . Wydaje mi się, że mój rodzaj jest naprawdę rodzajem skoku w górę, ponieważ wysokie elementy podskakują w górę, pozostawiając posortowane dno, a nie koniec.
Ten projekt wymiany prowadzi do tego, że nieposortowana część tablicy kończy się w większości w odwrotnej kolejności, co prowadzi do wielu zamian w późniejszym czasie. (Ponieważ zaczynasz od dużego kandydata i ciągle widzisz niższych i niższych kandydatów, więc ciągle zamieniasz się.) Nazwałem to „bąbelkowym”, mimo że przesuwa elementy w innym kierunku. Sposób, w jaki przesuwa elementy, jest również trochę podobny do odwrotnego sortowania. Aby obejrzeć go w akcji, użyj GDB
display (int[12])buf
, ustaw punkt przerwania w wewnętrznejloop
instrukcji i użyjc
(kontynuuj). Naciśnij Return, aby powtórzyć. (Polecenie „display” powoduje, że GDB wypisuje cały stan tablicy za każdym razem, gdy osiągamy punkt przerwania).xchg
with mem ma niejawnylock
przedrostek, co powoduje, że jest to bardzo wolne. Prawdopodobnie o rząd wielkości wolniejszy niż efektywna zamiana obciążenia / magazynu;xchg m,r
to jedna na przepustowość 23c na Skylake, ale ładowanie / przechowywanie / mov z regem tmp dla wydajnej wymiany (reg, mem) może przesunąć jeden element na zegar. Może to być gorszy współczynnik na procesorze AMD, w którymloop
instrukcja jest szybka i nie spowodowałaby tak dużego ograniczenia wewnętrznej pętli, ale pominięcia gałęzi nadal będą dużym wąskim gardłem, ponieważ wymiany są powszechne (i stają się częstsze, gdy nieposortowany region staje się mniejszy ).Sam rozmiar kod
int8_t
: Używajlodsb
/scasb
,AL
i zmienić[rsi/rdi-4]
na-1
. Ten sam kod maszynowy działa w trybie 32-bitowym dla elementów 8/32-bitowych. Tryb 16-bitowy dla 8/16-bitowych elementów musi zostać odbudowany ze zmienionymi przesunięciami (a 16-bitowe tryby adresowania używają innego kodowania). Ale wciąż 19 bajtów dla wszystkich.Unika początkowej
dec ecx
poprzez porównanie z elementem, który właśnie załadował przed przejściem dalej. Podczas ostatniej iteracji zewnętrznej pętli ładuje ostatni element, sprawdza, czy jest mniejszy niż on sam, a następnie jest wykonywany. To pozwala mu pracować z rozmiarem = 1, gdzie mój BubbleSort zawodzi (traktuje go jako rozmiar = 65536).Testowałem tę wersję (w GDB) przy użyciu tego wywołującego: Wypróbuj online! . Możesz uruchomić to na TIO, ale oczywiście nie ma debugera ani drukowania. Mimo to, to,
_start
co go wywołuje, kończy działanie z parametrem exit-status = największy element = 99, więc widać, że działa.źródło
cx
i użyjloop
dla obu? Może zapętlić w drugą stronę, od tyłu do przodu tablicy, więc liczymy indeks do zera? (I zwiększaj,bx
ponieważ posortowana część znajduje się na końcu, do którego zapętlasz).sub si, cx
jako część zewnętrznej pętli za pomocą wskaźnika zamiast indeksowania, ale nie myślałem olodsb
/cmp [si], al
. Zastanawiałem się nadlodsw
/dec si
, lublodsb
/,xchg al,ah
aby nadal konfigurowaćcmp ah,al
cld
, lub myślę, że możemy włączyć tę część konwencji wywoływania. AFAIK, poDF
wyczyszczeniu nie jest standardową częścią 16-bitowych konwencji wywoływania, tylko 32/64. A może po prostu nie możesz tego założyć w bootloaderze? Ale przy niestandardowej konwencji wywoływania rejestru jest to tak samo fragment kodu jak funkcja, więc na pewno, dlaczego nie wymagać DF = 0. (A jeśli chcemy, ES = DS, więc moglibyśmyscasb
zamiast tego,lodsb
jeśli jest to wygodniejsze.)C, 72 bajty
Bubblesort. Pierwszy argument jest wskaźnikiem do tablicy, drugi argument to długość tablicy. Działa z gcc.
źródło
MATL ,
1110 bajtówNiezwykle nieefektywne badanie wszystkich permutacji danych wejściowych.
Wypróbuj online!
Wyjaśnienie
źródło
Rubinowy, 40 bajtów
Sortuj wybór. Funkcja anonimowa; przyjmuje listę jako argument.
źródło
Python, 120 bajtów
To prawdopodobnie nie będzie najkrótsza odpowiedź, ale wydaje mi się, że ten algorytm należy tutaj. wywołanie z listą liczb całkowitych, zostaną wydrukowane w uporządkowany sposób na standardowe wyjście. Jednak nie spróbowałbym tego przy zbyt dużych liczbach.
źródło
MIPS, 68 bajtów
Jakiś czas temu napisałem prostą, niezoptymalizowaną implementację sortowania bąbelkowego. Liczba bajtów zaczyna się
loop
i kończy oli $v0, 10
, zakładając, że adres i długość listy są już w pamięci.Teraz czekam na wysadzenie z wody za pomocą x86 ...
źródło
swapped=true
kontrolę przedwczesną i odliczać na podstawie rozmiaru tablicy. Zobacz moją 20-bajtową wersję x86-16, która sortuje 8-bitową liczbę całkowitą . Mogę stworzyć normalną 32-bitową lub 64-bitową wersję x86, która sortuje 32-bitowe liczby całkowite w pewnym momencie, ale 8-bitowe liczby całkowite w trybie 16-bitowym są swego rodzaju miłym miejscem dla x86.Awk, 66 bajtów
Tablice w awk są jak słowniki, a nie jak tablice C. Indeksy mogą być nieciągłe i rosną (i są tworzone) w razie potrzeby. Tak więc tworzymy tablicę
a
dla danych wejściowych, przy czym każda linia jest kluczem. I zapisujemy wartości minimalną i maksymalną. Następnie zapętlamy od min do maksimum i wypisujemy wszystkie klucze, które istniejąa
.b
jest po to, aby uniknąć wielokrotnego używania$0
.źródło
Python 3,
916247 bajtówDzięki wnnmaw i Seeq za pomoc w grze w golfa.
Argumentem
z
powinna być lista. Jest to wariant sortowania selekcji.Nie jestem pewien, jak
min
radzi sobie z tymbuilt-in sorting functions
, ponieważ nie jestem pewien, jak implementuje się Pythonmin
. Mamy nadzieję, że to rozwiązanie jest nadal w porządku. Wszelkie sugestie dotyczące gry w golfa w komentarzach lub na czacie PPCG są mile widziane.źródło
def f(z):\nwhile z:m=min(z);z.remove(m);yield m
MATL , 11 bajtów
Wypróbuj online!
Sortuje to według następującej procedury, którą jest O ( n 2 ):
MATL jest oparty na stosie. Tablica z pozostałymi wartościami znajduje się na górze stosu. Usunięte wartości są poniżej, w kolejności. Pod koniec programu wyświetlane są wszystkie te wartości. Wyświetlona zostanie również tablica u góry, ale ponieważ jest pusta, nie jest wyświetlana.
źródło
Pyth -
15131110 bajtówDwa bajty zapisane dzięki @Jakube.
Bogosort.
Wypróbuj online tutaj .
Nie potrzebuję,
h
ponieważ gwarantujemy, że nie będzie duplikatów.źródło
Poważnie, 6 bajtów
Wypróbuj online!
Robi to samo, co wiele innych odpowiedzi: wygeneruj wszystkie permutacje, wybierz minimum. Trochę zapomniałem, że to zadziała, gdy pracuję nad poniższym rozwiązaniem.
Wyjaśnienie:
Poważnie, 25 bajtów (niekonkurujących)
Byłoby to konkurencyjne, gdyby nie błąd, który właśnie naprawiłem.
Wypróbuj online! To implementuje najlepszy algorytm sortowania: Bogosort !
Wyjaśnienie:
źródło
MATL,
1716 bajtówZaoszczędzono jeden bajt, tworząc tablicę zerową dzięki @LuisMendo
Sortowanie wiader. Nie próbuj z zakresem większym niż 2 31 -1.
Wypróbuj online!
Wyjaśnienie
TIL:
[]
i rozwijać ją, tak jak w MATLAB(
do indeksowania przypisańM
automatycznego schowkaNowy dzień, nowy TIL:
vertcat
magicznie tworzy pustą tablicę, gdy na stosie nie ma nic do połączeniaźródło
[]
można zastąpićv
. Wynika to z faktu, że domyślna liczba wejśćv
to liczba elementów na stosievertcat(STACK{:})
Julia,
2827 bajtówWypróbuj online!
źródło
R, 68 bajtów
Pobiera dane wejściowe
i
i wyjściowe,o
które są posortowaną listą.Wyjaśnienie:
Unikanie permutacji oznacza, że może stosunkowo szybko sortować duże listy. „Sztuczka” polega na tym, że odjęcie najmniejszej wartości od danych wejściowych pozostawia pojedyncze 0, które określa zarówno najmniejszą wartość, jak i pozycję najmniejszej wartości.
źródło
Java 8,
11292 bajtyOto kolejny wybór. Dane wejściowe są
List t
liczbami całkowitymi, a posortowane dane wyjściowe są wypisywane na standardowe wyjście.Aktualizacja
źródło
t
, co czyni ją fragmentem; wymagamy, aby zgłoszenia były pełnymi programami lub funkcjami, które wykorzystują nasze domyślne formaty We / Wy . Wymagamy również importu, aby uwzględnić liczbę bajtów. Daj mi znać, jeśli masz jakieś pytania!Retina, 95
Zmodyfikowano sortowanie bąbelkowe. Podejrzewam, że są na to znacznie lepsze sposoby, nawet bez wbudowanego sortowania siatkówki.
n
cyfrą; upuść-
znaki.1
cyfrą; dodaj1
do każdego, tak aby zero było reprezentowane przez1
.Wypróbuj online.
źródło
Ruby, 22 bajty
Szybkie permutacji sortowania. Działa w przestrzeni O (n!) I czasie.
źródło
Clojure,
7335 bajtówBogosort :)
Wcześniejsza wersja:
Zmniejsza do posortowanej listy
r
, dzieląc ją na części „mniejsze niż i” i „większe niż i”. To chyba rodzaj wstawiania .źródło
recur
z anonimowej funkcji. Też nie wiedziałem oshuffle
.Ruby,
26 lat24 bajtówSortuj według wyboru, podobnie jak w przypadku Value Ink, ale stosując inne podejście dla większej golfisty.
Zgodnie ze specyfikacją: „Wejście / wyjście można wykonać dowolną wybraną metodą, o ile jest to czytelne dla człowieka”. Myślę, że pasuje to do opisu, wynikiem jest tablica tablic z jednym elementem.
przykład:
źródło
Java 7,
106104 bajtówOto dobry rodzaj bąbelków. Parametr funkcji został zmodyfikowany na miejscu, więc nie muszę nic zwracać. Wciąż próbuję wycisnąć z tego kilka bajtów, abym mógł pokonać javę lambda, którą ktoś opublikował.
-1 bajt dzięki Geobits za wskazanie, że normalna zamiana bije xor'ing
-1 bajt dzięki Leaky Nun za wskazanie, że mogę przenieść wszystkie deklaracje int do pętli for
Wypróbuj online!
źródło
Ruby, 22 bajty
Tworzy tablicę poza zakresem między minimalnymi i maksymalnymi elementami tablicy wejściowej. Zwraca przecięcie dwóch tablic.
źródło