Suchen Sie das längste Wort in einem Array

24

Ihre Herausforderung besteht darin, ein Array von Zeichenfolgen zu verwenden und die längste Zeichenfolge im Array auszugeben. So für

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

die Ausgabe wäre biggest.

Wenn zwei Elemente des Arrays dieselbe Länge haben, sollten Sie dasjenige auswählen, das zuerst im Array angezeigt wird. Das heißt, wenn das Array so aussieht:

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

die Ausgabe ist one, aber wenn das Array so aussah:

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

die Ausgabe ist two.


Da es sich um , der kürzeste Code in Bytes gewinnt.

Doggo
quelle
3
2 Anmerkungen: 1Es wird dringend davon abgeraten, die Frage zu ändern und die vorhandene Antwort ungültig zu machen. Aus genau diesem Grund gibt es 2die Sandbox (stellen Sie sicher, dass die Herausforderungen gut sind, bevor Sie sie veröffentlichen)
user202729 20.12.17
4
Da ich glaube nicht, dass es jemand anders erwähnt hat - Hallo und willkommen bei PPCG!
AdmBorkBork
1
Nein, Sie müssen den Fall nicht behandeln, in dem das Array leer ist. Aber wenn du willst, kannst du.
Doggo
4
2 Stunden? Das ist weit, weit zu schnell eine Antwort zu akzeptieren.
Shaggy
6
Normalerweise wartet man eine Woche
Christopher

Antworten:

31

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

Online Version

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.

Online Version

Die einzige Golfmöglichkeit, die dies bietet, ist das Ersetzen pisin alkio(was "das längste Element" bedeutet) durch x.

Übersetzung:

Das längste Element in einer Liste hängt davon ab, ob die Länge des ersten Elements größer oder gleich der Länge jedes Elements in der Liste ist

  • das erste Element in der Liste oder
  • das längste Element im Ende der Liste.
fergusq
quelle
21
Ist das ein ... Tut das ... Wie geht es dir ... Was ?!
auhmaan
3
Google Translate from Finnish: Die Liste von x hängt davon ab, ob die Länge des ersten Elements größer oder gleich der Länge jedes Elements ist, entweder des ersten Elements oder des Endes von x.
Adám
2
@Adam Früher dachte ich, APL ist schwer zu lesen. Alles, was Sie tun müssen, ist, das Spielfeld in eine Sprache zu versetzen, in der Englisch eine seltene Ware ist.
Uriel
3
Wer braucht COBOL, AppleScript oder Inform 7? Wer braucht Arnold Chef oder Shakespeare? Sie haben Imperativ Tampio! Oh mein fliegendes Spaghetti-Monster, ausgerechnet Finnisch? Das lerne ich so schnell nicht ...
fede s.
1
@fedes. Man könnte sagen "Olkoon suomalainen suudelma uusi suudelma." (Lass den finnischen Kuss ein neuer Kuss sein, er erzeugt ein neues
Kussobjekt
20

Python , 23 Bytes

lambda a:max(a,key=len)

Probieren Sie es online!

Neil
quelle
1
Es tut mir leid, dass ich das nicht richtig umgesetzt habe.
Doggo
1
Ich habe das Code-Snippet aktualisiert, aber so wie es geschrieben ist, wird diese Funktionalität bereits erreicht.
Neil
1
Dies wird auch in Python 3 unverändert funktionieren.
anonymoose
17

Haskell , 35 Bytes

-3 Bytes dank Zgarb.

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

Probieren Sie es online!

Ich mag diesen Code. Du weißt, warum? Weil Haskell viel elegantere Lösungen mit Funktionen aus zufälligen Bibliotheken unterstützt.

maximumBy(compare`on`length).reverse

Das ist verdammt lesbar! Außer, es ist nicht gültig.

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

Ohne die Importe wäre dies eine perfekte Vorlage gewesen, um alle positiven Stimmen zu erhalten. : P

(Außerdem wird ein Golf-Tipp und eine Falte verwendet.)

total menschlich
quelle
2
Ohne die zusätzliche "First-Occidentence-In-Case-Of-Tie" -Voraussetzung würde diese Schönheit funktionieren: snd.maximum.map((,)=<<(0<$)) Versuchen Sie es online! .
Laikoni
1
Nur als Referenz: Es ist die langweilige 29 Byte eingebaut import Data.Lists;argmax(0<$).
nimi
1
Woah, wie ist das lnicht ein Teil von fold? Wie unterscheidet es das von einer benannten Funktion foldl?
21.
1
@ 12Me21 Dies ist Teil des Funktionsnamens foldl1. Ich dachte, dass ein Teil der Erklärung verwirrend sein könnte, sorry ...
totalhuman
1
35 Bytes mit einer Funktion anstelle von Lambda. Interessanterweise müssen Sie ersetzen 0mit aanderen oder etwas, sonst GHC beschwert sich über eine mehrdeutige numerischen Typ.
Zgarb
9

R + Pryr , 31 Bytes

[-2 Bytes dank Scrooble]

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

Probieren Sie es online!


R , 33 Bytes

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

Probieren Sie es online!

NofP
quelle
3
Auch 33 Bytes:x[which.max(nchar(x))]
Giuseppe
@ Scrooble von Ihrem Link sehe ich eine 33-Byte-Lösung.
NofP
1
@NofP Haha, dumm mich. 31 Bytes.
Khuldraeseth na'Barya
8

EXCEL, 36 42 Bytes

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

Wird als Matrixformel eingegeben (Strg-Umschalt-Eingabe). Das Eingabearray sollte in Spalte A eingegeben werden.

Die Formel gibt die erste Übereinstimmung mit maximaler Länge zurück.

Ersetzen Sie je nach den Einstellungen in Ihrer Region ,durch ;; Die Codelänge bleibt unverändert. Von den 16 hier aufgeführten Sprachen sind englische Funktionsnamen die kürzesten für diese Formel.

Erläuterung:

=                                          - 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
quelle
Was für die ,in letzterem? Die Formel funktioniert immer noch ohne sie
Anastasiya-Romanova 秀
Das Finale ,ist ein Parameter für MATCH, der die erste exakte Übereinstimmung gemäß der (überarbeiteten) Frage zurückgibt. Wenn es weggelassen wird, erwartet MATCH ein Array in aufsteigender Reihenfolge und gibt die letzte Übereinstimmung anstelle der ersten zurück, wenn mehrere Elemente mit derselben Länge vorhanden sind.
pbeentje
Sind sicher? Ich habe diese beiden Formeln verglichen und beide kommen mit genau dem gleichen Ergebnis
Anastasiya-Romanova 秀
Verwenden Sie ein Eingabearray mit zwei (unterschiedlichen) Zeichenfolgen gleicher Länge? Wenn ich das Komma (Semikolon)
weglasse, erhalte
Leider hat die Community entschieden, dass die Verwendung von benannten Bereichen auf diese Weise ungültig ist. Daher schlage ich vor, dass Sie in diesem speziellen Fall zur Verwendung wechseln A:Aund ein Array mit formalisieren {...}, ansonsten großartiger Beitrag!
Taylor Scott
7

APL (Dyalog Unicode) , 9 Byte SBCS

⊢⊃⍨∘⊃∘⍒≢¨

Probieren Sie es online!

 aus dem argument,

⊃⍨ Wählen Sie das Element mit dem Index, der das ist

 zuerst der

 Indizes in absteigender Reihenfolge der

≢¨ Längen von jedem

Adam
quelle
7

Prolog (SWI) , 98 92 72 69 Bytes

Das Prädikat der obersten Ebene ist *.

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

Probieren Sie es online!

Erläuterung

Die erste Zeile definiert das dyadische Prädikat /als eine Abkürzung, für atom_length/2die gilt, wenn die Länge des ersten Arguments das zweite Argument ist. Dies spart uns 3 Bytes bei atom_lengthzweimaliger Verwendung .

Unser Hauptprädikat ist als die Dyade definiert, bei der *das erste Argument eine Liste und das zweite Argument das längste Element dieser Liste ist.

Die zweite Zeile ist unser Basisfall, der besagt, dass das längste Element einer Liste mit einem Element dieses Element ist.

Die dritte Zeile gibt an, dass für eine Liste mit mindestens 2 Elementen das längste Element ist:

Wenn das zweite Element länger als das erste Element ist, befindet sich das längste Element in der Liste ohne das erste Element.

Andernfalls befindet sich das längste Element in der Liste ohne das zweite Element.

Emigna
quelle
Ich würde gerne eine Erklärung sehen, wie es funktioniert
Kritixi Lithos
@Cowsquack: Ich habe eine kurze Erklärung hinzugefügt.
Emigna
7

Pyth , 4 Bytes

h.Ml

Testsuite.

Erläuterung
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
quelle
Schön, dass Sie die Pyth-Antwort mit 6 Bytes schön schlagen.
Doggo
elD_und ho_lerreichen die gleiche Länge.
isaacg
1
@ hakr14 Vielen Dank für die Bearbeitung!
Mr. Xcoder
6

PowerShell , 24 Byte

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

Probieren Sie es online!

Übernimmt Eingaben $args[0], leitet diese an Sort-Objectdie lLänge in -dabsteigender Reihenfolge an. Dann nimmt man die [0]th davon. Da sort stabil ist, wird im Falle eines Unentschieden das erste Element verwendet.

AdmBorkBork
quelle
1
Nice name wuff wuff: D
Doggo
6

Oktave , 33 Bytes

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

Die Eingabe ist ein Zellenarray von Zeichenfolgen.

Probieren Sie es online!

Erläuterung

cellfun(@nnz,x)nnzWendet die Funktion (Anzahl der Nichtzeros) auf jede Zeichenfolge im Eingabearray an x. nnzEntspricht für ASCII-Zeichenfolgen numel(Anzahl der Elemente), ist jedoch kürzer. Das Ergebnis ist ein numerisches Array mit den Zeichenfolgenlängen.

Dann [~,]=max(...)gibt den Index des ersten Maximums in der Anordnung der Saitenlängen. Das Ergebnis wird als Index xfür geschweifte Klammern verwendet , um die entsprechende Zeichenfolge zu erhalten.

Luis Mendo
quelle
6

JavaScript (Node.js) , 38 Byte

Probieren Sie es online!

a=>a.sort((a,b)=>a.length<b.length)[0]
LiefdeWen
quelle
@Doggo Gibt bei einem Gleichstand das erste Element zurück.
LiefdeWen
1
Die Rückgabe eines Booleschen Werts anstelle einer vorzeichenbehafteten Zahl im sort () - Rückruf funktioniert nicht in allen JS-Engines (z. B. nicht in Edge). Ein anderer Ansatz wäre so etwas , das 1 Byte kürzer ist. Es gibt jedoch keine Garantie dafür, dass das erste Element im Falle eines Unentschieden konsistent zwischen den Browsern ausgewählt wird.
Arnauld
aber wenn es es konsequent in node.js auf TIO auswählt, ist das nicht gut genug? \
LiefdeWen
1
Sie sollten -statt <in der Komparatorfunktion verwenden.
Kamoroso94
1
@LiefdeWen Ja, aber es geht auf die Probleme in den Kommentaren ein.
Sebastian Simon
5

J , 19, 11, 10 8 Bytes

0{>\:#@>

Probieren Sie es online!

Danke an streetster für den Hinweis!

-1 Byte dank FrownyFrog!

-2 Bytes dank Conor O'Brien

Wie es funktioniert:

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

Probieren Sie es online!

Galen Ivanov
quelle
1
Dies war meine anfängliche Herangehensweise in K, aber dann wurde mir klar, dass ich die Liste einfach nach Anzahl sortieren, absteigen und den ersten Gegenstand nehmen konnte ... Können Sie dasselbe in J tun?
Streetster
@streetster - Danke! Das habe ich gerade gemerkt. Ich werde es jetzt versuchen, es sollte viel kürzer sein.
Galen Ivanov
1
Keine Klammern darüber hinaus:0{::]\:#@>
FrownyFrog
Würde {.@anstatt zu 0{::arbeiten?
Kritixi Lithos
1
8 Bytes:0{>\:#@>
Conor O'Brien
4

C #, 43 + 18 = 61 Bytes

Probieren Sie es online!

a=>a.OrderByDescending(x=>x.Length).First()
LiefdeWen
quelle
@Doggo Gibt bei einem Gleichstand das erste Element zurück.
LiefdeWen
@LiefdeWen OrderBy ist stabil und gibt im Falle eines Unentschieden das letzte Element zurück. Beispiel: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski
1
@ GrzegorzPuławski Oh, ich verstehe, behoben.
LiefdeWen
Ich habe ein paar, die vielleicht jemand helfen kann, a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)44-Byte-Basis, a=>a.First(x=>x.Length==a.Max(y=>y.Length))43-Byte-Basis zu verkürzen
Monso
1
@MrLore Das war meine erste Lösung, aber bei Gleichstand wird die letzte zurückgegeben, da die Bestellung nicht betroffen ist.
LiefdeWen
4

PHP, 72 Bytes

array_reduce($a,function($c,$i){return (strlen($i)>strlen($c))?$i:$c;});
Alan Ondra
quelle
4
Hallo und willkommen bei PPCG! :)
DJMcMayhem
4

Japt -h, 5 3 Bytes

ÔñÊ

Versuch es

Kehren Sie um, sortieren Sie nach Länge und geben Sie das letzte Element aus.

Zottelig
quelle
3

K (oK) , 9 Bytes

*x@>#:'x:

Probieren Sie es online!

Beispiel:

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

Erläuterung

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

Anmerkungen:

Nicht gelöscht, da dies als nicht trivial eingestuft wird, obwohl es im Grunde genommen 5 Schritte sind (wäre, wenn es als Funktion geschrieben würde {*x@>#:'x}).

Streetster
quelle
3

Java (OpenJDK 8) , 67 Byte

Noch ein Beitrag in meiner Lieblingssprache! (gelesen: das einzige, das ich kenne).
Dies funktioniert nicht mit einem leeren Array, aber das ist in Ordnung.

Golf gespielt

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.

Probieren Sie es online!

Luke Stevens
quelle
3

Schläger , 160 Bytes 110 Bytes

Probieren Sie es online! Zum ersten Mal mitarbeiten, Ratschläge erwünscht!

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

Aktualisierte Lösung basierend auf Feedback

Daniel Lambert
quelle
4
Ich möchte PPCG im Namen der Community willkommen heißen! Mir ist aufgefallen, dass Ihre Lösung anscheinend für Listen fehlschlägt, bei denen die längste Zeichenfolge am Ende steht. Beispiel hier . Ich erinnere mich nicht gut an Racket, aber wenn Sie können, würde ich empfehlen, Ihren Algorithmus auf einen foldr-basierten Ansatz umzustellen, das Maximum nach Länge zu nehmen und das zu übertragen.
Cole
Oh huh Danke, dass Sie darauf hingewiesen haben. Ich kann nicht glauben, dass ich das nicht getestet habe.
Daniel Lambert
Sie können auch die ändern define(m a)zuλ(a)
s fede.
1
Überprüfen Sie auch die Tipps, wenn Sie nicht haben!
fede s.
3

Scratch 27 17 170 160

das Codebild

Es wird eine globale (genauer gesagt an alle Sprites angehängte) Liste von Strings erwartet, die aufgerufen werden mylist. Nach dem Klicken auf die grüne Flagge verbleibt das längste Wort in der Variablen w.

Ich denke das ist der 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

Zählen nach diesem Meta.

fede s.
quelle
Ist es notwendig, stop[allhier?
Ggorlen
3

Röda , 30 Bytes

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

Probieren Sie es online!

Erläuterung:

{
 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]]}

Probieren Sie es online!

fergusq
quelle
Als ich meine jq-Antwort aufschrieb, wurde mir klar, dass enumdas fallengelassen werden kann und stattdessen das Minimum von [[-#_,_1]]ausgewählt werden kann, tio.run/…
Kritixi Lithos
@Cowsquack Das funktioniert nicht, weil dann minStrings alphabetisch verglichen werden (weil Arrays sekundär nach ihrem zweiten Element verglichen werden). Zum Beispiel ["b", "a"]würde Eingabe "a"als Ausgabe geben. Ich sollte wahrscheinlich eine minbyFunktion zu Röda oder etwas Ähnlichem hinzufügen ...
Fergusq
3

APL - 23 16 Bytes

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

Vielen Dank an alle für all Ihre tollen Vorschläge und Ermutigungen!

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

Verwendung:

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

Erläuterung:

Ruft die Länge jedes Zeichenvektors (Zeichenkette) ab und verwendet dann Maximum als Index. Ich habe gerade vor 20 Minuten mit APL angefangen. Es tut mir leid, wenn dies ein dummer Weg ist, es zu tun.

Probieren Sie es online!

(aus Gründen der Übersichtlichkeit bearbeitet)

rmoro
quelle
1
Willkommen bei PPCG!
Steadybox
Das a←wird nicht auf Ihr bytecount angerechnet.
Kritixi Lithos
Niemals vergessen, dass APL von rechts nach links ausgewertet wird: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Also, (...)⌷⍵=> ⍵⌷⍨...um ein Byte zu speichern
Zacharý
Abgesehen von den Klammern scheint dies tatsächlich ziemlich gut zu sein!
Zacharý
2

Standard ML (MLton) , 55 Bytes

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

Probieren Sie es online! Anwendungsbeispiel: & ["abc","de","fgh"]Erträge "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

Probieren Sie es online!

Laikoni
quelle
2

Funky , 38 Bytes

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

Erklärt

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.

Probieren Sie es online!

Ein Taco
quelle
2

Ruby , 21 bis 20 Bytes

->s{s.max_by &:size}

Probieren Sie es online!

Triviale Lösung, danke Snack für -1 Byte

GB
quelle
1
Nehmen Sie die &:sizeaus den Klammern für -1
Snack
2

SNOBOL4 (CSNOBOL4) , 63 57 Bytes

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

Probieren Sie es online!

Der Eingang ist auf stdin und der Ausgang auf stdout.

Grob übersetzt in den folgenden Pseudocode:

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