查找数组中最大和最小的数字


29

任务

任务很简单。给定包含整数字符串的数组,则输出最大数和最小数。

测试用例

Input: [1, 2, 3, 4, 5, 6, 7, 8]
Output: 1, 8

Input: [5, 4, 2, 9, 1, 10, 5]
Output: 1, 10

Input: [7, 8, 10, "Hello", 5, 5]
Output: 5, 10

字符串中的数字不视为整数:

Input: [1, 2, 3, 4, "5"]
Output: 1, 4

如果只有一个整数,则它既是最大整数又是最小整数:

Input: [1]
Output: 1, 1

Input: ["1", "2", "3", "4", 5]
Output: 5, 5

规则

  • 您可以假设一个数组将始终包含至少一个整数。
  • 所有整数均为正数(大于0)
  • 输出的顺序无关紧要。
  • 这是,因此以最少的字节提交为准!
  • 字符串可以包含所有可打印的ASCII字符(32 - 126),并且不能为空。

包含引号的字符串如何在输入中表示?
feersum '16

@feersum不会取决于您的语言吗?
马丁·恩德

@feersum可能带有转义符,但是如果该语言不能解决该问题,那就可以了。
阿德南

@MartinBüttner如果输入来自stdin,则它不应取决于所使用的语言。
feersum '16

3
@feersum这对我来说是新的。即使来自STDIN,[1, 2, 3] 1 2 3并且{1; 2; 3}都是有效的输入格式,所以我不明白为什么从STDIN接收到的字符串文字应该与其他任何不同。
马丁·恩德

Answers:


9

严重的是9 6个字节

,ì;M@m

在线试用

怎么运行的

,                              Read list input
 ì                             Remove everything but numbers from it
  ;                            Make a copy
   m                           Extract its min value
    @M                         Extract the other one's max value
                               Implicit output (max then min)

啊,是的,我正在寻找这样的命令。但是文档并不容易搜索。
quintopia '16

我同意。文档是我的下一个大目标。
Mego

11

JavaScript(ES6),54 56

编辑保存的2个字节thx @Neil

注意:x===+x当且仅当x是数字时为true

a=>[Math.max(...a=a.filter(x=>x===+x)),Math.min(...a)]

3
为什么是外层()的?
尼尔

@Neil什么外()?为什么在地球上应该有外部()?
edc65 '16

这将返回一个函数,您仍然需要调用它。(或只是删除a =>)
Michael Theriot

2
是的,它是一个匿名函数。在JavaScript @MichaelTheriot中发布答案是一种很常见的方法
edc65 '16

@MichaelTheriot 默认情况下,我们允许提交是独立的功能,而不是始终要求完整的程序。
Alex A.

8

Pyth,14 11 10字节

hM_BS^I#1Q

在线尝试。 测试套件。

说明

  • Q:评估输入
  • #:对以下内容进行过滤:
    • I:之后的值相同:
      • ^…1 提高力量1
  • S:排序
  • _B:创建数组 [previous, reversed(previous)]
  • hM:取该项目中每一项的第一项

最困难的部分是打高尔夫球,以除去琴弦,该琴弦目前需要4个字节。当前的方法之所以有效^<str>1,是因为获得了序列的第一个笛卡尔^<int>1功效(基本上是字符串的字符列表),但这仅仅是恒等函数。


Hrm,您也可以使用*#_1Q删除字符串,如果将变量初始化为负数,则字符串会更短...
FryAmTheEggman

7

Python 2,42字节

在Python 2中,在比较过程中,整数总是小于字符串,因此简单的min(s)查找最小的整数。当找到最大值时,我们必须首先过滤掉字符串。匿名函数接受一个序列,并返回一个带有最小值和最大值的元组。

lambda s:(min(s),max(x for x in s if''>x))

例:

[1,'77', 6, '', 4] -> (1, 6)

3
lambda a:在此之前,您需要坚持一下。
Doorknob

if x>0if''>x保存一个字节。
grc

@Doorknob,现在建议为lambda。
逻辑骑士

1
@丹尼斯,我不知道这个。我已经编辑了解决方案,以清除比较只在Python 2.作品
逻辑骑士

1
建立时间:lambda s:(min(s),-min(-1*_ for _ in s))(39个字节)
Fran Borcic '16

7

果冻,8个字节

|f¹Ṣ0,1ị

在线尝试!

背景

在理想情况下,将列表与自身的扁平版本相交就足够了。字符串只是Jelly中的字符列表,因此原始列表将包含整数和字符串,而拼合的版本将包含整数和字符,而交集中仅保留整数。

在现实世界中,输入文字和字符串文字的解析器都产生字符,而不是长度为1的字符串。将单例字符串传递给函数的唯一方法是将其“手动”编码为例如[”a],这是一个包装在数组中的字符。

这将节省一个字节,总共7个字节在线尝试!)。

fFṢ0,1ị

由于这可能不可接受,因此我们还需要一种区分字符和整数的方法。

果冻的按位原子拼命尝试将其参数转换为整数。他们从矢量化开始,直到遇到深度为0的类型(数字或字符),然后尝试将其转换为整数。对于代表整数的字符,这将成功。对于其他对象,二进位按位原子将简单地放弃并返回0

例如,将列表[1, "2", "34", "-5", "a", "bc"]与自身进行按位或运算将产生

[1, 2, [3, 4], [0, 5], 0, [0, 0]]

通过将结果与原始列表相交,我们摆脱了原始列表中不存在的数组和整数。

怎么运行的

|f¹Ṣ0,1ị  Main link. Input: A (list)

|         Bitwise OR the list A with itself.
 f¹       Filter the result by presence in A.
   Ṣ      Sort the resulting list of integers.
    0,1ị  Retrieve the elements at those indexes.
          Indices are 1-based and modular in Jelly, so 0 is the last (maximum),
          and 1 is the first (minimum).

6

Mathematica,20个字节

MinMax@*Select[#>0&]

测试用例

MinMax@*Select[#>0&]@{1,2,3,4,"5"}
(* {1,4} *)

1
为什么在*那里?似乎您只需将其削减即可达到19。
西蒙斯(Simmons)

1
@ASimmons这是必要的。MinMax@Select[#>0&]不是有效的纯函数。
njpipeorgan

1
@ASimmons @*是函数组合,而@函数应用程序。
马丁·恩德

1
MinMax@Select[# > 0 &][{1, 2, 3, 4, "Hello", 5}]产生正确的回应
西蒙斯(Simmons)

1
@ASimmons尝试分配MinMax@Select[# > 0 &]给一个符号,或只是对其进行求值。
njpipeorgan

6

Ruby,57 36 29字节

这里是新手,所以我不知道是否有任何标准或普遍接受的位置/方式来计算使用的字节,将不胜感激!

根据操作和门把手的评论进行编辑!

->n{(n.map(&:to_i)&n).minmax}

测试

2.3.0 :076 > f=->n{[(n.map(&:to_i) & n).min, (n.map(&:to_i) & n).max]}
 => #<Proc:0x007ff7650ee868@(irb):76 (lambda)>
2.3.0 :077 > f[[7, 8, 10, "Hello", 5, 5]]
 => [5, 10]

1
36个字元:->n{[(x=n.map(&:to_i)&n).min,x.max]}
manatwork '16

2
29个字节,使用minmax:->a{(a.map(&:to_i)&a).minmax}
门把手

5

CJam,15 13字节

{_:z&$2*_,(%}

一个未命名的块(函数),该块期望输入数组在堆栈上,并将输出数组保留在其位置。

运行所有测试用例。

说明

_     e# Duplicate.
:z    e# Map over list: a) take abs() of integer elements (a no-op) or b) wrap strings
      e# in an array.
&     e# Set intersection: only the integers will appear in both arrays.
$     e# Sort.
2*    e# Repeat array twice (to make the code work with single-integer input).
_,    e# Duplicate, get length N.
(%    e# Decrement, get every (N-1)th element, i.e. the first and the last.

我建议e)和e(给aittsu。他没有接受
username.ak

@ username.ak我不认为这些确实有用。增加一个只有两个字节的运算符,它比当前解决方案只节省一个字节,aditsu不太可能实现,我也认为必须有更多有用的功能来使用这些功能。
Martin Ender

它将保存3个字节:q~_e(ae)a+
username.ak

@ username.ak好吧,这是假设的,e(并且e)会忽略字符串或某些似乎不一致的东西。如果确实涉及到与字符串的比较,则可能会失败,$并且e>无法将整数与字符串进行比较。
Martin Ender

5

Haskell,41个 39字节

f x=[minimum,maximum]<*>[[i|Left i<-x]]

在Haskell中,列表的所有元素都必须具有相同的类型,因此我不能混合使用IntegerString。但是,存在Either将两种类型组合为一个类型的类型。因此,输入列表的类型为Either Integer String1f过滤Integer,移除Either包装器,将列表作为单个元素放入新列表(例如[[1,2,3]]),以便<*>可以将第一个参数中给出的功能应用于该列表。

用法示例:f [Left 1, Left 3, Right "Hello", Left 2]-> [1,3]

编辑:@xnor <*>发挥作用并保存了2个字节。谢谢!


1实际上,它在第二种类型中是完全多态的,因为String从未使用过该属性。


与模式匹配的好主意。您可以使用反向地图保存两个字符:f x=[minimum,maximum]<*>[[i|Left i<-x]]
xnor

@xnor:非常好。非常感谢!
nimi 2016年


4

Mathematica,28个字节

MinMax[#/._String->Nothing]&

我仍然不明白您对Nothing... 的痴迷……这并不意味着什么特别的东西……另外,对于23个字节:MinMax@*Select[NumberQ]
LegionMammal978

@ LegionMammal978利用“所有整数均为正”!看我的答案。
njpipeorgan

1
好的解决方案人员,我应该考虑那样做!@ LegionMammal978,Nothing确实具有特殊含义。从Mathematica 10.2开始,它将自动从列表中删除。
西蒙斯(Simmons)

@ LegionMammal978 Nothing是最新版本中已记录的功能。
Mr.Wizard'2

4

PHP,50 48字节

<?=min($a=array_filter($a,is_int)).', '.max($a);

1
打我2分钟:)。
TMH '02

2
通常被禁止的假设,输入已经处于一个变量。顺便说一句,您可以通过删除'周围的来节省两个字节is_int
黑洞

@Blackhole谢谢。没意识到。我已利用您的报价删除功能:)
PaulSkinner '16

4

视网膜,71

(与往常一样)感谢@MartinBüttner提供的高尔夫帮助。

在高尔夫方面并不具有竞争力,但是在Retina中实现整数气泡排序很有趣。

假设输入中的所有字符串都用"双引号引起来,并且不包含任何转义的双引号\"

A`"
¶

\d+
$&$*a $&$*a
+`\b(a+) +\1(a+)\b
$1$2 $1
 +[a ]+ +

(a)+
$#1

输入以换行符分隔。

在线尝试。


我认为,<space>.*<space>由于贪婪,您可以在倒数第二个阶段使用它。
FryAmTheEggman

4

数学家,14

#&@@@MinMax@#&

例:

tests = {
   {1, 2, 3, 4, 5, 6, 7, 8},
   {5, 4, 2, 9, 1, 10, 5},
   {7, 8, 10, "Hello", 5, 5},
   {1, 2, 3, 4, "5"},
   {1},
   {"1", "2", "3", "4", 5}
 };

# & @@@ MinMax@# & /@ tests
{{1, 8}, {1, 10}, {5, 10}, {1, 4}, {1, 1}, {5, 5}}

说明:

MinMax获取非数字输入时,它将尽最大可能减少问题,然后将术语包裹在Min和中Max

MinMax @ {7, 8, 10, "Hello", 5, 5}
{Min[5, "Hello"], Max[10, "Hello"]}

由于会进行自动排序,因此字符串后跟整数。

Apply然后在levelspec {1}(简写@@@为)处提取非原子元素的第一个参数。请注意,5此处未涉及:

foo @@@ {5, Max[10, "Hello"]}
{5, foo[10, "Hello"]}

3

Oracle SQL 11.2,189字节

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i))FROM(SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i FROM DUAL CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2)WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

未打高尔夫球

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i)) 
FROM  (
        SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i 
        FROM   DUAL 
        CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2
      )
WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

子查询将解析该数组并将其拆分以填充每行一个元素的视图。然后将非数字元素过滤掉。

我希望我能找到一种用LEAST和GREATEST做到这一点的方法,但是对于如何将数组作为参数进行处理并没有运气。


您将保留[]在数组中,因此如果它们是数组的第一个或最后一个元素,则不会选择max或min。您也不需要WHERE子句,因为您已经选择了聚合,所以不需要过滤。在正则表达式中搜索数字字符,并将数字转换向下推至子查询(几乎没有推入谓词的危险),它变为126个字节:select min(i),max(i)from(select to_number(regexp_substr(&1,'\d+',1,level))i from dual connect by level<=regexp_count(&1,'\d'))
2016年

这里不需要+第二个正则表达式,因为生成额外的行(节省一个字节)并不重要。值得一提的是,如果您有一个仅由数字组成的字符串,则在这里不会忽略它。在同一个程序包中需要重载函数,因此一点也不漂亮。
2016年

3

vimscript,25个字节

g/"/d
sort n
t.
t.
2,$-1d

是的,对,vimscript。

期望以以下形式输入

1
2
3
4
"5"

并以形式输出

1
4

说明:

g/"/d    delete all lines that contain quotes
sort n   sort numerically
t.       duplicate the first line
t.       duplicate it again
2,$-1d   delete from line 2 to line (END-1)

第一行需要重复两次,以处理单个数字输入的边缘情况。这是因为最后一条命令到达时只有两行时会报错,因为最后2,1d它是向后的范围。


3

Perl 44 39 + 3 = 41字节

@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"

需要-pa标志:

$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 5 4'
1 5
$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 4 "5"'
1 4

感谢@manatwork削减了几个字节


哪个Perl版本?对于第二个示例,我得到不同的结果:pastebin.com/judJys5g
manatwork

@manatwork您是正确的,图I无法删除sort{$a-$b}grep...
andlrc

需求并没有说明输出的格式必须完全与示例中的一样,并且在此任务中显然不是重点。因此,我们许多人只是使用了我们选择的语言中比较方便的东西。在Perl我会做这样的:$_="@a[0,-1]"
manatwork '16

短过滤一个字符:grep!/"/
manatwork '16

它说数组将是数字和字符串。问题中的所有示例都用双引号引起来,但是我看不到任何不能将它们用单引号引起来的信息。我认为!/\D/有必要代替!/"/,再增加一个字节。
msh210 '16

3

朱莉娅,35个字节

x->extrema(filter(i->isa(i,Int),x))

这是一个lambda函数,它接受一个数组并返回一个整数元组。要调用它,请将其分配给变量。

Julia具有一个内置函数,extrema用于将数组的最小和最大元素作为元组获取。但是,由于数组中也可以包含字符串,因此我们首先必须将其过滤掉。我们可以通过使用来测试每​​个元素是否为整数来做到这一点isa


3

Japt,23个字节

[V=Uf_bZÃn@X-Y})g Vw g]

在线测试!

怎么运行的

[V=Uf_  bZÃ n@  X-Y})g Vw g]
[V=UfZ{ZbZ} nXY{X-Y})g Vw g]

UfZ{ZbZ}   // Filter out the items Z in U where Z.b(Z) is falsy.
           // For numbers, this the original number, which is always non-0 (non-falsy).
           // For strings, this returns Z.indexOf(Z), which is always 0 (falsy).
nXY{X-Y}   // Sort by subtraction. Small items move to the front, large to the back.
V=         // Set variable V to the resulting array.
)g Vw g    // Take the first item in V, and the first in V.reverse().
[       ]  // Wrap them in an array so both are sent to output.

3

Bash,40 31 30字节

sort -n|sed /\"/d|sed '1p;$p;d'

需要行分隔列表:

$ echo $'5\n4\n2\n9\n1\n"10"\n5' | sort -n|sed /\"/d|sed '1p;$p;d'
1
9

感谢@manatwork削减了几个字节


sed '1p;$p;d'保存一个字节。
丹尼斯

3

PowerShell,53 36字节

@($args[0]|?{$_-is[int]}|sort)[0,-1]

@goric节省了17个字节

OOOF ... PowerShell通常在投放时玩起来很快且松散,这对打高尔夫球通常是一件好事,但会在这里造成伤害。

获取我们的输入$args[0]并将其通过管道传递到一个Where-Object语句(?)中,该语句将仅选择整数并将其沿管道传递,并丢弃其他任何内容。由于动态重播会在后台为您动态进行(例如,1+"5"返回6完全有效的PowerShell),因此我们需要使用-is运算符来区分数据类型。

从那里,我们将该集合通过管道Sort-Object传输到中,该集合将从最小到最大对整数进行排序。外部()是必需的,因此我们可以使用来引用第一个和最后一个元素[0,-1](即最小和最大),但是请注意@sort如果只有一个对象(作为结果的结果),我们还需要外部强制将输出强制转换为数组的?,或只有一个对象是输入)。


1
这里看看-is类型运算符。我想你可以替换使用,以节省17个字节.GetType().Name-eq"Int32"-is[int]
goric

@goric超级棒!感谢您的大规模高尔夫!
AdmBorkBork '16

3

MATL,23字节

"@Y:tX%1)2\?x]N$htX<wX>

在线尝试!

"       % implicitly input cell array. For loop that iterates on each cell
  @     %   push each cell
  Y:    %   cell's contents (either a number or a string)
  tX%   %   duplicate and push class. This will produce 'char'  or 'double'
  1)    %   get first letter: either 'c' or 'd'
  2\    %   is its ASCII code odd?
  ?     %   if so...
    x   %     delete (it's a string)
  ]     %   end if
  N$h   %   concatenate all stack into an array. This array will contain up to
        %   three numbers: minimum up to now, maximum up to now, new value (if any)
  tX<   %   duplicate. Push minimum
  wX>   %   swap. Push maximum.
        % implicitly end for
        % implicitly display stack contents

哦,我的坏:p。不错的答案:)
Adnan

@Adnan谢谢!有点太长了:-)
路易斯·门多

2

JavaScript(ES5),105个字节

function a(b){m=Math;b=b.filter(function(c){return c===+c});alert(m.min.apply(m,b)+','+m.max.apply(m,b))}

用法: a([1,2,3,'4'])

尝试一下 :)

“无高尔夫球”:

function a(b){
  m=Math;
  b=b.filter(function(c){
    return c===+c
  });
  alert(m.min.apply(m,b) + ',' + m.max.apply(m,b))
}

2

Pyth,11个字节

hJSf!>TkQeJ

说明:

   f    Q   - filter([V for T in >], Q)
    !>Tk    - not(T>"")
  S         - sorted(^)
hJ       eJ - print first and last element

在这里尝试!


2

Perl 6,25个字节

显而易见的答案是这个WhateverCode lambda

*.grep(Int).minmax.bounds

如果必须是完整程序

put get.words».&val.grep(Int).minmax.bounds

该完整程序的输入是用空格分隔的值列表


用法

# give it a lexical name
my &code = *.grep(Int).minmax.bounds;

say code [1, 2, 3, 4, 5, 6, 7, 8];  # (1 8)
say code [5, 4, 2, 9, 1, 10, 5];    # (1 10)
say code [7, 8, 10, "Hello", 5, 5]; # (5 10)
say code [1, 2, 3, 4, "5"];         # (1 4)
say code [1];                       # (1 1)
say code ["1", "2", "3", "4", 5];   # (5 5)

say code []; # (Inf -Inf)

2

𝔼𝕊𝕄𝕚𝕟,16个字符/ 20个字节

[МƲ(ï⇔⒡≔=+$⸩,МƵï

Try it here (Firefox only).

不错,不错...

说明

这将输出一个同时包含最大值和最小值的数组。(ï⇔⒡≔=+$⸩,基本上过滤掉输入中的所有字符串,МƲ获取输入中的最大值,并МƵ获取最小值。

请注意:这是我要使用的第一个挑战,基本上变成ï⇔ï=ï


2

Python 3,56个字节

lambda x:[m(t for t in x if str(t)!=t)for m in(min,max)]

Ideone上在线尝试。


2

APL(Dyalog),13个字节

(⌊/,⌈/)⎕AV~⍨∊

在线尝试!

 登记(展平–这会使所有字符串变成大列表中的字符)

⎕AV~⍨ 删除的所有字符一个托米奇V埃克特(字符集-叶数)

() 应用以下默认功能:

⌊/ 最小跨度

, 附加到

⌈/ 跨越的最大值


2

Java(OpenJDK 8),124字节

a->{int s[]={0,0},t;for(Object i:a)try{t=(int)i;s[0]=s[0]<1|t<s[0]?t:s[0];s[1]=s[1]<t?t:s[1];}catch(Exception e){}return s;}

在线尝试!

Java 8 lambda函数,将array作为输入并给出array {min, max}。非竞争性,因为输入必须是整数数组。

固定和-1字节感谢凯文·克鲁伊森


您可以通过获取对象列表并检查某项是整数还是字符串来使之竞争。
凯文·克鲁伊森

@KevinCruijssen完成了,谢谢
HyperNeutrino

<i现在给出一个不带整数转换的错误。另外,你的初始代码(而这一次也一样)不适合工作min,因为它总是会输出0min这是一个可能的解决方法。编辑:try-catch似乎1个字节if(i instanceof Integer)
凯文·克鲁伊森

@KevinCruijssen哦,没有注意到,谢谢!
HyperNeutrino,

1

Jolf,20个字节

我可能可以打高尔夫...我需要实施类型检查较短的解决方案。

γ fxd='nF~tH0ͺZkγZKγ
 _fx                 filter the input
    d='nF~tH0        checking for number type
γ                    call that "γ"
             ͺ       pair
              ZkγZKγ  the min and max of the array
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.