查找数组中最长的单词


24

您面临的挑战是获取一个字符串数组并输出该数组中最长的字符串。因此对于

["tiny", "small", "bigger", "biggest"]

输出将是biggest

如果数组的两个元素的长度相同,则应选择在数组中最先出现的元素。这意味着如果数组看起来像这样:

["one", "two", "no"]

输出为one,但如果数组如下所示:

["two", "one", "no"]

输出是two


因为这是,所以以字节为单位的最短代码获胜。


3
2个,注意事项:1它严重阻碍,如果问题是改变之无效现有的应答,并2沙箱中存在正是出于这个理由(请务必挑战是发布前好)
user202729

4
由于我认为没有人提到过-嗨,欢迎来到PPCG!
AdmBorkBork

1
不,您不必处理数组为空的情况。但是,如果您愿意,可以。
Doggo

4
2小时?这是迄今为止,远远太快被接受的答案。
毛茸茸的

6
通常,您等待一个星期
Christopher

Answers:


31

命令式坦皮奥,168字节

Listan x on riippuen siitä,onko sen ensimmäisen alkion pituus suurempi tai yhtä suuri kuin sen jokaisen alkion pituus,joko sen ensimmäinen alkio tai sen hännän x.

在线版

取消高尔夫:

Listan pisin alkio riippuen siitäonkoensimmäisenalkion身体高度suurempi yhtä suuri kuinjokaisen alkion身体高度,佐戈

  • ensimmäinenalkio
  • 森·汉纳·皮辛·奥尔基奥。

在线版

唯一的高尔夫机会是将替换为pisin alkio(表示“最长的元素”)x

翻译:

列表中最长的项取决于第一项的长度是大于还是等于列表中每个元素的长度,或者

  • 列表中的第一项,或者
  • 列表尾部最长的项目。

21
这是-...是吗-...你怎么样-....什么?!
auhmaan

3
Google翻译成芬兰语:x的列表取决于第一个元素的长度是否大于或等于每个元素(x的第一项或尾部)的长度。
亚当

2
@Adám我以前认为APL很难阅读。显然,您需要克服的一切就是将游戏领域转移到一种英语是一种稀有商品的语言。
Uriel

3
谁需要COBOL,AppleScript或Inform 7?谁需要阿诺德厨师或莎士比亚?你有命令式坦皮奥!噢,我的飞行意大利面怪物,所有语言的芬兰语?我很快就不会再得知了……
fede s。

1
@fedes。您可以说“ Olkoon suomalainen suudelma uusi suudelma”。(让芬兰之吻成为一个新的吻,它创建一个新的吻对象)
fergusq


17

Haskell,35个字节

-3个字节感谢Zgarb。

foldl1(!)
a!b|(a<$a)<(a<$b)=b|1<2=a

在线尝试!

我喜欢这个代码。你知道为什么?因为Haskell使用随机库中的函数支持更优雅的解决方案。

maximumBy(compare`on`length).reverse

这是弗里金的可读性!除了,这是无效的。

import Data.List
import Data.Function
maximumBy(compare`on`length).reverse

如果不是进口的话,这将是获得所有支持的完美选择。:P

(此外,它使用一个高尔夫球头并且使用了折叠。)


2
无需添加“首先发生领带的情况”的要求,这种美将起作用:snd.maximum.map((,)=<<(0<$)) 在线尝试!
Laikoni '17

1
仅供参考:内置了无聊的29字节import Data.Lists;argmax(0<$)
nimi

1
哇,这是l不是一部分fold?它与命名函数之间foldl有何区别?
17Me21年

1
@ 12Me21它是函数名称的一部分foldl1。我认为部分解释可能会令人困惑,对不起...
totallyhuman

1
35个字节的函数,而不是lambda。有趣的是,您必须0a或替换其他内容,否则GHC会抱怨模棱两可的数字类型。
Zgarb


8

极好 36 42字节

=INDEX(A:A,MATCH(MAX(LEN(A:A)),LEN(A:A),))

输入为数组公式(ctrl-shift-enter)。输入数组应在A列中输入。

该公式返回最大长度的第一个匹配项。

根据您的区域设置,替代,;; 代码长度保持不变。在此处列出的16种语言中,英语功能名称是此公式的最短名称。

说明:

=                                          - return
 INDEX(                                  ) - the item of
       A:A                                 - the input
          ,                                - at
           MATCH(                       )  - the position of
                                       ,   - the first exact match of
                 MAX(        )             - the maximum of
                     LEN(   )              - the array of lengths of
                         A:A               - the input
                              ,            - in
                               LEN(   )    - the array of lengths of
                                   A:A     - the input

对于,后者呢?该公式在没有它的情况下仍然有效
Anastasiya-Romanova秀

最终,是MATCH的参数,根据(经修订的)问题的要求,该参数返回第一个精确匹配。如果忽略了它,则MATCH期望数组以升序排列,如果有多个相同长度的元素,则返回最后一个匹配项而不是第一个匹配项。
pbeentje

确定吗 我已经比较了这两个公式,并且都得出了完全相同的结果
Anastasiya-Romanova秀

您是否在使用具有两个(不同)长度相同的字符串的输入数组?如预期的那样,省略逗号(分号)会给我最后一个最大长度的字符串...(Excel
2016,64

不幸的是,社区决定以这种方式使用命名范围是无效的,因此我建议对于这种特殊情况,您应切换到使用A:A并将其设置为带正规的数组{...},否则就太好了!
泰勒·斯科特


7

Prolog(SWI)98 92 72 69字节

顶级谓词是*

X/Y:-atom_length(X,Y).
[A]*A.
[A,B|L]*Z:-A/X,B/Y,Y>X,[B|L]*Z;[A|L]*Z.

在线尝试!

说明

第一行将二元谓词定义/为short,atom_length/2如果第一个参数的长度为第二个参数,则为true。这样比使用atom_length两次可节省3个字节。

我们的主要谓词定义为二进位*,其中第一个参数是列表,第二个参数是该列表的最长元素。

第二行是我们的基本情况,它指出一个元素列表中最长的元素是该元素。

第三行指出,对于包含至少2个元素的列表,最长的元素为:

如果第二个元素的长度大于第一个元素的长度,则最长的元素在列表中,而没有第一个元素。

否则,最长的元素将在列表中,而没有第二个元素。


我有兴趣查看有关其工作原理的解释
Kritixi Lithos

@Cowsquack:我添加了一个简短的解释。
Emigna '18年

7

Pyth,4个字节

h.Ml

测试套件。

说明
h.Ml   | Program
h.MlZQ | With implicit variables filled in
-------+--------------------------------------------------------------------
h      | First element of
 .M  Q | The list of elements from the input list with the maximal value for
   lZ  | The length of the element

您好,您以6个字节的好成绩击败了Pyth答案。
Doggo

elD_ho_l达到相同的长度。
isaacg

1
@ hakr14非常感谢您的编辑!
Xcoder先生18年

6

PowerShell,24字节

($args[0]|sort l* -d)[0]

在线尝试!

以升序接受输入$args[0]Sort-Object基于强度的管道。然后采取其中之一。由于排序是稳定的,因此在平局的情况下这是第一个要素。l-d[0]


1
不错的名字wuff:D
Doggo

6

八度,33字节

@(x)x{[~,p]=max(cellfun(@nnz,x))}

输入是字符串的单元格数组。

在线尝试!

说明

cellfun(@nnz,x)nnz函数(非零数)应用于输入数组中的每个字符串x。对于ASCII字符串,nnz等效于numel(元素数),但更短。结果是带有字符串长度的数字数组。

然后,[~,]=max(...)给出字符串长度数组中第一个最大值的索引。结果用作花括号索引,x以获取相应的字符串。


6

JavaScript(Node.js),38字节

在线尝试!

a=>a.sort((a,b)=>a.length<b.length)[0]

@Doggo如果出现平局,它确实返回第一个元素。
LiefdeWen

1
在sort()回调中返回布尔值而不是带符号的数字并不适用于所有JS引擎(例如,不适用于Edge)。另一种方法是这样的,它短了1个字节。但是,仍然不能保证在打成平手的情况下跨浏览器选择一致的第一项。
Arnauld

但是,如果它在TIO上的node.js中一致地选择它还不够好吗?\
LiefdeWen

1
您应该使用-而不是<在比较器功能中。
kamoroso94 '17

1
@LiefdeWen是的,但是它解决了注释中的问题。
塞巴斯蒂安·西蒙

5

J19,11,10 8字节

0{>\:#@>

在线尝试!

感谢streetster的提示!

-1个字节感谢FrownyFrog!

-2个字节,感谢Conor O'Brien

怎么运行的:

    (  #@>) - unbox each string and find its length
     \:     - sort down the list of strings according to the lengths
0{::        - take and unbox the first string

在线尝试!


1
这是我最初在K中使用的方法,但是后来我意识到我可以按照计数,降序对列表进行排序,然后采用第一个项目...在J中可以做同样的事情吗?
streetster

@streetster-谢谢!我才意识到。我现在要尝试一下,它要短得多。
Galen Ivanov

1
在此之后,没有括号:0{::]\:#@>
FrownyFrog

{.@代替0{::工作吗?
Kritixi Lithos

1
8个字节:0{>\:#@>
Conor O'Brien

4

C#,43 + 18 = 61字节

在线尝试!

a=>a.OrderByDescending(x=>x.Length).First()

@Doggo如果出现平局,它确实返回第一个元素。
LiefdeWen

@LiefdeWen OrderBy是稳定的,因此,如果出现平局,这实际上将返回最后一个元素。例如:tio.run
##

1
@GrzegorzPuławski哦,我知道了,已解决。
LiefdeWen

我有一些建议,也许有人可以帮助缩短a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)44个字节的基础,a=>a.First(x=>x.Length==a.Max(y=>y.Length))43个字节的基础
Monso

1
@MrLore这是我的第一个解决方案,但是在平局中它返回最后一个,因为顺序不受影响。
LiefdeWen





3

K(oK),9个字节

*x@>#:'x:

在线尝试!

例:

*x@>#:'x:("edur";"oot";"taht")
"edur"

说明

*x@>#:'x: / solution
       x: / store input in variable x
    #:'   / count (#:) each (')
   >      / sort descending
 x@       / apply indices to x
*         / take the first one

笔记:

未删除,尽管这基本上是5个步骤(如果将其编写为函数,则将被归类为非平凡的{*x@>#:'x})。


3

Java(OpenJDK 8),67字节

我最喜欢的语言的另一个提交!(阅读:我认识的唯一一位)。
这不适用于空数组,但是很好。

打高尔夫球

w->{for(String y:w)if(y.length()>w[0].length())w[0]=y;return w[0];}

不打高尔夫球

for(String y:w)                           // Loops through all Strings
    if(y.length()>w[0].length())          // If the String is longer than the first String 
                                w[0]=y;   // Store it as the first string.
return w[0];                              // Return the first String.

在线尝试!


3

球拍160字节 110字节

在线尝试! 第一次贡献,建议表示赞赏!

(define(m a)(if(>(length a)1)(if(>=(string-length(car a))(string-length(m(cdr a))))(car a)(m(cdr a)))(car a)))

不打高尔夫球

(define (m a)
    (if (> (length a) 1)
        (if (>= (string-length (car a)) (string-length (m (cdr a))))
            (car a)
            (m (cdr a))
        )
        (car a)
    )
)

根据反馈更新了解决方案


4
我要代表社区对PPCG表示欢迎!我注意到,对于最长字符串在末尾的列表,您的解决方案显然失败了。这里的例子。我不太记得Racket,但是如果可以的话,我建议您将算法更改为foldr基于方法,采用最大长度并将其传递出去。
cole

哦 感谢您指出这一点。我不敢相信我没有测试过。
丹尼尔·兰伯特

您也可以将更define(m a)改为λ(a)
fede。

1
如果还没有,请检查提示
fede s。


3

刮擦 27 17 170 160

代码图片

它期望一个称为的字符串的全局列表(更确切地说,附加到所有sprite)mylist。单击绿色标志后,最长的单词将留在变量中w

我认为这是链接

when gf clicked
set[w]to(item[1]of[mylist
set[i]to[0
repeat(length of[mylist
change[i]by(1
set[m]to(item(i)of[mylist
if<(m)>(w)>then
set[w]to(m
end
end
stop[all

根据此元计数


stop[all这里有必要吗?
ggorlen

3

Röda,30个字节

{enum|[[#_,-_,_1]]|max|_|tail}

在线尝试!

说明:

{
 enum|         /* For each element, push its index to the stream */
 [[#_,-_,_1]]| /* For each element and index, push [length, -index, element] */
 max|          /* Find the greatest element */
 _|            /* Flat the list in the stream */
 tail          /* Return the last item in the stream */
}

备用30个字节:

{enum|[[#_,-_,_1]]|max|[_[2]]}

在线尝试!


写了我的JQ的回答让我意识到,enum可以被丢弃,而是从最小[[-#_,_1]]可以选择,tio.run/...
Kritixi LITHOS

@Cowsquack这是行不通的,因为这会随后min按字母顺序对字符串进行第二次比较(因为数组的第二项将其进行第二次比较)。例如,输入["b", "a"]"a"作为输出给出。我可能应该minby
Röda上

3

APL- 23 16字节

a←{((⍴¨⍵)⍳(⌈/(⍴¨⍵)))⌷⍵}

感谢大家的宝贵建议和鼓励!

a←{⍵⌷⍨(⍴¨⍵)⍳⌈/⍴¨⍵}

用法:

a 'duck' 'duck' 'goose'
  'goose'

说明:

获取每个字符向量(字符串)的长度,然后使用最大值作为索引。我刚刚在20分钟前启动APL,所以如果这样做是愚蠢的做法,我感到抱歉。

在线尝试!

(为清楚起见进行了编辑)


1
欢迎来到PPCG!
Steadybox

a←不会对你的BYTECOUNT计数。
Kritixi Lithos

永远不会忘记APL是从右到左评估的:(⌈/(⍴¨⍵))=> ⌈/⍴¨⍵。另外,(...)⌷⍵=>⍵⌷⍨...保存一个字节
扎卡里

除了括号之外,这实际上看起来还不错!
扎卡里

2

标准ML(MLton),55字节

fun&(s::r)=foldl(fn(%,$)=>if size% >size$then%else$)s r

在线尝试!用法示例:& ["abc","de","fgh"]yields "abc"

取消高尔夫:

fun step (current, longest) = 
    if size current > size longest 
    then current 
    else longest

fun longestString (start :: list) = foldl step start list
  | longestString nil = raise Empty

在线尝试!



2

时髦的,38字节

a=>a[(v=a::map@#)::find(math.max...v)]

解释

a=>a[(v=a::map@#)::find(math.max...v)]
        a::map@#                        $ Create a list of the lengths of the input's strings.
      v=                                $ And assign it to v.
     (          )::find(            )   $ Find the first index in this list that equals...
                        math.max...v    $ The largest value of v, eg. the length of the longest string.
   a[                                ]  $ Get the value at that position.

在线尝试!



2

SNOBOL4(CSNOBOL4)63 57字节

I	M =LT(SIZE(M),SIZE(X)) X
	X =INPUT	:S(I)
	OUTPUT =M
END

在线尝试!

输入在stdin上,输出在stdout上。

大致翻译为以下伪代码:

while input exists
 x = input
 if length(m) < length(x)
  m = x
end
return m

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.