Найдите самое длинное слово в массиве

24

Ваша задача - взять массив строк и вывести самую длинную строку в массиве. Таким образом, для

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

выход будет biggest.

Если два элемента массива имеют одинаковую длину, вы должны выбрать тот, который появляется первым в массиве. Это означает, что если массив выглядит так:

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

вывод есть one, но если массив выглядел так:

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

выход есть two.


Поскольку это , выигрывает самый короткий код в байтах.

выжидать
источник
3
2 Примечания: 1Это сильно расстраивайтесь , если вопрос меняется и аннулирует существующий ответ, и Песочница существует именно по этой причине (убедитесь , что проблемы хороши , прежде чем отправлять)2
user202729
4
Так как я не думаю, что кто-то еще упомянул об этом - Привет и добро пожаловать в PPCG!
AdmBorkBork
1
Нет, вам не нужно обрабатывать случай, когда массив пуст. Но если хочешь, можешь.
Догго
4
два часа? Это далеко, далеко слишком быстро , чтобы быть принятие ответа.
Лохматый
6
Обычно вы ждете неделю
Кристофер

Ответы:

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.

Онлайн версия

Ungolfed:

Listan Pisin alkio на riippuen siitä , онко сен ensimmäisenAlkion pituus suurempi тай yhtä Suuri Куин сеном jokaisen Alkion pituus, Джоко

  • сен ensimmäinenалкио тай
  • Сен Ханнан Писин Алкио.

Онлайн версия

Единственная возможность игры в гольф - заменить pisin alkio(что означает «самый длинный элемент») на x.

Перевод:

Самый длинный элемент в списке, в зависимости от того, больше ли длина первого элемента или равна длине каждого элемента в списке, либо

  • первый элемент в списке, или
  • самый длинный элемент в конце списка.
fergusq
источник
21
Это -... Это -... Как ты -.... Что ?!
auhmaan
3
Google Translate с финского: Список x зависит от того, больше ли длина первого элемента или равна длине каждого элемента, либо первого элемента, либо хвоста x.
Адам
2
@ Adám Раньше я думал, что APL трудно читать. Очевидно, что все, что вам нужно, - это перевести игровое поле на язык, где английский является редким товаром.
Уриэль
3
Кому нужны COBOL, AppleScript или Inform 7? Кому нужен Арнольд Шеф или Шекспир? У вас есть императив Тампио! О мой летающий монстр спагетти, финский всех языков? Я не узнаю об этом в ближайшее время ...
fede s.
1
@fedes. Вы могли бы сказать: «Olkoon suomalainen suudelma uusi suudelma». (Пусть финский поцелуй будет новым поцелуем, он создает новый объект поцелуя)
fergusq
20

Python , 23 байта

lambda a:max(a,key=len)

Попробуйте онлайн!

Нил
источник
1
Мне жаль, что я не обратил это право.
Догго
1
Я обновил фрагмент кода, но, как написано, он уже достигает этой функциональности.
Нил
1
Это также будет работать без изменений в Python 3.
anonymoose
17

Haskell , 35 байт

-3 байта благодаря Згарбу.

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

Если бы не импорт, это было бы идеальным представлением для получения всех голосов. :П

(Кроме того, для этого используется один наконечник для игры в гольф и используется сгиб.)

totallyhuman
источник
2
Без этого требования «первый случай в галстуке» эта красота будет работать: snd.maximum.map((,)=<<(0<$)) попробуйте онлайн! ,
Лайкони
1
Просто для справки: есть скучный встроенный 29-байтовый import Data.Lists;argmax(0<$).
Ними
1
Вау, как это lне часть fold? Как он различает это и названную функцию foldl?
12Me21
1
@ 12Me21 Это часть имени функции foldl1. Я думал, что часть объяснения может сбить с толку, извините ...
полностью человек
1
35 байтов с функцией вместо лямбды. Интересно, что вы должны заменить 0с aили что - то еще, в противном случае GHC жалуется неоднозначного числового типа.
Згарб
8

EXCEL, 36 42 байта

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

Введено как формула массива (ctrl-shift-enter). Входной массив должен быть введен в столбце А.

Формула возвращает первое совпадение с максимальной длиной.

В зависимости от настроек вашего региона, замените ,на ;; длина кода остается неизменной. Из 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
pbeentje
источник
Что за ,последний? Формула все еще работает без нее
Анастасия-Романова 秀
Последний ,- это параметр для MATCH, который возвращает первое точное совпадение, как того требует (пересмотренный) вопрос. Если он пропущен, то MATCH ожидает массив в порядке возрастания и возвращает последнее совпадение вместо первого, если имеется несколько элементов одинаковой длины.
pbeentje
Уверены? Я сравнил эти две формулы, и обе пришли с одинаковым результатом
Анастасия-Романова
Используете ли вы входной массив, который имеет две (разные) строки одинаковой длины? Отсутствие запятой (точка с запятой) дает мне последнюю строку максимальной длины, как и ожидалось ... (Excel 2016, 64-разрядная
версия
К сожалению, сообщество решило, что использование именованных диапазонов таким образом недопустимо, поэтому я предлагаю, чтобы в этом конкретном случае вы переключились на использование A:Aи сделали массив формальным {...}, иначе отличный пост!
Тейлор Скотт
7

APL (Dyalog Unicode) , 9 байтов SBCS

⊢⊃⍨∘⊃∘⍒≢¨

Попробуйте онлайн!

 из аргумента,

⊃⍨ выбрать элемент с индексом, который является

 первый из

 индексы в порядке убывания

≢¨ длины каждого

Адам
источник
7

Пролог (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.

Попробуйте онлайн!

объяснение

Первая строка определяет двоичный предикат /как сокращение, для atom_length/2которого верно, если длина первого аргумента является вторым аргументом. Это экономит нам 3 байта при использовании в atom_lengthдва раза.

Наш основной предикат определяется как диадический, *где первый аргумент является списком, а второй аргумент - самым длинным элементом этого списка.

Вторая строка - это наш базовый случай, в котором говорится, что самым длинным элементом списка из одного элемента является этот элемент.

В третьей строке указывается, что для списка, содержащего не менее 2 элементов, самый длинный элемент:

Если длина второго элемента превышает длину первого элемента, самый длинный элемент находится в списке без первого элемента.

В противном случае самый длинный элемент находится в списке без второго элемента.

Emigna
источник
Мне было бы интересно увидеть объяснение того, как это работает
Kritixi Lithos
@ Cowsquack: я добавил краткое объяснение.
Emigna
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
Мистер Xcoder
источник
хорошо, что вы победили ответ Pyth с 6 байтами приятно.
Doggo
elD_и ho_lдостичь той же длины.
Исаак
1
@ hakr14 Большое спасибо за редактирование!
г-н Xcoder
6

PowerShell , 24 байта

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

Попробуйте онлайн!

Принимает входные данные $args[0], направляет их Sort-Objectпо lвозрастанию в -dпорядке возрастания. Затем берет [0]один из них. Так как сортировка стабильна, в случае связи используется первый элемент.

AdmBorkBork
источник
1
Хорошее имя вафф вафф: 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]
LiefdeWen
источник
@Doggo Возвращает первый элемент в случае ничьей.
LiefdeWen
1
Возвращение логического значения вместо числа со знаком в обратном вызове sort () не работает во всех движках JS (например, в Edge не работает). Другим подходом было бы что-то вроде этого , которое на 1 байт короче. Тем не менее, нет никакой гарантии, что первый элемент будет выбран одинаково во всех браузерах в случае ничьей.
Arnauld
но если он последовательно выбирает его в node.js на TIO, разве это не достаточно хорошо? \
LiefdeWen
1
Вы должны использовать -вместо <функции сравнения.
kamoroso94
1
@LiefdeWen Да, но это решает проблемы в комментариях.
Себастьян Саймон
5

J , 19, 11, 10 8 байт

0{>\:#@>

Попробуйте онлайн!

Спасибо Streetster за подсказку!

-1 байт благодаря FrownyFrog!

-2 байта благодаря Конору О'Брайену

Как это работает:

    (  #@>) - 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 - Спасибо! Я только что понял это. Я собираюсь попробовать это сейчас, это должно быть намного короче.
Гален Иванов
1
Никаких скобок после этой точки:0{::]\:#@>
FrownyFrog
Был бы {.@вместо 0{::работы?
Критиси Литос
1
8 байтов:0{>\:#@>
Конор О'Брайен
4

C #, 43 + 18 = 61 байт

Попробуйте онлайн!

a=>a.OrderByDescending(x=>x.Length).First()
LiefdeWen
источник
@Doggo Возвращает первый элемент в случае ничьей.
LiefdeWen
@LiefdeWen OrderBy является стабильным, так что это на самом деле будет возвращать последний элемент в случае связи. Пример: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Гжегож Пулавский
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
4

PHP, 72 байта

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Алан Ондра
источник
4
Здравствуйте и добро пожаловать в PPCG! :)
DJMcMayhem
4

Japt -h, 5 3 байта

ÔñÊ

Попытайся

Обратный, сортировка по длине и вывод последнего элемента.

мохнатый
источник
3

K (ок) , 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

Заметки:

Undeleted, поскольку это классифицируется как нетривиальное, хотя в основном это 5 шагов (будет, если написано как функция {*x@>#:'x}).

streetster
источник
3

Java (OpenJDK 8) , 67 байт

Еще одна подача на моем любимом языке! (читай: единственный, кого я знаю).
Это не работает с пустым массивом, но это нормально.

Golfed

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

Ungolfed

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

Ungolfed

(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основанный на подходе, взяв максимум по длине и перенеся его через.
Коул
О да Спасибо за указание на это. Я не могу поверить, что я не проверял это.
Даниэль Ламберт
Кроме того, можно изменить define(m a)наλ(a)
Федя с.
1
Также проверьте советы, если у вас нет!
Федерация с.
3

Царапина 27 17 170 160

кодовая картинка

Ожидается глобальный (прикрепленный ко всем спрайтам, если быть более точным) список вызываемых строк 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здесь?
Ггорлен
3

Рёда , 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]]}

Попробуйте онлайн!

fergusq
источник
Запись моего jq-ответа заставила меня осознать, что enumего можно отбросить, и вместо этого [[-#_,_1]]можно выбрать минимальное из , tio.run/…
Kritixi Lithos
@ Cowsquack Это не работает, потому что тогда minсравниваются строки в алфавитном порядке (потому что массивы сравниваются вторично по их второму элементу). Например, вход ["b", "a"]будет давать "a"как выход. Я, вероятно, должен добавить minbyфункцию к Röda или что-то подобное ...
fergusq
3

APL - 23 16 байт

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

Спасибо всем за ваши замечательные предложения и поддержку!

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

Использование:

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

Объяснение:

получает длину каждого вектора символов (строку), затем использует максимум в качестве индекса. Я только начал APL 20 минут назад, поэтому я извиняюсь, если это глупый способ сделать это.

Попробуйте онлайн!

(отредактировано для ясности)

rmoro
источник
1
Добро пожаловать в PPCG!
Steadybox
a←Не засчитан ваш ByteCount.
Kritixi Lithos
Никогда не забывайте, что APL оценивается справа налево: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Кроме того, (...)⌷⍵=> ⍵⌷⍨...чтобы сохранить один байт
Zacharý
Кроме скобок, это на самом деле кажется довольно хорошим!
Захари
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.

Попробуйте онлайн!

Ataco
источник
2

СНОБОЛ4 (CSNOBOL4) , 63 57 байт

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

Попробуйте онлайн!

Вход на стандартный вывод и вывод на стандартный вывод.

Примерно переводится следующий псевдокод:

while input exists
 x = input
 if length(m) < length(x)
  m = x
end
return m
Giuseppe
источник