输出位数最少的最大数字


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

@seshoumara听起来很合理,是的。
加尔文的爱好

Answers:


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

所有测试用例都在ideone上

取列表中的最小值为(长度,-值)


1
min应该工作代替sorted
丹尼斯

@丹尼斯,哦,老天爷-谢谢!可能与您自己发布的内容完全不同。
乔纳森·艾伦

交换sorted()[0]min?我认为这是对原始代码的微小修改。
丹尼斯

len(`x`)+1./x长度也一样。可惜的是你需要1.
xnor

好吧,那比我想出的要短。做得好!
mbomb007 '16

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
善用排序!
英里

@miles,您的方式仍然受到启发:)
Jonathan Allan

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

Ruby,34个字节

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

在eval.in上查看:https ://eval.in/643153


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
G1`

在线尝试!运行所有测试用例

感谢Martin,节省了8个字节!

全部测试使用的是代码的稍旧版本,但是算法相同。当我有更多时间时,我会更新它以使其更接近。

尾随换行符很重要。按反向数值对数字进行排序,然后按位数对它们进行排序。这使我们在第一个位置上得到的数字最多,位数最少,因此我们只需删除其余的数字即可。


如果将输入换行分隔,则可以在两个排序阶段都省略正则表达式,然后将其G1`用于最后一个阶段。
马丁·恩德

而且,第一阶段不需要#。您只关心给定整数长度的相对顺序,并且在一长度之内数字的字典编排是正确的。
马丁·恩德

@MartinEnder谢谢!我已经添加了您的两个提示。我应该建议\w+将其作为排序的默认值,这样,我就无需花太多精力来制作测试套件;)
FryAmTheEggman

这里是另一个16,如果它为您提供了进一步的高尔夫球任何想法:retina.tryitonline.net/...
马丁安德

4

Mathematica,33 31个字节

Max@MinimalBy[#,IntegerLength]&

MinimalBy根据来选择得分最小的原始输入列表的所有元素IntegerLength,即位数最少的元素;然后Max输出最大的一个。

感谢Martin Ender为我找到然后保存了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吗?
Federico Poloni 2016年

1
@FedericoPoloni 是的,尽管在另一个代码页中,它们确实适合
Erik the 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 14字节

多亏了Miles和Jonathan,间接节省了7个字节!

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

这是一个四链:

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

让我们浏览输入10 27 232 1000。内叉由三个尖齿组成。#@":"0计算尺寸,,.并使用其取反(-)成员连接每个尺寸。对于input 10 27 232 1000,我们剩下的是:

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

现在,我们将其{.@/:作为外部尖齿。这是{.二元排序(/:)之上的单子优先()。也就是说,我们将采用dyadic结果的第一个元素/:。这将根据其左参数对右参数进行排序,从而为我们提供了输入信息:

   (/: #@":"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为的参数作为右参数。计算方式为:长度(#)超过(@)默认格式(":),即数字字符串化,该格式适用于输入("0)的0单元格(即成员)。

让我们来看一下示例输入409 12 13

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

现在对于内部动词,>./@(#~ ] = <./@])。看起来>./@(...),这实际上意味着里面的(>./)的最大值()。至于内部,这是四列火车,等同于以下五列火车:@(...)

[ #~ ] = <./@]

[引用原始参数,并]引用size数组;409 12 133 2 2分别在此示例中。在这种情况下<./@],正确的齿会计算最小大小2。在这种情况下] = <./@],是一个等于最小值的布尔数组0 1 1。最后,[ #~ ...根据右参数掩码从左参数获取值。这意味着对应的元素将0被删除并1保留。所以我们留下了12 13。最后,根据以上所述,采用最大值,得出的正确结果13,我们完成了。


一些改组加上一个钩子可以节省一个字节>./@#~[:(=<./)#@":"0。我认为可能还有更多可节省的地方
英里

@miles XD我刚刚写完解释。嗯,让我看看这个美丽……
Conor O'Brien

乔纳森发现了一个更好的方法。如果我们将其转换为J,则为14字节,{.@/:#@":"0,.-但输入必须为列表形式
英里

@miles“形如列表”?你是说像400 12 13
Conor O'Brien

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

dc,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可以使用不同的方法来保存多个字节。

非高尔夫球和测试用例:

在这里尝试。

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; for(int b:a)i =(j =(i +“”)。length()-(b +“”)。 length())> 0?b:b> i&j == 0?b:i; return 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对不起,我读错了问题,现在已更正
Emmanuel

您可以删除之间的空间while((
seshoumara

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

@ user81655是的,我可以。我以为自己做了编辑,但显然没有
Downgoat

您也可以尝试取消最小值,以便重新使用Math.maxa=>(m=Math.max)(...a.filter(l=>l.length==-m(...a.map(i=>-i.length))))似乎只保存1个字节。
user81655 '16

对于另一个字节,filter可以将其替换为map返回0不通过测试的值的a :a=>(m=Math.max)(...a.map(l=>l.length+m(...a.map(i=>-i.length))?0:l))
user81655 '16

1

Brachylog,16个字节

or:@]feL:la#=,Lh

在线尝试!

说明

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

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
很高兴看到您的解释中的堆栈状态!
瑕疵的

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

R,72 41 36字节

用新方法重写功能。感谢@bouncyball的建议,打了5个字节。

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个字节functioni=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
Emmanuel

1

Python 2-41个字节

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

0

Python 2,58个字节

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

0

Python 3,56个字节

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

在lambda中使用lambda!

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

尽管我敢肯定有一种方法可以缩小它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.