Trova la parola più lunga in un array


24

La tua sfida è prendere una matrice di stringhe e produrre la stringa più lunga nella matrice. Quindi per

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

l'output sarebbe biggest.

Se due elementi dell'array hanno la stessa lunghezza, è necessario scegliere quello che appare per primo nell'array. Ciò significa che se l'array è simile al seguente:

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

l'output è one, ma se l'array fosse simile al seguente:

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

l'uscita è two.


Poiché si tratta di , vince il codice più breve in byte.


3
2 note: 1è fortemente scoraggiato se la domanda viene cambiata e invalida la risposta esistente, e 2il Sandbox esiste esattamente per questo motivo (assicurati che le sfide siano buone prima di pubblicare)
user202729

4
Dal momento che non penso che sia stato menzionato da altri - Ciao e benvenuto in PPCG!
AdmBorkBork,

1
No, non è necessario gestire il caso in cui l'array è vuoto. Ma se vuoi puoi.
Doggo,

4
2 ore? Questo è di gran lunga, di gran lunga troppo veloce per essere accettando una risposta.
Shaggy,

6
Normalmente aspetti una settimana
Christopher il

Risposte:


31

Tampio imperativo , 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.

Versione online

Ungolfed:

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.

Versione online

L'unica opportunità di golf che ha è quella di sostituire pisin alkio(che significa "l'elemento più lungo") con x.

Traduzione:

L'elemento più lungo in un elenco è, a seconda che la lunghezza del primo elemento sia maggiore o uguale alla lunghezza di ciascun elemento nell'elenco,

  • il primo elemento nell'elenco o
  • l'elemento più lungo nella coda dell'elenco.

21
È questo un -... Fa questo ... Come fai -.... Cosa ?!
auhmaan,

3
Google Translate dal finlandese: l' elenco di x dipende dal fatto che la lunghezza del primo elemento sia maggiore o uguale alla lunghezza di ciascun elemento, sia il primo elemento che la coda di x.
Adám,

2
@Adám Pensavo che APL fosse difficile da leggere. Apparentemente tutto ciò che devi battere è spostare il campo di gioco in una lingua in cui l'inglese è una merce rara.
Uriel,

3
Chi ha bisogno di COBOL, AppleScript o Inform 7? Chi ha bisogno di Arnold Chef o Shakespeare? Hai Imperative Tampio! Oh mio mostro di spaghetti volanti, finlandese di tutte le lingue? Non lo imparerò presto ...
fede s.

1
@fedes. Potresti dire "Olkoon suomalainen suudelma uusi suudelma". (Lascia che il bacio finlandese sia un nuovo bacio, crea un nuovo oggetto bacio)
fergusq

20

Python , 23 byte

lambda a:max(a,key=len)

Provalo online!


1
Mi dispiace di non aver convertito questo diritto.
Doggo,

1
Ho aggiornato lo snippet di codice, ma mentre è scritto, raggiunge già questa funzionalità.
Neil,

1
Questo funzionerà anche invariato in Python 3.
anonymoose il

17

Haskell , 35 byte

-3 byte grazie a Zgarb.

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

Provalo online!

Mi piace questo codice Tu sai perché? Perché Haskell supporta soluzioni molto più eleganti con funzioni di librerie casuali.

maximumBy(compare`on`length).reverse

È leggibile! Tranne che non è valido.

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

Se non fosse stato per le importazioni, questa sarebbe stata una presentazione perfetta per ottenere tutti i voti. : P

(Inoltre, utilizza una punta da golf e una piega.)


2
Senza l'aggiunta del requisito "prima occorrenza in caso di parità", questa bellezza funzionerebbe: snd.maximum.map((,)=<<(0<$)) provala online! .
Laikoni,

1
Solo per riferimento: c'è il noioso 29 byte incorporato import Data.Lists;argmax(0<$).
nimi,

1
Woah, come lmai non fa parte fold? Come si distingue tra quello e una funzione chiamata foldl?
Mee

1
@ 12Me21 Fa parte del nome della funzione foldl1. Pensavo che parte della spiegazione potesse essere confusa, scusa ...
totalmente umano il

1
35 byte con una funzione anziché lambda. È interessante notare che è necessario sostituire 0con ao qualcos'altro, altrimenti GHC si lamenta di un ambiguo tipo numerico.
Zgarb,


8

ECCELLERE, 36 42 byte

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

Inserito come una formula di matrice (ctrl-shift-invio). L'array di input deve essere inserito nella colonna A.

La formula restituisce la prima corrispondenza con la lunghezza massima.

A seconda delle impostazioni della propria regione, sostituire ,con ;; la lunghezza del codice rimane invariata. Delle 16 lingue elencate qui , i nomi delle funzioni inglesi sono i più brevi per questa formula.

Spiegazione:

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

Cosa per ,il secondo? La formula funziona ancora senza di essa
Anastasiya-Romanova 秀

Il finale ,è un parametro per MATCH che restituisce la prima corrispondenza esatta, come richiesto dalla domanda (rivista). Se viene lasciato fuori, MATCH si aspetta un array in ordine crescente e restituisce l' ultima corrispondenza anziché la prima se sono presenti più elementi con la stessa lunghezza.
pbeentje,

Sono sicuri? Ho confrontato queste due formule ed entrambe hanno lo stesso identico risultato
Anastasiya-Romanova

Stai usando un array di input che ha due (diverse) stringhe della stessa lunghezza? Lasciare la virgola (punto e virgola) mi dà l'ultima stringa di lunghezza massima, come previsto ... (Excel 2016, 64-bit)
pbeentje,

Sfortunatamente la comunità ha deciso che l' utilizzo di intervalli nominati in questo modo non è valido, quindi suggerisco che per questo caso particolare passi all'utilizzo A:Ae lo trasformi in un array formale con {...}, altrimenti un ottimo post!
Taylor Scott,

7

APL (Dyalog Unicode) , SBCS da 9 byte

⊢⊃⍨∘⊃∘⍒≢¨

Provalo online!

 dall'argomento,

⊃⍨ scegli l'elemento con l'indice che è il

 primo dei

 indici in ordine decrescente di

≢¨ lunghezze di ciascuno


7

Prolog (SWI) , 98 92 72 69 byte

Il predicato di livello superiore è *.

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

Provalo online!

Spiegazione

La prima riga definisce il predicato diadico /come abbreviato per atom_length/2cui è vero se la lunghezza del primo argomento è il secondo argomento. Questo ci fa risparmiare 3 byte oltre usando atom_lengthdue volte.

Il nostro predicato principale è definito come diadico in *cui il primo argomento è un elenco e il secondo argomento l'elemento più lungo di tale elenco.

La seconda riga è il nostro caso base in cui si afferma che l'elemento più lungo di un elenco di un elemento è quell'elemento.

La terza riga afferma che per un elenco con almeno 2 elementi, l'elemento più lungo è:

Se la lunghezza del secondo elemento è più lunga del primo elemento, l'elemento più lungo è nell'elenco senza il primo elemento.

Altrimenti l'elemento più lungo è nell'elenco senza il secondo elemento.


Sarei interessato a vedere una spiegazione su come funziona
Kritixi Lithos

@Cowsquack: ho aggiunto una breve spiegazione.
Emigna

7

Pyth , 4 byte

h.Ml

Suite di test.

Spiegazione
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

o bello hai battuto la risposta Pyth con 6 byte carino.
Doggo,

elD_e ho_lraggiungere la stessa lunghezza.
isaacg,

1
@ hakr14 Grazie mille per la modifica!
Mr. Xcoder,

6

PowerShell , 24 byte

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

Provalo online!

Prende input $args[0], reindirizza in Sort-Objectbase a length in -dordine crescente. Quindi prende il [0]suo. Poiché l'ordinamento è stabile, questo prende il primo elemento in caso di pareggio.


1
Bel nome Wuff Wuff: D
Doggo,

6

Ottava , 33 byte

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

L'input è un array di celle di stringhe.

Provalo online!

Spiegazione

cellfun(@nnz,x)applica la nnzfunzione (numero di nonzeros) a ciascuna stringa nella matrice di input x. Per le stringhe ASCII, nnzè equivalente anumel (numero di elementi), ma più breve. Il risultato è una matrice numerica con le lunghezze delle stringhe.

Quindi, [~,]=max(...)fornisce l'indice del primo massimo nella matrice di lunghezze di stringa. Il risultato viene utilizzato come indice parentesi graffa in xper ottenere la stringa corrispondente.


6

JavaScript (Node.js) , 38 byte

Provalo online!

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

@Doggo Restituisce il primo elemento in caso di pareggio.
Liefde:

1
Restituire un valore booleano anziché un numero con segno nel callback sort () non funziona in tutti i motori JS (ad es. Non funziona in Edge). Un altro approccio sarebbe qualcosa del genere , che è più corto di 1 byte. Tuttavia, non esiste alcuna garanzia che il primo elemento venga scelto in modo coerente tra i browser in caso di pareggio.
Arnauld,

ma se lo sceglie coerentemente in node.js su TIO non è abbastanza buono? \
LiefdeWen

1
Dovresti usare -invece che <nella funzione di confronto.
kamoroso94,

1
@LiefdeWen Sì, ma risolve i problemi nei commenti.
Sebastian Simon,

5

J , 19, 11, 10 8 byte

0{>\:#@>

Provalo online!

Grazie a streetster per il suggerimento!

-1 byte grazie a FrownyFrog!

-2 byte grazie a Conor O'Brien

Come funziona:

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

Provalo online!


1
Questo era il mio approccio iniziale in K, ma poi mi sono reso conto che potevo semplicemente ordinare l'elenco in base al conteggio, in ordine decrescente, e prendere il primo oggetto ... Puoi fare la stessa cosa in J?
streetster,

@streetster - Grazie! L'ho appena capito. Lo proverò ora, potrebbe essere molto più breve.
Galen Ivanov,

1
Nessuna parentesi oltre questo punto:0{::]\:#@>
FrownyFrog il

Sarebbe {.@invece di 0{::lavoro?
Kritixi Lithos,

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

4

C #, 43 + 18 = 61 byte

Provalo online!

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

@Doggo Restituisce il primo elemento in caso di pareggio.
Liefde:

@LiefdeWen OrderBy è stabile, quindi in realtà restituirà l'ultimo elemento in caso di pareggio. Esempio: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski

1
@ GrzegorzPuławski Oh, vedo, risolto.
Liefde:

Ne ho alcuni che forse qualcuno può aiutare ad accorciare 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 Questa è stata la mia prima soluzione ma poi in pareggio restituisce l'ultima, perché l'ordine non è interessato.
Liefde


4

PHP, 72 byte

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

4
Ciao e benvenuto in PPCG! :)
DJMcMayhem

4

Japt -h, 5 3 byte

ÔñÊ

Provalo

Inverti, ordina per lunghezza e genera l'ultimo elemento.



3

K (oK) , 9 byte

*x@>#:'x:

Provalo online!

Esempio:

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

Spiegazione

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

Gli appunti:

Non eliminato in quanto questo è classificato come non banale, nonostante sia sostanzialmente 5 passaggi (sarebbe se scritto come la funzione {*x@>#:'x}).


3

Java (OpenJDK 8) , 67 byte

Un'altra presentazione nella mia lingua preferita! (leggi: l'unico che conosco).
Questo non funziona con un array vuoto, ma va bene.

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.

Provalo online!


3

Racchetta , 160 byte 110 byte

Provalo online! La prima volta che hai contribuito, il consiglio è stato apprezzato!

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

Soluzione aggiornata basata sul feedback


4
Vorrei dare il benvenuto a PPCG a nome della comunità! Ho notato che la tua soluzione apparentemente non riesce per gli elenchi in cui si trova la stringa più lunga alla fine. Esempio qui . Non ricordo bene Racket, ma se puoi consiglierei di cambiare il tuo algoritmo in un foldrapproccio basato su base, prendendo il massimo per lunghezza e portandolo avanti.
Cole

Oh eh Grazie per averlo sottolineato. Non posso credere di non averlo provato.
Daniel Lambert,

Puoi anche cambiare define(m a)inλ(a)
fede s.

1
Controlla anche i suggerimenti se non l'hai fatto!
fede s.


3

Graffio 27 17 170 160

the code picture

Si aspetta un elenco globale (allegato a tutti gli sprite, per essere più precisi) di stringhe chiamate mylist. Dopo aver fatto clic sulla bandiera verde, la parola più lunga verrà lasciata nella variabile w.

Penso che questo sia il collegamento

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

Conteggio secondo questa meta.


È necessario stop[allqui?
Ggorlen,

3

Röda , 30 byte

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

Provalo online!

Spiegazione:

{
 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 alternativi:

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

Provalo online!


Scrivere la mia risposta jq mi ha fatto capire che enumpuò essere lasciato cadere, e invece [[-#_,_1]]può essere selezionato il minimo da , tio.run/…
Kritixi Lithos,

@Cowsquack Questo non funziona perché poi minconfronterebbe le stringhe secondariamente in ordine alfabetico (poiché le matrici vengono confrontate secondariamente dal loro secondo elemento). Ad esempio input ["b", "a"]darebbe "a"come output. Probabilmente dovrei aggiungere una minbyfunzione a Röda o qualcosa di simile ...
fergusq,

3

APL - 23 16 byte

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

Grazie a tutti per tutti i vostri fantastici suggerimenti e incoraggiamento!

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

Uso:

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

Spiegazione:

ottiene la lunghezza di ogni vettore di caratteri (stringa) quindi utilizza il massimo come indice. Ho appena iniziato APL 20 minuti fa, quindi mi dispiace se questo è un modo stupido per farlo.

Provalo online!

(modificato per chiarezza)


1
Benvenuti in PPCG!
Steadybox il

Il valore a←non viene conteggiato nel conto personale.
Kritixi Lithos,

Non dimenticare mai che l'APL viene valutato da destra a sinistra: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Inoltre, (...)⌷⍵=> ⍵⌷⍨...per salvare un byte
Zacharý

A parte le parentesi, questo in realtà sembra abbastanza buono!
Zacharý,

2

ML standard (MLton) , 55 byte

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

Provalo online! Esempio di utilizzo: & ["abc","de","fgh"]rese "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

Provalo online!



2

Funky , 38 byte

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

spiegato

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.

Provalo online!



2

SNOBOL4 (CSNOBOL4) , 63 57 byte

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

Provalo 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.