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.


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.

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


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


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


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

¿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


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.


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

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.


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.


6

JavaScript (Node.js) , 38 bytes

Pruébalo en línea!

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

@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!


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

@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;});

44
Hola y bienvenidos a PPCG! :)
DJMcMayhem

4

Japt -h, 5 3 bytes

ÔñÊ

Intentalo

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



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}).


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!


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


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

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.


¿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!


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)


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!



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!



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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.