Classificar por maior dígito (s)

23

Desafio:

Dada uma lista de números inteiros, classifique decrescente pelo (s) maior (s) dígito (s). A ordem dos números com o mesmo dígito maior é classificada pelo segundo maior dígito, etc.
Ignoramos dígitos duplicados nos números. E se todos os dígitos de um número forem iguais, a ordem desses números na lista poderá ser da maneira que você desejar.

Exemplo:

Input:            [123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373]
Possible outputs: [8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0]
                  [8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0]

Por quê? Aqui estão os dígitos relevantes em que os números foram classificados:

Output:
[8491,  -904,  62778,   478,     -7738,   6458,  373,   -73,   3120,      123,     0  ]

Relevant digits they were sorted on:
[[9,8], [9,4], [8,7,6], [8,7,4], [8,7,3], [8,6], [7,3], [7,3], [3,2,1,0], [3,2,1], [0]]

Regras do desafio:

  • Ignoramos dígitos duplicados, portanto, 478e -7738serão ordenados como 478, -7738, porque os dígitos maiores são [8,7,4]e [8,7,3], e não [8,7,4]e [8,7,7,3].
  • Se vários números tiverem os mesmos dígitos, a ordem deles poderá ser de qualquer maneira. Portanto, 373e -73pode ser classificado como ambos 373, -73ou -73, 373(os dígitos são [7,3]para esses dois números).
  • Se um número não contiver mais dígitos a serem verificados, será colocado na parte de trás dos números relevantes. Portanto, 123e 3120será classificado como 3120, 123, porque os dígitos maiores [3,2,1]são os mesmos, mas 0vêm antes none.
  • Você pode assumir que todos os números na entrada estão no intervalo [-999999,999999].
  • Apenas uma das saídas possíveis é suficiente como resultado, mas você pode gerar todas as saídas possíveis, onde as sublistas podem estar em qualquer permutação, se você quiser (embora eu duvide que isso salvaria bytes em qualquer idioma).

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Input:            [123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373]
Possible outputs: [8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0]
                  [8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0]

Input:            [11, -312, 902, 23, 321, 2132, 34202, -34, -382]
Possible outputs: [902, -382, 34202, -34, -312, 321, 2132, 23, 11]
                  [902, -382, 34202, -34, 2132, -312, 321, 23, 11]
                  etc. The sublist [-312, 321, 2132] can be in any permutation

Input:            [9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0]
Possible outputs: [29384, 192, 9, 6, 6, 4, 44, 2212, 21, 2, 1, 0]
                  [29384, 192, 9, 6, 6, 44, 4, 2212, 21, 2, 1, 0]
                  etc. The sublists [4, 44] and [2212, 21] can be in any permutation

Input:            [44, -88, 9, 233, -3, 14, 101, 77, 555, 67]
Output:           [9, -88, 67, 77, 555, 14, 44, 233, -3, 101]
Kevin Cruijssen
fonte

Respostas:

7

R , 97 bytes 95

function(x)x[rev(order(sapply(Map(sort,Map(unique,strsplit(paste(x),"")),T),Reduce,f=paste0)))]

Experimente online!

Este desafio parece ter sido pessimizado para R. Explicação da versão original (inicie em 1. e prossiga):

f <- function(x) {
  x[                                                  # 8. Input vector in
    rev(                                              # 7. Reversed
        order(                                        # 6. Lexicographical order
              sapply(                                 # 5. Paste....
                     Map(sort,                        # 4. Sort each using...
                              Map(unique,             # 3. Deduplicate each
                                  strsplit(           # 2. Split each string into characters
                                           paste(x),  # 1. Coerce each number to string
                                           "")),      
                         T),                          # 4. ...descending sort.
                     paste,collapse="")               # 5. ...back into strings
              )
        )
    ]
}
ngm
fonte
6

Perl 6 , 36 34 33 31 bytes

-1 byte graças a Jo King
-2 bytes graças a Phil H

*.sort:{sort 1,|set -<<m:g/\d/}

Experimente online!

Explicação

       {                      }  # Map each number, e.g. -373
                       m:g/\d/  # Extract digits: (3, 7, 3)
                    -<<  # Negate each digit: (-3, -7, -3)
                set  # Convert to set to remove duplicates
               |  # Pass as list of pairs: (-3 => True, -7 => True)
             1,  # Prepend 1 for "none": (1, -3 => True, -7 => True)
        sort  # Sort (compares 1 and pair by string value): (-7 => True, -3 => True, 1)
*.sort:  # Sort lexicographically
Nwellnhof
fonte
1
Agradável! -2 bytes para trocar m:g/\d./por .abs.comb: tio.run/…
Phil H
6

Python 2 , 60 55 54 bytes

-1 byte graças a Jonas Ausevicius .

def f(l):l.sort(cmp,lambda n:sorted(set(`n`))[::-1],1)

Experimente online!


Ungolfed

def f(l):
  l.sort(        # Sort the list in place
    cmp = cmp,   # ... compare with the builtin function cmp
    key = k,     # ... on the function k
    reverse = 1  # ... in reverse
  )              # As the arguments are used in the right order, no names are necessary.

k = lambda n:sorted( # sort  
  set(`n`)           # ... the set of digits
  )[::-1]            # reverse the result
                     # As '-' is smaller than the digits,
                     # it will be sorted to the back and ignored for sorting

Experimente online!

ovs
fonte
5
Nonepode ser substituído por cmpem sortfunção
Jonas Ausevicius
O [:: - 1] pode ser trocado por uma dupla negação, eu acho.
DonQuiKong
@DonQuiKong que demoraria um pouco mais, pois os dígitos são todos strings e precisaria ser convertido em ints para isso.
ovs 17/11/19
@JonasAusevicius Muito obrigado.
ovs 17/11/19
5

Braquilog , 9 bytes

{ȧdṫo₁}ᵒ¹

Nota: devido ao modo como a ordem funciona no braquilog, ela não funciona no número corretamente. Isso é corrigido lançando o número em uma sequência ( ) ao custo de 1 byte.

Experimente online!

Kroppeb
fonte
2
O que você quer dizer com " Devido a como a ordem funciona no braquilog, ela não funciona como o esperado ". Eu tentei todos os quatro casos de teste, e está dando os resultados corretos (a menos que acidentalmente olhei para além de algo).
21718 Kevin Murrijssen
@KevinCruijssen O (para string) corrige o problema. A ordenação de dígitos em um número decrescente funciona da seguinte maneira. Ordem do menor para o maior e depois inverter. O problema é que o número 3120ordenado do menor ao maior é 0123que é igual ao 123que reverteu é 321e não3210
Kroppeb
2
Ah, ok, então seu código atual está funcionando devido à adição de toString ( ). Como mencionado por @Arnauld, achei que seu comentário significava que seu código atual não funciona. Talvez seja melhor mencioná-lo da seguinte maneira: " Isso pode ter sido 8 bytes removendo o (toString), mas infelizmente não funciona conforme o esperado devido à forma como a ordem funciona no Brachylog. "
Kevin Cruijssen
Olhando o que escrevi, parece que meu cérebro se distraiu no meio da frase. Corrigido.
Kroppeb
5

Pitão, 7 6 bytes

-1 byte por @Sok

_o_{S`

O Pyth, que usa apenas ASCII imprimível, é uma desvantagem aqui. Idealmente codificado, isso seria6*log(95)/log(256) = 4.927 bytes, superando 05AB1E.

Explicado:

 o              Sort the implicit input by lambda N:
  _               reversed
   {               uniquified
    S               sorted
     '               string representation [of N]
_               then reverse the result.

Experimente aqui .

lirtosiast
fonte
2
O final Npode ser deixado de fora para salvar 1 byte - todas as funções do tipo lambda inferem a presença da variável lambda principal se houver algum argumento ausente no final. Exemplos incluem minferir d, fdeduzir T, uinferir G...
Sok
4

Geléia , 8 bytes

ADṢUQµÞU

Experimente online!

Como funciona

ADṢUQµÞU  Main link (monad). Input: integer list
     µÞU  Sort by (reversed):
AD        Absolute value converted to decimal digits
  ṢUQ     Sort, reverse, take unique values
Bubbler
fonte
2
Acabei de implementar isso e encontrei sua postagem. Eu fui com inversões normais , e não com as reviravoltas U. Observe, no entanto, que você não precisa da Dclassificação since,, é implementada com uma iterable(z, make_digits=True)chamada interna. Assim que foi AṢQṚµÞṚpara 7.
Jonathan Allan
3

MathGolf , 7 6 bytes

áÉ░▀zx

Experimente online! ou como uma suíte de teste .

Explicação

Depois de analisar a solução 05AB1E da Emigna, descobri que não precisava do operador absoluto (e minha resposta anterior estava realmente incorreta por causa desse operador). Agora, a principal diferença é que eu converto em string e obtenho caracteres únicos em vez de usar o operador de 1 byte em 05AB1E.

áÉ      Sort by the value generated from mapping each element using the next 3 instructions
  ░     Convert to string
   ▀    Get unique characters
    z   Sort reversed (last instruction of block)
     x  Reverse list (needed because I don't have a sort-reversed by mapping)
maxb
fonte
3

Japonês , 12 bytes

ñ_a ì â ñnÃw

Todos os casos de teste

Explicação:

ñ_        Ãw    :Sort Descending by:
  a             : Get the absolute value
    ì           : Get the digits
      â         : Remove duplicates
        ñn      : Sort the digits in descending order
Kamil Drakari
fonte
3

Haskell , 54 52 bytes

import Data.List
f=r.sortOn(r.sort.nub.show);r=reverse

Experimente online!

Martin Lütke
fonte
A definição r=reversesalva dois bytes. Também permitimos funções anônimas, para f=que não seja necessário contar.
Laikoni
Mudei a importação ef = para o cabeçalho do TIO. Tudo bem?
Martin Lütke
Contagem de bytes mesmo, mas talvez de algum interesse: f=r$r id.nub.show;r=(reverse.).sortOn.
Laikoni
1
A importação realmente precisa ser contada.
Laikoni
2
Você pode dar uma olhada no nosso Guia de regras de golfe em Haskell .
Laikoni
3

Stax , 6 7 bytes

èó≥ü≤♥¥

Execute e depure

recursivo
fonte
Isso parece dar resultados incorretos. Por exemplo, no caso de teste do seu TIO, ele é emitido em -904 8491 478 62778 6458 -7738 -73 373 123 3120 0vez do 8491 -904 62778 478 -7738 6458 373 -73 3120 123 0ou pretendido 8491 -904 62778 478 -7738 6458 -73 373 3120 123 0. Este caso de teste também é usado no exemplo e para explicar as regras, então eu daria uma olhada nisso para entender melhor. Parece que você está classificando apenas o maior dígito uma vez, sem nenhuma das outras regras?
21718 Kevin Kelijsen em
@KevinCruijssen: Sim, minhas desculpas. Eu li mal a declaração do problema. Ajustei o programa para lidar com os requisitos estabelecidos. Este programa está aceitando os números inteiros de entrada como seqüências de caracteres entre aspas. Isso geralmente é aceitável, mas, se não, talvez seja necessário adicionar outro byte.
recursivo
Parece bom agora, +1 de mim. E sim, inserir como strings é completamente bom.
Kevin Cruijssen
3

APL (Dyalog Extended) , 19 bytes

{⍵[⍒∪¨(∨'¯'~⍨⍕)¨⍵]}

Experimente online!

Corrigido com um custo de +2 bytes, graças ao OP.

Zacharý
fonte
Eu acho que está faltando um 'uniquify' em algum lugar? Se eu tentar o exemplo de caso de teste no seu TIO, por exemplo, ¯7738é colocado antes 478, mas deve ser depois: os dígitos [8,7,4]vêm antes dos dígitos [8,7,3].
21718 Kevin Kurtzssen
Obrigado, @KevinCruijssen
Zacharý
3

C (gcc) , 114 111 109 bytes

a;v(n){n=n<0?-n:n;for(a=0;n;n/=10)a|=1<<n%10;n=a;}c(int*a,int*b){a=v(*a)<v(*b);}f(a,n)int*a;{qsort(a,n,4,c);}

Experimente online!

Explicação:

f () usa qsort () para classificar a matriz fornecida no local. Usando a função de comparação c () para comparar números que avalia números usando v (). v () calcula um número maior se dígitos maiores estiverem presentes no parâmetro

[Editar 1] Melhorado por 3 bytes. 2 créditos de bytes para Kevin. obrigado

[Edit 2] Mais 2 bytes melhorados. Créditos ao gastropner. obrigado

GPS
fonte
1
Você pode golfe n>0para neu acho que em seu ciclo do seu método v.
21718 Kevin Kelijssen
A lista de argumentos de f () int*a,npode ser reduzida para int*a.
Gastropner 19/1118
1
Sugerir em for(a=0;n=abs(n);vez den=n<0?-n:n;for(a=0;n;
tetocat 20/11
2

J , 17 bytes

{~[:\:~.@\:~@":@|

Experimente online!

Explicação:

                @|    - find the absolute value and
             @":      - convert to string and
         @\:~         - sort down and
       ~.             - keep only the unique symbols
    \:                - grade down the entire list of strings   
  [:                  - function composition
{~                    - use the graded-down list to index into the input   
Galen Ivanov
fonte
2

JavaScript (SpiderMonkey) , 68 bytes

Obrigado por @Arnauld por me lembrar novamente que o SpiderMonkey usa classificação estável, portanto -4 bytes para remover ||-1 .

A=>A.sort((x,y,F=n=>[...new Set(""+n)].sort().reverse())=>F(x)<F(y))

Experimente online!

JavaScript (Node.js) , 72 bytes

A=>A.sort((x,y,F=n=>[...new Set(""+n)].sort().reverse())=>F(x)<F(y)||-1)

Experimente online!

Shieru Asakoto
fonte
Ou 68 bytes com o SpiderMonkey.
Arnauld
1
@Arnauld oh estável tipo novo; P
Shieru Asakoto
Na verdade, acho que o V8 está usando pelo menos 2 algoritmos de classificação diferentes. Parece que é estável se o tamanho da matriz for menor ou igual a10.
Arnauld
1
O @Arnauld V8 usa a classificação rápida antes do Chrome 70. O algoritmo de classificação rápida executa uma classificação de inserção quando o tamanho da matriz é pequeno o suficiente. E o Chrome mais recente mudou para uma classificação estável para corresponder ao comportamento de outros navegadores (IE / Firefox / Safari).
Tsh #
2

Java (JDK) , 98 bytes

l->l.sort((a,b)->{int r=0,i=58;for(;r==0&i-->48;)r=(b.indexOf(i)>>9)-(a.indexOf(i)>>9);return r;})

Experimente online!

Explicação

l->                           // Consumer<List<String>>
 l.sort(                      //  Use the incorporated sort method which uses a...
  (a,b)->{                    //   Comparator of Strings
   int r=0,                   //    define r as the result, initiated to 0
       i=58;                  //           i as the codepoint to test for.
   for(;r==0&i-->48;)         //    for each digit codepoint from '9' to '0',
                              //     and while no difference was found.
    r=                        //     set r as the difference between
     (b.indexOf(i)>>9)-       //      was the digit found in b? then 0 else -1 using the bit-shift operator
     (a.indexOf(i)>>9);       //      and was the digit found in a? then 0 else -1.
   return r;                  //    return the comparison result.
  }
 )

Nota:

Eu precisava de uma maneira de mapear números para um 0/1ou outro 0/-1.

indexOftem a propriedade legal de retornar consistentemente -1caracteres não encontrados. -1Shift à direita por qualquer número é sempre -1. Qualquer número positivo deslocado para a direita por um número grande o suficiente sempre produzirá0 .

Então aqui estamos nós:

input        input.indexOf('9')      input.indexOf('9')>>9
"999"        0                       0
"111119"     5                       0
"123456"     -1                      -1
Olivier Grégoire
fonte
1
Ah, sim, é isso que eu quero dizer. ; p Golfe agradável ao usar em >>9vez de >>32devido ao intervalo limitado de números.
Kevin Cruijssen
1

Ruby , 55 bytes

->a{a.sort_by{|x|x.abs.digits.sort.reverse|[]}.reverse}

Experimente online!

Kirill L.
fonte
1

APL (NARS), 366 caracteres, 732 bytes

_gb←⍬

∇a _s w;t
t←_gb[a]⋄_gb[a]←_gb[w]⋄_gb[w]←t
∇

∇(_f _q)w;l;r;ls;i
(l r)←w⋄→0×⍳l≥r⋄l _s⌊2÷⍨l+r⋄ls←i←l⋄→3
  →3×⍳∼0<_gb[i]_f _gb[l]⋄ls+←1⋄ls _s i
  →2×⍳r≥i+←1
l _s ls⋄_f _q l(ls-1)⋄_f _q(ls+1)r
∇

∇r←(a qsort)w
r←¯1⋄→0×⍳1≠⍴⍴w⋄_gb←w⋄a _q 1(↑⍴w)⋄r←_gb
∇

f←{∪t[⍒t←⍎¨⍕∣⍵]}

∇r←a c b;x;y;i;m
x←f a⋄y←f b⋄r←i←0⋄m←(↑⍴x)⌊(↑⍴y)⋄→3
→0×⍳x[i]<y[i]⋄→3×⍳∼x[i]>y[i]⋄r←1⋄→0
→2×⍳m≥i+←1⋄r←(↑⍴x)>(↑⍴y)
∇

Para o operador qsort, é uma tradução no APL de algo na página 139 K&R Linguaggio C. Acho que nele existem dados como C com ponteiros ... Teste

 c qsort 123, 478, ¯904, 62778, 0, ¯73, 8491, 3120, 6458, ¯7738, 373 
8491 ¯904 62778 478 ¯7738 6458 ¯73 373 3120 123 0 
 c qsort 11, ¯312, 902, 23, 321, 2132, 34202, ¯34, ¯382 
902 ¯382 34202 ¯34 321 ¯312 2132 23 11 
 c qsort 9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0 
29384 192 9 6 6 4 44 2212 21 2 1 0 
 c qsort 44, ¯88, 9, 233, ¯3, 14, 101, 77, 555, 67 
9 ¯88 67 77 555 14 44 233 ¯3 101 
RosLuP
fonte
1

Powershell, 44 bytes

$args|sort{$_-split'(.)'-ne'-'|sort -u -d}-d

Script de teste:

$f = {

$args|sort{$_-split'(.)'-ne'-'|sort -u -d}-d

}

@(
    ,( (123, 478, -904, 62778, 0, -73, 8491, 3120, 6458, -7738, 373),
       (8491, -904, 62778, 478, -7738, 6458, 373, -73, 3120, 123, 0),
       (8491, -904, 62778, 478, -7738, 6458, -73, 373, 3120, 123, 0) )

    ,( (11, -312, 902, 23, 321, 2132, 34202, -34, -382),
       (902, -382, 34202, -34, -312, 321, 2132, 23, 11),
       (902, -382, 34202, -34, 2132, -312, 321, 23, 11) )

    ,( (9, 44, 2212, 4, 6, 6, 1, 2, 192, 21, 29384, 0),
       (29384, 192, 9, 6, 6, 4, 44, 2212, 21, 2, 1, 0),
       (29384, 192, 9, 6, 6, 44, 4, 2212, 21, 2, 1, 0),
       (29384, 192, 9, 6, 6, 44, 4, 21, 2212, 2, 1, 0) )

    ,( (44, -88, 9, 233, -3, 14, 101, 77, 555, 67),
       ,(9, -88, 67, 77, 555, 14, 44, 233, -3, 101) )
) | % {
    $a, $expected = $_
    $result = &$f @a
    $true-in($expected|%{"$result"-eq"$_"})
    "$result"
}

Saída:

True
8491 -904 62778 478 -7738 6458 -73 373 3120 123 0
True
902 -382 34202 -34 2132 -312 321 23 11
True
29384 192 9 6 6 44 4 21 2212 2 1 0
True
9 -88 67 77 555 14 44 233 -3 101
confuso
fonte
1

PHP, 87 86 84 bytes

while(--$argc)$a[_.strrev(count_chars($n=$argv[++$i],3))]=$n;krsort($a);print_r($a);

Corra com -nrou experimente online .

Substitua ++$ipor $argc(+1 byte) para suprimir o Aviso (e tornar -nobsoleto).

demolir

while(--$argc)  # loop through command line arguments
    $a[                             # key=
        _.                              # 3. prepend non-numeric char for non-numeric sort
        strrev(                         # 2. reverse =^= sort descending
        count_chars($n=$argv[++$i],3)   # 1. get characters used in argument
        )
    ]=$n;                           # value=argument
krsort($a);     # sort by key descending
print_r($a);    # print

- é "menor" que os dígitos, portanto não afeta a classificação.

Titus
fonte
1

Lisp comum, 88 bytes

(sort(read)'string> :key(lambda(x)(sort(remove-duplicates(format()"~d"(abs x)))'char>)))

Experimente online!

Bom e velho verboso Common Lisp!

Explicação:

(sort                   ; sort
 (read)                 ; what to sort: a list of numbers, read on input stream 
 'string>               ; comparison predicate (remember: this is a typed language!)
 :key (lambda (x)       ; how to get an element to sort; get a number
       (sort (remove-duplicates  ; then sort the unique digits (characters) 
               (format() "~d" (abs x))) ; from its string representation
             'char>)))  ; with the appropriate comparison operator for characters
Renzo
fonte
1

C # (compilador interativo do Visual C #) , 75 74 bytes

-1 obrigado @ somente ASCII

x=>x.OrderByDescending(y=>String.Concat((y+"").Distinct().OrderBy(z=>-z)))

Experimente online!

Em C #, cadeias de caracteres são consideradas "enumeráveis" de caracteres. Eu uso isso para minha vantagem, primeiro convertendo cada número em uma string. O LINQ é então alavancado para obter os caracteres únicos (dígitos) classificados na ordem inversa. Eu converto cada matriz de caracteres classificados novamente em uma string e a uso como a chave de classificação para ordenar a lista inteira.

dana
fonte
Parece que você será capaz de se safar sem adicionar -, parece que a ordem deles realmente não importa?
somente ASCII
Sem o -retorno do caso de teste nº 2, o ... 321 2132 ...que parece incorreto?
quer
nah, leia o exemplo com mais cuidado
somente ASCII
OK - acho que você está certo. Obrigado pela dica!
quer