Classificação de bolhas em andamento

19

Crie uma função ou programa que aceite duas entradas:

  • Uma lista de números inteiros que devem ser classificados (menos de 20 elementos)
  • Um número inteiro positivo N, dizendo quantas comparações você deve fazer

A função deve parar e gerar a lista resultante de números inteiros após Ncomparações. Se a lista estiver totalmente classificada antes das Ncomparações serem feitas, a lista classificada deverá ser gerada.


O algoritmo de classificação de bolhas é bem conhecido, e acho que a maioria das pessoas sabe disso. O seguinte pseudo-código e animação (ambos do artigo vinculado da Wikipedia) devem fornecer os detalhes necessários:

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

A animação abaixo mostra o progresso:

insira a descrição da imagem aqui

Um exemplo (extraído diretamente do artigo vinculado da Wikipedia) mostra as etapas ao classificar a lista ( 5 1 4 2 8 ):

Primeira passagem

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.

Segunda passagem

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 )

Agora, a matriz já está classificada, mas o algoritmo não sabe se foi concluído. O algoritmo precisa de uma passagem inteira sem qualquer troca para saber que está classificado.

Terceiro Passe

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 )

Casos de teste:

Formato: 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

  • Sim, são permitidos algoritmos de classificação de bolha incorporados.
  • Não, você não pode assumir apenas números inteiros positivos ou números únicos.
  • A classificação deve estar na ordem descrita acima. Você não pode começar no final da lista
Stewie Griffin
fonte
2
Claro e perfeitamente razoável. Apenas uma pena desde que eu descobri uma solução verdadeiramente maravilhosa para o bubble sort espelhado que este comentário não é demasiado estreito para conter :)
Ton Hospel
A lista não ficará vazia?
miles
Além disso, a lista terá tamanho maior ou igual a 2? Notei que algumas respostas abaixo não funcionam para listas de tamanho 1 ou listas vazias.
milhas

Respostas:

2

Gelatina , 25 bytes

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

Com base na minha resposta em J.

Experimente online!

Verifique o número de comparações.

Explicação

O link auxiliar modifica a lista no índice [i-1, i], classificando-o que produz o mesmo resultado que a comparação de classificação de bolhas.

ḣ©ṫ-Ṣ®ṖṖ¤;;ṫḊ¥  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
milhas
fonte
9

JavaScript (ES6), 102 82 80 86 80 bytes

Correção de bugs e 1 byte salvo graças a @ 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")

A recursão pode não ser, definitivamente não é, provavelmente é a melhor abordagem, mas estou usando um loop por enquanto.

Experimente:

ETHproductions
fonte
Eu consegui golf sua versão recursiva até 82 bytes também: 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, isso é impressionante! Você pode publicar isso como quiser, se quiser.
ETHproductions
@Neil Você pode fazer a sua versão recursiva em 80 também, apenas remover a última,0
Jonathan Allan
Tente em 1/bvez de b+.5procurar porundefined
edc65 9/09/16
Tudo bem, a minha sugestão para 1 / b ainda detém
edc65
7

Haskell, 83 82 81 bytes

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

Exemplo de uso: [5,1,4,2,8] ! 5-> [1,4,2,5,8].

Em função, % ymantém o controle dos elementos visitados até o momento durante o passe atual, xainda não foram examinados. ae bsão os próximos dois, ou seja, os candidatos a trocar. Se chegarmos ao fim da lista, vamos começar desde o início: y%x = []%(y++x). Todas as etapas são armazenadas em uma lista onde a função principal seleciona o nelemento th.

Editar: as versões anteriores não funcionavam para listas de elemento único, felizmente a nova versão é ainda mais curta.

nimi
fonte
É possível testar isso online? Não sei nada sobre Haskell e recebo erros ao tentar colar isso diretamente em uma ide online. Acho que estou perdendo algumas coisas básicas ...?
Stewie Griffin
Adicione f=antes da segunda linha da resposta e anexe uma terceira linha ao programa que contém main=print(f [5,1,4,2,8] 5). Isso deve torná-lo executável.
Lynn
@WeeingIfFirst: programa completo
nimi
4

Python 3, 77 74 bytes

-3 bytes graças a @Maltysen (init jna declaração)

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

Casos de teste em ideone

Usa sortedpara fazer cada operação de comparação e troca, mas está executando uma classificação de bolha.

Define j=0(o índice esquerdo) e executa ncomparações e trocas de itens de lista adjacentes, redefinindo jpara 0sempre que essa janela sair dos limites.

O j*=j<len(l)-1multiplicará jpor False(ie 0) nesse ponto, enquanto que em todas as outras vezes multiplicará jpor True(ie 1).

(Ele também funcionará para uma lista vazia também.)

Jonathan Allan
fonte
11
Eu acho que você pode salvar, removendo o sinal de mais e definindo j = 0 nos parâmetros lambda padrão
Maltysen
11
Além disso, você não precisa redefinir j, você pode usar%
Maltysen
@ Maltysen, na verdade, não posso usar o módulo aritmético e salvar bytes, pois precisamos lidar com uma lista de comprimento 1, quando receberíamos um erro de divisão por zero, adicionando a lógica para lidar com isso que me empurra em bytes.
Jonathan Allan
11
Funciona bem para todos os casos de teste e é um pouco mais curto que minha resposta do MATLAB. +1 =) Infelizmente, não posso usar a mesma técnica evalno MATLAB devido às atribuições inline.
Stewie Griffin
11
Atualizado para incluir novos casos de teste
Jonathan Allan
3

PowerShell v2 +, 135 129 bytes

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

Então. Muitos. Dólares.

( Salvo seis bytes por perceber que este desafio não inclui o "de graça" otimização de pular o último elemento (s) em cada passagem, uma vez que está garantido classificadas e, em vez atravessa uma passagem completa de cada vez. Isso mudou a $a.countna forloop e eliminou a $zvariável. )

Tipo de bolha reta, com um ponto bacana, fazendo a troca em uma única etapa -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]

A lógica de saída é tratada através de if(!--$n){$a;exit}

Casos de teste

(A matriz é mostrada como separada por espaço aqui, porque o separador de campo de saída padrão para stringing de uma matriz é um espaço. A stringification ocorre porque estamos concatenando com os rótulos "$_ -> ".)

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
fonte
3

R, 132 131 112 136 bytes

O programa recebe a entrada da seguinte maneira: primeiro N, depois o próprio vetor. Por exemplo, se você quiser v = [5 1 4 2 8]e n = 1, a entrada que entra no arquivo scané 1 5 1 4 2 8. Portanto, para executar este programa, você executa a primeira linha , alimenta os números um a um no console e, em seguida, executa o restante (esta é uma resposta REPL).

Em seguida, o código a seguir faz o truque:

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

Teste:

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

Atualização: 1 byte de golfe devido a Vlo .

Andreï Kostyrka
fonte
2
Isso parece exigir a codificação das entradas como variáveis ​​e a exibição implícita da saída por meio de um mecanismo REPL, que não é aceitável pela nossa lista de métodos de E / S aceitáveis .
Mego
@ Megego Ok, eu consertei isso. Por favor, ver se agora é totalmente compatível ...
Andreï Kostyrka
Parece que você pode remover o primeiro s = T; e ainda tem saída correta; isso economiza 4 bytes. EDIT: Na verdade, você pode remover completamente o loop while () e apenas usar o loop for (), substituindo seu s = T por break, o que também nos permite livrar-nos de algumas chaves. Isso gera: v = scan (); s = m = 0; para (i em 3: comprimento (v)) {m = m + 1; if (m> v [1]) quebra; if (v [i- 1]> v [i]); v [c (i-1, i)] = v [c (i, i-1)]; break}}; v [-1] Para um total de 117 bytes.
precisa saber é o seguinte
@rturnbull Sua versão é muito melhor! Parabéns a você.
Andreï Kostyrka 9/09/16
@rturnbull Para onde foram esses comentários iniciais? Sua sugestão de jogar golfe a 19 bytes de distância ... acabou de remover esse loop extra que era essencial porque o desempenho do tipo de bolha é O (n²), enquanto que sem esse loop extra, ele se torna (n-1) longo. Eu deveria ter verificado ... Agora está corrigido e contém uma explicação de como alimentar a entrada! Está melhor do que antes?
Andreï Kostyrka 10/09/16
2

Pyth, 34 32 Bytes

AQVH=*<ZtlGZ=GsXJcG,Zh=hZ1ShtJ;G

Uma tradução da resposta Python de Jonathan Allan.

Experimente aqui!

Steven H.
fonte
2

JavaScript (ES6), 82 80 79 bytes

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)

Com base na resposta original da @ ETHproduction. Editar: salvou 2 bytes graças a @JonathanAllan. Guardou 1 byte graças a @ edc65.

Neil
fonte
2

J , 62 60 bytes

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

Este é um verbo que recebe dois argumentos: o número de comparações no LHS e a lista de números inteiros no RHS. Primeiro, ele verifica se o comprimento da lista é maior que um. Caso contrário, ele retorna a lista sem modificação, caso contrário, opera com ela executando o número especificado de comparações antes de retornar o resultado.

Uso

Para o primeiro caso de teste, comandos extras são usados ​​para formatar várias entradas / saídas. O segundo caso de teste é mostrado como entrada / saída única.

   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

Explicação

É difícil escrever código conciso em J que usa mutabilidade, então, em vez disso, converto o problema em reduzir uma lista em um conjunto de indicações. Eu acho que esse código é confuso, então eu passo a passo o trabalho de cada frase em vez de cada primitivo. A primeira parte pega o comprimento da lista e produz um intervalo. Em seguida, opere em cada infixo do tamanho 2 para emular uma passagem de comparações.

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

Estas são as indicações iniciais de cada comparação. Se 7 comparações estiverem sendo realizadas, reformule-a para obter a quantidade desejada. J analisa da direita para a esquerda, diminuindo da direita para a esquerda, como dobra-direita. Anexe a lista inicial e inverta-a.

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

Como alternativa, o intervalo [0, 7) pode ser definido e cada valor obtido modula o comprimento da lista menos 1 para criar o mesmo intervalo.

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

A última parte é um verbo que leva uma lista no RHS e um índice no LHS que marca o índice inicial da comparação. Selecione os dois elementos começando nesse índice, classifique-os e conecte-os novamente à lista e retorne-o.

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

Matlab, 93 91 bytes

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

Salva 11 bytes ao omitir if l(i)>l(i+1);l(i:i+1)=l([i+1,i])e, em vez disso, basta classificar os dois elementos todas as vezes. Funciona para listas de tamanho 1. Pode salvar um ou dois bytes usando o m--operador Octave , mas isso não é muito.

Salva mais dois bytes, definindo n=numel(l)-1;, porque então eu posso fazer em while nvez de while n>1e em i=mod(i,n)+1vez de i=mod(i,n-1)+1.


Para constar, essa resposta foi escrita muitas horas após o desafio ter sido criado.

Stewie Griffin
fonte
1

Groovy (101 bytes)

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

EDIT: Eu não precisava escrever meu próprio fechamento de swap, o groovy tinha isso incorporado.
Experimente aqui: https://groovyconsole.appspot.com/script/5104724189642752

Exemplo de Rastreio de Saída:

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]

Implementação antiga (122 bytes)

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}

Experimente aqui: https://groovyconsole.appspot.com/script/6316871066320896

Urna de polvo mágico
fonte
Este erros para listas com menos de dois itens
Jonathan Allan
No meu celular ... adicionando> = 0 na segunda instrução if corrige esse problema.
Magic Octopus Urn
Parece falhar também nas listas com entrada negativa. Por exemplo, o segundo caso de teste.
Stewie Griffin
Funciona agora, eu estava no celular ontem à noite, então não pude fazer as edições necessárias.
Magic Octopus Urn
1

php, 148 145 bytes

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

Não estou muito feliz com a estrutura do loop, mas gosto da opção de lista e funciona, por isso estou postando de qualquer maneira. O php7.1 me permitiria salvar pelo menos 4 bytes.

Com uma formatação melhor:

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

Edit: Jörg Hülsermann me lembrou da junção, em vez de implodir.
nota: precisa estar em um arquivo com um único nome de arquivo.

user59178
fonte
php.net/manual/de/function.join.php alias de implode
Jörg Hülsermann 9/16
$ t = $ a [$ i]; $ a [$ i] = $ a [$ i + 1]; $ a [$ i + 1] = $ t; é menor que a lista ($ a [$ i], $ a [$ i + 1]) = [$ a [$ i + 1], $ a [$ i]]; e não tenho certeza se, em vez de echo substr (implode ('', $ a), 5); este $ a [1] = null; echo join ('', $ a); a melhor alternativa é.
Jörg Hülsermann 9/09/16
11
Enquanto o uso da variável temporária é 2 bytes mais curto, também são múltiplas instruções, portanto você precisa usar esses 2 bytes para incluir tudo entre chaves. Para $ a [1] = null, você realmente precisa desarmar ($ a [0], $ a [1]) para evitar espaços em branco e o nome do arquivo no início.
user59178
1

Ruby, 52 50 bytes

Espere ... não, Ruby?

->l,n{n.times{|a|l[s=a%~-l.size,2]=l[s,2].sort};l}
GB
fonte