Trouver le mot le plus long dans un tableau

24

Votre défi consiste à prendre un tableau de chaînes et à générer la chaîne la plus longue du tableau. Donc pour

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

la sortie serait biggest.

Si deux éléments du tableau ont la même longueur, vous devez choisir celui qui apparaît en premier dans le tableau. Cela signifie que si le tableau ressemble à ceci:

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

la sortie est one, mais si le tableau ressemblait à ceci:

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

la sortie est two.


Comme il s'agit de , le code le plus court en octets l'emporte.

Se terrer
la source
3
2 notes: 1Il est fortement déconseillé si la question est modifiée et invalide la réponse existante, et 2le bac à sable existe exactement pour cette raison (assurez-vous que les défis sont bons avant de publier)
user202729
4
Puisque je ne pense pas que quelqu'un d'autre l'ait mentionné - Salut et bienvenue chez PPCG!
AdmBorkBork
1
Non, vous n'avez pas à gérer le cas où le tableau est vide. Mais si vous voulez, vous le pouvez.
Doggo
4
2 heures? C'est beaucoup, beaucoup trop rapide pour accepter une réponse.
Shaggy
6
Normalement, vous attendez une semaine
Christopher

Réponses:

31

Tampio impératif , 168 octets

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.

Version en ligne

Non golfé:

Listan pisin alkio sur 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.

Version en ligne

La seule opportunité de jouer au golf est de remplacer pisin alkio(signifiant "l'élément le plus long") par x.

Traduction:

L'élément le plus long d'une liste est, selon que la longueur du premier élément est supérieure ou égale à la longueur de chaque élément de la liste, soit

  • le premier élément de la liste, ou
  • l'élément le plus long dans la queue de la liste.
fergusq
la source
21
Est-ce un -... Est-ce que -... Comment voulez-vous quoi?!
auhmaan
3
Google Translate du finnois: la liste de x dépend de la longueur du premier élément supérieure ou égale à la longueur de chaque élément, soit le premier élément, soit la queue de x.
2017
2
@ Adám Je pensais qu'APL est difficile à lire. Apparemment, tout ce que vous devez battre est de déplacer le champ de jeu vers une langue où l'anglais est une denrée rare.
Uriel
3
Qui a besoin de COBOL, AppleScript ou Inform 7? Qui a besoin d'Arnold Chef ou de Shakespeare? Vous avez impératif Tampio! Oh mon monstre spaghetti volant, le finnois de toutes les langues? Je n'apprends pas ça de sitôt ...
fede s.
1
@fedes. Vous pourriez dire «Olkoon suomalainen suudelma uusi suudelma». (Que le baiser finlandais soit un nouveau baiser, il crée un nouvel objet baiser)
fergusq
20

Python , 23 octets

lambda a:max(a,key=len)

Essayez-le en ligne!

Neil
la source
1
Je suis désolé de ne pas avoir converti ce droit.
Doggo
1
J'ai mis à jour l'extrait de code, mais tel qu'il est écrit, il atteint déjà cette fonctionnalité.
Neil
1
Cela fonctionnera également sans changement dans Python 3.
anonymoose
17

Haskell , 35 octets

-3 octets grâce à Zgarb.

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

Essayez-le en ligne!

J'aime ce code. Tu sais pourquoi? Parce que Haskell prend en charge des solutions beaucoup plus élégantes avec des fonctions provenant de bibliothèques aléatoires.

maximumBy(compare`on`length).reverse

C'est facile à lire! Sauf que ce n'est pas valable.

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

S'il n'y avait pas eu les importations, cela aurait été une soumission parfaite pour obtenir tous les votes positifs. : P

(En outre, cela utilise une pointe de golf et un pli.)

totalement humain
la source
2
Sans l'exigence supplémentaire de «première occurrence en cas d'égalité», cette beauté fonctionnerait: snd.maximum.map((,)=<<(0<$)) essayez-la en ligne! .
Laikoni
1
Juste pour référence: il y a l'ennuyeux 29 octets intégré import Data.Lists;argmax(0<$).
nimi
1
Woah, comment ça ne fait lpas partie de fold? Comment fait-il la distinction entre cela et une fonction nommée foldl?
12Me21
1
@ 12Me21 Il fait partie du nom de la fonction foldl1. Je pensais qu'une partie de l'explication pouvait être déroutante, désolé ...
totalement humain
1
35 octets avec une fonction au lieu de lambda. Fait intéressant, vous devez remplacer 0par aou autre chose, sinon GHC se plaint d'un type numérique ambigu.
Zgarb
9

R + pryr , 31 octets

[-2 octets grâce à Scrooble]

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

Essayez-le en ligne!


R , 33 octets

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

Essayez-le en ligne!

NofP
la source
3
Aussi 33 octets:x[which.max(nchar(x))]
Giuseppe
@Scrooble à partir de votre lien, je vois une solution de 33 octets.
NofP
1
@NofP Haha, idiot moi. 31 octets.
Khuldraeseth na'Barya
8

EXCELLER, 36 42 octets

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

Entré sous forme de formule matricielle (ctrl-shift-enter). Le tableau d'entrée doit être entré dans la colonne A.

La formule renvoie la première correspondance avec une longueur maximale.

Selon les paramètres de votre région, remplacez ,par ;; la longueur du code reste inchangée. Sur les 16 langues répertoriées ici , les noms de fonction anglais sont les plus courts pour cette formule.

Explication:

=                                          - 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
la source
Qu'en est-il pour ,ces derniers? La formule fonctionne toujours sans elle
Anastasiya-Romanova
Le dernier ,est un paramètre pour MATCH qui renvoie la première correspondance exacte, comme requis par la question (révisée). S'il est omis, MATCH attend un tableau dans l'ordre croissant et renvoie la dernière correspondance au lieu du premier s'il existe plusieurs éléments de même longueur.
pbeentje
Sont sûrs? J'ai comparé ces deux formules et les deux donnent exactement le même résultat
Anastasiya-Romanova
Utilisez-vous un tableau d'entrée qui a deux chaînes (différentes) de la même longueur? Le fait de laisser la virgule (point-virgule) me donne la dernière chaîne de longueur maximale, comme prévu ... (Excel 2016, 64 bits)
pbeentje
Malheureusement, la communauté a décidé que l' utilisation de plages nommées de cette manière n'est pas valide , je suggère donc que dans ce cas particulier, vous passiez à l'utilisation A:Aet en fassiez un tableau formel avec {...}, sinon un excellent article!
Taylor Scott
7

APL (Dyalog Unicode) , 9 octets SBCS

⊢⊃⍨∘⊃∘⍒≢¨

Essayez-le en ligne!

 de l'argument,

⊃⍨ choisissez l'élément avec l'indice qui est le

 premier des

 indices dans l'ordre décroissant de la

≢¨ longueurs de chacun

Adam
la source
7

Prolog (SWI) , 98 92 72 69 octets

Le prédicat de niveau supérieur est *.

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

Essayez-le en ligne!

Explication

La première ligne définit le prédicat dyadique /comme un court pour atom_length/2lequel est vrai si la longueur du premier argument est le deuxième argument. Cela nous permet d'économiser 3 octets sur l'utilisationatom_length deux fois.

Notre prédicat principal est défini comme le dyadique * où le premier argument est une liste et le deuxième argument l'élément le plus long de cette liste.

La deuxième ligne est notre scénario de base qui indique que l'élément le plus long d'une liste à un élément est cet élément.

La troisième ligne indique que pour une liste avec au moins 2 éléments, l'élément le plus long est:

Si la longueur du deuxième élément est plus longue que le premier élément, l'élément le plus long est dans la liste sans le premier élément.

Sinon, l'élément le plus long se trouve dans la liste sans le deuxième élément.

Emigna
la source
Je serais intéressé de voir une explication sur la façon dont cela fonctionne
Kritixi Lithos
@Cowsquack: J'ai ajouté une courte explication.
Emigna
7

Pyth , 4 octets

h.Ml

Suite de tests.

Explication
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
M. Xcoder
la source
ou bien vous battez la réponse Pyth avec 6 octets sympa.
Doggo
elD_et ho_latteindre la même longueur.
isaacg
1
@ hakr14 Merci beaucoup pour la modification!
M. Xcoder
6

PowerShell , 24 octets

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

Essayez-le en ligne!

Prend l'entrée $args[0], les tuyaux qui à Sort-Objectbasé sur length dans l' -dordre croissant. Prend ensuite le [0]th de celui-ci. Le tri étant stable, cela prend le premier élément en cas d'égalité.

AdmBorkBork
la source
1
Joli nom wuff wuff: D
Doggo
6

Octave , 33 octets

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

L'entrée est un tableau de cellules de chaînes.

Essayez-le en ligne!

Explication

cellfun(@nnz,x)applique la nnzfonction (nombre de non-zéros) à chaque chaîne du tableau d'entrée x. Pour les chaînes ASCII, nnzest équivalent à numel(nombre d'éléments), mais plus court. Le résultat est un tableau numérique avec les longueurs de chaîne.

Ensuite, [~,]=max(...)donne l'index du premier maximum dans le tableau des longueurs de chaîne. Le résultat est utilisé comme index d'accolade xpour obtenir la chaîne correspondante.

Luis Mendo
la source
6

JavaScript (Node.js) , 38 octets

Essayez-le en ligne!

a=>a.sort((a,b)=>a.length<b.length)[0]
LiefdeWen
la source
@Doggo Il retourne le premier élément en cas d'égalité.
LiefdeWen
1
Le renvoi d'un booléen au lieu d'un numéro signé dans le rappel sort () ne fonctionne pas dans tous les moteurs JS (par exemple, il ne fonctionne pas dans Edge). Une autre approche serait quelque chose comme ça , qui est 1 octet plus court. Néanmoins, rien ne garantit que le premier élément sera choisi de manière cohérente dans les navigateurs en cas d'égalité.
Arnauld
mais s'il le choisit de manière cohérente dans node.js sur TIO, n'est-ce pas suffisant? \
LiefdeWen
1
Vous devez utiliser -au lieu de <dans la fonction de comparateur.
kamoroso94
1
@LiefdeWen Oui, mais cela résout les problèmes dans les commentaires.
Sebastian Simon
5

J , 19, 11, 10 8 octets

0{>\:#@>

Essayez-le en ligne!

Merci au streetster pour l'astuce!

-1 octet grâce à FrownyFrog!

-2 octets grâce à Conor O'Brien

Comment ça marche:

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

Essayez-le en ligne!

Galen Ivanov
la source
1
C'était mon approche initiale en K, mais j'ai réalisé que je pouvais simplement trier la liste par le nombre, en descendant, et prendre le premier élément ... Pouvez-vous faire la même chose en J?
streetster
@streetster - Merci! Je viens de m'en rendre compte. Je vais l'essayer maintenant, ça devrait être beaucoup plus court.
Galen Ivanov
1
Pas de parenthèses au-delà de ce point:0{::]\:#@>
FrownyFrog
Serait {.@au lieu de 0{::travailler?
Kritixi Lithos
1
8 bytes: 0{>\:#@>
Conor O'Brien
4

C#, 43 + 18 = 61 bytes

Try it online!

a=>a.OrderByDescending(x=>x.Length).First()
LiefdeWen
la source
@Doggo It does return the first element in the case of a tie.
LiefdeWen
@LiefdeWen OrderBy is stable so this will in fact return last element in case of a tie. Example: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski
1
@GrzegorzPuławski Oh, I see, fixed.
LiefdeWen
I've got a few that maybe someone can help shorten a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x) 44 byte base, a=>a.First(x=>x.Length==a.Max(y=>y.Length)) 43 byte base
Monso
1
@MrLore That was my first solution but then in a tie it returns the last one, because order is unaffected.
LiefdeWen
4

Perl 6,  14  13 bytes

*.max(*.chars)

Try it

*.max(&chars)

Try it

Brad Gilbert b2gills
la source
4

PHP, 72 bytes

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Alan Ondra
la source
4
Hello, and welcome to PPCG! :)
DJMcMayhem
4

Japt -h, 5 3 bytes

ÔñÊ

Try it

Reverse, sort by length and output the last element.

Shaggy
la source
3

K (oK), 9 bytes

*x@>#:'x:

Try it online!

Example:

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

Explanation

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

Notes:

Undeleted as this is classed as non-trivial, despite being basically 5 steps (would be if written as the function {*x@>#:'x}).

streetster
la source
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
la source
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
la source
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
la source
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.
la source
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
la source
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
la source
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
la source
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
la source
2

Ruby, 21 20 bytes

->s{s.max_by &:size}

Try it online!

Trivial solution, thanks Snack for -1 byte

G B
la source
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
la source