Знайдіть найдовше слово в масиві


24

Ваше завдання - взяти масив рядків і вивести найдовший рядок у масиві. Так для

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

вихід буде biggest.

Якщо два елементи масиву мають однакову довжину, слід вибрати той, який з’явиться першим у масиві. Це означає, що масив виглядає так:

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

вихід є one, але якщо масив виглядав так:

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

вихід є two.


Оскільки це , виграє найкоротший код у байтах.


3
2 Примітки: 1Це сильно турбуйтеся , якщо питання змінюється і анулює існуючу відповідь, і Пісочниця існує саме по цій причині (переконайтеся , що проблеми гарні , перш ніж відправляти)2
user202729

4
Оскільки я не думаю, що ніхто інший це не згадував - Привіт, ласкаво просимо до PPCG!
AdmBorkBork

1
Ні, вам не доведеться обробляти випадок, коли масив порожній. Але якщо ти хочеш, можеш.
Догго

4
2 години? Це далеко, далеко надто швидко , щоб бути прийняття відповіді.
Кудлатий

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.

Інтернет-версія

Безголівки:

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

  • сен ensimmäinenалкіо тай
  • sen hännän pisin alkio.

Інтернет-версія

Єдина можливість для гольфу - це замінити pisin alkio(означає "найдовший елемент") на x.

Переклад:

Найдовший елемент у списку - це залежно від того, чи більша довжина першого елемента або дорівнює довжині кожного елемента у списку, або

  • перший пункт у списку, або
  • найдовший елемент у хвості списку.

21
Це - ... чи робить це ...... як ти ....... Що ?!
auhmaan

3
Google Translate з фінської мови: Список x залежить від того, чи довжина першого елемента більша або дорівнює довжині кожного елемента, або першого елемента, або хвоста x.
Adám

2
@ Adám Я вважав, що APL важко читати. Мабуть, все, що вам потрібно обіграти, це перенести ігрове поле на мову, де англійська мова є рідкісним товаром.
Уріель

3
Кому потрібні COBOL, AppleScript або Inform 7? Кому потрібен шеф-кухар Арнольд чи Шекспір? У вас є імперативний Тампіо! О мій літаючий монстр спагетті, фінська всіх мов? Я цього не скоро
навчусь

1
@fedes. Можна сказати "Olkoon suomalainen suudelma uusi suudelma." (Нехай фінський поцілунок буде новим поцілунком, він створює новий об’єкт поцілунку)
fergusq


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

Якби не імпорт, це було б ідеальним поданням, щоб отримати всі результати. : P

(Також для цього використовується один наконечник для гри в гольф, і він використовує складку.)


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 скаржиться на неоднозначний числовий тип.
Згарб

9

R + pryr , 31 байт

[-2 байти завдяки Scrooble]

pryr::f(x[order(-nchar(x))][1])

Спробуйте в Інтернеті!


R , 33 байти

function(x)x[order(-nchar(x))][1]

Спробуйте в Інтернеті!


3
Також 33 байти:x[which.max(nchar(x))]
Джузеппе

@Scrooble з вашого посилання я бачу 33-байтне рішення.
NofP

1
@NofP Ха-ха, нерозумно мені. 31 байт.
Khuldraeseth na'Barya

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

Що для ,останнього? Формула досі працює без неї
Анастасія-Романова 秀

Остаточний ,- це параметр MATCH, який повертає перше точне відповідність, як того вимагає (переглянуте) питання. Якщо це не буде, то MATCH очікує масив у порядку зростання та повертає останнє збіг замість першого, якщо є кілька елементів однакової довжини.
pbeentje

Ви впевнені? Я порівняв ці дві формули, і обидві приходять з абсолютно однаковим результатом
Анастасія-Романова

Чи використовуєте ви вхідний масив, який має дві (різні) рядки однакової довжини? Випускаючи кому (крапка з комою) дає мені останню рядок максимальної довжини, як очікувалося ... (Excel 2016, 64-розрядні)
pbeentje

На жаль, спільнота вирішила, що використання названих діапазонів таким чином недійсне, тому я пропоную вам у цьому конкретному випадку перейти на використання 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.

Спробуйте в Інтернеті!

Пояснення

Перший рядок визначає діадичний предикат /як короткий, atom_length/2що є істинним, якщо довжина першого аргументу є другим аргументом. Це заощаджує нам 3 байти, використовуючи atom_lengthдвічі.

Наш основний предикат визначається як діадичний, *де перший аргумент - це список, а другий аргумент - найдовший елемент цього списку.

Другий рядок - це наш базовий випадок, який стверджує, що найдовший елемент одного списку елементів - це цей елемент.

У третьому рядку зазначено, що для списку, що містить щонайменше два елементи, найдовший елемент:

Якщо довжина другого елемента довша першого, найдовший елемент знаходиться в списку без першого елемента.

Інакше найдовший елемент знаходиться у списку без другого елемента.


Мені було б цікаво ознайомитись із тим, як це працює
Kritixi Lithos

@Cowsquack: Я додав коротке пояснення.
Емінья

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

ой приємно, що ти побив Pyth відповідь 6 байтів приємно.
Догго

elD_і ho_lдосягти однакової довжини.
isaacg

1
@ hakr14 Дякую за редакцію!
Містер Xcoder

6

PowerShell , 24 байти

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

Спробуйте в Інтернеті!

Бере вхід $args[0], труби, які Sort-Objectбазуються на length у -dпорядку зростання. Потім приймає [0]ту її. Оскільки сортування стабільне, то це вимагає першого елемента у випадку зв'язання.


1
Гарне ім’я wuff wuff: D
Догго

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 байт коротше. Однак немає гарантії, що перший елемент буде обраний послідовно у веб-переглядачах у разі краватки.
Арнольд

але якщо він вибирає його послідовно в node.js на TIO, чи не так добре? \
LiefdeWen

1
Ви повинні використовувати -замість <функції порівняння.
kamoroso94

1
@LiefdeWen Так, але це вирішує проблеми в коментарях.
Себастьян Саймон

5

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

0{>\:#@>

Спробуйте в Інтернеті!

Дякуємо вулицеві за підказку!

-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 - Дякую! Я щойно це зрозумів. Я зараз спробую це зробити, це може бути набагато коротше.
Гален Іванов

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/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski

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 від імені громади! Я помітив, що ваше рішення, мабуть, не відповідає спискам, де знаходиться найдовша рядок в кінці. Приклад тут . Я не пам’ятаю Ракетки добре, але якщо ви можете, я б рекомендував змінити ваш алгоритм 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тут?
ggorlen

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]]}

Спробуйте в Інтернеті!


Складання моєї відповіді 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 хв тому, тому мені шкода, якщо це дурний спосіб зробити це.

Спробуйте в Інтернеті!

(відредаговано для наочності)


1
Ласкаво просимо до PPCG!
Steadybox

Значення a←не зараховується до вашого рахунку.
Kritixi Lithos

Ніколи не забувайте, що APL оцінюється справа наліво: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Також (...)⌷⍵=> ⍵⌷⍨...зберегти один байт
Zacharý

Крім дужок, це насправді здається досить гарним!
Zacharý

2

Стандартний ML (MLton) , 55 байт

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

Спробуйте в Інтернеті! Приклад використання: & ["abc","de","fgh"]врожайність "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.

Спробуйте в Інтернеті!




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.