Implementar Lazy Drop Sort


26

Esse desafio já descreve o dropsort. No entanto, sou meio preguiçoso e realmente só preciso que minha matriz seja um pouco mais ordenada do que antes, não precisa ser ordenada completamente .

No Drop Sort, eliminamos cada elemento menos que qualquer elemento anterior a ele. No Lazy Drop Sort, eliminamos todos os elementos menos do que o estritamente anterior .

Aqui está um exemplo. Considere a seguinte matriz:

8 6 9 9 7 2 3 8 1 3

Vamos marcar cada elemento menor que o anterior.

8 6 9 9 7 2 3 8 1 3
  ^     ^ ^     ^

Observe como nem 3foi marcado nem o último 8. Eles são todos maiores que o elemento único à esquerda deles.

Completando o algoritmo, removendo os elementos marcados, obtemos:

8 9 9 3 8 3

Isso basicamente parece mais organizado. Meio. Sou preguiçosa.

Sua tarefa, como você já deve ter deduzido, é implementar esse algoritmo.

A entrada é uma matriz de pelo menos 1 número inteiro positivo entre 1 e 9, para que você também possa pegar uma sequência de dígitos.

Isso é , o menor número de bytes vence!

Casos de teste adicionais:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3

Pode ser uma função ou deve ser um programa completo?
Rafa11111 23/03

@ rafa11111 Ou é bom
Pavel

Caso seja uma função, a matriz de entrada pode ser codificada no programa principal? E o comprimento da matriz pode ser passado como entrada para a função?
Rafa11111 23/03

@ rafa11111 A entrada não pode ser codificada na própria função. Não importa como a função obtém essa entrada no seu programa de teste. Você pode usar um comprimento de matriz apenas se estiver usando C / C ++ ou outro idioma em que essa seja a única maneira de determinar o comprimento de uma matriz.
Pavel

Respostas:


6

Casca , 4 bytes

m←ġ<

Experimente online!

Explicação

m←ġ<
  ġ<    Group the numbers into decreasing sequences
m←      Keep the first element of each sequence

15

JavaScript (ES6), 28 25 bytes

Guardado 3 bytes graças a @Shaggy

a=>a.filter(n=>~-a<(a=n))

Experimente online!


2
n=>p<=nteria olhado ;-) incrível
ETHproductions

4
@ETHproductions Para +4 bytes, (n=p)=>p<=(p=n)funciona bem;)
Arnauld

esta resposta está me surpreendendo, por que isso não explode ao tentar acessar ppela primeira vez, quando ainda não está definido?
22718 Brian H.

1
@ Shagy Isso parece seguro. Será atualizado quando voltar à frente de um computador. Obrigado!
Arnauld

2
O @Pavel aé inicialmente definido como a matriz de entrada e a-1resultaria em NaN(a menos que contenha um único número inteiro; nesse caso, ele é coagido a esse número inteiro).
Arnauld


6

MATL , 9 8 bytes

Guardou um byte graças a Giuseppe.

0yd0<h~)

Experimente online!


Explicação:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]

5

Perl 5 .10.0 + -nl, 16 bytes

$f>$_||say;$f=$_

Experimente online!


1
Tradução para Perl 6perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills 22/03

O @Brad perl6 é um idioma diferente (não é nem compatível com versões anteriores)
Wastl

Eu escrevi um que era mais Perl 6 idiomático, mas era mais longo. Também uma das razões pelas quais eu publico aqui é mostrar o idioma e explicá-lo. A publicação dessa tradução não faz nada, mas mostra que é uma versão um pouco mais detalhada do Perl. Basicamente, não satisfaz nenhuma das razões pelas quais eu publico neste site.
Brad Gilbert b2gills



4

Stax , 5 bytes

âÿ╠╦░

Execute e depure isso online

Ao descompactar, desfeitar e comentar o código, obtemos isso.

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

Execute este

A ordem das instruções é incômoda, mas há uma razão para isso. A embalagem do código fonte Stax nem sempre produz o mesmo tamanho de saída para a mesma entrada de tamanho. Basicamente, você tem a chance de salvar um byte se o último caractere da fonte tiver um código de caractere mais baixo. Bem, !tem um dos códigos mais baixos que você pode obter para um caractere imprimível. (33 especificamente) Muitos programas stax ASCII de 6 bytes não podem ser menores. Mas se eles terminam com a !, podem. Portanto, o motivo dessa ordem específica de instruções é garantir que o lógico não termine no final do programa.


4

J, 12 bytes

#~1,2&(<:/\)

Explicação:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

Exemplos:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Experimente online!


Ótima solução! Adicionei um link TIO para o seu código.
Galen Ivanov

4

Gelatina , 6 bytes

>Ɲ0;¬×

A E / S está em cadeias.

Experimente online!


Estou curioso, por que operar em strings e não em matrizes? Foi-me dito que Jelly é ruim em cordas.
Pavel

2
Isto é. ×não deve funcionar para a repetição de caracteres, mas funciona.
Dennis

4

Java 8, 66 55 48 bytes

l->{for(int i=0;;)if(i>(i=l.next()))l.remove();}

-11 bytes após uma dica de @ OlivierGrégoire .
-7 mais bytes graças a @ OlivierGrégoire .

Explicação:

Experimente online.

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item

Por que todo mundo começa a usar ~0quando é basicamente -1. Pessoalmente, eu escolheria a solução mais intuitiva se a contagem de bytes tivesse o mesmo comprimento (exceto while(...)vs for(;...;), nesse caso, eu prefiro o for. Obrigado por mais -7 bytes, no entanto. :) :)
Kevin Cruijssen

É porque eu sou ruim com 2-complemento ... Eu sou tão ruim que eu queria dizer Integer.MIN_VALUE(que é, em seguida 1<<31, eu acho ...) ;-)
Olivier Grégoire

4

Oitava , 21 bytes

@(x)x(~[0,diff(x)<0])

Experimente online!

Explicação:

Pegue um vetor xcomo entrada e crie um vetor [0, diff(x)<0], onde diff(x)é um vetor com a diferença entre todos os elementos adjacentes. Mantenha apenas os negativos comparando-os a zero, fornecendo uma lista de todos os elementos que queremos eliminar.

Em seguida, selecionamos os elementos do vetor de entrada que queremos manter.


4

V , 25 bytes

òjälá k$yl+@"òç-/d
ç /dw

Experimente online!

Hexdump:

00000000: f26a e46c e120 6b24 796c 2b40 2218 f2e7  .j.l. k$yl+@"...
00000010: 2d2f 640a e720 2f64 77                   -/d.. /dw

Pior idioma para o trabalho. Mas fiz isso por um desafio .


6
Nota lateral: ojalá é espanhol, espero .
Dennis

2
@ dennis Isso é legal. Para que serve o k$yl+@"òç-/despanhol?
DJMcMayhem

7
k$yl+@"òç-/dpode ser traduzido liberalmente como Ouch, quem diabos deixou a porta do armário aberta?
Luis Mendo

3

Triangularidade , 71 bytes

.....).....
....IEL....
...)rFD)...
..2+)IE)w..
.+h)2_stDO.
={M)IEm}...

Experimente online!

Como funciona?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Programa completo.
) IE - Obtenha a 0ª entrada I e avalie-a.
   L) r - E pressione o intervalo [0 ... comprimento de I).
      F {- Filtre os números inteiros neste intervalo que satisfazem:
       D) 2+) IE) w + h) 2_stDO = - Esta condição. Executa cada elemento E em um separado
                                    empilhar e descartar aqueles que não atendem aos critérios.
       D) 2+ - Duplique e adicione 2 à segunda cópia.
           ) IE - Recupere I novamente.
              ) - Empurre um 0 para a pilha.
               w - Coloque o 0 em uma lista. [0]
                + - Anexe-o a I.
                 h - cabeça. Apare os elementos após o índice E + 2.
                  ) 2_ - Literal -2.
                     st - cauda.
                       DO = - Verifique se o resultado é invariável sobre a classificação.
                           M) IEm} - Última parte: indexação na entrada.
                           M} - Para cada índice que satisfaça as condições:
                            ) IEm - Recupere o elemento I nessa posição.

2
Por curiosidade (já que você é o criador da Triangularidade): por que não fazer algo semelhante ao Hexagony / Cubically, onde um pedaço de código é automaticamente preenchido com os pontos não-op? Portanto, esse programa seria o )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}que seria expandido para sua resposta atual?
Kevin Cruijssen 22/03

@KevinCruijssen Porque eu estava realmente planejando fazer da Triangularity um esolang 2D, mas desisti da ideia e fiquei com o meu modelo anterior. Acho que farei algumas mudanças importantes em breve, quando eu lançar o Triangularity v2. (Também é meio divertido jogar golfe em sua forma atual, porque um simples salvamento em linha de 1 byte pode poupar 20: D ... Ele também se aplica retroativamente ao consertar coisas: C)
Sr. Xcoder

Bem, mesmo se você planeja lançá-lo como um esolang 2D, meu comentário ainda permanece (um pouco). )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}seria seu código, ele seria expandido para o modelo atual e, em seguida, execute os comandos 2D nesse modelo expandido. EDIT: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...e .....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...e )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}todos os três seriam exatamente o mesmo programa.
Kevin Cruijssen 22/03


3

Wolfram Language (Mathematica) , 33 bytes

Pick[#,Arg[#-{0}~Join~Most@#],0]&

Experimente online!

Como funciona

O código # - {0}~Join~Most@#transforma uma matriz {a,b,c,d,e,f}em {a,b-a,c-b,d-c,e-d,f-e}. A aplicação Arga isso define números negativos para Pie números não negativos para0 .

Pick[#, ..., 0]&seleciona as entradas de #onde ...tem um 0: no nosso caso, exatamente os elementos que produzem um número não negativo quando você subtrai o elemento anterior. Em outras palavras, essas são exatamente as entradas que queremos manter ao preguiçoso.


3

Maravilha , 27 bytes

-> ':1.!> 'sS#<=.cns2.++[0]

Exemplo de uso:

(-> ':1.!> 'sS#<=.cns2.++[0])[8 6 9 9 7 2 3 8 1 3]

Explicação

Versão não destruída:

(map get 1).(fltr sS <=).(cns 2).(++ [0])

Anexe previamente 0, obtenha a lista de pares consecutivos, mantenha os itens da lista em que o primeiro número <= segundo número, obtenha o segundo número de cada par.


3

Wolfram Language (Mathematica) , 20 bytes

#&@@@Split[#,##>0&]&
(* or *)
Max/@Split[#,##>0&]&

Experimente online!

Explicação

Input = {8, 6, 9, 9, 7, 2, 3, 8, 1, 3}

Split[#,##>0&]

Agrupe elementos consecutivos que estão estritamente diminuindo: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Tome o primeiro elemento de cada um: {8, 9, 9, 3, 8, 3}


##>0é chique e tudo mais, mas na verdade não salva nada por #>#2aqui;) (o que faria seu programa funcionar com números inteiros arbitrários, embora não seja necessário).
Martin Ender


3

SWI-Prolog, 44 bytes

[A,B|C]-[A|E]:-B<A,[B|C]-[B|E];[B|C]-E. L-L.

Uso: Chame " Lista -X" onde Lista é uma lista entre colchetes e separada por vírgula, por exemplo [1,4,5,1,11,6,7].


1
Bem vindo ao site! :)
DJMcMayhem

2

APL + WIN, 14 bytes

Solicita a entrada na tela de um vetor de números inteiros.

(1,1>2-/v)/v←⎕

2

05AB1E , 6 bytes

ĆÁü›_Ï

Experimente online!

Explicação

Ć        # append the head of the list
 Á       # rotate right
  ü›     # apply pair-wise greater-than
    _    # logical negate each
     Ï   # keep elements of input that are true in this list

2

Kotlin , 39 bytes

a->a.filterIndexed{i,v->i<1||v>=a[i-1]}

Experimente online!

Filtre os itens que são o primeiro item (índice == 0 ou ainda menor índice <1) OU o Valor atual é maior ou igual ao item anterior (a [i-1]).



2

K4 , 10 bytes

Solução:

x_/|&<':x:

Exemplo:

q)k)x_/|&<':x:8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Explicação:

Encontre índices onde o elemento é menor que o anterior, remova esses índices da entrada

x_/|&<':x: / the solution
        x: / store input as x
     <':   / less-than each-previous
    &      / indices where true
   |       / reverse
 _/        / drop-over
x          / the input

2

Anexo , 24 bytes

{Mask[1'(Delta!_>=0),_]}

Experimente online!

Explicação

Maskseleciona todos os elementos de seu segundo argumento que correspondem aos elementos de verdade em seu primeiro argumento. 1'(Delta!_>=0)calcula os índices que correspondem aos elementos que deveriam estar na matriz final.

Outras tentativas

28 bytes (sem ponto): ~Mask#(1&`'##Delta#`>=#C[0])

32 bytes: {Mask[1'(&`<= =>Slices[_,2]),_]}


2

C # (.NET Core) , 33 + 18 = 51 bytes

x=>x.Where((a,n)=>n<1||x[n-1]<=a)

Experimente online!

basicamente, a instrução é onde x é o primeiro int na matriz ou é maior ou igual ao número anterior, mantenha-o. Caso contrário, solte-o.


1
Você pode retornar um IEnumerable. Não é ToArray()necessário.
Pavel

@ Pavel eu precisaria adicionar uma referência extra System.Collections, e isso negaria todos os bytes salvos para remover o arquivo ToArray().
Dennis.Verweij

Não, pois você não fará referência IEnumerablena resposta, apenas a use como o tipo de retorno.
Pavel

@Pavel graças ok, às vezes eu sou um inseguro pouco quando a contagem dos bytes ou não ... desculpe
Dennis.Verweij

1

Swift 4 , 56 55 bytes

{var l=0;print($0.filter{($0>=l,l=$0).0})}as([Int])->()

Experimente online!

Explicação

{var l=0;           // Declare variable l
print($0.filter{(   // Print every element e in the input
  $0>=l,            //   where e >= l
  l=$0).0})         //   And set l to e
}as([Int])->()      // Set the input type to integer array

1

Geléia , 9 bytes

0;>ƝżµḢÐṂ

Experimente online!

Isso parece bastante volumoso, não seria tão surpreendente se houver uma maneira melhor.

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element

1

Flak cerebral , 136 , 120 bytes

((())){{}([{}]({}))([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}(({})<>)(())(<>)}{}([][()])}{}{}<>{{}({}<>)<>}<>

Aqui está formatado e "legível" .

((()))
{
    {}

    ([{}]({}))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

    {
        {}(({})<>)(())(<>)
    }

    {}

    ([][()])

}{}{}<>

{
    {}
    ({}<>)<>
}<>

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.