Encontre a palavra mais longa em uma matriz


24

Seu desafio é pegar uma matriz de seqüências de caracteres e produzir a sequência mais longa da matriz. Então para

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

a saída seria biggest.

Se dois elementos da matriz tiverem o mesmo comprimento, escolha o que aparecer primeiro na matriz. Isso significa que se a matriz estiver assim:

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

a saída é one, mas se a matriz estiver assim:

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

a saída é two.


Como esse é o , o código mais curto em bytes vence.


3
2 notas: 1É fortemente desencorajado se a questão for alterado e invalida resposta existente, e 2o Sandbox existe exatamente para isso (certifique-se desafios são bons antes de postar)
user202729

4
Como acho que ninguém mais o mencionou - Olá, e bem-vindo ao PPCG!
AdmBorkBork

11
Não, você não precisa lidar com o caso em que a matriz está vazia. Mas se você quiser, pode.
Doggo

4
2 horas? Isso é muito, muito rápido demais para ser aceita uma resposta.
Salsicha

6
Normalmente você espera uma semana
Christopher

Respostas:


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.

Versão online

Ungolfed:

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

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

Versão online

A única oportunidade de golfe disponível é substituí-la pisin alkio(significando "o elemento mais longo") por x.

Tradução:

O item mais longo de uma lista é, dependendo se o comprimento do primeiro item é maior ou igual ao comprimento de cada elemento da lista, seja

  • o primeiro item da lista ou
  • o item mais longo no final da lista.

21
Isso é um ... Isso faz ... Como você ... O quê ?!
auhmaan

3
Google Tradutor do finlandês: a lista de x depende se o comprimento do primeiro elemento é maior ou igual ao comprimento de cada elemento, seja o primeiro item ou a cauda de x.
Adám

2
@ Adám Eu costumava pensar que o APL é difícil de ler. Aparentemente, tudo o que você precisa vencer é mover o campo de jogo para um idioma em que o inglês é uma mercadoria rara.
Uriel

3
Quem precisa de COBOL, AppleScript ou Inform 7? Quem precisa do Arnold Chef ou Shakespeare? Você tem Imperative Tampio! Oh meu monstro espaguete voador, finlandês de todas as línguas? Eu não estou aprendendo isso tão cedo ...
fede s.

11
@fedes. Você poderia dizer "Olkoon suomalainen suudelma uusi suudelma". (Deixe o beijo Finnish ser um novo beijo, ele cria um novo objeto beijo)
fergusq

20

Python , 23 bytes

lambda a:max(a,key=len)

Experimente online!


11
Lamento não ter convertido isso direito.
Doggo

11
Atualizei o trecho de código, mas, como está escrito, ele já atinge essa funcionalidade.
Neil

11
Isso também funcionará inalterado no Python 3. #
anonymoose

17

Haskell , 35 bytes

-3 bytes graças ao Zgarb.

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

Experimente online!

Eu gosto deste código. Você sabe porque? Porque o Haskell suporta soluções muito mais elegantes com funções de bibliotecas aleatórias.

maximumBy(compare`on`length).reverse

Isso é legível! Exceto, não é válido.

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

Se não fosse pelas importações, esse seria um envio perfeito para obter todos os votos positivos. : P

(Além disso, ele usa uma dica de golfe e uma dobra.)


2
Sem a exigência de "primeira ocorrência em caso de empate", essa beleza funcionaria: snd.maximum.map((,)=<<(0<$)) Experimente on-line! .
Laikoni

11
Apenas para referência: há o chato 29 bytes embutido import Data.Lists;argmax(0<$).
nimi

11
Woah, como isso lnão faz parte fold? Como ele distingue isso e uma função chamada foldl?
12Me21

11
@ 12Me21 Faz parte do nome da função foldl1. Eu pensei que parte da explicação pode ser confusa, desculpe ...
totallyhuman

11
35 bytes com uma função em vez de lambda. Curiosamente, você deve substituir 0por aou algo mais, caso contrário, o GHC reclama de um tipo numérico ambíguo.
Zgarb


8

EXCEL, 36. 42 bytes

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

Introduzido como uma fórmula de matriz (ctrl-shift-enter). A matriz de entrada deve ser inserida na coluna A.

A fórmula retorna a primeira correspondência com o comprimento máximo.

Dependendo das configurações da sua região, substitua ,por ;; o comprimento do código permanece inalterado. Dos 16 idiomas listados aqui , os nomes das funções em inglês são os mais curtos para esta fórmula.

Explicação:

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

O que para ,o último? A fórmula ainda funciona sem ela
Anastasiya-Romanova #

O final ,é um parâmetro para MATCH que retorna a primeira correspondência exata, conforme exigido pela pergunta (revisada). Se for deixado de fora, o MATCH espera uma matriz em ordem crescente e retorna a última correspondência, em vez da primeira, se houver vários elementos com o mesmo comprimento.
Pseentje

Têm certeza? Eu comparei essas duas fórmulas e ambas vêm com o mesmo resultado
Anastasiya-Romanova # 21/17/17

Você está usando uma matriz de entrada que possui duas cadeias (diferentes) do mesmo comprimento? Deixando de fora a vírgula (ponto e vírgula) me dá a última seqüência de comprimento máximo, como esperado ... (Excel 2016, 64-bit)
pbeentje

Infelizmente, a comunidade decidiu que o uso de intervalos nomeados dessa maneira é inválido, por isso sugiro que, nesse caso em particular, você mude para o uso A:Ae o torne um array formal com {...}um post ótimo!
Taylor Scott

7

APL (Dyalog Unicode) , SBCS de 9 bytes

⊢⊃⍨∘⊃∘⍒≢¨

Experimente online!

 do argumento,

⊃⍨ escolha o elemento com o índice que é o

 primeiro do

 índices em ordem decrescente do

≢¨ comprimentos de cada


7

Prolog (SWI) , 98 92 72 69 bytes

O predicado de nível superior é *.

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

Experimente online!

Explicação

A primeira linha define o predicado diádico /como um curto, o atom_length/2que é verdadeiro se o comprimento do primeiro argumento for o segundo argumento. Isso nos economiza 3 bytes usando atom_lengthduas vezes.

Nosso predicado principal é definido como o diádico, *onde o primeiro argumento é uma lista e o segundo argumento, o elemento mais longo dessa lista.

A segunda linha é o nosso caso base, que afirma que o elemento mais longo de uma lista de um elemento é esse elemento.

A terceira linha afirma que, para uma lista com pelo menos 2 elementos, o elemento mais longo é:

Se o comprimento do segundo elemento for maior que o primeiro, o elemento mais longo estará na lista sem o primeiro elemento.

Caso contrário, o elemento mais longo estará na lista sem o segundo elemento.


Eu estaria interessado em ver uma explicação sobre como ele funciona
Kritixi Lithos

@ Cowquack: eu adicionei uma breve explicação.
Emigna

7

Pitão , 4 bytes

h.Ml

Suíte de teste.

Explicação
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

ou bom, você venceu a resposta Pyth com 6 bytes de bom.
Doggo

elD_e ho_lalcançar o mesmo comprimento.
Isaacg

11
@ hakr14 Muito obrigado pela edição!
Sr. Xcoder 25/03

6

PowerShell , 24 bytes

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

Experimente online!

Recebe entrada $args[0], tubos que, com Sort-Objectbase no length, em -dordem de tendência. Em seguida, leva o [0]th dela. Como a classificação é estável, isso leva o primeiro elemento em caso de empate.


11
Bom nome wuff wuff: D
Doggo

6

Oitava , 33 bytes

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

Entrada é uma matriz de células de cadeias.

Experimente online!

Explicação

cellfun(@nnz,x)aplica a nnzfunção (número de nonzeros) a cada string na matriz de entrada x. Para cadeias ASCII, nnzé equivalente a numel(número de elementos), mas menor. O resultado é uma matriz numérica com os comprimentos de sequência.

Em seguida, [~,]=max(...)fornece o índice do primeiro máximo na matriz de comprimentos de sequência. O resultado é usado como um índice de chaves xpara obter a sequência correspondente.


6

JavaScript (Node.js) , 38 bytes

Experimente online!

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

@ Doggo Ele retorna o primeiro elemento em caso de empate.
LiefdeWen

11
Retornar um número booleano em vez de um número assinado no retorno de chamada sort () não funciona em todos os mecanismos JS (por exemplo, não funciona no Edge). Outra abordagem seria algo assim , que é 1 byte mais curto. Ainda assim, não há garantia de que o primeiro item seja escolhido de forma consistente nos navegadores em caso de empate.
Arnauld

mas se ele escolhe-lo de forma consistente em node.js sobre TIO que não é bom o suficiente \?
LiefdeWen

11
Você deve usar em -vez de <na função comparadora.
precisa saber é o seguinte

11
@LiefdeWen Sim, mas aborda os problemas nos comentários.
Sebastian Simon

5

J , 19, 11, 10 8 bytes

0{>\:#@>

Experimente online!

Obrigado ao streetster pela dica!

-1 byte graças a FrownyFrog!

-2 bytes graças a Conor O'Brien

Como 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

Experimente online!


11
Esta foi a minha abordagem inicial em K, mas então percebi que era possível ordenar a lista pela contagem, descer e pegar o primeiro item ... Você pode fazer a mesma coisa em J?
Streetster 20/12

@ streetster - Obrigado! Eu acabei de perceber isso. Vou tentar agora, deve ser muito mais curto.
Galen Ivanov

11
Não há parênteses além deste ponto:0{::]\:#@>
FrownyFrog 21/12

Em {.@vez de 0{::trabalhar?
Kritixi Lithos

11
8 bytes:0{>\:#@>
Conor O'Brien

4

C #, 43 + 18 = 61 bytes

Experimente online!

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

@ Doggo Ele retorna o primeiro elemento em caso de empate.
LiefdeWen

O @LiefdeWen OrderBy é estável e, portanto, retornará o último elemento em caso de empate. Exemplo: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski

11
@ GrzegorzPuławski Oh, eu vejo, fixo.
LiefdeWen

Eu tenho alguns que talvez alguém possa ajudar a encurtar a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)base de 44 byte, a=>a.First(x=>x.Length==a.Max(y=>y.Length))43 byte de base
Monso

11
@ MrLore Essa foi minha primeira solução, mas depois empatada, ela retorna a última, porque a ordem não é afetada.
precisa saber é o seguinte


4

PHP, 72 bytes

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

4
Olá, e bem-vindo ao PPCG! :)
DJMcMayhem

4

Japonês -h, 5 3 bytes

ÔñÊ

Tente

Inverta, classifique por comprimento e produza o último elemento.



3

K (oK) , 9 bytes

*x@>#:'x:

Experimente online!

Exemplo:

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

Explicação

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

Notas:

Com exclusão de exclusão, isso é classificado como não trivial, apesar de ter basicamente 5 etapas (seria escrito como a função {*x@>#:'x}).


3

Java (OpenJDK 8) , 67 bytes

Outra submissão no meu idioma favorito! (leia: o único que eu conheço).
Isso não funciona com uma matriz vazia, mas tudo bem.

Golfe

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.

Experimente online!


3

Raquete , 160 bytes 110 bytes

Experimente online! Primeira contribuição, conselhos apreciados!

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

Solução atualizada com base no feedback


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

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.


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!


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)


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!



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!


2

Ruby, 21 20 bytes

->s{s.max_by &:size}

Try it online!

Trivial solution, thanks Snack for -1 byte


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.