Выведите наибольшее число с наименьшим количеством цифр


37

Учитывая непустой список положительных десятичных целых чисел, выведите наибольшее число из набора чисел с наименьшим количеством цифр.

Список ввода не будет в каком-либо определенном порядке и может содержать повторяющиеся значения.

Примеры:

[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

Самый короткий код в байтах побеждает.


Могут ли вводимые числа быть в отдельных строках?
Сешумара

@seshoumara Это звучит разумно, да.
Увлечения Кэлвина

Ответы:


13

Pyth, 7 3 6 байт

eS.ml`

Тестирование

Объяснение:

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

7-байтовое решение:

eSh.gl`

Тестирование

Объяснение:

   .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 байта

-6 байт благодаря @Dennis (используйте, minа не sorted)

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

Все тесты в идеале

Взять минимум списка по (длина, -значение)


1
minдолжен работать вместо sorted.
Деннис

@ Денис, о боже - спасибо! Вероятно, достаточно отличается, чтобы опубликовать это самостоятельно, хотя.
Джонатан Аллан

Обмен sorted()[0]на min? Я считаю это тривиальной модификацией вашего оригинального кода.
Деннис

Там тоже len(`x`)+1./xдля такой же длины. Жаль, что тебе нужно 1..
xnor

Ну, это короче, чем я придумал. Отличная работа!
mbomb007

6

Желе , 7 байт

DL,NµÞḢ

Протестируйте его в TryItOnline
или посмотрите все тестовые примеры также в TryItOnline

Как?

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

1
Отличное использование сортировки!
мили

@ Майлз ваш путь все еще был вдохновлен :)
Джонатан Аллан

5

05AB1E , 5 байтов

Код:

({é¬(

Объяснение:

(      # 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.

Использует кодировку CP-1252 . Попробуйте онлайн!



4

MATL , 14 байтов

10&YlktX<=G*X>

Попробуйте онлайн!

Объяснение:

  &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

Сетчатка ,24 16 байт

O ^ `
O $ # `
$ 0,0
G1`

Попробуйте онлайн! или запустите все тестовые случаи .

Сохранено 8 байтов благодаря Мартину!

Весь тест использует немного более старую версию кода, но алгоритм идентичен. Я обновлю это, чтобы быть ближе, когда у меня будет больше времени.

Трейлинг новой строки является значительным. Сортирует числа по обратному числовому значению, затем сортирует их по количеству цифр. Это оставляет нам наибольшее число с наименьшим количеством цифр в первой позиции, поэтому мы можем просто удалить оставшиеся цифры.


Если вы сделаете входной перевод строки разделенным, вы можете опустить регулярное выражение на обоих этапах сортировки, а затем использовать G1`для последнего этапа.
Мартин Эндер

Также первый этап не нужен #. Вы заботитесь только об относительном порядке для данной длины целого числа, и в пределах одной длины лексикографическая сортировка чисел является правильной.
Мартин Эндер

@MartinEnder Спасибо! Я добавил оба твоих совета. Я должен был предложить \w+в качестве значения по умолчанию для сортировки, чтобы мне не пришлось так много бороться за создание тестовых наборов;)
FryAmTheEggman

Вот еще 16, на случай, если это даст вам какие-либо идеи для дальнейшего игры в гольф: retina.tryitonline.net/…
Мартин Эндер

4

Mathematica, 33 31 байт

Max@MinimalBy[#,IntegerLength]&

MinimalBy выбирает все элементы исходного списка ввода с наименьшей оценкой в ​​соответствии с IntegerLength, т. Е. С наименьшим количеством цифр; а затем Макс выводит самый большой.

Спасибо Мартину Эндеру за то, что он нашел, а затем сохранил 2 байта для меня :)


4

Perl 6 , 18 байт

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

Объяснение:

*\        # 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
}

Использование:

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

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

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

3

Желе , 8 байт

DL€İMị¹Ṁ

Попробуйте онлайн! или Проверьте все контрольные примеры.

объяснение

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

Как это 8 байтов? Все ли эти символы вписываются в ASCII?
Федерико Полони

1
@FedericoPoloni Да, они подходят , хотя и в другой кодовой странице.
Эрик Outgolfer

3

JavaScript (ES6), 51

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

Тест

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 21 байт

Сохранено 7 байтов благодаря милям и (косвенно) Джонатану!

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

Это четыре цепочки:

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

Давайте пройдемся по входу 10 27 232 1000. Внутренняя вилка состоит из трех пальцев. #@":"0вычисляет размеры, ,.объединяет каждый размер с его элементом negated ( -). Для ввода 10 27 232 1000нам осталось это:

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

Теперь у нас есть {.@/:внешний зуб. Это монадическое значение first ( {.), а не двоичное sort ( /:). То есть мы возьмем первый элемент результата диадики /:. Это сортирует свой правый аргумент в соответствии с его левым аргументом, который дает нам для нашего ввода:

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

Затем использование {.дает нам первый элемент этого списка, и мы закончили:

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

Старая версия

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

Все еще работаю над улучшениями. Я играл в гольф с 30, и я думаю, что это достаточно хорошо. Я собираюсь сначала разбить его на основные части:

   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

Вот как это работает.

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

Это монадический поезд, но эта часть - крюк. Глагол >./@(#~ ] = <./@])вызывается с левым аргументом в качестве входа в основную цепочку, а размеры определяются #@":"0как правый аргумент. Это вычисляется как длина ( #) над (@ ) format ) по умолчанию ":, то есть числовое форматирование строк, которое применяется для применения к 0-ячейкам (то есть элементам) input ( "0).

Давайте пройдемся по примеру ввода 409 12 13 .

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

Теперь для внутреннего глагола >./@(#~ ] = <./@]). Похоже >./@(...), что фактически означает максимальное значение ( >./) of ( @), что внутри (...). Что касается внутренней части, это четыре поезда, эквивалентные этим пяти поездам:

[ #~ ] = <./@]

[ссылается на исходный аргумент и ]ссылается на массив размеров; 409 12 13и 3 2 2соответственно в этом примере. Правильный зубец <./@]вычисляет минимальный размер, 2в этом случае. в данном случае ] = <./@]это логический массив значений, равный минимуму 0 1 1. Наконец, [ #~ ...принимает значения из левого аргумента в соответствии с маской правого аргумента. Это означает, что элементы, которые соответствуют 0, удаляются и 1сохраняются. Итак, мы остались с 12 13. Наконец, в соответствии с вышеизложенным, максимум берется, давая нам правильный результат 13, и мы сделали.


Некоторые тасования плюс хук могут спасти байт >./@#~[:(=<./)#@":"0. Я думаю, что может быть немного больше, чтобы сэкономить
мили

@ Miles XD Я только что закончил писать объяснения. Ах, хорошо, позвольте мне взглянуть на эту красоту ...
Конор О'Брайен

Джонатан нашел лучший метод. Если мы конвертируем его в J, его 14 байтов, {.@/:#@":"0,.-но входные данные должны быть представлены в виде списка
мили

@ миль "в виде списка"? Вы имеете в виду, как 400 12 13?
Конор О'Брайен

2

JavaScript (ES6), 62 байта

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

постоянный ток, 54 байта

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

Объяснение:

?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

Пример выполнения: «input.txt» содержит все контрольные примеры в формулировке вопроса

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

Выход:

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 байта

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;}

Другой подход для сохранения нескольких байтов благодаря @ Barteks2x .

Ungolfed и тестовые случаи:

Попробуй это здесь.

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 }));
  }
}

Выход:

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

1
более короткая версия: int c (int [] a) {int i = a [0], j; для (int b: a) i = (j = (i + ""). length () - (b + ""). length ())> 0? b: b> i & j == 0? b: i; вернуть i;}
barteks2x

@ Barteks2x Спасибо, я редактировал это.
Кевин Круйссен

2

bash, awk, сортировка 53 байта

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

Чтение ввода из стандартного ввода, одно значение в строке

bash and sort, 58 57 байт

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


не работает для последнего образца дал 2383 вместо 938
Archemar

@Archemar извините, я неправильно прочитал вопрос, теперь он исправлен
Эммануэль

Вы можете удалить пространство между whileи ((.
Сешумара

1

JavaScript ES6, 80 77 70 байт

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

Я надеюсь, что я иду в правильном направлении ...


Не могли бы вы заменить a.map(i=>i.length).sort((a,b)=>a-b)[0]на Math.min(...a.map(i=>i.length))?
user81655 16.09.16

@ user81655 Да, я могу. Я думал, что сделал это редактирование, но, видимо, я этого не сделал
Downgoat

Вы также можете попробовать отменить минимальное значение, чтобы можно было повторно использовать Math.max: a=>(m=Math.max)(...a.filter(l=>l.length==-m(...a.map(i=>-i.length))))Похоже, что он экономит только 1 байт.
user81655 16.09.16

Еще один байт filterможно заменить на значение map, возвращающее 0значения, которые не прошли тест:a=>(m=Math.max)(...a.map(l=>l.length+m(...a.map(i=>-i.length))?0:l))
user81655


1

Haskell, 39 байт

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

Это не работает, он предпочитает , 34чтобы 2.
xnor

ой ну спасибо. Я должен переосмыслить это ..
Дэмиен

Работает лучше сейчас!
Дэмиен

1

Javascript (ES6), 57 54 53 байта

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

Для справки, моя предыдущая версия была более ориентирована на математику, но на 1 байт больше:

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

Контрольные примеры

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 байт

tV48\&XS0))

Ввод - это вектор-столбец (используется в ;качестве разделителя), например

[78; 99; 620; 100]

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Давайте использовать вход [78; 99; 620; 100]в качестве примера.

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

1
Приятно видеть состояния стека в вашем объяснении!
flawr 16.09.16

1

Perl, 38 37 байт

Включает +1 для -a

Внесите свой вклад в 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]}

Использует линейную память с наибольшим числом, поэтому не пытайтесь использовать это для слишком больших чисел. Решение без этого недостатка составляет 38 байт:

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

Все это очень неловко и совсем не чувствует себя оптимально ...


1

Р, 72 41 36 байт

Переписал функцию с новым подходом. Гольф 5 байтов благодаря предложению @bouncyball.

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

Разъяснение:

        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}}

Углублено / объяснил:

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.
  }
}


1
Сохраните 4 байта, не определяя function:i=scan();n=nchar(i);max(i[n==min(n)])
bouncyball

@bouncyball Спасибо! И еще 1 байт сохранен n=nchar(i<-scan()).
rturnbull

1

Bash + coreutils, 58 байт

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

Формат ввода - одно значение в строке. Предложения по гольфу приветствуются.

Объяснение:

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 спасибо, теперь я знаю, что sed q=head -1
Эммануэль



0

Python 3, 56 байт

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

Использует лямбду в лямбде!

Python 2, 53 байта

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

То же самое, но с кавычками


0

Пип , 11 байт

(SNgSK-#_v)

Принимает ввод как аргументы командной строки. Попробуйте онлайн!

Впервые с помощью оператора с Sнаправленным Kвзглядом! Как и в Python sorted(), он принимает функцию, которая применяется к каждому элементу итерируемого, а результат используется в качестве ключа сортировки. Вот как работает эта программа:

 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 байта

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

как в:

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

Хотя я уверен, что есть способ сделать его меньше.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.