Trwa sortowanie bąbelkowe


19

Utwórz funkcję lub program, który pobiera dwa dane wejściowe:

  • Lista liczb całkowitych, które należy posortować (mniej niż 20 elementów)
  • Liczba całkowita dodatnia, Nokreślająca liczbę porównań

Funkcja zatrzyma się i wyświetli wynikową listę liczb całkowitych po Nporównaniach. Jeśli lista jest w pełni posortowana przed dokonaniem Nporównań, należy posortować listę posortowaną.


Bubble sortowania algorytm jest znany, i myślę, że większość ludzi wie. Poniższy pseudo-kod i animacja (oba z powiązanego artykułu z Wikipedii) powinny zawierać niezbędne szczegóły:

procedure bubbleSort( A : list of sortable items )
   n = length(A)
   repeat 
     swapped = false
     for i = 1 to n-1 inclusive do
       /* if this pair is out of order */
       if A[i-1] > A[i] then    
         /* swap them and remember something changed */
         swap( A[i-1], A[i] )
         swapped = true
       end if
     end for
   until not swapped
end procedure

Poniższa animacja pokazuje postęp:

wprowadź opis zdjęcia tutaj

Przykład (zaczerpnięty bezpośrednio z powiązanego artykułu z Wikipedii) pokazuje kroki podczas sortowania listy ( 5 1 4 2 8 ):

Pierwsze przejście

1: ( 5 1 4 2 8 ) ->  ( 1 5 4 2 8 ) // Here, algorithm compares the first two elements, 
                                   // and swaps since 5 > 1.
2: ( 1 5 4 2 8 ) ->  ( 1 4 5 2 8 ) // Swap since 5 > 4
3: ( 1 4 5 2 8 ) ->  ( 1 4 2 5 8 ) // Swap since 5 > 2
4: ( 1 4 2 5 8 ) ->  ( 1 4 2 5 8 ) // Now, since these elements are already in order 
                                   // (8 > 5), algorithm does not swap them.

Druga przepustka

5: ( 1 4 2 5 8 ) ->  ( 1 4 2 5 8 )
6: ( 1 4 2 5 8 ) ->  ( 1 2 4 5 8 ) // Swap since 4 > 2
7: ( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )
8: ( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )

Teraz tablica jest już posortowana, ale algorytm nie wie, czy jest zakończony. Algorytm wymaga jednego całego przejścia bez wymiany, aby wiedzieć, że jest posortowany.

Trzecia przepustka

9: ( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )
10:( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )
11:( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )
12:( 1 2 4 5 8 ) ->  ( 1 2 4 5 8 )

Przypadki testowe:

Format: Number of comparisons (N): List after N comparisons

Input list:
5  1  4  2  8
Test cases: 
1: 1  5  4  2  8
2: 1  4  5  2  8
3: 1  4  2  5  8
4: 1  4  2  5  8
5: 1  4  2  5  8
6: 1  2  4  5  8
10: 1  2  4  5  8
14: 1  2  4  5  8

Input list:
0: 15  18  -6  18   9  -7  -1   7  19  19  -5  20  19   5  15  -5   3  18  14  19
Test cases:
1: 15  18  -6  18   9  -7  -1   7  19  19  -5  20  19   5  15  -5   3  18  14  19
21: -6  15  18   9  -7  -1   7  18  19  -5  19  19   5  15  -5   3  18  14  19  20
41: -6   9  -7  15  -1   7  18  18  -5  19  19   5  15  -5   3  18  14  19  19  20
60: -6  -7  -1   9   7  15  18  -5  18  19   5  15  -5   3  18  14  19  19  19  20
61: -6  -7  -1   7   9  15  18  -5  18  19   5  15  -5   3  18  14  19  19  19  20
81: -7  -6  -1   7   9  15  -5  18  18   5  15  -5   3  18  14  19  19  19  19  20
119: -7  -6  -1  -5   7   9  15   5  15  -5   3  18  14  18  18  19  19  19  19  20
120: -7  -6  -1  -5   7   9  15   5  15  -5   3  18  14  18  18  19  19  19  19  20
121: -7  -6  -1  -5   7   9   5  15  15  -5   3  18  14  18  18  19  19  19  19  20
122: -7  -6  -1  -5   7   9   5  15  15  -5   3  18  14  18  18  19  19  19  19  20
123: -7  -6  -1  -5   7   9   5  15  -5  15   3  18  14  18  18  19  19  19  19  20
201: -7  -6  -5  -1  -5   3   5   7   9  14  15  15  18  18  18  19  19  19  19  20
221: -7  -6  -5  -5  -1   3   5   7   9  14  15  15  18  18  18  19  19  19  19  20

  • Tak, wbudowane algorytmy sortowania bąbelkowego są dozwolone.
  • Nie, nie można zakładać tylko dodatnich liczb całkowitych lub unikatowych liczb całkowitych.
  • Sortowanie musi odbywać się w kolejności opisanej powyżej. Nie możesz zacząć od końca listy

2
Jasne i całkowicie rozsądne. Szkoda, odkąd odkryłem naprawdę cudowne rozwiązanie dla lustrzanego sortowania bąbelków, którego ten komentarz nie jest zbyt wąski, aby go pomieścić :)
Ton Hospel

Czy lista nie będzie pusta?
mile

Ponadto, czy lista będzie miała rozmiar większy lub równy 2? Zauważyłem, że niektóre odpowiedzi poniżej nie działają dla list o długości 1 lub pustych list.
mile

Odpowiedzi:


2

Galaretka , 25 bajtów

ḣ©ṫ-Ṣ®ṖṖ¤;;ṫḊ¥
JḊṁ¹³W¤;ç/

Na podstawie mojej odpowiedzi w J.

Wypróbuj online!

Sprawdź liczbę porównań.

Wyjaśnienie

Łącze pomocnicze modyfikuje listę w indeksie [i-1, i], sortując ją, co daje taki sam wynik jak porównanie sortowania bąbelkowego.

ḣ©ṫ-Ṣ®ṖṖ¤;;ṫḊ¥  Helper link - Input: list A, index i
ḣ               Take the first i values
 ©              Save a copy of it
  ṫ-            Take the last two values
    Ṣ           Sort them
         ;      Append them to
     ®            Get the copy
      ṖṖ¤         Pop the last two values (Ṗ is pop)
          ;     Prepend it to
           ṫ      Take the last i values
            Ḋ¥    Dequeue - remove the head

JḊṁ¹³W¤;ç/  Input: list A and # of comparisons n
J           Enumerate the indices of A
 Ḋ          Dequeue - remove the head
  ṁ         Reshape it cyclically to length n
   ¹        Identity function (Just to avoid parsing rules)
       ;    Append it to
    ³         The list A
     W¤       Wrap it as an array
        ç/  Reduce from left to right using the helper link and return

9

JavaScript (ES6), 102 82 80 86 80 bajtów

Poprawka błędu i 1 bajt zapisane dzięki @ edc65

(a,m)=>eval("for(i=0;m;a[j=i-1]>(b=a[i])?a[a[i]=a[j],j]=b:0)1/a[++i]?m--:i=0;a")

Rekurencja może nie być zdecydowanie nie jest prawdopodobnie najlepszym podejściem, ale na razie trzymam się pętli.

Wypróbuj to:


Udało mi się golf swoją wersję rekurencyjną w dół do 82 bajtów za: f=(a,m,n=0,_,b=a[n+1])=>b+.5?m?f(a,m-1,n+1,a[n]>b?a[a[n+1]=a[n],n]=b:0):a:f(a,m,0).
Neil

@Neil Wow, to imponujące! Możesz to opublikować jako własne, jeśli chcesz.
ETHprodukcje

@Neil Możesz także zrobić swoją rekurencyjną wersję w 80, po prostu usuń ostatnią,0
Jonathan Allan

Spróbuj 1/bzamiast tego b+.5sprawdzićundefined
edc65

W porządku, moja sugestia dotycząca 1 / b nadal obowiązuje
edc65

7

Haskell, 83 82 81 bajtów

y%x@(a:b:c)=(y++x):(y++[min a b])%(max a b:c)
y%x=[]%(y++x)
[x]!_=[x] 
x!n=[]%x!!n

Przykład użycia: [5,1,4,2,8] ! 5-> [1,4,2,5,8].

W funkcji % yśledzi elementy odwiedzane do tej pory podczas bieżącego przejścia, xsą jeszcze do sprawdzenia. ai bsą następnymi dwoma, tj. kandydatami do zamiany. Jeśli dotrzemy do końca listy, zaczynamy od początku: y%x = []%(y++x). Wszystkie kroki są przechowywane na liście, na której główna funkcja wybiera ten nelement.

Edycja: poprzednie wersje nie działały dla list pojedynczych elementów, na szczęście nowa wersja jest jeszcze krótsza.


Czy można to przetestować online? Nic nie wiem o Haskell i dostaję błędy, gdy próbuję wkleić to bezpośrednio do idei online. Chyba brakuje mi kilku podstawowych rzeczy ...?
Stewie Griffin,

Dodaj f=przed drugim wierszem odpowiedzi, a następnie dodaj trzeci wiersz do programu zawierającego main=print(f [5,1,4,2,8] 5). To powinno sprawić, że będzie działać.
Lynn,

@WeeingIfFirst: pełny program
nimi

4

Python 3, 77 74 bajtów

-3 bajty dzięki @Maltysen (init jw deklaracji)

lambda l,n,j=0:exec('j*=j<len(l)-1;l[j:j+2]=sorted(l[j:j+2]);j+=1;'*n)or l

Przypadki testowe w ideone

Używa sortedkażdej operacji porównywania i zamiany, ale wykonuje sortowanie bąbelkowe.

Ustawia j=0(lewy indeks), a następnie wykonuje nporównanie i zamianę sąsiednich elementów listy, resetując jdo 0tego, gdy to okno wykracza poza granice.

W tym j*=j<len(l)-1momencie mnoży się jprzez False(tj. 0), Natomiast za każdym razem będzie mnożyć jprzez True(tj 1.).

(Nadal będzie działać również dla pustej listy).


1
Myślę, że można zaoszczędzić poprzez usunięcie plus i ustawienie j = 0 na domyślnych lambda params
Maltysen

1
ponadto nie musisz resetować j, możesz użyć%
Maltysen

@Maltysen faktycznie nie mogę używać arytmetyki modulo i zapisywać bajtów, ponieważ musimy obsłużyć listę długości 1, kiedy otrzymalibyśmy błąd dzielenia przez zero, dodając logikę do obsługi, która popycha mnie w bajty.
Jonathan Allan,

1
Działa dobrze dla wszystkich przypadków testowych i jest nieco krótszy niż moja odpowiedź MATLAB. +1 =) Niestety nie mogę użyć tej samej techniki evalw MATLAB z powodu przypisań wbudowanych.
Stewie Griffin,

1
Zaktualizowano, aby uwzględnić nowe przypadki testowe
Jonathan Allan,

3

PowerShell v2 +, 135 129 bajtów

param($a,$n)for($s=1;$s){($s=0)..($a.count-2)|%{if($a[$_]-gt$a[$_+1]){$a[$_],$a[$_+1]=$a[$_+1],$a[$_];$s=1}if(!--$n){$a;exit}}}$a

Więc. Wiele. Dolary

( Zaoszczędzono sześć bajtów, wiedząc, że to wyzwanie nie obejmuje optymalizacji „za darmo” pomijania ostatniego elementu (elementów) przy każdym przejściu, ponieważ jest to gwarantowane posortowane, a zamiast tego przechodzi przez pełne przejście za każdym razem. To przeniosło się $a.countdo forzapętlić i wyeliminować $zzmienną ).

Prosto sortuj bąbelki, z jednym fajnym miejscem, robiąc zamianę w jednym kroku -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]

Wyjściowa logika jest obsługiwana przez if(!--$n){$a;exit}

Przypadki testowe

(Tablica jest tutaj pokazana jako oddzielona spacją, ponieważ domyślnym separatorem pól wyjściowych do tworzenia łańcucha jest spacja. Tworzenie łańcuchów ma miejsce, ponieważ łączymy się z etykietami "$_ -> ").

PS C:\Tools\Scripts\golfing> 1,2,3,4,5,6,10,14|%{"$_ -> "+(.\bubble-sorting-in-progress.ps1 @(5,1,4,2,8) $_)}
1 -> 1 5 4 2 8
2 -> 1 4 5 2 8
3 -> 1 4 2 5 8
4 -> 1 4 2 5 8
5 -> 1 4 2 5 8
6 -> 1 2 4 5 8
10 -> 1 2 4 5 8
14 -> 1 2 4 5 8

PS C:\Tools\Scripts\golfing> 1,21,41,60,61,81,119,120,121,122,123,201,221|%{"$_ -> "+(.\bubble-sorting-in-progress.ps1 @(15,18,-6,18,9,-7,-1,7,19,19,-5,20,19,5,15,-5,3,18,14,19) $_)}
1 -> 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
21 -> -6 15 18 9 -7 -1 7 18 19 -5 19 19 5 15 -5 3 18 14 19 20
41 -> -6 9 -7 15 -1 7 18 18 -5 19 19 5 15 -5 3 18 14 19 19 20
60 -> -6 -7 -1 9 7 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
61 -> -6 -7 -1 7 9 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
81 -> -7 -6 -1 7 9 15 -5 18 18 5 15 -5 3 18 14 19 19 19 19 20
119 -> -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
120 -> -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
121 -> -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
122 -> -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
123 -> -7 -6 -1 -5 7 9 5 15 -5 15 3 18 14 18 18 19 19 19 19 20
201 -> -7 -6 -5 -1 -5 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
221 -> -7 -6 -5 -5 -1 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20

3

R, 132 131 112 136 bajtów

Program odbiera dane wejściowe w następujący sposób: najpierw N, a potem sam wektor. Na przykład, jeśli chcesz v = [5 1 4 2 8]i n = 1, wejście, które trafia do scanjest 1 5 1 4 2 8. Aby uruchomić ten program, uruchom pierwszy wiersz , podaj numery jeden po drugim w konsoli , a następnie uruchom resztę (jest to odpowiedź REPL).

Następnie następujący kod załatwia sprawę:

v=scan()
s=m=0
while(!s){s=T;for(i in 3:length(v)){m=m+1
if(m>v[1]){s=T;break}
if(v[i-1]>v[i]){v[c(i-1,i)]=v[c(i,i-1)];s=F}}}
cat(v[-1])

Test:

Input: a vector with N first and the elements to be sorted next
1 5 1 4 2 8
5 5 1 4 2 8
14 5 1 4 2 8
60 15 18 -6 18  9 -7 -1  7 19 19 -5 20 19  5 15 -5  3 18 14 19

Output: 
1 5 4 2 8
1 4 2 5 8
1 2 4 5 8
-6 -7 -1  9  7 15 18 -5 18 19  5 15 -5  3 18 14 19 19 19 20

Aktualizacja: golf 1 bajt dzięki Vlo .


2
Wydaje się, że wymaga to zakodowania na stałe danych wejściowych jako zmiennych i domyślnego wyświetlania danych wyjściowych za pomocą mechanizmu REPL, co jest nie do przyjęcia na naszej liście dopuszczalnych metod We / Wy .
Mego

@Mego Dobra, naprawiłem to. Sprawdź, czy teraz jest w pełni zgodny ...
Andreï Kostyrka,

Wygląda na to, że możesz usunąć pierwsze s = T; i nadal mają poprawną wydajność; oszczędza to 4 bajty. EDYCJA: W rzeczywistości możesz całkowicie usunąć pętlę while () i po prostu użyć pętli for (), zastępując s = T przerwaniem, co pozwala nam również pozbyć się nawiasów klamrowych. Daje to: v = skan (); s = m = 0; dla (i w 3: długość (v)) {m = m + 1; if (m> v [1]) break; if (v [i- 1]> v [i]); v [c (i-1, i)] = v [c (i, i-1)]; break}}; v [-1] Łącznie 117 bajtów.
rturnbull

@rturnbull Twoja wersja jest o wiele lepsza! Uznanie dla ciebie.
Andreï Kostyrka,

@rturnbull Gdzie poszły te wczesne komentarze? Twoja sugestia gry w golfa w odległości 19 bajtów ... po prostu usunęła tę dodatkową pętlę, która była niezbędna, ponieważ wydajność sortowania bąbelków wynosi O (n²), natomiast bez tej dodatkowej pętli staje się (n-1) długa. Powinienem był sprawdzić ... Teraz jest naprawiony i zawiera wyjaśnienie, jak wprowadzić dane wejściowe! Czy to jest lepsze niż wcześniej?
Andreï Kostyrka,


2

JavaScript (ES6), 82 80 79 bajtów

f=(a,m,n=0,_,b=a[n+1])=>1/b?m?f(a,m-1,n+1,a[n]>b?a[a[n+1]=a[n],n]=b:0):a:f(a,m)

Na podstawie oryginalnej odpowiedzi @ ETHproduction. Edycja: Zapisano 2 bajty dzięki @JonathanAllan. Zapisano 1 bajt dzięki @ edc65.


2

J , 62 60 bajtów

>@([:({.,(2/:~@{.}.),]}.~2+[)&.>/]|.@;<:@#@]<@|i.@[)^:(]1<#)

Jest to czasownik, który przyjmuje dwa argumenty: liczbę porównań na LHS i listę liczb całkowitych na RHS. Najpierw sprawdza, czy długość listy jest większa niż jeden. Jeśli nie jest, zwraca listę niezmodyfikowaną, w przeciwnym razie działa na niej, wykonując określoną liczbę porównań przed zwróceniem wyniku.

Stosowanie

W pierwszym przypadku testowym polecenia formatowania służą do formatowania wielu wejść / wyjść. Drugi przypadek testowy jest pokazany jako pojedyncze wejście / wyjście.

   f =: >@([:({.,(2/:~@{.}.),]}.~2+[)&.>/]|.@;<:@#@]<@|i.@[)^:(]1<#)
   1 2 3 4 5 6 10 14 ([;f)"0 1 ] 5 1 4 2 8
┌──┬─────────┐
│1 │1 5 4 2 8│
├──┼─────────┤
│2 │1 4 5 2 8│
├──┼─────────┤
│3 │1 4 2 5 8│
├──┼─────────┤
│4 │1 4 2 5 8│
├──┼─────────┤
│5 │1 4 2 5 8│
├──┼─────────┤
│6 │1 2 4 5 8│
├──┼─────────┤
│10│1 2 4 5 8│
├──┼─────────┤
│14│1 2 4 5 8│
└──┴─────────┘
   1 f 15 18 _6 18 9 _7 _1 7 19 19 _5 20 19 5 15 _5 3 18 14 19
15 18 _6 18 9 _7 _1 7 19 19 _5 20 19 5 15 _5 3 18 14 19
   123 f 15 18 _6 18 9 _7 _1 7 19 19 _5 20 19 5 15 _5 3 18 14 19
_7 _6 _1 _5 7 9 5 15 _5 15 3 18 14 18 18 19 19 19 19 20
   221 f 15 18 _6 18 9 _7 _1 7 19 19 _5 20 19 5 15 _5 3 18 14 19
_7 _6 _5 _5 _1 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20

Wyjaśnienie

Trudno jest napisać zwięzły kod w J, który używa zmienności, więc zamiast tego przekształcam problem w redukowanie listy na zbiorze wskazań. Myślę, że ten kod jest niechlujny, więc omówię zadanie każdej frazy zamiast każdej prymitywnej. Pierwsza część pobiera długość listy i tworzy zakres. Następnie działaj na każdym przyrostku wielkości 2, aby emulować jedno przejście porównań.

   i. # 5 1 4 2 8
0 1 2 3 4
   2 <\ i. # 5 1 4 2 8
┌───┬───┬───┬───┐
│0 1│1 2│2 3│3 4│
└───┴───┴───┴───┘
   2 <@{.\ i. # 5 1 4 2 8
┌─┬─┬─┬─┐
│0│1│2│3│
└─┴─┴─┴─┘

Są to początkowe wskaźniki każdego porównania. Jeśli wykonuje się 7 porównań, zmień go, aby uzyskać żądaną kwotę. J parsuje od prawej do lewej, więc zmniejsza się od prawej do lewej, podobnie jak składanie w prawo. Dołącz początkową listę i odwróć ją.

   7 $ 2 <@{.\ i. # 5 1 4 2 8
┌─┬─┬─┬─┬─┬─┬─┐
│0│1│2│3│0│1│2│
└─┴─┴─┴─┴─┴─┴─┘
   |. 5 1 4 2 8 ; 7 $ 2 <@{.\ i. # 5 1 4 2 8
┌─┬─┬─┬─┬─┬─┬─┬─────────┐
│2│1│0│3│2│1│0│5 1 4 2 8│
└─┴─┴─┴─┴─┴─┴─┴─────────┘

Alternatywnie można wprowadzić zakres [0, 7) i każdą wartość wziąć modulo do długości listy minus 1, aby utworzyć ten sam zakres.

   (<: # 5 1 4 2 8) <@| i. 7
┌─┬─┬─┬─┬─┬─┬─┐
│0│1│2│3│0│1│2│
└─┴─┴─┴─┴─┴─┴─┘

Ostatnia część to czasownik, który pobiera listę na RHS i indeks na LHS, który oznacza indeks początkowy porównania. Wybierz dwa elementy zaczynające się od tego indeksu, posortuj je, podłącz z powrotem do listy i zwróć.

   > ({.,(2/:~@{.}.),]}.~2+[)&.>/ |. 5 1 4 2 8 ; 7 $ 2 <@{.\ i. # 5 1 4 2 8
1 2 4 5 8

Imponujące, bardzo imponujące +1.
Magic Octopus Urn

1

Matlab, 93 91 bajtów

function l=f(l,m)
n=numel(l)-1;i=0;while n&m;i=mod(i,n)+1;m=m-1;l(i:i+1)=sort(l(i:i+1));end

Oszczędza 11 bajtów, pomijając if l(i)>l(i+1);l(i:i+1)=l([i+1,i]), i zamiast tego po prostu sortuj dwa elementy za każdym razem. Działa z listami o długości 1. Można zapisać bajt lub dwa za pomocą m--operatora Octave , ale to niewiele.

Zapisuje dwa kolejne bajty przez ustawienie n=numel(l)-1;, ponieważ wtedy mogę po prostu zrobić while nzamiast while n>1i i=mod(i,n)+1zamiast i=mod(i,n-1)+1.


Dla przypomnienia odpowiedź ta została napisana wiele godzin po utworzeniu wyzwania.


1

Groovy (101 bajtów)

{l,n->(l.size()..0).each{i->(0..i-2).each{if(l[it]>l[it+1] && n>0 && it>-1){l.swap(it,it+1)};n--}};l}

EDYCJA: Nie musiałem pisać własnego zamknięcia wymiany, Groovy miał to wbudowane.
Wypróbuj tutaj: https://groovyconsole.appspot.com/script/5104724189642752

Przykład śledzenia wyników:

4:[1, 5, 4, 2, 8]
3:[1, 4, 5, 2, 8]
2:[1, 4, 2, 5, 8]
1:[1, 4, 2, 5, 8]
0:[1, 4, 2, 5, 8] - Locks in the final answer.
-1:[1, 4, 2, 5, 8]
-2 (Return):[1, 4, 2, 5, 8]

Stara implementacja (122 bajtów)

m={l,n->s={x,y->t=l[x];l[x]=l[y];l[y]=t};((l.size()-2)..2).each{i->(0..i).each{if(l[it]>l[it+1] && n){s(it,it+1)};n--}};l}

Wypróbuj tutaj: https://groovyconsole.appspot.com/script/6316871066320896


Ten błąd dotyczy list zawierających mniej niż dwa elementy
Jonathan Allan,

Na moim telefonie komórkowym ... dodanie go> = 0 w drugim przypadku, jeśli instrukcja rozwiązuje ten problem.
Magic Octopus Urn

Wygląda na to, że zawodzi również w przypadku list z ujemnym wejściem. Na przykład drugi przypadek testowy.
Stewie Griffin,

Działa teraz, ostatniej nocy byłem na telefonie komórkowym, więc nie mogłem wprowadzić wymaganych zmian.
Magic Octopus Urn

1

php, 148 145 bajtów

<?php for($i=2,$a=$argv;$a[1]--;$i=$i==count($a)-2?2:$i+1)if($a[$i]>$a[$i+1])list($a[$i],$a[$i+1])=[$a[$i+1],$a[$i]];echo substr(join(' ',$a),5);

Nie jestem bardzo zadowolony ze struktury pętli, ale podoba mi się przełącznik listy i działa, więc i tak go publikuję. php7.1 pozwoli mi zaoszczędzić co najmniej 4 bajty.

Z ładniejszym formatowaniem:

<?php 
for($i=2,$a=$argv;$a[1]--;$i=$i==count($a)-2?2:$i+1)
  if($a[$i]>$a[$i+1])
    list($a[$i],$a[$i+1])=[$a[$i+1],$a[$i]];
echo substr(join(' ',$a),5);

Edycja: Jörg Hülsermann przypomniał mi o dołączeniu zamiast implode.
Uwaga: musi znajdować się w pliku o nazwie jednoznakowej.



$ t = $ a [$ i]; $ a [$ i] = $ a [$ i + 1]; $ a [$ i + 1] = $ t; jest krótszy niż lista ($ a [$ i], $ a [$ i + 1]) = [$ a [$ i + 1], $ a [$ i]]; i nie jestem pewien, czy zamiast echa substr (implode ('', $ a), 5); ten $ a [1] = null; echo join ('', $ a); lepsza alternatywa to.
Jörg Hülsermann

1
Chociaż użycie zmiennej tymczasowej jest o 2 bajty krótsze, zawiera również wiele instrukcji, więc musisz użyć tych 2 bajtów, aby zamknąć całość w nawiasach klamrowych. Dla $ a [1] = null trzeba by faktycznie cofnąć ($ a [0], $ a [1]), aby uniknąć białych znaków i nazwy pliku na początku.
user59178,

1

Rubin, 52 50 bajtów

Zaraz ... nie Ruby?

->l,n{n.times{|a|l[s=a%~-l.size,2]=l[s,2].sort};l}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.