Conforme descrito nesta pergunta :
O Dropsort, projetado por David Morgan-Mar, é um exemplo de um "algoritmo de classificação" de tempo linear que produz uma lista que é, de fato, classificada, mas contém apenas alguns dos elementos originais. Qualquer elemento que não seja pelo menos tão grande quanto o máximo dos elementos anteriores é simplesmente removido da lista e descartado.
Para usar um de seus casos de teste, uma entrada de {1, 2, 5, 4, 3, 7}
rendimentos {1, 2, 5, 7}
, como 4
e 3
são eliminados por serem menores que o valor "classificado" anteriormente 5
,.
Não queremos algoritmos de "classificação", queremos que eles sejam o negócio real. Portanto, quero que você escreva um programa que, dada uma lista de números, produza uma lista de listas DropSorted (para ser um algoritmo de classificação completo, precisaríamos mesclar essas listas, mas a fusão de duas listas classificadas já foi feita antes, e pedir para você fazer de novo é quase duas perguntas; portanto, essa pergunta é especificamente a etapa "dividida" de nosso DropSort completo).
A organização e o conteúdo de nossas listas são cruciais, no entanto. A saída do seu programa deve ser equivalente à saída de um DropSort, seguida por um DropSort dos valores descartados e assim por diante, até que você tenha apenas uma lista de cadeias classificadas. Novamente, emprestando o conjunto de testes existente (e adicionando mais dois):
Input -> Output
{1, 2, 5, 4, 3, 7} -> {{1, 2, 5, 7}, {4}, {3}}
{10, -1, 12} -> {{10, 12}, {-1}}
{-7, -8, -5, 0, -1, 1} -> {{-7, -5, 0, 1}, {-8, -1}}
{9, 8, 7, 6, 5} -> {{9}, {8}, {7}, {6}, {5}}
{10, 13, 17, 21} -> {{10, 13, 17, 21}}
{10, 10, 10, 9, 10} -> {{10, 10, 10, 10}, {9}} //Note equivalent values aren't dropped
{5, 4, 3, 8, 7, 6} -> {{5, 8}, {4, 7}, {3, 6}}
{0, 2, 5, 4, 0, 7} -> {{0, 2, 5, 7}, {4}, {0}}
Você pode assumir que a entrada não está vazia.
Isso é código-golfe , então as regras padrão se aplicam!
[5, 4, 3, 8, 7, 6] -> [5, 8], [4,3,7,6]
?{3,4,5,3,4,5,3,4,5}
resultar em{{3,4,5,5,5},{3,4,4},{3}}
?Respostas:
MATL ,
15109 bytes5 bytes de desconto usando a idéia de @ máximo cumulativo de @beaker
A entrada é um vetor de linha numérica, no formato
[1, 2, 5, 4, 3, 7]
(vírgulas são opcionais). A saída contém listas separadas por novas linhas, com os números em cada lista separados por espaços.Experimente online! Ou verifique todos os casos de teste .
Explicação
Dada uma matriz, o código seleciona todas as entradas iguais ao máximo acumulado até essa entrada.
Por exemplo, dado
o código seleciona as primeira, segunda, terceira e sexta entradas:
Em seguida, o processo é repetido na sub-matriz formada pelas entradas restantes (na ordem original):
Isso precisa ser feito até que a sub-matriz das entradas restantes esteja vazia. Um limite superior no número necessário de iterações é o tamanho da entrada. As últimas iterações podem não ser necessárias. Nesse caso, eles operam em uma matriz vazia, produzindo matrizes vazias adicionais.
No final, a pilha contém as matrizes necessárias e possivelmente várias matrizes vazias, que não são exibidas.
fonte
Haskell,
67 5958 bytesExplicação: Dada uma lista de listas (que já estão classificadas) e um valor
x
, o!
operador colocaráx
no final da primeira lista cujo último elemento seja menor ou igual ax
. Se essa lista não existir, a lista[x]
será colocada no final.Experimente online.
fonte
Casca , 10 bytes
Experimente online!
Esta é uma combinação da minha outra resposta Husk e a resposta Haskell de xnor . A cópia
ü<
parece desajeitada, mas não sei como me livrar dela ...Explicação
A função é
ü<
traduzidanubBy(>)
em Haskell. Ele percorre uma lista da esquerda para a direita, mantendo os elementos para os quais nenhum elemento mantido anteriormente é estritamente maior. Em outras palavras, ele executa dropsort. Os elementos restantes são obtidos considerando a diferença de lista da lista original e o resultado deü<
.fonte
Haskell , 50 bytes
Experimente online!
fonte
\\
função: (Casca , 16 bytes
Experimente online!
Explicação
Essa primeira linha é a função principal e a segunda é uma função auxiliar de ordem superior (assume uma função como argumento e retorna uma nova função). É acessado pelo subscrito
₁
. A idéia é que₁≤
executa dropsort e₁>
fornece os elementos restantes.Na função principal,
₁>
iteramos a função restante e aplicamos a função dropsort₁≤
aos resultados.fonte
Python 3 ,
131 112 10395 bytesMuito obrigado @Mr. Xcoder para esmagar 19 bytes !!
Muito obrigado @ovs por 17 bytes incríveis!
Experimente online!
Explicação:
fonte
if-else
pode ser recolhido[m,d][i<m[-1]]+=[i]
.[m,d]
coisa, mas ele não estava funcionando de alguma forma ....(len(d)>0)
ébool(d)
porque listas vazias são falsas no Python. +1, solução agradável!i,
é apenas uma abreviação de(i,)
, que é uma tupla que contéma
.a,*x = x or [0]
é a descompactação estendida do python3 . Aqui está uma publicação útil do SO sobre este tópico, com alguns exemplos.Haskell ,
11310710292 bytesExperimente online!
Isso parece muito longo.
Explicação
!
executa a classificação de queda em uma lista, enquanto#
coleta os aparamentos.g
aplica-se repetidamente#
até que a lista esteja vazia registrando os resultados em uma lista.fonte
head a
pora!!0
salva um byte.APL, 27 bytes
Explicação:
⍵≡⍬:⍬
: se a entrada estiver vazia, retorne a lista vaziaX←⍵≥⌈\⍵
: todos os números maiores ou iguais ao máximo em execução(⊂X/⍵)
: a lista desses números,∇⍵/⍨~X
: seguido pelo resultado da execução dessa função nos números restantesfonte
{⍵≡⍬:⍬⋄(⊂⍵~r),∇r←⍵/⍨⍵<⌈\⍵}
. Morten está ficando preocupado com a falta de resposta aos seus e-mails. Está tudo bem?JavaScript (ES6), 64 bytes
Ungolfed:
Mostrar snippet de código
fonte
?!
era algum novo operador fantasia ...?!
(i,n,o=[])=>[i.filter(a=>(n||a)<=a?(n=a,1):!o.push([a])),...o]
Aparentemente, grandes mentes pensam da mesma forma. Infelizmente, parece que não consigo extrair mais bytes ... Apenas observe que você pode removerf=
seu código e talvez meu código possa lhe dar algumas idéias sobre como jogar o seu ainda mais.f=
do meu código, porque é recursivo. A sua abordagem é interessante, mas parece não funcionar em alguns casos de teste. Por exemplo, ele retorna[[5,8],[4],[3],[7],[6]]
para o penúltimo caso.R , 61 bytes
Experimente online!
Função recursiva.
sum(x|1)
é uma abreviação delength(x)
, portanto, essa recursão será executada até quex
esteja vazia.cummax
leva o máximo cumulativo dex
, que é comparado comx
novamente. Isso produz um vetor booleano de comprimentox
, onde todas as TRUEs correspondem a valores classificados. Nós usamos isso para tomar um subconjunto dex
eprint
-lo. A função é chamada novamente no restante dex
.fonte
Java 8,
182179177 bytes-3 bytes graças a @Nevay .
-2 bytes usando em
Stack
vez deVector
.Explicação:
Experimente aqui.
fonte
try{}catch{}
vez de verificarl.size()
para salvar alguns?0
e remover os colchetes do loop for externol->{List r=new Vector(),t;for(int p,i,x;l.size()>0;)for(p=l.get(0),r.add(t=new Vector()),i=0;i<l.size();p=x)if((x=l.get(i++))>=p)t.add(l.remove(--i));return r;}
(-3 bytes).C #,
188203 bytesA contagem de bytes inclui +18 para:
Experimente online!
fonte
C ++ 14,
118108 bytesUsando o algoritmo da resposta Haskell de w0lf .
Como lambda genérico sem nome. O primeiro parâmetro é um contêiner dos valores para dropsort (like
vector<int>
) e o segundo parâmetro requer um contêiner vazio compatível de contêineres (likevector<vector<int>>
) para o valor de retorno por referência.Na primeira versão do programa, havia
R.clear;()
como primeira instrução, de modo que o contêiner de contêineres não precisava estar vazio. Peter Cordes achou que isso poderia acontecer na especificação, deixando cair 10 bytes para isso.Experimente online!
Ungolfed:
fonte
R.clear()
e exigir que o chamador comece com um contêiner vazio.Python 2 , 88 bytes
-4 bytes graças a Arnold Palmer
Experimente online!
Solução semelhante ao haskell de @ w0lf [resposta] [1]
Caso de uso raro para
for-else
construçãoRepita as listas ordenadas
for l in r
(vazias no início).Se o elemento (da entrada)
i
for maior que o último elemento da listal[-1]
, inclua o elemento na listal+=[i]
, quebre.Se nenhuma lista foi aceita, adicione uma nova lista com esses elemens
r+=[[i]]
fonte
R, Trabalho em andamento (89, mas com falha)
Segurando um pouco de trabalho aqui, porque eu me apoiei em um canto usando
%in%
(ele falha em entradas duplicadas, em particular no último caso de teste), e eu preciso fazer outras coisas agora, mas isso está aqui se alguém quiser criar:Ungolfed:
fonte
z=function(x)"if"(sum(x|1),{a=x[(i=x>=cummax(x))] c(list(a),z(x[!i]))},NULL)
funciona]
ec
é uma nova linha (ou ponto e vírgula)"if"
antes, mas sou muito novo no golfe R. Você deve postar como sua própria resposta, e eu posso derrubar a minha. Gosto do que você fez com oi
índice, para contornar o%in%
problema.cummax
!JavaScript (ES6),
717068 bytesMuito simples, apenas itera a matriz, procura a primeira matriz interna cujo último valor é
<=
o próximo valor a ser descartado, se não existir, anexa uma nova matriz interna com o próximo valor à saída, caso contrário, anexa o próximo valor à primeira encontrado matriz interna que corresponde à condição.Atualizações
Graças a Neil, salvou três bytes converter
(...,o)
para...&&o
e re-organizar o retorno de chamada paramap()
ser mais compacto.fonte
&&o
é um byte menor que(,o)
.[...b].pop()
, mas acho que(o.find(b=>[...b].pop()<=n)||(n=[n],o)).push(n)
economiza um byte ou dois.Japonês , 29 bytes
Teste online!
fonte
C (gcc) ,
176175173 bytesExperimente online!
Versão um pouco legível:
fonte
PHP,
911039685 bytes(Editado para adicionar 12 caracteres
print_r($r);
para atender aos requisitos de saída)(Editado para remover 7 bytes ao permitir erros de PHP)
(Editado para remover 11 bytes ao continuar a tarefa)
Dada a entrada
$a
, produz resultado$r
Bonita:
O loop externo pseudo-recursivo inicializa as matrizes keep
$b
e descarta$d
para esvaziar, em seguida, executa um loop básico de classificação da gota, definindo finalmente as devoluções como a nova entrada e adicionando as Keep ao resultado$r
fonte
PHP ,
102 bytes, 98 bytesExperimente online!
-4 bytes, graças a @Umbrella
Explicação
A função assume a lista de entrada como uma matriz.
$s
, que se tornará a lista de listas finalmente retornada, é declarada estática. Isso estende seu escopo a todas as chamadas dessa função, permitindo que a função seja chamada recursivamente sem precisar passar essa lista de resultados como argumento ou retorná-la.Repita cada valor da lista.
É menor que o maior membro da lista atual?
Sim, coloque-o na lista
$f
para posterior classificação.Não, coloque-o na lista
$l
.Empurre a lista
$l
para a lista de listas.Se houver algo na lista
$f
, envie-o novamente para outra classificação.Retorne a lista de listas.
fonte
<?php function d($a){return$r;}
, você me esmagou de coração. Além disso, acabei de perceber que nós dois esquecemos de produzir.$v<max($l)?$f[]=$v:$l[]=$v;
por${$v<max($l)?f:l}[]=$v;
- pelo menos, funciona nos meus testes.Sábio, 102 bytes
Muito semelhante à resposta de @Dead Possum .
Anexa cada membro
x
daw
à primeira lista ema
{list of lists} comx
maior que o último elemento.se nenhum, anexa
[x]
aa
.Eu realmente gostaria que fosse
exists
devolvidoa
se nada fosse encontrado! Também tentando aplicar a ideia de uma linha de @ officialaimm ...Pergunta: Se eu removesse meu código da função, teria que atribuir
w
a entrada, certo? Então, ele salvaria bytes?fonte
Ocaml ,
6962 bytesExplicação:
fonte
APL,
1008883797857567776 bytes-0 bytes graças a Kritixi Lithos ...
Experimente online!
Tem que haver uma maneira melhor de fazer isso ( existe ). Todas as dicas são muito apreciadas e bem-vindas.
Quão?
(Observe que algumas dessas explicações podem estar erradas, pois eu esqueci como isso funcionava)
fonte
{⍬≢⍴⍵}
pode se tornar(⍬≢⍴)
{(⍵/⍨~E),⊂⍵/⍨E←(⍬≡⍴)¨⍵}
? Parece ser separado de tudo o mais[[1,2,5,7],[4],3]
, em vez do necessário[[1,2,5,7],[4],[3]]
.(,¨)
Geléia, 26 bytes
Esse é o mesmo método da resposta do APL do marinus.
Experimente online! .
fonte
JavaScript (Node.js) ,
125109106 bytes-
1618 bytes de Zacharý-1 removendo
{
e}
alterando o incrementador para incluir o "definir último para o atual"Basicamente, pede é o item atual maior que o último item, adicione à primeira lista. Caso contrário, adicione ao segundo.
Descobri durante isso que comparar qualquer número
NaN
sempre resultaráfalse
. Interessante!Explicação:
Experimente online!
fonte
var
?x
.