47
\$\begingroup\$

Given a nonempty list of positive decimal integers, output the largest number from the set of numbers with the fewest digits.

The input list will not be in any particular order and may contain repeated values.

Examples:

[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

The shortest code in bytes wins.

asked Sep 16, 2016 at 0:27
\$\endgroup\$
2
  • \$\begingroup\$ Can the input numbers be on separate lines? \$\endgroup\$ Commented Sep 16, 2016 at 5:48
  • \$\begingroup\$ @seshoumara That sounds reasonable, yes. \$\endgroup\$ Commented Sep 16, 2016 at 5:48

68 Answers 68

1
2 3
15
\$\begingroup\$

Pyth, (削除) 7 (削除ここまで) (削除) 3 (削除ここまで) 6 bytes

eS.ml`

Test Suite

Explanation:

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

7 byte solution:

eSh.gl`

Test Suite

Explanation:

 .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
MD XF
14.2k5 gold badges69 silver badges107 bronze badges
answered Sep 16, 2016 at 1:06
\$\endgroup\$
0
7
\$\begingroup\$

Jelly, 7 bytes

DL,NμÞḢ

Test it at TryItOnline
Or see all test cases also at TryItOnline

How?

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
answered Sep 16, 2016 at 3:19
\$\endgroup\$
3
  • 1
    \$\begingroup\$ Great use of sort! \$\endgroup\$ Commented Sep 16, 2016 at 3:21
  • \$\begingroup\$ @miles your way was still inspired :) \$\endgroup\$ Commented Sep 16, 2016 at 3:28
  • \$\begingroup\$ Looks like ÐṂ and ÐṀ (leads to a 6 byte answer) were added hours after this answer :P \$\endgroup\$ Commented Jul 25, 2021 at 22:43
7
\$\begingroup\$

05AB1E, 5 bytes

Code:

({é¬(

Explanation:

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

Uses the CP-1252 encoding. Try it online!

answered Sep 16, 2016 at 6:30
\$\endgroup\$
6
\$\begingroup\$

Python 2, (削除) 48 (削除ここまで) 42 bytes

-6 bytes thanks to @Dennis (use min rather than sorted)

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

All test cases are at ideone

Take the minimum of the list by (length, -value)

answered Sep 16, 2016 at 3:06
\$\endgroup\$
5
  • 2
    \$\begingroup\$ min should work instead of sorted. \$\endgroup\$ Commented Sep 16, 2016 at 3:48
  • \$\begingroup\$ @Dennis, oh jeez - thanks! Probably different enough to have posted that yourself though. \$\endgroup\$ Commented Sep 16, 2016 at 4:14
  • \$\begingroup\$ Swapping sorted()[0] for min? I consider that a trivial modification of your original code. \$\endgroup\$ Commented Sep 16, 2016 at 4:35
  • \$\begingroup\$ There's also len(`x`)+1./x for the same length. Too bad you need the 1.. \$\endgroup\$ Commented Sep 16, 2016 at 6:37
  • \$\begingroup\$ Well, that's shorter than what I came up with. Good job! \$\endgroup\$ Commented Sep 16, 2016 at 19:39
5
\$\begingroup\$

K (ngn/k), (削除) 16 (削除ここまで) (削除) 15 (削除ここまで) 14 bytes

|/{=/&/\#'$x}#

Try it online!

  • {...}# set up a filter, returning elements from the (implicit) right argument where the code in {...} returns 1s
    • #'$x count the number of characters in the string representation of each input
    • &/\ generate a two item list of the character counts and their minimum
    • =/ generate a boolean mask indicating which indices have the fewest digits
  • |/ return the maximum (remaining) value
answered Jul 26, 2021 at 13:44
\$\endgroup\$
2
  • 1
    \$\begingroup\$ c=&/c: can be =/&/\ for -1 \$\endgroup\$ Commented Jun 10, 2022 at 21:57
  • \$\begingroup\$ Nice! A clever way to avoid the inline assignment. \$\endgroup\$ Commented Jun 10, 2022 at 22:23
4
\$\begingroup\$

Ruby, 34 bytes

->a{a.max_by{|n|[-n.to_s.size,n]}}

See it on eval.in: https://eval.in/643153

answered Sep 16, 2016 at 0:36
\$\endgroup\$
4
\$\begingroup\$

MATL, 14 bytes

10&YlktX<=G*X>

Try it online!

Explanation:

 &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
answered Sep 16, 2016 at 0:38
\$\endgroup\$
4
\$\begingroup\$

J, (削除) 21 (削除ここまで) 14 bytes

Saved 7 bytes thanks to miles and (indirectly) Jonathan!

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

This is a four-chain:

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

Let's walk over the input 10 27 232 1000. The inner fork consists of three tines. #@":"0 calculates the sizes, ,. concats each size with its negated (-) member. For input 10 27 232 1000, we are left with this:

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

Now, we have {.@/: as the outer tine. This is monadic first ({.) over dyadic sort (/:). That is, we'll be taking the first element of the result of dyadic /:. This sorts its right argument according to its left argument, which gives us for our input:

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

Then, using {. gives us the first element of that list, and we are done:

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

Old version

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

Still working on improvements. I golfed it down from 30, and I think this is good enough. I'm going to first break it down into basic parts:

 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

Here's how this works.

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

This is a monadic train, but this part is a hook. The verb >./@(#~ ] = <./@]) is called with left argument as the input to the main chain and the sizes, defined as #@":"0, as the right argument. This is computed as length (#) over (@) default format (":), that is, numeric stringification, which is made to apply to the 0-cells (i.e. members) of the input ("0).

Let's walk over the example input 409 12 13.

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

Now for the inner verb, >./@(#~ ] = <./@]). It looks like >./@(...), which effectively means maximum value (>./) of (@) what's inside (...). As for the inside, this is a four-train, equivalent to this five-train:

[ #~ ] = <./@]

[ refers to the original argument, and ] refers to the size array; 409 12 13 and 3 2 2 respectively in this example. The right tine, <./@], computes the minimum size, 2 in this case. ] = <./@] is a boolean array of values equal to the minimum, 0 1 1 in this case. Finally, [ #~ ... takes values from the left argument according the right-argument mask. This means that elements that correspond to 0 are dropped and 1 retained. So we are left with 12 13. Finally, according to the above, the max is taken, giving us the correct result of 13, and we are done.

answered Sep 16, 2016 at 1:55
\$\endgroup\$
4
  • \$\begingroup\$ Some shuffling plus a hook can save a byte >./@#~[:(=<./)#@":"0. I think there might be a bit more to save \$\endgroup\$ Commented Sep 16, 2016 at 2:05
  • \$\begingroup\$ @miles XD I just finished writing explanation. Ah well, let me take a look at this beauty... \$\endgroup\$ Commented Sep 16, 2016 at 2:06
  • \$\begingroup\$ Jonathan found a better method. If we convert it to J, its 14 bytes {.@/:#@":"0,.- but the input has to be shaped as a list \$\endgroup\$ Commented Sep 16, 2016 at 3:29
  • \$\begingroup\$ @miles "shaped as a list"? You mean, like 400 12 13? \$\endgroup\$ Commented Sep 16, 2016 at 10:49
4
\$\begingroup\$

Retina, (削除) 24 (削除ここまで) 16 bytes

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

Try it online! or run all test cases.

Saved 8 bytes thanks to Martin!

The all test is using a slightly older version of the code, but the algorithm is identical. I'll update it to be closer when I get more time.

The trailing newline is significant. Sorts the numbers by reverse numeric value, then sorts them by number of digits. This leaves us with the largest number with the fewest digits in the first position, so we can just delete the remaining digits.

answered Sep 16, 2016 at 0:41
\$\endgroup\$
4
  • \$\begingroup\$ If you make the input linefeed-separated you can omit the regex from both sorting stages and then use G1` for the last stage. \$\endgroup\$ Commented Sep 16, 2016 at 5:56
  • \$\begingroup\$ Also, the first stage doesn't need #. You only care about relative order for a given integer length, and within one length lexicographic sorting of numbers is correct. \$\endgroup\$ Commented Sep 16, 2016 at 6:21
  • \$\begingroup\$ @MartinEnder Thanks! I've added both your tips. I should have suggested \w+ as the default for sorting, that way I wouldn't need to struggle as much to make the test suites ;) \$\endgroup\$ Commented Sep 16, 2016 at 18:12
  • \$\begingroup\$ Here is another 16, in case it gives you any ideas for further golfing: retina.tryitonline.net/… \$\endgroup\$ Commented Sep 16, 2016 at 18:44
4
\$\begingroup\$

Mathematica, (削除) 33 (削除ここまで) 31 bytes

Max@MinimalBy[#,IntegerLength]&

MinimalBy selects all the elements of the original input list with the smallest score according to IntegerLength, i.e., with the smallest number of digits; and then Max outputs the largest one.

Thanks to Martin Ender for finding, and then saving, 2 bytes for me :)

answered Sep 16, 2016 at 0:48
\$\endgroup\$
0
4
\$\begingroup\$

Perl 6, 18 bytes

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

Explanation:

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

Usage:

say [738, 2383, 281, 938, 212, 1010].&( *.min:{.chars,-$_} ); # 938
my &code = *.min:{.chars,-$_}
say code [78, 99, 620, 10]; # 99
Cyoce
3,37126 silver badges29 bronze badges
answered Sep 16, 2016 at 0:48
\$\endgroup\$
3
\$\begingroup\$

Jelly, 8 bytes

DL€İMị1Ṁ

Try it online! or Verify all test cases.

Explanation

DL€İMị1Ṁ 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
 1 Get A
 ị Select the values at those indices from A
 Ṁ Find the maximum and return
answered Sep 16, 2016 at 1:23
\$\endgroup\$
2
  • \$\begingroup\$ How is this 8 bytes? Do all of these characters fit in ASCII? \$\endgroup\$ Commented Sep 16, 2016 at 14:29
  • 1
    \$\begingroup\$ @FedericoPoloni Yes, they do fit, although in another codepage. \$\endgroup\$ Commented Sep 16, 2016 at 14:52
3
\$\begingroup\$

JavaScript (ES6), 51

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

Test

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

answered Sep 16, 2016 at 7:49
\$\endgroup\$
3
\$\begingroup\$

Factor, 25 bytes

[ all-shortest supremum ]

Try it online!

Get the largest of the shortests.

answered Jul 26, 2021 at 18:03
\$\endgroup\$
3
\$\begingroup\$

Julia, 39

f(l)=sort(l,by=x->(length("$x"),-x))[1]

ATOable

answered Jun 10, 2022 at 18:57
\$\endgroup\$
2
  • \$\begingroup\$ Welcome back to code golf! 34 bytes \$\endgroup\$ Commented Jun 12, 2022 at 8:53
  • 1
    \$\begingroup\$ and you can check Tips for golfing in Julia \$\endgroup\$ Commented Jun 12, 2022 at 9:03
3
\$\begingroup\$

bash, awk, sort (削除) 58 (削除ここまで) (削除) 53 (削除ここまで) 44 bytes

Read input from stdin, one value per line

printf `awk '{print 0,ドルlength}'|sort -rnk2n`

Try it online!

53 bytes: set `awk '{print 0,ドルlength(0ドル)}'|sort -rnk2n`;echo 1ドル
57 bytes: set `sort -n`;while((${#2}==${#1}));do shift;done;echo 1ドル

roblogic
4,62921 silver badges24 bronze badges
answered Sep 16, 2016 at 13:45
\$\endgroup\$
4
  • \$\begingroup\$ doesn't work for last sample gave 2383 instead of 938 \$\endgroup\$ Commented Sep 16, 2016 at 14:47
  • \$\begingroup\$ @Archemar sorry I misread the question, it is corrected now \$\endgroup\$ Commented Sep 16, 2016 at 16:54
  • \$\begingroup\$ You can remove the space between while and ((. \$\endgroup\$ Commented Sep 17, 2016 at 11:26
  • 1
    \$\begingroup\$ 44 bytes refining your strategy a bit (and beating my Zsh solution) \$\endgroup\$ Commented Sep 14, 2024 at 0:11
2
\$\begingroup\$

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'))

answered Sep 16, 2016 at 4:51
\$\endgroup\$
2
\$\begingroup\$

Javascript (ES6), (削除) 57 (削除ここまで) (削除) 54 (削除ここまで) 53 bytes

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

For the record, my previous version was more math-oriented but 1 byte bigger:

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

Test cases

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

answered Sep 16, 2016 at 6:55
\$\endgroup\$
2
\$\begingroup\$

dc, 54 bytes

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

Explanation:

?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

Run example: 'input.txt' contains all the test cases in the question's statement

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

Output:

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
answered Sep 16, 2016 at 9:03
\$\endgroup\$
2
\$\begingroup\$

C# 72 bytes

int S(int[]i){return i.OrderBy(v=>(""+v).Length).ThenBy(v=>-v).First();}

Borrowing from some of the other answers, a very efficient way to accomplish this task is to sort by number of digits, then by value descending. This moves the answer to the first position. Linq accomplishes this fairly simply with the OrderBy and ThenBy statements.

Console.WriteLine(S(new[] { 738, 2383, 281, 938, 212, 1010 }));

Output: 938

answered Sep 17, 2016 at 0:50
\$\endgroup\$
2
\$\begingroup\$

Bash + coreutils, 58 bytes

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

Input format is one value per line. Golfing suggestions are welcomed.

Explanation:

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)
answered Sep 17, 2016 at 12:27
\$\endgroup\$
0
2
\$\begingroup\$

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

Different approach to save multiple bytes thanks to @Barteks2x.

Ungolfed & test cases:

Try it here.

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

Output:

1
9
1729
1
3
13
1
11
1
99
9
3451
938
answered Sep 16, 2016 at 7:15
\$\endgroup\$
2
  • 1
    \$\begingroup\$ shorter version: 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;} \$\endgroup\$ Commented Sep 17, 2016 at 20:40
  • \$\begingroup\$ @Barteks2x Thanks, I've edited it. \$\endgroup\$ Commented Sep 17, 2016 at 21:29
2
\$\begingroup\$

Pip, 11 bytes

@Y#_AE-_SKa

Try It Online!

answered Jun 11, 2022 at 3:07
\$\endgroup\$
0
2
\$\begingroup\$

Husk, (削除) 5 (削除ここまで) 4 bytes

さんかく←kL

Try it online!

Takes a list as an input and outputs the "the largest number with the fewest digits".

Commented:

 -- Implicit input; 
 kL -- Klassify the numbers by their length = number of digits
 ← -- Take the first group, with the fewest digits
さんかく -- Take the maximal value of the group
answered Sep 10, 2024 at 7:28
\$\endgroup\$
1
  • 1
    \$\begingroup\$ 4 bytes using k instead of ġ...O. \$\endgroup\$ Commented Nov 4 at 15:27
1
\$\begingroup\$

Pip, 11 bytes

(SNgSK-#_v)

Takes input as command-line args. Try it online!

First time using the Sort-Keyed operator! Like Python's sorted(), it takes a function that is applied to each item of the iterable and the result used as a sort key. Here's how this program works:

 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
answered Sep 16, 2016 at 4:02
\$\endgroup\$
1
\$\begingroup\$

JavaScript ES6, (削除) 80 (削除ここまで) (削除) 77 (削除ここまで) 70 bytes

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

I hope I am going in the right direction...

answered Sep 16, 2016 at 0:41
\$\endgroup\$
4
  • \$\begingroup\$ Could you replace a.map(i=>i.length).sort((a,b)=>a-b)[0] with Math.min(...a.map(i=>i.length))? \$\endgroup\$ Commented Sep 16, 2016 at 4:58
  • \$\begingroup\$ @user81655 yup, I can. I thought I had made that edit but apparently I did not \$\endgroup\$ Commented Sep 16, 2016 at 4:59
  • \$\begingroup\$ You could also try negating the minimum so that you can reuse the Math.max: a=>(m=Math.max)(...a.filter(l=>l.length==-m(...a.map(i=>-i.length)))) It seems to save only 1 byte though. \$\endgroup\$ Commented Sep 16, 2016 at 5:03
  • \$\begingroup\$ For another byte the filter can be replaced with a map that returns 0 for values that do not pass the test: a=>(m=Math.max)(...a.map(l=>l.length+m(...a.map(i=>-i.length))?0:l)) \$\endgroup\$ Commented Sep 16, 2016 at 5:12
1
\$\begingroup\$

Brachylog, 16 bytes

or:@]feL:la#=,Lh

Try it online!

Explanation

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.
answered Sep 16, 2016 at 6:21
\$\endgroup\$
1
\$\begingroup\$

Haskell, 39 bytes

snd.maximum.map((0-).length.show>>=(,))
answered Sep 16, 2016 at 6:37
\$\endgroup\$
2
  • \$\begingroup\$ This doesn't work, it prefers 34 to 2. \$\endgroup\$ Commented Sep 16, 2016 at 6:39
  • \$\begingroup\$ Works better now! \$\endgroup\$ Commented Sep 16, 2016 at 6:52
1
\$\begingroup\$

C#, 119 bytes

int L(int[]n){var g=n.GroupBy(o=>(o+"").Length);return g.Where(o=>o.Key==g.Min(k=>k.Key)).OrderBy(o=>o).First().Max();}

Ungolfed:

public int L(int[]n)
{
 var g = n.GroupBy(o => (o+"").Length);
 return g.Where(o => o.Key == g.Min(k => k.Key)).OrderBy(o => o).First().Max();
}

Magical Linq...

Usage:

var a = new LargestNumberFewestDigits();
Console.Write(a.L(new int[] { 738, 2383, 281, 938, 212, 1010 }));

Output:

938
answered Sep 16, 2016 at 11:59
\$\endgroup\$
1
\$\begingroup\$

MATL, 11 bytes

tV48\&XS0))

Input is a column vector (using ; as separator), such as

[78; 99; 620; 100]

Try it online! Or verify all test cases.

Explanation

Let's use input [78; 99; 620; 100] as an example.

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
answered Sep 16, 2016 at 8:53
\$\endgroup\$
1
  • 1
    \$\begingroup\$ Nice to see the stack states in your explanation! \$\endgroup\$ Commented Sep 16, 2016 at 23:18
1
2 3

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.