Produza o maior número com o menor número de dígitos


37

Dada uma lista não vazia de números inteiros decimais positivos, imprima o maior número do conjunto de números com o menor número de dígitos.

A lista de entrada não estará em nenhuma ordem específica e pode conter valores repetidos.

Exemplos:

[1] -> 1
[9] -> 9
[1729] -> 1729
[1, 1] -> 1
[34, 3] -> 3
[38, 39] -> 39
[409, 12, 13] -> 13
[11, 11, 11, 1] -> 1
[11, 11, 11, 11] -> 11
[78, 99, 620, 1] -> 1
[78, 99, 620, 10] -> 99
[78, 99, 620, 100] -> 99
[1, 5, 9, 12, 63, 102] -> 9
[3451, 29820, 2983, 1223, 1337] -> 3451
[738, 2383, 281, 938, 212, 1010] -> 938

O código mais curto em bytes vence.


Os números de entrada podem estar em linhas separadas?
seshoumara

@seshoumara Isso parece razoável, sim.
Hobbies de Calvin

Respostas:


13

Pitão, 7 3 6 bytes

eS.ml`

Suíte de teste

Explicação:

e      Still grab the last element
 S      Still sort
  .ml`   But prefilter the list for those with the (m)inimum length.

Solução de 7 bytes:

eSh.gl`

Suíte de teste

Explicação:

   .g   Group items in (implicit) input by:
     l  The length of
      ` their representation
  h     Get those with the shortest length
 S      Sort the resulting list
e       and grab the last (i.e. largest) element

6

Python 2, 48 42 bytes

-6 bytes graças a @Dennis (use em minvez de sorted)

lambda l:min(l,key=lambda x:(len(`x`),-x))

Todos os casos de teste estão em ideone

Pegue o mínimo da lista em (comprimento, valor)


11
mindeve funcionar em vez de sorted.
Dennis

@ Dennis, oh caramba - obrigado! Provavelmente diferente o suficiente para ter postado isso você mesmo.
Jonathan Allan

Trocando sorted()[0]por min? Considero que uma modificação trivial do seu código original.
Dennis

Também tem len(`x`)+1./xo mesmo comprimento. Pena que você precisa do 1..
xnor

Bem, isso é mais curto do que eu inventei. Bom trabalho!
Mbomb007

6

Geléia , 7 bytes

DL,NµÞḢ

Teste-o em TryItOnline
Ou veja todos os casos de teste também em TryItOnline

Quão?

DL,NµÞḢ - Main link takes one argument, the list, e.g. [738, 2383, 281, 938, 212, 1010]
D       - convert to decimal, e.g. [[7,3,8],[2,3,8,3],[2,8,1],[9,3,8],[2,1,2],[1,0,1,0]]
 L      - length, e.g. [3,4,3,3,3,4]
   N    - negate, e.g [-738, -2383, -281, -938, -212, -1010]
  ,     - pair, e.g. [[3,-738],[4,-2383],[3,-281],[3,-938],[3,-212],[4,-1010]]
    µ   - make a monadic chain
     Þ  - sort the input by that monadic function, e.g [938,738,281,212,2383,1010]
          (the lists in the example are not created, but we sort over the values shown)
      Ḣ - pop and return the first element, e.g. 938

11
Grande uso do tipo!
miles

@miles seu caminho ainda foi inspirado :)
Jonathan Allan

5

05AB1E , 5 bytes

Código:

({é¬(

Explicação:

(      # Negate the list, e.g. [22, 33, 4] -> [-22, -33, -4]
 {     # Sort, e.g. [-22, -33, -4] -> [-33, -22, -4]
  é    # Sort by length, e.g. [-33, -22, -4] -> [-4, -22, -33]
   ¬   # Get the first element.
    (  # And negate that.

Usa a codificação CP-1252 . Experimente online!



4

MATL , 14 bytes

10&YlktX<=G*X>

Experimente online!

Explicação:

  &Yl           % Log
10              % Base 10
     kt         % Floor and duplicate
       X<       % Find the smallest element
         =      % Filter out elements that do not equal the smallest element
          G     % Push the input again
           *    % Multiply (this sets numbers that do not have the fewest digits to 0)
            X>  % And take the maximum

4

Retina ,24 16 bytes

O ^ `
O $ # `
$ .0
G1`

Experimente online! ou execute todos os casos de teste .

Economizou 8 bytes graças a Martin!

O teste all está usando uma versão um pouco mais antiga do código, mas o algoritmo é idêntico. Vou atualizá-lo para ficar mais próximo quando tiver mais tempo.

A nova linha à direita é significativa. Classifica os números pelo valor numérico reverso e depois os classifica pelo número de dígitos. Isso nos deixa com o maior número com o menor número de dígitos na primeira posição, para que possamos excluir os dígitos restantes.


Se você fizer a entrada de linha separada pela alimentação, poderá omitir a regex dos dois estágios de classificação e, em seguida, usá G1`-lo no último estágio.
Martin Ender

Além disso, o primeiro estágio não precisa #. Você se preocupa apenas com a ordem relativa de um determinado comprimento inteiro e, em um comprimento, a classificação lexicográfica de números está correta.
Martin Ender

@MartinEnder Thanks! Adicionei as duas dicas. Eu deveria ter sugerido \w+como o padrão para a classificação, dessa forma eu não teria necessidade de luta tanto para fazer os conjuntos de testes;)
FryAmTheEggman

Aqui estão outros 16, caso isso lhe dê alguma idéia para continuar jogando: retina.tryitonline.net/…
Martin Ender

4

Mathematica, 33 31 bytes

Max@MinimalBy[#,IntegerLength]&

MinimalBy seleciona todos os elementos da lista de entrada original com a menor pontuação de acordo com IntegerLength, ou seja, com o menor número de dígitos; e então Max produz o maior.

Obrigado a Martin Ender por encontrar e salvar 2 bytes para mim :)


4

Perl 6 , 18 bytes

*.min:{.chars,-$_}

Explicação:

*\        # Whatever lambda
.min:     # find the minimum using

{         # bare block lambda with implicit parameter 「$_」

  .chars, # number of characters first ( implicit method call on 「$_」 )
  -$_     # then negative of the value in case of a tie
}

Uso:

say [738, 2383, 281, 938, 212, 1010].&( *.min:{.chars,-$_} ); # 938

my &code = *.min:{.chars,-$_}

say code [78, 99, 620, 10]; # 99

3

Gelatina , 8 bytes

DL€İMị¹Ṁ

Experimente online! ou Verifique todos os casos de teste.

Explicação

DL€İMị¹Ṁ  Input: list A
D         Convert each integer to a list of base 10 digits
 L€       Get the length of each list (number of digits of each)
   İ      Take the reciprocal of each
    M     Get the indices of the maximal values
      ¹   Get A
     ị    Select the values at those indices from A
       Ṁ  Find the maximum and return

Como são esses 8 bytes? Todos esses caracteres se encaixam em ASCII?
Federico Poloni

11
@FedericoPoloni Sim, eles se encaixam , embora em outra página de código.
Erik the Outgolfer

3

JavaScript (ES6), 51

l=>l.sort((a,b)=>(a+l).length-(b+l).length||b-a)[0]

Teste

f=l=>l.sort((a,b)=>(a+l).length-(b+l).length||b-a)[0]

;[
 [[1], 1]
,[[9], 9]
,[[1729], 1729]
,[[1, 1], 1]
,[[34, 3], 3]
,[[38, 39], 39]
,[[409, 12, 13], 13]
,[[11, 11, 11, 1], 1]
,[[11, 11, 11, 11], 11]
,[[78, 99, 620, 1], 1]
,[[78, 99, 620, 10], 99]
,[[78, 99, 620, 100], 99]
,[[1, 5, 9, 12, 63, 102], 9]
,[[3451, 29820, 2983, 1223, 1337], 3451]
,[[738, 2383, 281, 938, 212, 1010], 938]
].forEach(([l,x])=>{
  var r=f(l)
  console.log(r==x?'OK':'KO',l+' -> '+r)
})  


3

J, 21 14 bytes

Economizou 7 bytes graças a milhas e (indiretamente) Jonathan!

{.@/:#@":"0,.-

Esta é uma cadeia de quatro:

{.@/: (#@":"0 ,. -)

Vamos passar por cima da entrada 10 27 232 1000. O garfo interno consiste em três dentes. #@":"0calcula os tamanhos, ,.concata cada tamanho com seu -membro negado ( ). Para entrada 10 27 232 1000, ficamos com isso:

   (#@":"0 ,. -) 10 27 232 1000
2   _10
2   _27
3  _232
4 _1000

Agora, temos {.@/:como dente externo. Isso é monádico primeiro ( {.) sobre tipo diádico ( /:). Ou seja, pegaremos o primeiro elemento do resultado da diádica /:. Isso classifica o argumento correto de acordo com o argumento esquerdo, o que nos fornece como entrada:

   (/: #@":"0 ,. -) 10 27 232 1000
27 10 232 1000

Então, usar {.nos fornece o primeiro elemento dessa lista e estamos prontos:

   ({.@/: #@":"0 ,. -) 10 27 232 1000
27

Versão antiga

>./@(#~]=<./@])#@":"0

Ainda trabalhando em melhorias. Joguei a partir dos 30, e acho que isso é bom o suficiente. Vou primeiro dividi-lo em partes básicas:

   size =: #@":"0
   max =: >./
   min =: <./
   over =: @
   right =: ]
   left =: [
   selectMin =: #~ right = min over right

   f =: max over selectMin size
   f 3 4 5
5
   f 3 4 53
4
   f 343 42 53
53

Veja como isso funciona.

>./@(#~ ] = <./@]) #@":"0

Este é um trem monádico, mas esta parte é um gancho. O verbo >./@(#~ ] = <./@])é chamado com argumento esquerdo como a entrada para a cadeia principal e os tamanhos, definidos como #@":"0, como argumento correto. Isso é calculado como comprimento ( #) sobre ( @) formato padrão ( ":), ou seja, stringificação numérica, que é aplicada às células 0 (ou seja, membros) da entrada ( "0).

Vamos examinar o exemplo de entrada 409 12 13.

   (#@":"0) 409 12 13
3 2 2

Agora, o verbo interior >./@(#~ ] = <./@]). Parece >./@(...), o que efetivamente significa o valor máximo ( >./) de ( @) o que está dentro (...). Quanto ao interior, este é um trem de quatro, equivalente a este de cinco trens:

[ #~ ] = <./@]

[refere-se ao argumento original e ]refere-se à matriz de tamanho; 409 12 13e 3 2 2respectivamente neste exemplo. O dente certo,, <./@]calcula o tamanho mínimo, 2neste caso. ] = <./@]é uma matriz booleana de valores igual ao mínimo, 0 1 1neste caso. Por fim, [ #~ ...recebe valores do argumento esquerdo de acordo com a máscara do argumento direito. Isso significa que os elementos correspondentes 0são eliminados e 1retidos. Então ficamos com 12 13. Finalmente, de acordo com o exposto acima, o máximo é obtido, fornecendo o resultado correto de 13e pronto.


Alguns embaralhar mais um gancho podem salvar um byte >./@#~[:(=<./)#@":"0. Acho que pode ser um pouco mais para salvar
milhas

@miles XD Acabei de escrever uma explicação. Ah, bem, deixe-me dar uma olhada nessa beleza ...
Conor O'Brien

Jonathan encontrou um método melhor. Se o convertermos em J, seus 14 bytes, {.@/:#@":"0,.-mas a entrada deverá ser modelada como uma lista
milhas

@miles "em forma de lista"? Você quer dizer 400 12 13?
Conor O'Brien

2

JavaScript (ES6), 62 bytes

var solution =

a=>a.map(n=>(l=`${n}`.length)>a?l>a+1|n<r?0:r=n:(a=l-1,r=n))|r

;document.write('<pre>' + `
[1] -> 1
[9] -> 9
[1729] -> 1729
[1, 1] -> 1
[34, 3] -> 3
[38, 39] -> 39
[409, 12, 13] -> 13
[11, 11, 11, 1] -> 1
[11, 11, 11, 11] -> 11
[78, 99, 620, 1] -> 1
[78, 99, 620, 10] -> 99
[78, 99, 620, 100] -> 99
[1, 5, 9, 12, 63, 102] -> 9
[3451, 29820, 2983, 1223, 1337] -> 3451
[738, 2383, 281, 938, 212, 1010] -> 938
`.split('\n').slice(1, -1).map(c =>
  c + ', result: ' + solution(eval(c.slice(0, c.indexOf('->'))))
).join('\n'))


2

dc, 54 bytes

?dZsL0sN[dsNdZsL]su[dlN<u]sU[dZlL=UdZlL>ukz0<R]dsRxlNp

Explicação:

?dZsL0sN                  # read input, initialize L (length) and N (number)
[dsNdZsL]su               # macro (function) 'u' updates the values of L and N
[dlN<u]sU                 # macro 'U' calls 'u' if N < curr_nr
[dZlL=U dZlL>ukz0<R]dsR   # macro 'R' is a loop that calls 'U' if L == curr_nr_len
                          #or 'u' if L > curr_nr_len
xlNp                      # the main: call 'R' and print N at the end

Exemplo de execução: 'input.txt' contém todos os casos de teste na declaração da pergunta

while read list;do echo "$list -> "$(dc -f program.dc <<< $list);done < input.txt

Saída:

1 -> 1
9 -> 9
1729 -> 1729
1 1 -> 1
34 3 -> 3
38 39 -> 39
409 12 13 -> 13
11 11 11 1 -> 1
11 11 11 11 -> 11
78 99 620 1 -> 1
78 99 620 10 -> 99
78 99 620 100 -> 99
1 5 9 12 63 102 -> 9
3451 29820 2983 1223 1337 -> 3451
738 2383 281 938 212 1010 -> 938

2

Java 7, 112 104 bytes

int c(int[]a){int i=a[0],j;for(int b:a)i=(j=(i+"").length()-(b+"").length())>0?b:b>i&j==0?b:i;return i;}

Abordagem diferente para salvar vários bytes graças ao @ Barteks2x .

Casos não testados e de teste:

Experimente aqui.

class M{
  static int c(int[] a){
    int i = a[0],
        j;
    for(int b : a){
      i = (j = (i+"").length() - (b+"").length()) > 0
           ? b
           : b > i & j == 0
              ? b
              : i;
    }
    return i;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1 }));
    System.out.println(c(new int[]{ 9 }));
    System.out.println(c(new int[]{ 1729 }));
    System.out.println(c(new int[]{ 1, 1 }));
    System.out.println(c(new int[]{ 34, 3 }));
    System.out.println(c(new int[]{ 409, 12, 13 }));
    System.out.println(c(new int[]{ 11, 11, 11, 1 }));
    System.out.println(c(new int[]{ 11, 11, 11, 11 }));
    System.out.println(c(new int[]{ 78, 99, 620, 1 }));
    System.out.println(c(new int[]{ 78, 99, 620, 100 }));
    System.out.println(c(new int[]{ 1, 5, 9, 12, 63, 102 }));
    System.out.println(c(new int[]{ 3451, 29820, 2983, 1223, 1337 }));
    System.out.println(c(new int[]{ 738, 2383, 281, 938, 212, 1010 }));
  }
}

Saída:

1
9
1729
1
3
13
1
11
1
99
9
3451
938

11
versão mais curta: int c (int [] a) {int i = a [0], j; para (int b: a) i = (j = (i + ""). length () - (b + ""). length ())> 0? b: b> i & j == 0? b: i; return i;}
barteks2x 17/16

@ Barteks2x Obrigado, eu editei.
Kevin Cruijssen 17/09/09

2

bash, awk, classifique 53 bytes

set `awk '{print $0,length($0)}'|sort -rnk2n`;echo $1

Ler entrada de stdin, um valor por linha

bash e classificação, 58 57 bytes

set `sort -n`;while((${#2}==${#1}));do shift;done;echo $1


não funciona para última amostra deu 2.383 em vez de 938
Archemar

@Archemar desculpe, eu descaracterizou a pergunta, é corrigido agora
Emmanuel

Você pode remover o espaço entre whilee ((.
seshoumara

1

JavaScript ES6, 80 77 70 bytes

a=>Math.max(...a.filter(l=>l.length==Math.min(...a.map(i=>i.length))))

Espero estar indo na direção certa ...


Você poderia substituir a.map(i=>i.length).sort((a,b)=>a-b)[0]por Math.min(...a.map(i=>i.length))?
User81655

@ user81655 Sim, eu posso. Eu pensei que eu tinha feito essa edição, mas aparentemente não o fiz
Downgoat

Você também pode tentar negar o mínimo para poder reutilizar o Math.max: a=>(m=Math.max)(...a.filter(l=>l.length==-m(...a.map(i=>-i.length))))Parece economizar apenas 1 byte.
user81655

Para outro byte, o valor filterpode ser substituído por um mapque retorne 0para valores que não passam no teste:a=>(m=Math.max)(...a.map(l=>l.length+m(...a.map(i=>-i.length))?0:l))
user81655

1

Braquilog , 16 bytes

or:@]feL:la#=,Lh

Experimente online!

Explicação

or                 Sort the list in descending order.
  :@]f             Find all suffixes of the list.
      eL           Take one suffix L of the list.
        :la        Apply length to all numbers in that suffix.
           #=,     All lengths must be equal.
              Lh   Output is the first element of L.

1

Haskell, 39 bytes

snd.maximum.map((0-).length.show>>=(,))

Isso não funciona, ele prefere 34a 2.
xnor

ah obrigada Eu tenho que repensar isso ..
Damien

Funciona melhor agora!
Damien

1

Javascript (ES6), 57 54 53 bytes

l=>l.sort((a,b)=>(s=a=>1/a+`${a}`.length)(a)-s(b))[0]

Para o registro, minha versão anterior era mais orientada para matemática, mas 1 byte maior:

l=>l.sort((a,b)=>(s=a=>1/a-~Math.log10(a))(a)-s(b))[0]

Casos de teste

let f =
l=>l.sort((a,b)=>(s=a=>1/a+`${a}`.length)(a)-s(b))[0]

console.log(f([1]));                              //  -> 1
console.log(f([9]));                              //  -> 9
console.log(f([1729]));                           //  -> 1729
console.log(f([1, 1]));                           //  -> 1
console.log(f([34, 3]));                          //  -> 3
console.log(f([38, 39]));                         //  -> 39
console.log(f([409, 12, 13]));                    //  -> 13
console.log(f([11, 11, 11, 1]));                  //  -> 1
console.log(f([11, 11, 11, 11]));                 //  -> 11
console.log(f([78, 99, 620, 1]));                 //  -> 1
console.log(f([78, 99, 620, 10]));                //  -> 99
console.log(f([78, 99, 620, 100]));               //  -> 99
console.log(f([1, 5, 9, 12, 63, 102]));           //  -> 9
console.log(f([3451, 29820, 2983, 1223, 1337]));  //  -> 3451
console.log(f([738, 2383, 281, 938, 212, 1010])); //  -> 938


1

MATL , 11 bytes

tV48\&XS0))

Entrada é um vetor de coluna (usando ;como separador), como

[78; 99; 620; 100]

Experimente online! Ou verifique todos os casos de teste .

Explicação

Vamos usar a entrada [78; 99; 620; 100]como um exemplo.

t      % Input column vector implicitly. Duplicate
       %   STACK: [78; 99; 620; 100], [78; 99; 620; 100]
V      % Convert to string. Each number is a row, left-padded with spaces
       %   STACK: [78; 99; 620; 100], [' 78'; ' 99'; '620'; '100']
48\    % Modulo 48. This transforms each digit into the corresponding number,
       % and space into 32. Thus space becomes the largest "digit"
       %   STACK: [78; 99; 620; 100], [32 7 8; 32 9 9; 6 2 0; 1 0 0]
&XS    % Sort rows in lexicographical order, and push the indices of the sorting
       %   STACK: [78; 99; 620; 100], [4; 3; 1; 2]
0)     % Get last value
       %   STACK: [78; 99; 620; 100], 2
)      % Index
       %   STACK: 99
       % Implicitly display

11
É bom ver os estados da pilha na sua explicação!
flawr

1

Perl, 38 37 bytes

Inclui +1 para -a

Dê entrada no STDIN:

perl -M5.010 maxmin.pl <<< "3451 29820 2983 1223 1337"

maxmin.pl:

#!/usr/bin/perl -a
\$G[99-y///c][$_]for@F;say$#{$G[-1]}

Usa memória linear no maior número, portanto, não tente isso em números muito grandes. Uma solução sem essa falha é de 38 bytes:

#!/usr/bin/perl -p
$.++until$\=(sort/\b\S{$.}\b/g)[-1]}{

Tudo isso é muito estranho e nem parece ótimo ...


1

R, 72 41 36 bytes

Reescreva a função com uma nova abordagem. Jogou 5 bytes com uma sugestão de @bouncyball.

n=nchar(i<-scan());max(i[n==min(n)])

Explicado:

        i<-scan()       # Read input from stdin
n=nchar(         );     # Count the number of characters in each number in i
max(             )      # Return the maximum of the set where
    i[n==min(n)]        # the number of characters is the minimum number of characters.

function(i){while(1){if(length(o<-i[nchar(i)==T]))return(max(o));T=T+1}}

Recuado / explicado:

function(i){               # Take an input i
  while(1){                # Do the following continuously:
    if(length(
        o<-i[nchar(i)==T]) # Define o to be the subset of i with numbers of length T,
      )                    # where T is 1 (a built-in!).
                           # We take the length of this subset (its size), and then pass
                           # it to if(). Thanks to weak typing, this numeric is converted
                           # to a logical value. When this occurs, zero evaluates to FALSE
                           # and any non-zero number evaluates to TRUE. Therefore, the if()
                           # is TRUE iff the subset is not empty.
      return(max(o));      # If it's true, then we just return the largest element of the
                           # subset, breaking out of our loop.
    T=T+1                  # Otherwise, increment our counter and continue.
  }
}


11
Salve 4 bytes não definindo function:i=scan();n=nchar(i);max(i[n==min(n)])
bouncyball 16/16

@bouncyball Thanks! E mais 1 byte salvo por n=nchar(i<-scan()).
R16 #

1

Bash + coreutils, 58 bytes

d=`sort -n`;egrep ^.{`sed q<<<"$d"|wc -L`}$<<<"$d"|tail -1

O formato de entrada é um valor por linha. Sugestões de golfe são bem-vindas.

Explicação:

d=`sort -n`                             #save the list in ascending numerical order
egrep ^.{                    }$<<<"$d"  #print only list lines having as many chars
         `sed q<<<"$d"|wc -L`                 #as the first sorted line does
|tail -1                                #and then get the last one (the answer)

+1 obrigado agora eu sei que sed q=head -1
Emmanuel

1

Python 2 - 41 bytes

lambda l:max((-len(`x`),x) for x in l)[1]

0

Python 2, 58 bytes

def F(x):l={len(`i`):i for i in sorted(x)};print l[min(l)]

0

Python 3, 56 bytes

lambda a:sorted(sorted(a),key=lambda x:-len(str(x)))[-1]

Usa um lambda em um lambda!

Python 2, 53 bytes

s=lambda a:sorted(sorted(a),key=lambda x:-len(`x`))[-1]

O mesmo, mas com retalhos


0

Pip , 11 bytes

(SNgSK-#_v)

Recebe a entrada como argumentos da linha de comando. Experimente online!

Primeira vez em que utiliza o operador com Sorifício K! Como o Python sorted(), é necessária uma função que é aplicada a cada item do iterável e o resultado usado como uma chave de classificação. Veja como este programa funciona:

 SNg         List of cmdline args, sorted numerically in increasing order
    SK       Sort with key function...
      -#_    ... negative length(x), thus putting the shortest numbers at the end but not
               affecting the relative ordering among numbers with the same length
(        v)  Get the last element (index -1) and auto-print

0

Clojure, 63 bytes

(reduce #(if(=(quot %1 10)(quot %2 10))(max %1 %2) %1)(sort x)) 

como em:

(reduce #(if(=(quot %1 10)(quot %2 10))(max %1 %2) %1)(sort[3 7 121 11 8 2 10 9]))
=> 9

Embora eu tenha certeza de que há uma maneira de torná-lo menor.


0

PHP, 86 bytes

<?$l=strlen($r=min($a=$_GET[a]));foreach($a as$v)if($v>$r&strlen($v)==$l)$r=$v;echo$r;
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.