Tìm từ dài nhất trong một mảng


24

Thử thách của bạn là lấy một chuỗi các chuỗi và xuất chuỗi dài nhất trong mảng. Vì vậy đối với

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

đầu ra sẽ là biggest.

Nếu hai phần tử của mảng có cùng độ dài, bạn nên chọn phần tử xuất hiện đầu tiên trong mảng. Điều đó có nghĩa là nếu mảng trông như thế này:

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

đầu ra là one, nhưng nếu mảng trông như thế này:

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

đầu ra là two.


Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.


3
2 lưu ý: 1Nó nặng nề nản chí nếu câu hỏi được thay đổi và làm mất hiệu lực câu trả lời hiện có, và 2các Sandbox tồn tại cho chính xác điều đó lý do (chắc chắn rằng những thách thức rất tốt trước khi gửi bài)
user202729

4
Vì tôi không nghĩ có ai khác đã đề cập đến nó - Xin chào, và chào mừng bạn đến với PPCG!
admBorkBork

1
Không, bạn không phải xử lý trường hợp mảng trống. Nhưng nếu bạn muốn bạn có thể.
Doggo

4
2 giờ? Đó là xa, xa quá nhanh chóng được chấp nhận một câu trả lời.
Xù xì

6
Thông thường bạn đợi một tuần
Christopher

Câu trả lời:


31

Băng vệ sinh bắt buộc , 168 byte

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.

Phiên bản trực tuyến

Ung dung:

Listan Pisin alkio trên riippuen siitä , onko sen ensimmäisenAlkion pituus suurempi tai yhtä suuri Kuin sen jokaisen Alkion pituus, Joko

  • sen ensimmäinenkiềmio tai
  • sen hännän pisin.

Phiên bản trực tuyến

Cơ hội chơi gôn duy nhất này là để thay thế pisin alkio(có nghĩa là "yếu tố dài nhất") x.

Dịch:

Mục dài nhất trong danh sách là, tùy thuộc vào độ dài của mục đầu tiên lớn hơn hoặc bằng độ dài của mỗi phần tử trong danh sách,

  • mục đầu tiên trong danh sách, hoặc
  • mục dài nhất trong đuôi của danh sách.

21
Đây có phải là -... Có thi -... Làm thế nào để bạn -.... Cái gì?!
auhmaan

3
Google Dịch từ tiếng Phần Lan: Danh sách x phụ thuộc vào độ dài của phần tử đầu tiên lớn hơn hoặc bằng độ dài của mỗi phần tử, mục đầu tiên hay phần đuôi của x.
Adám

2
@ Adám Tôi từng nghĩ APL khó đọc. Rõ ràng tất cả những gì bạn cần để đánh bại đó là chuyển sân chơi sang ngôn ngữ mà tiếng Anh là một mặt hàng hiếm.
Uriel

3
Ai cần COBOL, AppleScript hoặc Thông tin 7? Ai cần đầu bếp Arnold hay Shakespeare? Bạn có Tampio bắt buộc! Oh quái vật spaghetti bay của tôi, tiếng Phần Lan của tất cả các ngôn ngữ? Tôi sẽ không học được điều đó bất cứ lúc nào sớm ...
fede s.

1
@fedes. Bạn có thể nói "Olkoon suomalainen suudelma uusi suudelma." (Hãy để nụ hôn của Phần Lan là một nụ hôn mới, nó tạo ra một đối tượng hôn mới)
fergusq

20

Python , 23 byte

lambda a:max(a,key=len)

Hãy thử trực tuyến!


1
Tôi xin lỗi vì tôi đã không chuyển đổi quyền này.
Doggo

1
Tôi đã cập nhật đoạn mã, nhưng khi được viết, nó đã đạt được chức năng này.
Neil

1
Điều này cũng sẽ làm việc không thay đổi trong Python 3.
anonymoose

17

Haskell , 35 byte

-3 byte nhờ Zgarb.

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

Hãy thử trực tuyến!

Tôi thích mã này. Bạn biết tại sao mà? Bởi vì Haskell hỗ trợ các giải pháp thanh lịch hơn nhiều với các chức năng từ các thư viện ngẫu nhiên.

maximumBy(compare`on`length).reverse

Đó là friggin 'có thể đọc được! Ngoại trừ, nó không hợp lệ.

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

Nếu không phải là hàng nhập khẩu, đây sẽ là một bản hoàn hảo để nhận tất cả các ưu đãi. : P

(Ngoài ra, điều này sử dụng một mẹo chơi golf nó sử dụng một nếp gấp.)


2
Với yêu cầu bổ sung "lần đầu tiên xảy ra trong trường hợp buộc", người đẹp này sẽ làm việc: snd.maximum.map((,)=<<(0<$)) Hãy thử trực tuyến! .
Laikoni

1
Chỉ để tham khảo: có 29 byte tích hợp import Data.Lists;argmax(0<$).
nimi

1
Woah, làm thế nào lkhông phải là một phần của fold? Làm thế nào để phân biệt giữa đó và một chức năng được đặt tên foldl?
12Me21

1
@ 12Me21 Nó là một phần của tên hàm foldl1. Tôi nghĩ rằng một phần của lời giải thích có thể gây nhầm lẫn, xin lỗi ...
hoàn toàn là con người

1
35 byte với chức năng thay vì lambda. Thật thú vị, bạn phải thay thế 0bằng ahoặc một cái gì đó khác, nếu không GHC phàn nàn về một loại số mơ hồ.
Zgarb


8

VƯỢT TRỘI, 36 42 byte

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

Được nhập dưới dạng công thức mảng (ctrl-shift-enter). Mảng đầu vào phải được nhập vào cột A.

Công thức trả về trận đấu đầu tiên với độ dài tối đa.

Tùy thuộc vào cài đặt khu vực của bạn, thay thế ,bằng ;; chiều dài mã không thay đổi. Trong số 16 ngôn ngữ được liệt kê ở đây , tên hàm tiếng Anh là ngắn nhất cho công thức này.

Giải trình:

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

Điều gì cho ,sau này? Công thức vẫn hoạt động mà không có nó
Anastasiya-Romanova

Cuối cùng ,là một tham số cho MATCH trả về kết quả khớp chính xác đầu tiên, theo yêu cầu của câu hỏi (đã sửa đổi). Nếu nó bị bỏ đi, thì MATCH mong đợi một mảng theo thứ tự tăng dần và trả về kết quả khớp cuối cùng thay vì đầu tiên nếu có nhiều phần tử có cùng độ dài.
pbeentje

Có chắc không Tôi đã so sánh hai công thức đó và cả hai đều có cùng một kết quả
Anastasiya-Romanova

Bạn có đang sử dụng một mảng đầu vào có hai chuỗi (khác nhau) có cùng độ dài không? Thoát khỏi dấu phẩy (dấu chấm phẩy) mang lại cho tôi chuỗi cuối cùng có độ dài tối đa, như mong đợi ... (Excel 2016, 64-bit)
pbeentje

Thật không may, cộng đồng đã quyết định rằng việc sử dụng các phạm vi được đặt tên theo cách này là không hợp lệ, vì vậy tôi đề nghị rằng trong trường hợp cụ thể này, bạn chuyển sang sử dụng A:Avà biến nó thành một mảng chính thức với {...}, nếu không thì bài đăng tuyệt vời!
Taylor Scott


7

Prolog (SWI) , 98 92 72 69 byte

Vị ngữ cấp cao nhất là *.

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

Hãy thử trực tuyến!

Giải trình

Hàng đầu tiên định nghĩa vị từ dyadic /là viết tắt củaatom_length/2 , điều này đúng nếu độ dài của đối số thứ nhất là đối số thứ hai. Điều này giúp chúng tôi tiết kiệm 3 byte khi sử dụng atom_lengthhai lần.

Vị ngữ chính của chúng tôi được định nghĩa là dyadic * trong đó đối số thứ nhất là danh sách và đối số thứ hai là phần tử dài nhất của danh sách đó.

Hàng thứ hai là trường hợp cơ sở của chúng tôi nói rằng phần tử dài nhất của danh sách một phần tử là phần tử đó.

Hàng thứ ba nói rằng đối với một danh sách có ít nhất 2 phần tử, phần tử dài nhất là:

Nếu độ dài của phần tử thứ hai dài hơn phần tử thứ nhất, phần tử dài nhất nằm trong danh sách không có phần tử thứ nhất.

Mặt khác, phần tử dài nhất nằm trong danh sách mà không có phần tử thứ hai.


Tôi rất muốn xem giải thích về cách thức hoạt động của nó
Kritixi Lithos

@Cowsquack: Tôi đã thêm một lời giải thích ngắn.
Emigna

7

Bình thường , 4 byte

h.Ml

Bộ thử nghiệm.

Giải trình
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

Rất vui, bạn đánh bại câu trả lời Pyth với 6 byte tốt đẹp.
Doggo

elD_ho_lđạt được cùng chiều dài.
isaacg

1
@ hakr14 Cảm ơn bạn rất nhiều vì đã chỉnh sửa!
Ông Xcoder

6

PowerShell , 24 byte

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

Hãy thử trực tuyến!

Có đầu vào $args[0], đường ống mà Sort-Objectdựa trên length theo -dthứ tự tăng dần. Sau đó lấy cái [0]thứ đó. Vì sắp xếp ổn định, điều này có yếu tố đầu tiên trong trường hợp hòa.


1
Tên đẹp wuff wuff: D
Doggo 20/12/17

6

Octave , 33 byte

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

Đầu vào là một mảng ô của chuỗi.

Hãy thử trực tuyến!

Giải trình

cellfun(@nnz,x)áp dụng nnzhàm (số lượng khác không) cho mỗi chuỗi trong mảng đầu vào x. Đối với chuỗi ASCII, nnztương đương với numel(số phần tử), nhưng ngắn hơn. Kết quả là một mảng số với độ dài chuỗi.

Sau đó, [~,]=max(...)đưa ra chỉ số của mức tối đa đầu tiên trong mảng độ dài chuỗi. Kết quả được sử dụng như một chỉ số nẹp cong xđể có được chuỗi tương ứng.


6

JavaScript (Node.js) , 38 byte

Hãy thử trực tuyến!

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

@Doggo Nó trả về phần tử đầu tiên trong trường hợp hòa.
LiefdeWen

1
Trả về một boolean thay vì một số đã ký trong cuộc gọi lại sắp xếp () không hoạt động trong tất cả các công cụ JS (ví dụ: nó không hoạt động trong Edge). Một cách tiếp cận khác sẽ là một cái gì đó tương tự , ngắn hơn 1 byte. Tuy nhiên, không có gì đảm bảo rằng mục đầu tiên sẽ được chọn nhất quán trên các trình duyệt trong trường hợp hòa.
Arnauld

nhưng nếu nó chọn nó một cách nhất quán trong node.js trên TIO thì không đủ tốt sao? \
LiefdeWen

1
Bạn nên sử dụng -thay vì <trong chức năng so sánh.
kamoroso94

1
@LiefdeWen Có, nhưng nó giải quyết các vấn đề trong các bình luận.
Sebastian Simon

5

J , 19, 11, 10 8 byte

0{>\:#@>

Hãy thử trực tuyến!

Cảm ơn streetster cho gợi ý!

-1 byte nhờ FrownyFrog!

-2 byte nhờ Conor O'Brien

Làm thế nào nó hoạt động:

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

Hãy thử trực tuyến!


1
Đây là cách tiếp cận ban đầu của tôi ở K, nhưng sau đó tôi nhận ra rằng tôi chỉ có thể sắp xếp danh sách theo số đếm, giảm dần và lấy mục đầu tiên ... Bạn có thể làm điều tương tự trong J không?
streetster

@streetster - Cảm ơn! Tôi chỉ nhận ra rằng. Tôi sẽ thử nó ngay bây giờ, nó sẽ ngắn hơn nhiều.
Galen Ivanov

1
Không có dấu ngoặc đơn nào ngoài điểm này:0{::]\:#@>
FrownyFrog

Sẽ {.@thay vì 0{::công việc?
Kritixi Litva

1
8 byte:0{>\:#@>
Conor O'Brien

4

C #, 43 + 18 = 61 byte

Hãy thử trực tuyến!

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

@Doggo Nó trả về phần tử đầu tiên trong trường hợp hòa.
LiefdeWen

@LiefdeWen OrderBy ổn định nên trên thực tế điều này sẽ trả về phần tử cuối cùng trong trường hợp hòa. Ví dụ: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/ phỏng
Grzegorz Puławski

1
@ GrzegorzPuławski Ồ, tôi hiểu rồi, đã sửa.
LiefdeWen

Tôi có một vài cái mà có lẽ ai đó có thể giúp rút ngắn a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)cơ sở 44 byte, cơ sở a=>a.First(x=>x.Length==a.Max(y=>y.Length))43 byte
Monso

1
@MrLore Đó là giải pháp đầu tiên của tôi nhưng sau đó, nó trả lại cái cuối cùng, vì thứ tự không bị ảnh hưởng.
LiefdeWen


4

PHP, 72 byte

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});

4
Xin chào, và chào mừng đến với PPCG! :)
DJMcMayhem

4

Japt -h, 5 3 byte

ÔñÊ

Thử nó

Đảo ngược, sắp xếp theo chiều dài và xuất phần tử cuối cùng.



3

K (oK) , 9 byte

*x@>#:'x:

Hãy thử trực tuyến!

Thí dụ:

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

Giải trình

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

Ghi chú:

Không bị xóa vì điều này được phân loại là không tầm thường, mặc dù về cơ bản là 5 bước (sẽ được viết là hàm {*x@>#:'x}).


3

Java (OpenJDK 8) , 67 byte

Một đệ trình trong ngôn ngữ yêu thích của tôi! (đọc: người duy nhất tôi biết).
Điều này không hoạt động với một mảng trống, nhưng điều đó tốt.

Chơi gôn

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

Bị đánh cắp

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.

Hãy thử trực tuyến!


3

Vợt , 160 byte 110 byte

Hãy thử trực tuyến! Lần đầu đóng góp, tư vấn đánh giá cao!

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

Bị đánh cắp

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

Giải pháp cập nhật dựa trên phản hồi


4
Tôi muốn nói lời chào mừng tới PPCG thay mặt cho cộng đồng! Tôi nhận thấy rằng giải pháp của bạn dường như thất bại đối với các danh sách có chuỗi dài nhất ở cuối. Ví dụ ở đây . Tôi không nhớ rõ về Vợt, nhưng nếu bạn có thể, tôi khuyên bạn nên thay đổi thuật toán của mình sang foldrcách tiếp cận dựa trên cơ sở, lấy tối đa theo chiều dài và mang nó đi ngang.
cole

Ồ hả. Cảm ơn bạn đã chỉ ra rằng. Tôi không thể tin rằng tôi đã không kiểm tra điều đó.
Daniel Lambert

Bạn cũng có thể thay đổi define(m a)thànhλ(a)
fede s.

1
Ngoài ra, hãy kiểm tra các mẹo nếu bạn chưa!
fede s.


3

Cào 27 17 170 160

hình ảnh mã

Nó hy vọng một danh sách toàn cầu (được đính kèm với tất cả các sprite, chính xác hơn) các chuỗi được gọi mylist. Sau khi nhấp vào cờ màu xanh lá cây, từ dài nhất sẽ được để lại trong biến w.

Tôi nghĩ rằng đây là liên kết

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

Đếm theo meta này.


Có cần thiết stop[allở đây không?
ggorlen

3

Röda , 30 byte

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

Hãy thử trực tuyến!

Giải trình:

{
 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 byte thay thế:

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

Hãy thử trực tuyến!


Viết lên câu trả lời jq của tôi khiến tôi nhận ra rằng enumcó thể bỏ được, và thay vào đó, [[-#_,_1]]có thể chọn mức tối thiểu từ đó , tio.run/ mẹo
Kritixi Lithos

@Cowsquack Điều đó không hiệu quả vì sau đó min sẽ so sánh các chuỗi theo thứ tự bảng chữ cái (vì các mảng được so sánh thứ hai bởi mục thứ hai của chúng). Ví dụ đầu vào ["b", "a"]sẽ cung cấp "a"như đầu ra. Tôi có lẽ nên thêm một minbychức năng cho Röda hoặc một cái gì đó tương tự ...
fergusq

3

APL - 23 16 byte

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

Cảm ơn tất cả mọi người cho tất cả các đề xuất và khuyến khích tuyệt vời của bạn!

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

Sử dụng:

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

Giải trình:

được độ dài của mỗi vectơ ký tự (chuỗi) sau đó sử dụng tối đa làm chỉ mục. Tôi mới bắt đầu APL 20 phút trước vì vậy tôi rất tiếc nếu đây là một cách ngu ngốc để làm điều đó.

Hãy thử trực tuyến!

(chỉnh sửa cho rõ ràng)


1
Chào mừng đến với PPCG!
Steadybox

Điều a←này không được tính vào bytecount của bạn.
Kritixi Lithos

Không bao giờ quên APL được đánh giá từ phải sang trái: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Ngoài ra, (...)⌷⍵=> ⍵⌷⍨...để lưu một byte
Zacharý

Khác với dấu ngoặc đơn, điều này thực sự có vẻ khá tốt!
Zacharý



2

Funky , 38 byte

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

Giải thích

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.

Hãy thử trực tuyến!



2

SNOBOL4 (CSNOBOL4) , 63 57 byte

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

Hãy thử trực tuyến!

Đầu vào là trên stdin và đầu ra trên thiết bị xuất chuẩn.

Tạm dịch sang mã giả sau:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.