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.

Doggo
fonte
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.
fergusq
fonte
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!

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

totalmente humano
fonte
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
9

R + pryr , 31 bytes

[-2 bytes graças ao Scrooble]

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

Experimente online!


R , 33 bytes

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

Experimente online!

NofP
fonte
3
Também 33 bytes:x[which.max(nchar(x))]
Giuseppe
@ Scrooble do seu link, vejo uma solução de 33 bytes.
NofP 5/0318
11
@NofP Haha, bobo eu. 31 bytes.
Khuldraeseth na'Barya
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
pbeentje
fonte
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

Adão
fonte
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.

Emigna
fonte
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
Mr. Xcoder
fonte
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.

AdmBorkBork
fonte
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.

Luis Mendo
fonte
6

JavaScript (Node.js) , 38 bytes

Experimente online!

a=>a.sort((a,b)=>a.length<b.length)[0]
LiefdeWen
fonte
@ 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!

Galen Ivanov
fonte
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()
LiefdeWen
fonte
@ 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

Perl 6 ,  14  13 bytes

*.max(*.chars)

Tente

*.max(&chars)

Tente

Brad Gilbert b2gills
fonte
4

PHP, 72 bytes

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Alan Ondra
fonte
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.

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

rua
fonte
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!

Luke Stevens
fonte
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

Daniel Lambert
fonte
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
fonte
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.
fonte
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
fonte
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
fonte
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
fonte
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
fonte
2

Ruby, 21 20 bytes

->s{s.max_by &:size}

Try it online!

Trivial solution, thanks Snack for -1 byte

G B
fonte
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
fonte