Идет сортировка пузырьков

19

Создайте функцию или программу, которая принимает два входа:

  • Список целых чисел, которые должны быть отсортированы (менее 20 элементов)
  • Целое положительное число, Nуказывающее, сколько сравнений следует выполнить

Функция должна остановиться и вывести результирующий список целых чисел после Nсравнений. Если список полностью отсортирован перед выполнением Nсравнения, то отсортированный список должен быть выведен.


Bubble рода алгоритм хорошо известен, и я предполагаю , что большинство людей знают об этом. Следующий псевдокод и анимация (обе из связанной статьи в Википедии) должны предоставить необходимые детали:

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

Анимация ниже показывает прогресс:

введите описание изображения здесь

Пример (взятый непосредственно из связанной статьи Википедии) показывает шаги при сортировке списка ( 5 1 4 2 8 ):

Первый проход

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.

Второй проход

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 )

Теперь массив уже отсортирован, но алгоритм не знает, завершен ли он. Алгоритму нужен один полный проход без какого-либо обмена, чтобы знать, что он отсортирован.

Третий проход

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 )

Тестовые случаи:

Формат: 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

  • Да, встроенные алгоритмы Bubble sort разрешены.
  • Нет, вы не можете принимать только положительные или уникальные целые числа.
  • Сортировка должна быть в порядке, описанном выше. Вы не можете начать с конца списка
Стьюи Гриффин
источник
2
Ясно и совершенно разумно. Жаль только, что я нашел поистине изумительное решение для зеркальных пузырьков, которое этот комментарий не слишком узок, чтобы его содержать :)
Тон Хоспел
Будет ли список не пустым?
миль
Кроме того, размер списка будет больше или равен 2? Я заметил, что некоторые ответы ниже не работают для списков длиной 1 или пустых списков.
миль

Ответы:

2

Желе , 25 байт

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

На основании моего ответа в J.

Попробуйте онлайн!

Проверьте количество сравнений.

объяснение

Вспомогательная ссылка изменяет список по индексу [i-1, i], сортируя его, что дает тот же результат, что и сравнение с сортировкой пузырьков.

ḣ©ṫ-Ṣ®ṖṖ¤;;ṫḊ¥  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 байт

Исправлена ​​ошибка и 1 байт сохранен благодаря @ 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")

Рекурсия может и не быть , безусловно, не лучший подход, но сейчас я придерживаюсь цикла.

Попробуйте это:

ETHproductions
источник
Мне удалось обработать вашу рекурсивную версию до 82 байтов 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).
Нил
@ Нил Вау, это впечатляет! Вы можете опубликовать это как свой собственный, если хотите.
ETHproductions
@Neil Вы можете сделать свою рекурсивную версию также в 80, просто удалите последнюю,0
Джонатан Аллан
Попробуйте 1/bвместо того, b+.5чтобы проверитьundefined
edc65
Хорошо, мое предложение для 1 / b остается в
силе
7

Haskell, 83 82 81 байт

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

Пример использования: [5,1,4,2,8] ! 5-> [1,4,2,5,8].

В функции % yотслеживает элементы, посещенные до сих пор во время текущего прохода, xкоторые еще предстоит изучить. aи bследующие два, то есть кандидаты на обмен. Если мы достигаем конца списка, мы начнем с самого начала: y%x = []%(y++x). Все шаги хранятся в списке, где основная функция выбирает nэлемент th.

Изменить: предыдущие версии не работали для списков из одного элемента, к счастью, новая версия еще короче.

Ними
источник
Можно ли проверить это онлайн? Я вообще ничего не знаю о Haskell, и получаю ошибки, когда пытаюсь вставить это прямо в онлайн-идею. Думаю, мне не хватает некоторых базовых вещей ...?
Стьюи Гриффин
Добавьте f=перед второй строкой ответ, затем добавьте третью строку в программу, содержащую main=print(f [5,1,4,2,8] 5). Это должно сделать его работоспособным.
Линн
@WeeingIfFirst: полная программа
Ними
4

Python 3, 77 74 байта

-3 байта благодаря @Maltysen (init jв объявлении)

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

Тестовые случаи в Ideone

Использует sortedкаждую операцию сравнения и обмена, но выполняет пузырьковую сортировку.

Устанавливает j=0(левый индекс), затем выполняет nсравнение и перестановку смежных элементов списка, сбрасывая jих, 0когда это окно выходит за пределы.

В этой точке j*=j<len(l)-1воля будет умножаться jна False(т.е. 0), тогда как каждый раз она будет умножаться jна True(то есть 1).

(Это все еще будет работать для пустого списка тоже.)

Джонатан Аллан
источник
1
Я думаю, что вы можете сэкономить, удалив плюс и установив j = 0 в параметрах лямбды по умолчанию
Maltysen
1
Кроме того, вам не нужно сбрасывать j, вы можете использовать%
Maltysen
@Maltysen на самом деле я не могу использовать арифметику по модулю и сохранять байты, поскольку нам нужно обработать список длиной 1, когда мы получим ошибку деления на ноль, добавив логику для обработки, которая подталкивает меня в байтах.
Джонатан Аллан
1
Работает нормально для всех тестовых случаев и немного короче, чем мой ответ MATLAB. +1 =) К сожалению, я не могу использовать ту же технику с evalMATLAB из-за встроенных заданий.
Стьюи Гриффин
1
Обновлен, чтобы включить новые тестовые случаи
Джонатан Аллан
3

PowerShell v2 +, 135 129 байт

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

Так. Много. Доллары.

( Сохраненный шесть байтов, понимая , что эта задача не включает в себя «бесплатно» оптимизации пропуска последнего элемента (ов) на каждом проходе , так что гарантировала отсортированный, и вместо этого проходит через полный проход каждый раз. Это переместил $a.countв forзациклите и исключите $zпеременную. )

Прямо пузырьковая сортировка, с одним изящным пятном, делая обмен за один шаг -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]

Логика выхода обрабатывается через if(!--$n){$a;exit}

Тестовые случаи

(Массив здесь показан как разделенный пробелами, потому что разделителем выходных полей по умолчанию для строкового массива является пробел. Стрификация происходит потому, что мы объединяем метки "$_ -> ".)

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
AdmBorkBork
источник
3

R 132 131 112 136 байт

Программа получает входные данные следующим образом: сначала Nсам вектор. Например, если вы хотите v = [5 1 4 2 8]и n = 1, вход, который входит в scanэто 1 5 1 4 2 8. Поэтому для того , чтобы запустить эту программу, вы запустить первую линию , кормить число один за другим в консоли , а затем запустить остальное (это РЕПЛ ответ).

Тогда следующий код делает свое дело:

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])

Тестовое задание:

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

Обновление: игра в гольф 1 байт благодаря Vlo .

Андрей Костырка
источник
2
По-видимому, это требует жесткого кодирования входных данных как переменных и неявного отображения выходных данных с помощью механизма REPL, что неприемлемо для нашего списка приемлемых методов ввода-вывода .
Мего
@Mego Хорошо, я исправил это. Пожалуйста, посмотрите, полностью ли он соответствует требованиям ...
Андрей Костырка,
Похоже, вы можете удалить первый s = T; и все еще иметь правильный вывод; это экономит 4 байта. РЕДАКТИРОВАТЬ: На самом деле, вы можете полностью удалить цикл while () и просто использовать цикл for (), заменив s = T на break, что также позволяет нам избавиться от некоторых фигурных скобок. Это приводит к: v = scan (); s = m = 0; для (i in 3: length (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] Всего 117 байт.
rturnbull
@rturnbull Ваша версия намного лучше! Слава тебе.
Андрей Костырка
@rturnbull Куда делись эти ранние комментарии? Ваше предложение поиграть в гольф на расстоянии 19 байтов ... оно просто удалило тот дополнительный цикл, который был необходим, потому что производительность сортировки пузырьков равна O (n²), тогда как без этого дополнительного цикла он становится (n-1) длинным. Я должен был проверить ... Теперь это исправлено и содержит объяснение, как кормить на входе! Это лучше чем раньше?
Андрей Костырка
2

JavaScript (ES6), 82 80 79 байт

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)

Основано на оригинальном ответе @ ETHproduction. Изменить: Сохранено 2 байта благодаря @JonathanAllan. Сохранено 1 байт благодаря @ edc65.

Нил
источник
2

J , 62 60 байт

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

Это глагол, который принимает два аргумента: количество сравнений в LHS и список целых чисел в RHS. Сначала он проверяет, больше ли длина списка, чем один. Если это не так, он возвращает список без изменений, в противном случае он работает с ним, выполняя указанное количество сравнений перед возвратом результата.

использование

В первом тестовом примере дополнительные команды используются для форматирования нескольких входов / выходов. Второй тестовый пример показан как один вход / выход.

   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

объяснение

Трудно написать краткий код на J, который использует изменчивость, поэтому вместо этого я преобразую проблему в сокращение списка на множестве признаков. Я думаю, что этот код грязный, поэтому я рассмотрю каждую фразу вместо каждого примитива. Первая часть захватывает длину списка и создает диапазон. Затем оперируйте каждым инфиксом размера 2, чтобы эмулировать один проход сравнений.

   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│
└─┴─┴─┴─┘

Это стартовые показатели каждого сравнения. Если выполняется 7 сравнений, измените их, чтобы получить желаемую сумму. 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│
└─┴─┴─┴─┴─┴─┴─┴─────────┘

В качестве альтернативы, диапазон [0, 7) может быть установлен, и каждое значение принимается по модулю длины списка минус 1, чтобы создать тот же диапазон.

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

Последняя часть - это глагол, который берет список в RHS и индекс в LHS, который отмечает начальный индекс сравнения. Выберите два элемента, начиная с этого индекса, отсортируйте их и вставьте обратно в список и верните его.

   > ({.,(2/:~@{.}.),]}.~2+[)&.>/ |. 5 1 4 2 8 ; 7 $ 2 <@{.\ i. # 5 1 4 2 8
1 2 4 5 8
миль
источник
Впечатляет, очень впечатляет +1.
Волшебная Урна Осьминога
1

Matlab, 93 91 байт

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

Сохраняет 11 байтов, опуская if l(i)>l(i+1);l(i:i+1)=l([i+1,i]), и вместо этого просто сортирует два элемента каждый раз. Работает для списков длины 1. Может сохранить один или два байта, используя m--оператор Octave , но это не так много.

Сохраняя еще два байта путем установки n=numel(l)-1;, потому что тогда я могу просто сделать while nвместо while n>1, а i=mod(i,n)+1вместо i=mod(i,n-1)+1.


Для справки, этот ответ был написан спустя много часов после создания проблемы.

Стьюи Гриффин
источник
1

Groovy (101 байт)

{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}

РЕДАКТИРОВАТЬ: Мне не нужно было писать свое собственное закрытие подкачки, в Groovy это было встроено.
Попробуйте это здесь: https://groovyconsole.appspot.com/script/5104724189642752

Пример выходной трассировки:

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]

Старая реализация (122 байта)

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}

Попробуйте это здесь: https://groovyconsole.appspot.com/script/6316871066320896

Урна волшебного осьминога
источник
Это ошибки для списков с менее чем двумя элементами
Джонатан Аллан
На моем мобильном ... добавив его> = 0 во второй оператор if, решит эту проблему.
Волшебная Урна Осьминога
Похоже, что это не подходит для списков с отрицательным вводом тоже. Например, второй контрольный пример.
Стьюи Гриффин
Работает сейчас, я был на мобильном вчера вечером, поэтому я не мог сделать необходимые изменения.
Волшебная урна осьминога
1

php, 148 145 байт

<?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);

Я не очень доволен структурой цикла, но мне нравится переключатель списка, и он работает, поэтому я все равно публикую его. php7.1 позволит мне сохранить как минимум 4 байта.

С более хорошим форматированием:

<?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);

Изменить: Йорг Хюльсерманн напомнил мне присоединиться, а не взорваться.
примечание: должен быть в файле с именем файла из одного символа.

user59178
источник
php.net/manual/de/function.join.php псевдоним имплода
Йорг Хюльсерманн
$ т = $ а [$ я]; $ а [$ я] = $ а [$ + 1]; $ а [$ + 1] = $ т; короче list ($ a [$ i], $ a [$ i + 1]) = [$ a [$ i + 1], $ a [$ i]]; и я не уверен, что вместо echo substr (implode ('', $ a), 5); этот $ a [1] = null; echo join ('', $ a); лучшая альтернатива.
Йорг Хюльсерманн
1
Хотя использование временной переменной на 2 байта короче, это также несколько операторов, поэтому вам нужно использовать эти 2 байта, чтобы заключить все это в фигурные скобки. Для $ a [1] = null вам на самом деле нужно сбросить ($ a [0], $ a [1]), чтобы избежать пробелов и имени файла в начале.
user59178 12.09.16
1

Рубин, 52 50 байт

Подожди ... нет Руби?

->l,n{n.times{|a|l[s=a%~-l.size,2]=l[s,2].sort};l}
гигабайт
источник