Encuentra la palabra más larga en una matriz

24

Su desafío es tomar una matriz de cadenas y generar la cadena más larga de la matriz. Entonces para

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

la salida sería biggest.

Si dos elementos de la matriz tienen la misma longitud, debe elegir el que aparece primero en la matriz. Eso significa que si la matriz se ve así:

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

la salida es one, pero si la matriz se ve así:

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

la salida es two.


Como se trata de , gana el código más corto en bytes.

Escondido
fuente
3
2 notas: 1Se desaconseja mucho si la pregunta se cambia e invalida la respuesta existente, y 2el Sandbox existe exactamente por esa razón (asegúrese de que los desafíos sean buenos antes de publicar)
usuario202729
44
Como no creo que nadie más lo haya mencionado, ¡Hola y bienvenido a PPCG!
AdmBorkBork
1
No, no tiene que manejar el caso donde la matriz está vacía. Pero si quieres puedes.
Doggo
44
¿2 horas? Eso es mucho, mucho demasiado rápido para estar aceptando una respuesta.
Shaggy
66
Normalmente esperas una semana
Christopher

Respuestas:

31

Tampio imperativo , 168 bytes

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.

Versión en línea

Sin golf:

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

Versión en línea

La única oportunidad de golf que tiene es reemplazar pisin alkio(que significa "el elemento más largo") con x.

Traducción:

El elemento más largo de una lista es, dependiendo de si la longitud del primer elemento es mayor o igual a la longitud de cada elemento de la lista, ya sea

  • el primer elemento de la lista, o
  • El elemento más largo en la cola de la lista.
fergusq
fuente
21
¿Es esto un ...? ¿Esto ...? ¿Cómo ...? ¡¿Qué ?!
auhmaan
3
Traductor de Google del finlandés: la lista de x depende de si la longitud del primer elemento es mayor o igual que la longitud de cada elemento, ya sea el primer elemento o la cola de x.
Adám
2
@ Adám Solía ​​pensar que APL es difícil de leer. Aparentemente, todo lo que necesita para superar eso es mover el campo de juego a un idioma donde el inglés es una mercancía rara.
Uriel
3
¿Quién necesita COBOL, AppleScript o Inform 7? ¿Quién necesita Arnold Chef o Shakespeare? Tienes Tampio Imperativo! Oh mi monstruo de espagueti volador, ¿finlandés de todos los idiomas? No voy a aprender eso pronto ...
fede s.
1
@fedes. Podrías decir "Olkoon suomalainen suudelma uusi suudelma". (Deje que el beso finlandés sea un beso nuevo, crea un nuevo objeto beso)
fergusq
20

Pitón , 23 bytes

lambda a:max(a,key=len)

Pruébalo en línea!

Neil
fuente
1
Lamento no haber convertido esto correctamente.
Doggo
1
Actualicé el fragmento de código, pero como está escrito, ya logra esta funcionalidad.
Neil
1
Esto también funcionará sin cambios en Python 3.
anonymoose
17

Haskell , 35 bytes

-3 bytes gracias a Zgarb.

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

Pruébalo en línea!

Me gusta este codigo ¿Sabes por qué? Porque Haskell admite soluciones mucho más elegantes con funciones de bibliotecas aleatorias.

maximumBy(compare`on`length).reverse

¡Eso es legible! Excepto que no es válido.

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

Si no fuera por las importaciones, esta hubiera sido una presentación perfecta para obtener todos los votos positivos. :PAGS

(Además, esto usa una punta de golf y usa un pliegue).

totalmente humano
fuente
2
Sin el requisito adicional de "primer suceso en caso de empate", esta belleza funcionaría: ¡ snd.maximum.map((,)=<<(0<$)) Pruébelo en línea! .
Laikoni
1
Solo como referencia: está el aburrido incorporado de 29 bytes import Data.Lists;argmax(0<$).
nimi
1
Woah, ¿cómo es que lno es parte fold? ¿Cómo distingue entre eso y una función nombrada foldl?
12Me21
1
@ 12Me21 Es parte del nombre de la función foldl1. Pensé que parte de la explicación podría ser confusa, lo siento ...
totalmente humano
1
35 bytes con una función en lugar de lambda. Curiosamente, debe reemplazar 0con ao algo más, de lo contrario, GHC se queja de un tipo numérico ambiguo.
Zgarb
9

R + pryr , 31 bytes

[-2 bytes gracias a Scrooble]

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

Pruébalo en línea!


R , 33 bytes

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

Pruébalo en línea!

NofP
fuente
3
También 33 bytes:x[which.max(nchar(x))]
Giuseppe
@Scrooble desde su enlace veo una solución de 33 bytes.
NofP
1
@NofP Jaja, tonto de mí. 31 bytes.
Khuldraeseth na'Barya
8

SOBRESALIR, 36 42 bytes

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

Ingresado como una fórmula de matriz (ctrl-shift-enter). La matriz de entrada debe ingresarse en la columna A.

La fórmula devuelve la primera coincidencia con longitud máxima.

Dependiendo de la configuración de su región, sustituya ,con ;; la longitud del código permanece sin cambios. De los 16 idiomas enumerados aquí , los nombres de funciones en inglés son los más cortos para esta fórmula.

Explicación:

=                                          - 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
fuente
¿Qué hay para ,el último? La fórmula aún funciona sin ella
Anastasiya-Romanova 秀
El final ,es un parámetro para MATCH que devuelve la primera coincidencia exacta, como lo requiere la pregunta (revisada). Si se omite, MATCH espera una matriz en orden ascendente y devuelve la última coincidencia en lugar de la primera si hay varios elementos con la misma longitud.
pbeentje
¿Están seguros? Comparé esas dos fórmulas y ambas tienen exactamente el mismo resultado
Anastasiya-Romanova 秀
¿Está utilizando una matriz de entrada que tiene dos cadenas (diferentes) de la misma longitud? Dejando de lado la coma (punto y coma) me da la última cadena de longitud máxima, como se esperaba ... (Excel 2016, 64 bits)
pbeentje
Desafortunadamente, la comunidad ha decidido que el uso de rangos con nombre de esta manera no es válido, por lo que sugiero que para este caso en particular, cambie a usar A:Ay lo convierta en una matriz formal {...}, ¡de lo contrario, es una gran publicación!
Taylor Scott el
7

APL (Dyalog Unicode) , SBCS de 9 bytes

⊢⊃⍨∘⊃∘⍒≢¨

Pruébalo en línea!

 del argumento

⊃⍨ elija el elemento con el índice que es el

 primero de los

 índices en orden descendente de la

≢¨ longitudes de cada

Adán
fuente
7

Prólogo (SWI) , 98 92 72 69 bytes

El predicado de nivel superior es *.

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

Pruébalo en línea!

Explicación

La primera fila define el predicado diádico /como un corto para el atom_length/2cual es verdadero si la longitud del primer argumento es el segundo argumento. Esto nos ahorra 3 bytes al usaratom_length dos veces.

Nuestro predicado principal se define como la diádica * donde el primer argumento es una lista y el segundo argumento el elemento más largo de esa lista.

La segunda fila es nuestro caso base que establece que el elemento más largo de una lista de un elemento es ese elemento.

La tercera fila indica que para una lista con al menos 2 elementos, el elemento más largo es:

Si la longitud del segundo elemento es más larga que el primer elemento, el elemento más largo está en la lista sin el primer elemento.

De lo contrario, el elemento más largo está en la lista sin el segundo elemento.

Emigna
fuente
Me interesaría ver una explicación sobre cómo funciona
Kritixi Lithos
@Cowsquack: agregué una breve explicación.
Emigna
7

Pyth , 4 bytes

h.Ml

Banco de pruebas.

Explicación
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
Sr. Xcoder
fuente
O bueno, superaste la respuesta de Pyth con 6 bytes.
Doggo
elD_y ho_llograr la misma longitud.
isaacg
1
@ hakr14 ¡Muchas gracias por la edición!
Sr. Xcoder
6

PowerShell , 24 bytes

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

Pruébalo en línea!

Toma entradas $args[0], canalizaciones Sort-Objectbasadas en la lprofundidad en -dorden ascendente. Luego toma el [0]th del mismo. Como sort es estable, esto toma el primer elemento en caso de empate.

AdmBorkBork
fuente
1
Bonito nombre wuff wuff: D
Doggo
6

Octava , 33 bytes

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

La entrada es una matriz de celdas de cadenas.

Pruébalo en línea!

Explicación

cellfun(@nnz,x)aplica la nnzfunción (número de nonzeros) a cada cadena en la matriz de entrada x. Para cadenas ASCII, nnzes equivalente a numel(número de elementos), pero más corto. El resultado es una matriz numérica con las longitudes de cadena.

Luego, [~,]=max(...)da el índice del primer máximo en la matriz de longitudes de cadena. El resultado se utiliza como un índice de llaves xpara obtener la cadena correspondiente.

Luis Mendo
fuente
6

JavaScript (Node.js) , 38 bytes

Pruébalo en línea!

a=>a.sort((a,b)=>a.length<b.length)[0]
LiefdeWen
fuente
@Doggo Devuelve el primer elemento en caso de empate.
LiefdeWen
1
Devolver un booleano en lugar de un número con signo en la devolución de llamada sort () no funciona en todos los motores JS (por ejemplo, no funciona en Edge). Otro enfoque sería algo así , que es 1 byte más corto. Aún así, no hay garantía de que el primer elemento se elija de manera consistente en todos los navegadores en caso de empate.
Arnauld
pero si lo elige consistentemente en node.js en TIO, ¿no es lo suficientemente bueno?
LiefdeWen
1
Debería usar en -lugar de <en la función de comparación.
kamoroso94
1
@LiefdeWen Sí, pero aborda los problemas en los comentarios.
Sebastian Simon
5

J , 19, 11, 10 8 bytes

0{>\:#@>

Pruébalo en línea!

Gracias a streetter por la pista!

-1 byte gracias a FrownyFrog!

-2 bytes gracias a Conor O'Brien

Cómo funciona:

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

Pruébalo en línea!

Galen Ivanov
fuente
1
Este fue mi enfoque inicial en K, pero luego me di cuenta de que podía ordenar la lista por conteo, descendente y tomar el primer elemento ... ¿Puedes hacer lo mismo en J?
Calles el
@streetster - ¡Gracias! Me acabo de dar cuenta de eso. Lo intentaré ahora, debería ser mucho más corto.
Galen Ivanov
1
Sin paréntesis más allá de este punto: 0{::]\:#@>
FrownyFrog
¿En {.@lugar de 0{::trabajar?
Kritixi Lithos
1
8 bytes:0{>\:#@>
Conor O'Brien
4

C #, 43 + 18 = 61 bytes

Pruébalo en línea!

a=>a.OrderByDescending(x=>x.Length).First()
LiefdeWen
fuente
@Doggo Devuelve el primer elemento en caso de empate.
LiefdeWen
@LiefdeWen OrderBy es estable, por lo que esto devolverá el último elemento en caso de empate. Ejemplo: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski
1
@ GrzegorzPuławski Oh, ya veo, arreglado.
LiefdeWen
Tengo algunos que tal vez alguien pueda ayudar a acortar la a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)base de 44 bytes, la base de a=>a.First(x=>x.Length==a.Max(y=>y.Length))43 bytes
Monso
1
@MrLore Esa fue mi primera solución, pero luego en un empate devuelve la última, porque el orden no se ve afectado.
LiefdeWen
4

PHP, 72 bytes

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Alan Ondra
fuente
44
Hola y bienvenidos a PPCG! :)
DJMcMayhem
4

Japt -h, 5 3 bytes

ÔñÊ

Intentalo

Invertir, ordenar por longitud y generar el último elemento.

Lanudo
fuente
3

K (oK) , 9 bytes

*x@>#:'x:

Pruébalo en línea!

Ejemplo:

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

Explicación

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

Notas:

Sin eliminar, ya que se clasifica como no trivial, a pesar de ser básicamente 5 pasos (se escribiría como la función {*x@>#:'x}).

callejero
fuente
3

Java (OpenJDK 8) , 67 bytes

¡Otra presentación en mi idioma favorito! (léase: el único que conozco).
Esto no funciona con una matriz vacía, pero está bien.

Golfed

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

Sin golf

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.

Pruébalo en línea!

Luke Stevens
fuente
3

Raqueta , 160 bytes 110 bytes

Pruébalo en línea! Contribución por primera vez, apreciado consejo!

(define(m a)(if(>(length a)1)(if(>=(string-length(car a))(string-length(m(cdr a))))(car a)(m(cdr a)))(car a)))

Sin golf

(define (m a)
    (if (> (length a) 1)
        (if (>= (string-length (car a)) (string-length (m (cdr a))))
            (car a)
            (m (cdr a))
        )
        (car a)
    )
)

Solución actualizada basada en comentarios

Daniel Lambert
fuente
44
¡Me gustaría dar la bienvenida a PPCG en nombre de la comunidad! Noté que su solución aparentemente falla para las listas donde la cadena más larga está al final. Ejemplo aquí . No recuerdo bien a Racket, pero si puedes, recomendaría cambiar tu algoritmo a un foldrenfoque basado en la base, tomar el máximo por longitud y transmitirlo.
cole
Oh eh Gracias por señalar eso. No puedo creer que no haya probado eso.
Daniel Lambert
También puede cambiar define(m a)aλ(a)
fede s.
1
¡También revisa los consejos si no lo has hecho!
fede s.
3

Bash , 45 bytes

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

Pruébalo en línea!

nxnev
fuente
1
¡Bienvenido a PPCG, buen primer post!
Conor O'Brien
3

Scratch 27 17 170 160

la imagen del código

Espera una lista global de cadenas (unidas a todos los sprites, para ser más precisos) llamadas mylist. Después de hacer clic en la bandera verde, la palabra más larga quedará en la variablew .

Creo que este es el enlace

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

Contando según este meta.

fede s.
fuente
¿Es necesario stop[allaquí?
ggorlen
3

Röda , 30 bytes

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

Pruébalo en línea!

Explicación:

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

Alternativa de 30 bytes:

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

Pruébalo en línea!

fergusq
fuente
Al escribir mi respuesta jq me di cuenta de que enumse puede descartar, y en su lugar [[-#_,_1]]se puede seleccionar el mínimo de , tio.run/…
Kritixi Lithos
@Cowsquack Eso no funciona porque luego mincompararía las cadenas de forma alfabética secundaria (porque las matrices se comparan secundariamente por su segundo elemento). Por ejemplo, input ["b", "a"]daría "a"como salida. Probablemente debería agregar una minbyfunción a Röda o algo similar ...
fergusq
3

APL - 23 16 bytes

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

¡Gracias a todos por todas sus excelentes sugerencias y aliento!

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

Uso:

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

Explicación:

obtiene la longitud de cada vector de caracteres (cadena) y luego usa el máximo como índice. Acabo de comenzar APL hace 20 minutos, así que lamento si esta es una forma estúpida de hacerlo.

Pruébalo en línea!

(editado para mayor claridad)

rmoro
fuente
1
Bienvenido a PPCG!
Steadybox
El a←no se cuenta para su bytecount.
Kritixi Lithos
Nunca olvides que APL se evalúa de derecha a izquierda: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Además, (...)⌷⍵=> ⍵⌷⍨...para guardar un byte
Zacharý
¡Aparte de los paréntesis, esto en realidad parece bastante bueno!
Zacharý
2

ML estándar (MLton) , 55 bytes

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

Pruébalo en línea! Ejemplo de uso: & ["abc","de","fgh"]rendimientos"abc" .

Sin golf:

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

Pruébalo en línea!

Laikoni
fuente
2

Funky , 38 bytes

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

Explicado

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.

Pruébalo en línea!

Un taco
fuente
2

Ruby , 21 20 bytes

->s{s.max_by &:size}

Pruébalo en línea!

Solución trivial, gracias Snack por -1 byte

GB
fuente
1
Quite el &:sizeparéntesis de -1
Merienda
2

SNOBOL4 (CSNOBOL4) , 63 57 bytes

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

Pruébalo en línea!

La entrada está en stdin y la salida en stdout.

Se traduce aproximadamente al siguiente pseudocódigo:

while input exists
 x = input
 if length(m) < length(x)
  m = x
end
return m
Giuseppe
fuente