O algoritmo de classificação é assim:
Enquanto a lista não estiver classificada, encaixe metade de todos os itens (remova-os da lista). Continue até que a lista seja classificada ou apenas um item permaneça (que é classificado por padrão). Esse algoritmo de classificação pode fornecer resultados diferentes com base na implementação.
O procedimento de remoção do item depende da implementação, mas a lista deve ter a metade do tempo anterior a uma passagem do procedimento de remoção do item. Seu algoritmo pode decidir remover a primeira metade ou a lista, a última metade da lista, todos os itens ímpares, todos os itens pares, um de cada vez até que a lista tenha a metade do comprimento ou qualquer outro não mencionado.
A lista de entrada pode conter uma quantidade arbitrária de itens (dentro da razão, digamos, até 1000 itens), não apenas listas perfeitamente divisíveis de 2 ^ n itens. Você precisará remover (n + 1) / 2 ou (n-1) / 2 itens se a lista for ímpar, codificada permanentemente ou decidida aleatoriamente durante o tempo de execução. Decida por si mesmo: o que Thanos faria se o universo contivesse uma quantidade ímpar de seres vivos?
A lista é classificada se nenhum item for menor que qualquer item anterior. Podem ocorrer duplicatas na entrada e na saída.
Seu programa deve receber uma matriz de números inteiros (via stdin ou como parâmetros, itens individuais ou um parâmetro de matriz) e retornar a matriz classificada (ou imprimi-la em stdout).
Exemplos:
// A sorted list remains sorted
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
// A list with duplicates may keep duplicates in the result
[1, 2, 3, 4, 3] -> [1, 3, 3] // Removing every second item
[1, 2, 3, 4, 3] -> [3, 4, 3] -> [4, 3] -> [3] // Removing the first half
[1, 2, 3, 4, 3] -> [1, 2] // Removing the last half
[1, 2, 4, 3, 5]
poderia dar resultados diferentes:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
ou:
// Removing the first half of the list
[1, 2, 4, 3, 5] -> [3, 5] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [4, 3, 5] -> [3, 5] // With (n-1)/2 items removed
ou:
// Removing the last half of the list
[1, 2, 4, 3, 5] -> [1, 2] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [1, 2, 4] // With (n-1)/2 items removed
ou:
// Taking random items away until half (in this case (n-1)/2) of the items remain
[1, 2, 4, 3, 5] -> [1, 4, 3] -> [4, 3] -> [4]
[9, 1, 1, 1, 1]
. Meu próprio algoritmo falhou nesta entradaRespostas:
R , 41 bytes
Experimente online!
fonte
is.unsorted
em vez deany(...)
41 bytes.Python 3 ,
384239 bytesExperimente online!
-3 bytes
graças a @JoKing e @Quuxplusonefonte
!= sorted(t)
deve ser> sorted(t)
.Python 2 , 39 bytes
Experimente online!
fonte
Braquilog (v2), 6 bytes
Experimente online!
Este é um envio de função. Entrada da esquerda, saída para a direita, como de costume. (O link TIO usa um argumento de linha de comando que agrupa automaticamente a função em um programa completo, para que você possa vê-la em ação.)
Explicação
Rodada de bônus
Experimente online!
O snap foi feito para ser aleatório, não é? Aqui está uma versão do programa que escolhe os elementos sobreviventes aleatoriamente (enquanto garante que metade sobreviva a cada rodada).
Isso seria mais curto se pudéssemos reordenar os elementos, mas por que um algoritmo de classificação desejaria fazer isso ?
fonte
Perl 6 , 30 bytes
Experimente online!
Função recursiva que remove a segunda metade da lista até que a lista seja classificada.
Explicação:
fonte
C # (compilador interativo do Visual C #) , 76 bytes
Experimente online!
fonte
Java 10,
10697 bytes-9 bytes graças a @ OlivierGrégoire .
Experimente online.
Deixe apenas a primeira metade da lista a cada iteração e removen + 12 itens se o tamanho da lista for ímpar.
Explicação:
fonte
n->{for(;n.reduce((1<<31)+0d,(a,b)->a==.5|b<a?.5:b)==.5;n=n.skip(n.count()/2));return n;}
é mais curto usando fluxos, mas não consegui descobrir como evitar ojava.lang.IllegalStateException: stream has already been operated upon or closed
erro depois de retornar o fluxoreduce
é uma operação de terminal que fecha o fluxo. Você nunca poderá ligarreduce
duas vezes no mesmo fluxo. Você pode criar um novo fluxo, no entanto.Wolfram Language (Mathematica) , 30 bytes
Experimente online!
@Doorknob salvou 12 bytes
fonte
x[[;;;;2]]
).OrderedQ
, mas não poderia fazê-lo funcionarOrderedQ
na minha primeira abordagem (ver edições)JavaScript (ES6),
4948 bytesGuardado 1 byte graças a @tsh
Remove todo segundo elemento.
Experimente online!
fonte
p++&1
->a^=1
Ruby , 37 bytes
Experimente online!
fonte
05AB1E ,
87 bytes-1 byte graças a @Emigna .
Experimente online ou verifique mais alguns casos de teste (ou verifique esses casos de teste passo a passo para cada iteração ).
Alternativa de 7 bytes por @Grimy :
Experimente online ou verifique mais alguns casos de teste (ou verifique esses casos de teste passo a passo para cada iteração ).
Explicação:
fonte
ι
vez de2ä
mudar para manter uma estratégia de todos os outros elementos .ΔÐ{Ê>äн
TI-BASIC (TI-84),
47424544 bytes-1 byte graças a @SolomonUcko!
Lista de entrada está em
Ans
.A saída está
Ans
impressa e implicitamente impressa.Explicação:
Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.
fonte
not(min(L1=Ans
pormax(L1≠Ans
para salvar um byte.Geléia , 7 bytes
Experimente online!
fonte
Haskell ,
5755 bytes (graças apenas ao ASCII)Experimente online!
Código original:
Experimente online!
Ungolfed:
fonte
Oitava , 49 bytes
Experimente online!Esta foi uma jornada em que mais chato é melhor. Observe as duas entradas muito mais interessantes abaixo:
50 bytes
Experimente online!Em vez da solução imperativa desinteressante, podemos fazer uma solução recursiva, por apenas um byte adicional.
53 bytes
Experimente online! Sim. Uma função anônima recursiva, graças à brilhante resposta de @ ceilingcat na minha pergunta de dicas . Uma função anônima que retorna uma função anônima recursiva, definindo-se em sua lista de argumentos. Eu gosto de funções anônimas. Mmmmm.
fonte
MATL , 11 bytes
Experimente online!
Isso funciona removendo cada segundo item.
Explicação
fonte
Japonês , 10 bytes
Tente
fonte
Java (JDK) , 102 bytes
Já existe uma resposta em C #, então decidi tentar minha resposta em Java.
Experimente online!
fonte
Cristal , 58 bytes
Com
Array#sort
( 58 bytes ):Experimente online!
Sem
Array#sort
( 101 bytes ):Experimente online!
fonte
Casca ,
65 bytes1 byte economizado graças ao Zgarb
Experimente online!
Explicação
fonte
Ċ2
vez de(←½
para salvar um byte.Gaia ,
98 bytesExperimente online!
Explicação:
fonte
Julia 1.0 , 30 bytes
Experimente online!
Leva cada segundo elemento da matriz se não for classificado.
fonte
-
por 20 bytes. também quase sempre não contamos caracteres: | seria bom se isso fosse removido do cabeçalhoC ++ (gcc) , 103 bytes
Não posso comentar, mas aprimorei a versão do movatica reduzindo as inclusões e usando o auto.
-2 bytes: tetocat
-2 bytes: somente ASCII
Experimente online!
fonte
l.size()/2
?(n+1)/2
ou(n-1)/2
ambos são válidos. hmm ....VDM-SL , 99 bytes
Nunca foi enviado no vdm antes, portanto, não há regras específicas sobre o idioma. Então, enviei como uma definição de função que recebe
seq of int
e retorna umseq of int
Um programa completo para executar pode ser assim:
fonte
Pitão, 10 bytes
Experimente online aqui . Isso remove a segunda metade de cada iteração, arredondando para baixo. Para alterá-lo para remover a primeira metade, arredondando para cima, altere
h
parae
.fonte
hc
por%
. Isso também permite excluir a variável lambda à direitaZ
e permitir que Pyth a preencha implicitamente, para um total de 2 bytes salvos.C ++ (GCC) ,
139137116 bytes-2 bytes thanx para tetocat, -21 bytes thanx para PeterZuger
Redimensione o vetor para a primeira metade até que seja classificado.
Experimente online!
fonte
include
sK (oK) ,
2220 bytesSolução:
Experimente online!
Itere a entrada até que seja classificada ... se não for classificada, pegue os primeiros n / 2 itens.
Editar% s:
fonte
(.5*#x)#x
->*2 0N#x
2 0N
mas presumi que seria mais longo (sem teste), obrigado!Julia 1.0 , 33 bytes
Experimente online!
fonte
Retina , 38 bytes
Experimente online! Toma números separados por vírgula. Explicação:
Converta para unário.
Repita enquanto a lista não está classificada ...
... exclua todos os elementos pares.
Converta para decimal.
fonte
C (gcc) , 66 bytes
Retira a segunda metade da lista de cada iteração (
n/2+1
elementos se o comprimento for ímpar).Experimente online!
Leva a entrada como um ponteiro para o início de uma matriz
int
seguida por seu comprimento. Saídas retornando o novo comprimento da matriz (classifica no local).Versão não destruída:
fonte
~i+n
vez dei<n-1