Classifique pelo que os pares de dígitos descrevem

17

Dado um número inteiro positivo, podemos formar um novo número descrito por seus dígitos tomados em pares (com um 0 inicial adicionado para números com número ímpar de dígitos).

Por exemplo:

  • 1234 pode ser lido como um 2, três 4s - portanto, a saída para 1234 é 2444.

  • 643 tem um número ímpar de dígitos, portanto, um zero à esquerda é adicionado para torná-lo uniforme. Então, 0643 pode ser lido como: zero 6s, quatro 3s; portanto, a saída seria 3333.

(Este é o OEIS A056967 ).

Tarefa: Dada uma matriz de números inteiros positivos, classifique-os pelo valor descrito pelo par de dígitos, em ordem crescente. A ordem não importa entre os números de entrada que levam ao mesmo valor.

Entrada : uma matriz / lista / conjunto de números inteiros positivos. Zeros à esquerda na entrada não são permitidos e são inseridos como strings / listas de dígitos / etc. não são permitidos - as entradas devem ser tão próximas a um tipo inteiro / numérico quanto o seu idioma é capaz de usar.

Resultado : a matriz classificada da maneira mencionada acima, retornada de qualquer uma das formas usuais (função retorna valor / STDOUT / grita no vazio / etc.) Você pode imprimi-las individualmente, retorná-las como números, seqüências de caracteres ou listas de dígitos.

Casos de teste

Input 
Output

[19, 91, 2345, 2023]
[19, 2023, 2345, 91]

[25257, 725, 91, 5219, 146125, 14620512]
[725, 5219, 14620512, 91, 146125, 25257]

[123130415 3335 91 111111111 528 88]
[528, 111111111, 123130415, 3335, 88, 91]

[1 21 33 4 5]
[1 4 5 21 33]

[3725, 10, 2537, 1, 1225, 2512]
[10, 1, 1225, 2512, 2537, 3725]

[125, 26, 1115, 1024] 
[1115, 1024, 125, 26]

(No quarto caso de teste, 1, 4 e 5 são avaliados como 0 e, portanto, podem ser classificados entre si em qualquer ordem. Da mesma forma, no quinto caso de teste, 10 e 1 avaliam como 0s e, portanto, podem ser classificados em qualquer pedido.)

(Relacionado: Diga o que vê , Um 1, Dois 1, Um 2 Um 1

Agradecemos a Kevin Cruijssen pela ajuda para esclarecer a pergunta na Sandbox.

sundar - Restabelecer Monica
fonte
2
Podemos pegar uma lista de listas de dígitos como entrada? Podemos produzir uma lista de listas de dígitos?
Mr. Xcoder
@ Mr.Xcoder A entrada deve ser uma lista de números inteiros, não de dígitos. A saída pode ser uma lista de listas de dígitos, se isso for mais conveniente.
sundar - Restabelece Monica
como apontado por @mnel, minha resposta não funcionará para números acima de 10 dígitos. é legítimo mantê-lo como está, ou devo modificá-lo ao custo de 32 bytes.
Jayce
@ JayCe Se bem entendi, a limitação é porque esse é o limite do tipo inteiro em R - porque strtoiretorna um número inteiro - correto? Se assim for, tudo bem, é legal como é.
sundar - Restabelece Monica
você está certo! manterá como está.
Jayce

Respostas:

5

APL (Dyalog) , 26 bytes

Obrigado ngn por salvar 1 byte :)

{⍵[⍋⌽↑,⍨⌿⍴⌿0 10⊤⍵⊤⍨⍴⍨100]}

Experimente online!

Inspiração de dzaima & ngn

H.PWiz
fonte
100⊥⍣¯1⊢⍵-> ⍵⊤⍨⍵/100trabalha para 26.
jslip 18/08/1918
Eu realmente não quero WSFULLs nos casos de teste fornecidos
#
26 é possível com MAXWS = 1M
ngn
100⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨100
NGN
1
@ H.PWiz e aqui está uma solução diferente para 26 bytes:{⍵[⍋⌽↑,⍨⌿⍴⌿⊃⊥⍣¯1/10 100⍵]}
ngn
3

R , 141 bytes

(s<-scan(,""))[order(strtoi(sapply(s,function(x)paste(strrep((m=matrix(c(if(nchar(x)%%2)0,el(strsplit(x,""))),2))[2,],m[1,]),collapse=""))))]

Experimente online!

Resposta bastante trabalhosa - mas funciona em todos os casos de teste. Constrói a saída do par de dígitos e classifica a entrada de acordo com isso.

JayCe
fonte
Postei minha abordagem em outra resposta, pois estava trabalhando nessa tarde, mas fui interrompido. Só para garantir que não
obtive
@digEmAll não se preocupe :) - Na verdade, acho que peguei o nome vda variável nas suas outras respostas - nunca usei vantes. E bom uso de intToUtf8!
Jayce
ahah, estou com inveja dos nomes das variáveis ​​de uma única letra! Não,
falando
strtoi voltará NA para inteiros acima de 10 dígitos, (as.numeric não)
mnel
@mnel obrigado por apontar! Eu verifiquei com Sundar e uma vez que é uma limitação do tipo inteiro eu posso deixá-lo como é :)
Jayce
3

R , 120 bytes

(v=scan())[order(sapply(v,function(n,e=nchar(n))sum((a=rep((x=n%/%10^(0:(e-1-e%%2))%%10)[!0:1],x[!1:0]))*10^seq(a=a))))]

Experimente online!

  • -11 bytes graças à sugestão "aritmética" do @sundar!

Código ungolfed com explicação:

# define a function G which takes a number 'n' and uncompress it multiplied by 10
# e.g. 2735 -> 775550, 61345 -> 355550 etc.
G=function(n){
  e = nchar(n)                   # get the n.of digits in the compressed number

  x = n%/%10^(0:(e-1-e%%2))%%10  # split 'n' into vector of digits reversed adding 
                                 # trailing zero if 'e' is odd (e.g. 123 -> c(0,3,2,1))

  even = x[!0:1]                 # take only the odd elements of 'x' (= even digits)
  odd  = x[!1:0]                 # take only the even elements of 'x' (= odd digits)
                                 # N.B. :
                                 # these tricks work because !0:1 is c(TRUE,FALSE)
                                 # and V[c(TRUE,FALSE)] exploits the fact that R 
                                 # automatically recycles the logical indexes up to the
                                 # length of the vector V

  a = rep(even,odd)              # repeat each value in 'even' 'odd' times obtaining the
                                 # uncompressed number as digits vector. Note that in
                                 #  case of single digit 'n', 'a' will be an empty vector

  sum(a*10^seq(a=a))             # multiplies 'a' * 10^(1:length(a)) and sum 
                                 # obtaining the uncompressed number multiplied by 10
                                 # N.B. in case of empty 'a', we get 0
}

v = scan()                       # take vector v from stdin

w = sapply(v,G(n))               # apply G to all numbers of 'v'

v[order(w)]                      # use the uncompressed values as weights to sort 'v'
digEmAll
fonte
O [!1:0]truque é muito bom - nunca o vi antes.
Jayce
@sundar: explicação adicionada;)
digEmAll
1
Agradável. Eu sabia que aqueles [!1:0]caras estavam escondendo algo legal. Eu estava brincando com isso e as pontas em R golfe, tentando obter o número dos dígitos aritmeticamente (sem as.double), mas apenas veio com uma versão 132 byte: TIO
sundar - Reintegrar Monica
@ Sundar: Não pensei na abordagem aritmética ... Salvei 11 bytes, obrigado!
precisa saber é o seguinte
2

Pitão , 14 bytes

oir9c.[Z2jNT2T

Experimente aqui! | Suíte de teste! | 12 bytes com lista de E / S de dígitos

Como funciona?

oir9c.[Z2jNT2T – Full program.
o              – Sort the input list by the results of the following code (variable: N).
         jNT   – Cast the current element to a list of digits.
     .[Z2      – Pad it on the left with 0s to the nearest multiple of 2.
    c       2  – Split in pieces of length 2.
  r9           – Run length decode.
 i           T – Cast the list of digits to a base 10 integer.
Mr. Xcoder
fonte
2

Gelatina , 10 bytes

ṚẋƝm2ṚFḌµÞ

Experimente online!

Confira uma suíte de testes!

Como funciona

Þm2ṚFḌµÞ Link monádico / programa completo. | Exemplo: [25257, 725, 91, 5219, 146125, 14620512]
        µÞ Classifique a lista de entrada pelo resultado do link monádico: | Exemplo: 725
Ṛ Promova N na sua matriz de dígitos e inverta-a. | [5, 2, 7]
 ẋƝ Para cada dois dígitos consecutivos x, y, repita xy vezes. | [[5, 5], [2, 2, 2, 2, 2, 2, 2]]
   m2 Modular 2. Pegue todos os outros elementos dessa matriz. | [5, 5]
     Ṛ Reverso. | [5, 5]
      F Achate. | [5, 5]
       Ḍ Converta de decimal para inteiro. | 55
Mr. Xcoder
fonte
Definitivamente, é uma coincidência: 2537e 3725não representa o mesmo número.
Erik the Outgolfer
Você poderia me dar um caso de teste que captasse isso, e eu adicionarei isso à pergunta?
sundar - Restabelece Monica
Como o Erik disse [2537, 3725],. Eu nunca duvidei que isso é uma coincidência, portanto, que incluiu essa nota para a resposta
Mr. Xcoder
@ Mr.Xcoder Testcase adicionado, obrigado.
sundar - Restabelece Monica
2

Perl 6 , 53 bytes

*.sort(+*.flip.comb.rotor(2).map({[x] $_}).join.flip)

Experimente online!

Anônimo Qualquer que seja a lambda que pega uma lista de valores e a classifica de acordo com o que os pares de números descrevem.

Nesse caso, estou revertendo o número e depois rotora lista por dois para obter cada par de números. Isso excluirá o primeiro dígito para números de comprimento ímpar, mas como isso se traduz em 0multiplicar esse número, tudo bem. Além disso, alinha os valores para usar [x]corretamente.

Brincadeira
fonte
2

Haskell , 89 88 bytes

Guardou um byte graças a ovs

import Data.List
(%)=mod
m?n|n<1=0|n%100<10=m?div n 100|w<-n-10=m*10?w+m*n%10
sortOn(1?)

A última linha define uma função anônima que pode ser usada assim:

> sortOn(1?)[19, 91, 2345, 2023]
[19,2023,2345,91]

A funcionalidade principal é fornecida pelo operador infix, (?)que monitora um multiplicador me a entrada RLE restante n. (?)subtrai continuamente 10 de nenquanto há um dígito de dezenas para subtrair e, ao fazê-lo, empurra outra cópia do dígito final para a frente da saída (via multiplicador m, que é aumentado em 10 a cada vez). Quando o valor das dezenas termina, os dois dígitos finais são descartados e o processo se repete até que o número seja reduzido a 0. Finalmente, usamos o operador (com um multiplicador inicial de 1) como uma chave de classificação.

nitroso
fonte
1
m?n|n<1=0|n%100<10=m?div n 100|w<-n-10=m*10?w+m*n%10é um byte mais curto.
ovs 17/08/19
2

Casca , 10 bytes

ÖödṁΓ*C_2d

Experimente online!

Explicação

ÖödṁΓ*C_2d    Full function
Ö             Sort the input list by the result of...
 ö            The composition of these four functions:
         d      Convert to a list of digits
      C_2       Split into length-2 sublists starting at the end
   ṁ            Map the following function and concatenate the results:
    Γ*            Repeat the list tail X times, where X is the list head
  d             Convert back to an integer
Sophia Lechner
fonte
2

Dyalog APL, 41 39 36 35 31 30 29 bytes

f←⊂⌷¨⍨∘⍋{10⊥∊⍴⌿0 10100⊥⍣¯1⊢⍵}¨

Experimente online!

-2 graças a Vacas charlatão
-4 (mais -4 para a idéia de conversão de base) graças a ngn
-2 obrigado, então H.PWiz

dzaima
fonte
⊃,/pode se tornar
Kritixi Lithos
@Cowsquack eu sabia que estava esquecendo um built-in: p
dzaima
{⍺⍴⍨⍎⍵}->⍴⍨∘⍎
NGN
@ngn é claro, eu nunca consigo lembrar todo o jota / coisas de trem
dzaima
aqui está outro truque para -1 byte - trainify {⍵[⍋F ⍵]}como⊂⌷¨⍨∘⍋F
NGN
2

C (gcc) (sistemas de 32 bits), 188 177 176 bytes

char*p,*q,c[99],b[99]="0";i;d(x){for(p=b+!(sprintf(b+1,"%d",x)&1),q=c;i=*p++;++p)for(i-=48;i--;*q++=*p);*q=0;atoi(c);}m(int*a,int*b){return d(*a)-d(*b);}s(l,c){qsort(l,c,4,m);}

Experimente online!

em amd64adicionar sinalizador -m32para compilação.

Uso : s(x,n);onde xaponta para uma matriz de números inteiros para classificar e né o comprimento dessa matriz.

O segundo caso de teste fornece um resultado errado, porque a conversão 25257fornece 2222277777um número inteiro de 32 bits que ultrapassa o limite - foi adicionado um quinto caso de teste sem esse número.

Explicação:

char*p,                                     // d(): input pointer
    *q,                                     // d(): output pointer
    c[99],                                  // d(): output buffer
    b[99]="0";                              // d(): input buffer
                                            //      (fixed first char 0)
i;                                          // d(): repeat counter

d(x){                                       // conversion function
    for(
            p=b+!(sprintf(b+1,"%d",x)&1),   // print number in decimal to
                                            // input buffer, starting at second
                                            // character, initialize input
                                            // pointer to first or second char
                                            // depending on the length of the
                                            // number
            q=c;                            // initialize output pointer
            i=*p++;                         // set repeat counter to digit and
                                            // point to next digit, stop when
                                            // NUL character is found
            ++p)                            // point to next digit after loop
        for(i-=48;i--;*q++=*p);             // inner loop, append current digit
                                            // i-48 ('0') times to output buffer
    *q=0;                                   // terminate output with NUL
    atoi(c);                                // convert to number, 'return' not
                                            // needed as atoi() leaves result
                                            // on the stack
}

m(int*a,int*b){                             // comparison function for qsort
    return d(*a)-d(*b);                     // return difference of converted
}                                           // values

s(l,c){                                     // sorting function
    qsort(l,c,4,m);                         // only "wrap" qsort, assuming
}                                           // sizeof(int) is 4
Felix Palmen
fonte
Sua função d()é longa por causa de strings e funções relacionadas a elas; você pode salvar muitos bytes apenas lendo os últimos 2 dígitos e construindo a saída da seguinte maneira: o;u;i;d(x){for(u=1,o=0;x;x/=100)for(i=0;i++<x%100/10;o+=x%10*u,u*=10);x=o;}m(int*a,int*b){u=d(*a)-d(*b);}s(l,c){qsort(l,c,4,m);}você também salvará bytes evitando declarar e inicializar chars.
Annyo
Boa ideia - acho que trabalhar com valores inteiros faz com que essa abordagem seja completamente diferente; portanto, considere postar uma resposta? :)
Felix Palmen
Sugerir em b-~sprintf(b+1,"%d",x)%2vez deb+!(sprintf(b+1,"%d",x)&1)
ceilingcat 19/12/19
@Annyo sugerir em x/10%10vez dex%100/10
tetocat
1

Python 2 , 102 101 97 101 bytes

lambda l:sorted(l,key=lambda x:int(''.join(v*int(c)for c,v in zip(*[iter(`x`[len(`x`)%2:])]*2))or 0))

Experimente online!

TFeld
fonte
@sundar Não se preocupe, fixa
TFeld
1

Braquilog , 18 bytes

{↔ġ₂ẹ{Ċj₎|Ȯt}ˢ↔c}ᵒ

Experimente online!

Explicação

Cargas de pequenas coisas necessárias para explicar os três casos diferentes: número ímpar de dígitos, par de 0 vezes o número e pares normais.

{               }ᵒ     Order the Input according to the output of this predicate
 ↔                       Reverse the number
  ġ₂                     Group into pairs; the last digit is alone if there are
                           an odd number of them
    ẹ{      }ˢ           For each group:
      Ċ                    If there are two elements
       j₎                  Juxtapose the first one as many times as the second
                             element (won't work if the second element is 0)
         |                 Else
          Ȯ                If there is one element (odd number of digits)
           t               just take that element
                           (Else don't select anything, i.e. 0 repetitions)
              ↔c         Reverse and concatenate back into an integer
Fatalizar
fonte
Eu acho que isso |Ȯté desnecessário e, na verdade, o classifica errado: equivale a preencher com 1 em vez de 0, então, dado [125, 26, 1], classifica-o como [1, 26, 125] em vez de [1 125, 26].
sundar - Restabelece Monica
1

Perl 5 , 76 bytes

Uma função em vez de uma linha por uma vez.

Para a frente: gclassifica as entradas numericamente, usando hpara converter os números. hfaz isso usando o regex s/(.)(.)/$2x$1/gre(que provavelmente é legível o suficiente). E o 0preenchimento esquerdo é feito com 0 x("@_"=~y///c%2)."@_"(onde y///chá uma maneira abreviada de escrever length, xé o operador de repetição e .a concatenação).

sub h{(0 x("@_"=~y///c%2)."@_")=~s/(.)(.)/$2x$1/gre}sub g{sort{h($a)-h$b}@_}

Experimente online!

Estou esperando ver algumas respostas mais curtas de Perl!

dada
fonte
1

Retina , 44 bytes

^.?((..)*)$
$1 $&
%)`\G(\d)(.)
$1*$2
N`
.+ 

Experimente online! Gerar a chave de classificação no início da linha é mais difícil, mas o estágio de classificação curta resulta em uma economia geral de 3 bytes. Explicação:

%)`

Aplique os dois primeiros estágios em cada linha individualmente.

^.?((..)*)$
$1 $&

Combine e copie um número par de dígitos à direita.

\G(\d)(.)
$1*$2

Substitua cada par de dígitos pelo valor descrito. Isso \G\dfaz com que a partida pare no espaço.

N`

Classifique numericamente.

.+ 

Exclua as chaves de classificação.

Neil
fonte
Esse é um truque inteligente para classificar por uma chave. Um bom.
sundar - Restabelece Monica
1

05AB1E , 20 19 bytes

ΣDgÉi¦}2ôε`sиJ}J0ìï

Correção de bug para +1 byte e, em seguida, alterou para -2 bytes graças a @sundar .

Experimente online ou verifique todos os casos de teste .

Definitivamente pode ser jogado golfe .. Não estou muito feliz com isso tbh ..

Explicação:

Σ                    # Sort by:
 Dg                  #  Duplicate the current number, and take it's length
                     #   i.e. 25257 → 5
                     #   i.e. 4 → 1
   Éi }              #  If this length is odd:
     ¦               #   Remove the first digit
                     #    i.e. 25257 → '5257'
                     #    i.e. 4 → ''
       2ô            #  Then split the number in pieces of 2
                     #   i.e. '5257' → ['52','57']
                     #   i.e. '' → []
         ε    }      #  And map each to:
          `          #   Push both digits to the stack
                     #    i.e. '52' → '5' and '2'
           s         #   Swap them
            и        #   Repeat the first digit the second digit amount of times
                     #    i.e. '2' and '5' → ['2','2','2','2','2']
             J       #   Join the list of digits together
                     #    i.e. ['2','2','2','2','2'] → '22222'
               J     #  Join all numbers back together again
                     #   i.e. ['','22222','77777'] → '2222277777'
                     #   i.e. [] → ''
                0ì   #  Prepend a 0 (because `Σ` will put all '' at the back)
                     #   i.e. 2222277777 → '02222277777'
                     #   i.e. '' → '0'
                  ï  #  Cast it to an integer, because sorting is done string-wise by
                     #  default despite 05AB1E's interchangeability of strings and numbers;
                     #  and it's also to remove all leading zeros
                     #   i.e. '02222277777' → 2222277777
                     #   i.e. '0' → 0
Kevin Cruijssen
fonte
1

Anexo , 50 bytes

SortBy!N@Flip##~`&&>PadRight&0&2=>Chop&2@Flip@List

Experimente online!

Explicação

SortBy!N@Flip##~`&&>PadRight&0&2=>Chop&2@Flip@List      anonymous function, argument: [a1..aN]
SortBy!                                                 sort the given array by grading f[ai]
                                                        e.g. 42513
                                              List      digits of ai
                                                        e.g. [4, 2, 5, 1, 3]
                                         Flip@          flip the digits around
                                                        e.g. [3, 1, 5, 2, 4]
                                  Chop&2@               chop into groups of 2
                                                        e.g. [[3, 1], [5, 2], [4]]
                    PadRight&0&2=>                      pad each group to size 2 with 0's
                                                        e.g. [[3, 1], [5, 2], [0, 4]]
                  &>                                    using each sub array as arguments...
               ~`&                                      ...repeat the 2nd the 1st amount of times
                                                        e.g. [[1, 1, 1], [2, 2, 2, 2, 2], []]
             ##                                         then:
         Flip                                           reverse the groups
                                                        e.g. [[2, 2, 2, 2, 2], [1, 1, 1]]
       N@                                               then convert it to an number
                                                        e.g. 22222111
Conor O'Brien
fonte
1

JavaScript (ES8), 72 70 bytes

a=>a.sort((a,b)=>(g=n=>n&&g(n/100|0)+''.padEnd(n/10%10,n%10))(a)-g(b))

Experimente online!

Arnauld
fonte
1

Japonês, 13 bytes

ñ_ì_ò2n)®rçì

Experimente ou execute todos os casos de teste


Explicação

ñ_                :Sort by passing each integer through a function
  ì_              :  Split to an array of digits, pass it through the following function and implicitly convert back to an integer
    ò2n)          :    Starting from the end of the array, split at every second element
        ®         :    Map
         rç       :      Reduce X & Y by repeating X Y times
           Ã      :    End mapping
            ¬     :    Join
Shaggy
fonte
0

Java 11, 204 189 bytes

L->{L.sort((a,b)->Long.compare(s(a+""),s(b+"")));}long s(String s){var r="";for(int l=s.length(),i=l%2;i<l;)r+=s.split("")[++i].repeat(s.charAt(i++-1)-48);return r.isEmpty()?0:new Long(r);}

Toma uma lista de longos como parâmetro e classifica essa lista de entrada (sem retornar uma nova lista).

Experimente on-line (NOTA: String.repeat(int)é emulado repeat(String,int)porque o Java 11 ainda não está no TIO. A contagem de bytes permanece a mesma.)

Explicação:

L->{                     // Method with ArrayList<Long> parameter and no return-type
  L.sort(                //  Sort the list by:
   (a,b)->Long.compare(  //   Using a builtin Long-comparator with:
     s(a+""),s(b+"")));} //   The correctly formatted values as described in the challenge

long s(String s){        // Separated method with String parameter and long return-type
  var r="";              //  Temp-String, starting empty
  for(int l=s.length(),  //  The length of the input-String
      i=l%2;i<l;)        //   If the length is even:
                         //    Loop `i` in the range [0,`l`) (in steps of 2)
                         //   Else (the length is odd):
                         //    Loop `i` in the range [1,`l`) (in steps of 2) instead
    r+=                  //   Append the result-String with:
      s.split("")[++i].  //    The digit at index `i+1`
      .repeat(s.charAt(i++-1)-48);
                         //    Repeated the digit at index `i` amount of times
  return r.isEmpty()?    //  If the temp-String is empty:
          0              //   Return 0
         :               //  Else:
          new Long(r);}  //   Convert the temp-String to a long and return it
Kevin Cruijssen
fonte
Olá, o desafio proíbe explicitamente a entrada de string, desculpe! (Estou tentado a permitir que ele for Java, mas não seria justo para as outras respostas.)
sundar - Reintegrar Monica
@ Sundar Ah, perdi esse requisito; meu mal .. Felizmente, é uma solução fácil de apenas adicionar 2x +""para converter o número em String. Deve ser corrigido agora. :)
Kevin Cruijssen
1
Agradável. Eu não esperava isso do Java. :)
sundar - Reinstate Monica