Znajdź najdłuższe słowo w tablicy

24

Twoim wyzwaniem jest pobranie tablicy ciągów i wygenerowanie najdłuższego ciągu w tablicy. Więc dla

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

wynik byłby biggest.

Jeśli dwa elementy tablicy mają tę samą długość, należy wybrać ten, który pojawi się jako pierwszy w tablicy. Oznacza to, że tablica wygląda następująco:

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

wynikiem jest one, ale jeśli tablica wyglądała tak:

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

wyjście jest two.


Ponieważ jest to , wygrywa najkrótszy kod w bajtach.

Doggo
źródło
3
2 Uwagi: 1To mocno zniechęcony jeśli pytanie jest zmieniana i unieważnia istniejące odpowiedź i Sandbox istnieje dokładnie ten powód (upewnij się wyzwań są dobre przed wysłaniem)2
user202729
4
Ponieważ nie sądzę, żeby ktokolwiek o tym wspominał - Cześć i witam w PPCG!
AdmBorkBork,
1
Nie, nie musisz zajmować się przypadkiem, w którym tablica jest pusta. Ale jeśli chcesz, możesz.
Doggo,
4
2 godziny? To zdecydowanie zbyt szybko, by zaakceptować odpowiedź.
Kudłaty
6
Zwykle czekasz tydzień
Christopher

Odpowiedzi:

31

Tryb imperatywny , 168 bajtów

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.

Wersja online

Nie golfowany:

Listan pisin alkio on riippuen siitä , onko sen ensimmäisenalkion pituus suurempi tai yhtä suuri kuin sen jokaisen alkion pituus, joko

  • sen ensimmäinenalkio tai
  • sen hännän pisin alkio.

Wersja online

Jedyną możliwością gry w golfa jest zastąpienie pisin alkio(co oznacza „najdłuższy element”) x.

Tłumaczenie:

Najdłuższy element na liście, w zależności od tego, czy długość pierwszego elementu jest większa, czy równa długości każdego elementu na liście, albo

  • pierwszy element na liście lub
  • najdłuższy element na końcu listy.
fergusq
źródło
21
Czy to jest… Czy to… Jak się masz… Co ?!
auhmaan,
3
Tłumacz Google z fińskiego: Lista x jest zależna od tego, czy długość pierwszego elementu jest większa, czy równa długości każdego elementu, pierwszego elementu lub ogona x.
Adám,
2
@ Adám Myślałem, że APL jest trudny do odczytania. Najwyraźniej wszystko, co musisz pokonać, to przenieść pole gry na język, w którym angielski jest rzadkim towarem.
Uriel,
3
Kto potrzebuje COBOL, AppleScript lub Inform 7? Kto potrzebuje szefa kuchni Arnolda lub Szekspira? Masz Imperative Tampio! Och, mój latający potwór spaghetti, fiński ze wszystkich języków? Już się tego nie uczę ...
Fede s.
1
@fedes. Można powiedzieć „Olkoon suomalainen suudelma uusi suudelma”. (Niech fiński pocałunek będzie nowym pocałunkiem, tworzy nowy obiekt pocałunku)
fergusq
20

Python , 23 bajty

lambda a:max(a,key=len)

Wypróbuj online!

Neil
źródło
1
Przepraszam, że nie przekonwertowałem tego poprawnie.
Doggo,
1
Zaktualizowałem fragment kodu, ale jak już został napisany, osiąga już tę funkcjonalność.
Neil,
1
Działa
17

Haskell , 35 bajtów

-3 bajty dzięki Zgarbowi.

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

Wypróbuj online!

Lubię ten kod. Wiesz dlaczego? Ponieważ Haskell obsługuje znacznie bardziej eleganckie rozwiązania z funkcjami z bibliotek losowych.

maximumBy(compare`on`length).reverse

To cholernie czytelne! Z wyjątkiem tego, że nie jest poprawny.

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

Gdyby nie import, byłoby to idealne przesłanie, aby uzyskać wszystkie opinie. : P

(Również używa jednej wskazówki golfowej i korzysta z fold.)

całkowicie ludzki
źródło
2
Bez dodanego wymogu „pierwsze wystąpienie w przypadku remisu” to piękno zadziałałoby: snd.maximum.map((,)=<<(0<$)) Wypróbuj online! .
Laikoni,
1
Tylko dla odniesienia: wbudowany jest nudny 29 bajtów import Data.Lists;argmax(0<$).
nimi
1
Wow, jak to lnie jest częścią fold? Jak odróżnia to od funkcji o nazwie foldl?
Mee
1
@ 12Me21 Jest to część nazwy funkcji foldl1. Myślałem, że ta część wyjaśnienia może być myląca, przepraszam ...
całkowicie ludzki
1
35 bajtów z funkcją zamiast lambda. Co ciekawe, trzeba wymienić 0z alub coś innego, inaczej GHC narzeka dwuznacznej typu liczbowego.
Zgarb
9

R + pryr , 31 bajtów

[-2 bajty dzięki Scrooble]

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

Wypróbuj online!


R , 33 bajty

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

Wypróbuj online!

Nie dotyczy
źródło
3
Również 33 bajty:x[which.max(nchar(x))]
Giuseppe
@ Scrooble z twojego łącza Widzę rozwiązanie 33 bajtów.
NofP,
1
@NofP Haha, głupiutki ja. 31 bajtów.
Khuldraeseth na'Barya
8

PRZEWYŻSZAĆ, 36 42 bajty

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

Wprowadzono jako formułę tablicową (ctrl-shift-enter). Tablicę wejściową należy wprowadzić w kolumnie A.

Formuła zwraca pierwsze dopasowanie o maksymalnej długości.

W zależności od ustawień regionu, substytut ,z ;; długość kodu pozostaje niezmieniona. Spośród 16 języków wymienionych tutaj , angielskie nazwy funkcji są najkrótsze dla tej formuły.

Wyjaśnienie:

=                                          - 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
źródło
Po co ,w tym drugim? Formuła nadal działa bez niego
Anastasiya-Romanova 秀
Finał ,jest parametrem dla PODAJNIKA, który zwraca pierwsze dokładne dopasowanie, zgodnie z wymaganiami (poprawionego) pytania. Jeśli zostanie pominięty, to MATCH oczekuje tablicy w porządku rosnącym i zwraca ostatnie dopasowanie zamiast pierwszego, jeśli istnieje wiele elementów o tej samej długości.
pbeentje
Jesteś pewien? Porównałem te dwie formuły i oba przyniosły dokładnie taki sam wynik
Anastasiya-Romanova 秀
Czy używasz tablicy wejściowej, która ma dwa (różne) ciągi o tej samej długości? Pozostawienie przecinka (średnik) daje mi ostatni ciąg o maksymalnej długości, zgodnie z oczekiwaniami ... (Excel 2016, 64-bit)
pbeentje
Niestety społeczność zdecydowała, że używanie nazwanych zakresów w ten sposób jest nieprawidłowe, dlatego sugeruję, aby w tym konkretnym przypadku przełączyć się na używanie A:Ai uczynić z niej formalną tablicę {...}, w przeciwnym razie świetny post!
Taylor Scott
7

APL (Dyalog Unicode) , 9 bajtów SBCS

⊢⊃⍨∘⊃∘⍒≢¨

Wypróbuj online!

 z argumentu

⊃⍨ wybierz element o indeksie, który jest

 pierwszy z

 indeksy w kolejności malejącej

≢¨ długości każdego

Adám
źródło
7

Prolog (SWI) , 98 92 72 69 bajtów

Predykat najwyższego poziomu to *.

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

Wypróbuj online!

Wyjaśnienie

Pierwszy wiersz definiuje predykat dynamiczny /jako skrót, dla atom_length/2którego jest prawdą, jeśli długość pierwszego argumentu jest drugim argumentem. To oszczędza nam 3 bajty przy atom_lengthpodwójnym użyciu .

Nasz główny predykat jest zdefiniowany jako dyadyczny * gdzie pierwszy argument jest listą, a drugi argument najdłuższym elementem tej listy.

Drugi wiersz jest naszym przypadkiem podstawowym, który stwierdza, że ​​najdłuższym elementem listy z jednym elementem jest ten element.

Trzeci wiersz stwierdza, że ​​w przypadku listy zawierającej co najmniej 2 elementy najdłuższy element to:

Jeśli długość drugiego elementu jest dłuższa niż pierwszy element, najdłuższy element znajduje się na liście bez pierwszego elementu.

W przeciwnym razie najdłuższy element znajduje się na liście bez drugiego elementu.

Emigna
źródło
Byłbym zainteresowany wyjaśnieniem, jak to działa
Kritixi Lithos
@ Cowsquack: Dodałem krótkie wyjaśnienie.
Emigna
7

Pyth , 4 bajty

h.Ml

Zestaw testowy.

Wyjaśnienie
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
Pan Xcoder
źródło
ou miło, że pobiłeś odpowiedź Pytha ładnymi 6 bajtami.
Doggo,
elD_i ho_losiągnąć tę samą długość.
isaacg,
1
@ hakr14 Dziękuję bardzo za edycję!
Pan Xcoder,
6

PowerShell , 24 bajty

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

Wypróbuj online!

Trwa wejściowych $args[0], rur, które na Sort-Objectpodstawie length w -dporządku escending. Następnie bierze ten [0]jeden. Ponieważ sortowanie jest stabilne, bierze to pierwszy element w przypadku remisu.

AdmBorkBork
źródło
1
Ładne imię wuff wuff: D
Doggo
6

Oktawa , 33 bajty

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

Dane wejściowe to tablica komórek ciągów znaków.

Wypróbuj online!

Wyjaśnienie

cellfun(@nnz,x)stosuje nnzfunkcję (liczbę niezerowych) do każdego łańcucha w tablicy wejściowej x. W przypadku ciągów ASCII nnzjest równoważny numel(liczba elementów), ale krótszy. Wynikiem jest tablica liczbowa o długości łańcucha.

Następnie [~,]=max(...)podaje indeks pierwszego maksimum w tablicy długości łańcuchów. Wynik jest używany jako indeks nawiasu klamrowego w xcelu uzyskania odpowiedniego ciągu.

Luis Mendo
źródło
6

JavaScript (Node.js) , 38 bajtów

Wypróbuj online!

a=>a.sort((a,b)=>a.length<b.length)[0]
LiefdeWen
źródło
@Doggo Zwraca pierwszy element w przypadku remisu.
LiefdeWen,
1
Zwracanie wartości logicznej zamiast podpisanego numeru w wywołaniu zwrotnym sort () nie działa we wszystkich silnikach JS (np. Nie działa w Edge). Innym podejściem byłoby coś takiego , czyli 1 bajt krótszy. Mimo to nie ma gwarancji, że pierwszy element będzie konsekwentnie wybierany w różnych przeglądarkach w przypadku remisu.
Arnauld,
ale jeśli wybierze go konsekwentnie w node.js na TIO, czy to nie wystarczy? \
LiefdeWen
1
Powinieneś używać -zamiast <w funkcji komparatora.
kamoroso94,
1
@LiefdeWen Tak, ale rozwiązuje problemy w komentarzach.
Sebastian Simon
5

J , 19, 11, 10 8 bajtów

0{>\:#@>

Wypróbuj online!

Dzięki streetster za podpowiedź!

-1 bajt dzięki FrownyFrog!

-2 bajty dzięki Conorowi O'Brienowi

Jak to działa:

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

Wypróbuj online!

Galen Iwanow
źródło
1
To było moje pierwsze podejście do K, ale potem zdałem sobie sprawę, że mogę posortować listę według liczby, malejąco i wziąć pierwszy element ... Czy możesz zrobić to samo w J?
streetster,
@streetster - Dzięki! Właśnie zdałem sobie z tego sprawę. Spróbuję teraz, może być znacznie krótszy.
Galen Iwanow,
1
Brak nawiasów poza tym punktem:0{::]\:#@>
FrownyFrog,
Czy {.@zamiast 0{::pracy?
Kritixi Lithos
1
8 bajtów:0{>\:#@>
Conor O'Brien,
4

C #, 43 + 18 = 61 bajtów

Wypróbuj online!

a=>a.OrderByDescending(x=>x.Length).First()
LiefdeWen
źródło
@Doggo Zwraca pierwszy element w przypadku remisu.
LiefdeWen,
@LiefdeWen OrderBy jest stabilny, więc w rzeczywistości zwróci ostatni element w przypadku remisu. Przykład: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski
1
@ GrzegorzPuławski Oh, rozumiem, naprawione.
LiefdeWen,
Mam kilka, że ​​może ktoś może pomóc skrócić a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)44-bajtową bazę, a=>a.First(x=>x.Length==a.Max(y=>y.Length))43-bajtową bazę
Monso
1
@MrLore To było moje pierwsze rozwiązanie, ale potem remis zwraca ostatnie, ponieważ nie ma to wpływu na kolejność.
LiefdeWen,
4

Perl 6 ,  14  13 bajtów

*.max(*.chars)

Spróbuj

*.max(&chars)

Spróbuj

Brad Gilbert b2gills
źródło
4

PHP, 72 bajty

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Alan Ondra
źródło
4
Witaj i witaj w PPCG! :)
DJMcMayhem
4

Japt -h, 5 3 bajty

ÔñÊ

Spróbuj

Odwróć, sortuj według długości i wypisz ostatni element.

Kudłaty
źródło
3

K (oK) , 9 bajtów

*x@>#:'x:

Wypróbuj online!

Przykład:

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

Wyjaśnienie

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

Uwagi:

Nieusunięte, ponieważ jest to klasyfikowane jako nietrywialne, mimo że w zasadzie jest to 5 kroków (byłoby napisane jako funkcja {*x@>#:'x}).

streetster
źródło
3

Java (OpenJDK 8), 67 bytes

Another submission in my favourite language! (read: the only one I know).
This doesn't work with an empty array, but that's fine.

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.

Try it online!

Luke Stevens
źródło
3

Racket, 160 bytes 110 bytes

Try it online! First time contributing, advice appreciated!

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

Updated solution based on feedback

Daniel Lambert
źródło
4
I'd like to say welcome to PPCG on behalf of the community! I noticed that your solution apparently fails for lists where the longest string is at the end. Example here. I don't remember Racket well, but if you can I would recommend changing your algorithm to a foldr-based approach, taking the max by length and carrying that across.
cole
Oh huh. Thank you for pointing that out. I can't believe that I didn't test that.
Daniel Lambert
You can also change the define(m a) to λ(a)
fede s.
1
Also check the tips if you haven't!
fede s.
3

Bash, 45 bytes

a=;for b;do((${#b}>${#a}))&&a=$b;done;echo $a

Try it online!

nxnev
źródło
1
Welcome to PPCG, nice first post!
Conor O'Brien
3

Scratch 27 17 170 160

the code picture

It expects a global (attached to all sprites, to be more precise) list of strings called mylist. After clicking the green flag, the longest word will be left in the variable w.

I think this is the link

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

Counting as per this meta.

fede s.
źródło
Is it necessary to stop[all here?
ggorlen
3

Röda, 30 bytes

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

Try it online!

Explanation:

{
 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 */
}

Alternative 30 bytes:

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

Try it online!

fergusq
źródło
Writing up my jq answer made me realise that enum can be dropped, and instead the minimum from [[-#_,_1]] can be selected, tio.run/…
Kritixi Lithos
@Cowsquack That doesn't work because then min would compare strings secondarily alphabetically (because arrays are compared secondarily by their second item). For example input ["b", "a"] would give "a" as output. I should probably add a minby function to Röda or something similar...
fergusq
3

APL -- 23 16 bytes

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

Thanks to everyone for all of your great suggestions and encouragement!

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

Usage:

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

Explanation:

gets length of each vector of characters (string) then uses maximum as an index. I just started APL 20 min ago so I am sorry if this is a stupid way to do it.

Try it Online!

(edited for clarity)

rmoro
źródło
1
Welcome to PPCG!
Steadybox
The a← is not counted towards your bytecount.
Kritixi Lithos
Never forget APL is evaluated right-to-left: (⌈/(⍴¨⍵)) => ⌈/⍴¨⍵. Also, (...)⌷⍵ => ⍵⌷⍨... to save one byte
Zacharý
Other than the parentheses, this actually seems pretty good!
Zacharý
2

Standard ML (MLton), 55 bytes

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

Try it online! Example usage: & ["abc","de","fgh"] yields "abc".

Ungolfed:

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

Try it online!

Laikoni
źródło
2

Funky, 38 bytes

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

Explained

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.

Try it online!

ATaco
źródło
2

Ruby, 21 20 bytes

->s{s.max_by &:size}

Try it online!

Trivial solution, thanks Snack for -1 byte

G B
źródło
1
Take the &:size out of the parentheses for -1
Snack
2

SNOBOL4 (CSNOBOL4), 63 57 bytes

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

Try it online!

Input is on stdin and output on stdout.

Roughly translates to the following pseudocode:

while input exists
 x = input
 if length(m) < length(x)
  m = x
end
return m
Giuseppe
źródło