配列内で最も長い単語を見つける


24

あなたの課題は、文字列の配列を取得し、配列内の最も長い文字列を出力することです。だから

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

出力はになりますbiggest

配列の2つの要素の長さが同じ場合、配列の最初に表示される要素を選択する必要があります。つまり、配列が次のようになっている場合です。

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

出力はoneですが、配列が次のようになっている場合:

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

出力はtwoです。


これはであるため、バイト単位の最短コードが優先されます。


3
2注:1質問が変更され、既存の回答が無効になり2、その理由でSandboxが存在する場合は強くお勧めしません(投稿する前に課題が適切であることを確認してください)
user202729

4
私は他の誰かがそれについて言及したとは思わないので-こんにちは、PPCGへようこそ!
AdmBorkBork

1
いいえ、配列が空の場合を処理する必要はありません。しかし、必要に応じてできます。
Doggo

4
2時間?それは、はるかですはるかにあまりにも迅速な答えを受け入れることを。
シャギー

6
通常、1週間待つ
クリストファー

回答:


31

命令型タンピオ、168バイト

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.

オンライン版

ゴルフをしていない:

Listan pisin alkio riippuen siitäonkoensimmäisenalkion pituus suurempi 太極拳 yhtä suuri kuinjokaisen alkion pituus、ジョコ

  • センensimmäinenアルキオタイ
  • senhännänpisin alkio。

オンライン版

これが持つ唯一のゴルフの機会は、pisin alkio(「最も長い要素」を意味する)に置き換えることxです。

翻訳:

リスト内の最も長い項目は、最初の項目の長さがリスト内の各要素の長さ以上であるかどうかに応じて、

  • リストの最初のアイテム、または
  • リストの末尾にある最長のアイテム。

21
これは…ですか………どうしますか…。
auhmaan

3
Google Translate from Finnish:xのリストは、最初の要素の長さが各要素(最初のアイテムまたはxの末尾)の長さ以上であるかどうかに依存します。
アダム

2
@AdámAPLは読みにくいと思っていました。どうやらあなたが勝つために必要なのは、英語が珍しい商品である言語にゲームフィールドを移動することです。
ウリエル

3
COBOL、AppleScript、またはInform 7が必要なのは誰ですか?アーノルドシェフやシェークスピアが必要なのは誰ですか?命令型タンピオがあります!私の飛行スパゲッティモンスター、すべての言語のフィンランド人?私は、その1つのいつでもすぐに...学んでいないよ
FEDE秒。

1
@fedes。「Olkoon suomalainen suudelma uusi suudelma」と言えます。(フィンランドのキスを新しいキスにし、新しいキスオブジェクトを作成します)
fergusq


17

Haskell、35バイト

Zgarbのおかげで-3バイト。

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

オンラインでお試しください!

私はこのコードが好きです。あなたが理由を知っている?Haskellは、ランダムライブラリの関数を使用してよりエレガントなソリューションをサポートしているためです。

maximumBy(compare`on`length).reverse

それは読みやすいです!例外として、それは無効です。

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

輸入品でなければ、これはすべての賛成票を獲得するための完璧な提案でした。:P

(また、これは1つのゴルフチップ使用し、フォールドを使用します。)


2
追加された「最初の場合」の要件がなければ、この美しさは機能snd.maximum.map((,)=<<(0<$)) します。オンラインで試してみてください!
ライコニ

1
参照用:退屈な29バイトのビルトインがありimport Data.Lists;argmax(0<$)ます。
nimi

1
うわー、どうしてlの一部ではないのfold?それと名前付き関数をどのように区別しfoldlますか?
12Me21

1
@ 12Me21関数名の一部ですfoldl1。私は...申し訳ありませんが、説明の一部が混乱するかもしれないと思った
totallyhuman

1
35バイトラムダではなく関数を使用した。興味深いことに、あなたは交換する必要があります0aそうでない場合はGHCがあいまいな数値型を訴え、または何か他のもの。
Zgarb

9

R + pryr、31バイト

[Scroobleのおかげで2バイト]

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

オンラインでお試しください!


R、33バイト

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

オンラインでお試しください!


3
また33バイト:x[which.max(nchar(x))]
ジュゼッペ

あなたのリンクから@Scroobleは33バイトのソリューションを参照してください。
NofP


8

エクセル、 36 42バイト

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

配列数式として入力(ctrl-shift-enter)。入力配列は列Aに入力する必要があります。

数式は、最大長の最初の一致を返します。

お住まいの地域の設定によっては、代替,;。コード長は変更されません。ここにリストされている 16の言語のうちに、英語の関数名がこの式の最短です。

説明:

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

何のために,、後者では?公式はそれなしでも機能します
アナスタシア・

最後,はMATCHのパラメーターであり、(改訂された)質問で要求される最初の完全一致を返します。省略した場合、MATCHは昇順の配列を想定し、同じ長さの要素が複数ある場合、最初ではなく最後の一致を返します。
pbeentje

確かですか?これら2つの式を比較しましたが、どちらもまったく同じ結果になりました
Anastasiya-Romanova秀

同じ長さの2つの(異なる)文字列を持つ入力配列を使用していますか?予想通り、私の最大の長さの最後の文字列を与える...(エクセル2016、64ビット)、カンマ(セミコロン)を除外
pbeentje

残念ながら、この方法で名前付き範囲使用することは無効であるとコミュニティが決定したため、この特定のケースでは、に切り替えてA:A配列をフォーマルにすることを推奨し{...}ます。
テイラースコット


7

プロローグ(SWI)98 92 72 69バイト

最上位の述部は*です。

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

オンラインでお試しください!

説明

最初の行は、最初の引数の長さが2番目の引数である場合にtrueで/ある短い2 項述語を定義しatom_length/2ます。これにより、atom_length2回使用することで3バイト節約できます。

私たちの主な述語は二項として定義されています *、最初の引数がリストであり、2番目の引数がそのリストの最も長い要素であるます。

2行目は、1つの要素リストの最も長い要素がその要素であることを示す基本ケースです。

3番目の行は、少なくとも2つの要素を持つリストの場合、最も長い要素は次のとおりであることを示しています。

2番目の要素の長さが最初の要素よりも長い場合、最も長い要素は最初の要素のないリストにあります。

それ以外の場合、最長要素は2番目の要素なしでリストに含まれます。


私はそれがどのように動作するかの説明を見ることに興味がある
KritixiのLithos

@Cowsquack:簡単な説明を追加しました。
エミグナ

7

Pyth、4バイト

h.Ml

テストスイート。

説明
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

Pythの答えを6バイトのナイスで打ち負かした。
Doggo

elD_ho_l同じ長さを達成します。
isaacg

1
@ hakr14編集ありがとうございます!
ミスターXcoder


6

オクターブ、33バイト

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

入力は文字列のセル配列です。

オンラインでお試しください!

説明

cellfun(@nnz,x)nnz入力配列の各文字列に関数(非ゼロの数)を適用しますx。ASCII文字列の場合、(要素数)nnzと同等numelですが、短いです。結果は、文字列の長さを持つ数値配列です。

次に、[~,]=max(...)文字列の長さの配列の最初の最大のインデックスを指定します。結果はx、対応する文字列を取得する中括弧インデックスとして使用されます。


6

JavaScript(Node.js)、38バイト

オンラインでお試しください!

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

@Doggo同点の場合、最初の要素を返します。
LiefdeWen

1
sort()コールバックで符号付き数値の代わりにブール値を返すことは、すべてのJSエンジンで機能しません(たとえば、Edgeでは機能しません)。別のアプローチはそのようなもので、1バイト短くなります。それでも、同点の場合に最初のアイテムがブラウザ間で一貫して選択されるという保証はありません。
アーナルド

しかし、TIOのnode.jsで一貫してそれを選択した場合、それだけでは十分ではありませんか?\
LiefdeWen

1
コンパレーター関数の-代わりに使用する必要があり<ます。
kamoroso94

1
@LiefdeWenはい、ただしコメントの問題に対処します。
セバスチャンサイモン

5

J19、11、10の 8バイト

0{>\:#@>

オンラインでお試しください!

ヒントをくれたストリートスターに感謝します!

FrownyFrogのおかげで-1バイト!

-2バイト、Conor O'Brienのおかげ

使い方:

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

オンラインでお試しください!


1
これはKでの最初のアプローチでしたが、カウントでリストを降順でソートし、最初の項目を取得できることに気付きました... Jでも同じことを行うことができますか?
ストリートスター

@streetster-ありがとう!私はちょうどそれを実現しました。私は今それを試してみるつもりです、それははるかに短くなるはずです。
ガレンイワノフ

1
この点を超える括弧はありません:0{::]\:#@>
FrownyFrog

{.@の代わりに0{::動作しますか?
クリチキシリソス

1
8バイト:0{>\:#@>
コナーオブライエン

4

C#、43 + 18 = 61バイト

オンラインでお試しください!

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

@Doggo同点の場合、最初の要素を返します。
LiefdeWen

@LiefdeWen OrderByは安定しているため、実際には同点の場合に最後の要素を返します。例:tio.run
GrzegorzPuławski17年

1
@GrzegorzPuławskiああ、なるほど、修正しました。
LiefdeWen

私は多分、誰かが短縮助けることができるいくつかを持っているa=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)44バイトのベース、a=>a.First(x=>x.Length==a.Max(y=>y.Length))43バイトのベース
Monso

1
@MrLoreそれが私の最初の解決策でしたが、順番が影響を受けないため、同点では最後の解決策を返します。
LiefdeWen





3

K(oK)、9バイト

*x@>#:'x:

オンラインでお試しください!

例:

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

説明

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

ノート:

基本的に5つのステップであるにもかかわらず、これは重要なものとして分類されるため、削除されません(関数として記述されている場合{*x@>#:'x})。


3

Java(OpenJDK 8)、67バイト

私の好きな言語での別の投稿!(読む:私が知っている唯一のもの)。
これは空の配列では機能しませんが、それで問題ありません。

ゴルフ

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

非ゴルフ

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.

オンラインでお試しください!


3

ラケット160バイト 110バイト

オンラインでお試しください! 初めての貢献、アドバイスをお願いします!

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

非ゴルフ

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

フィードバックに基づいて更新されたソリューション


4
コミュニティを代表してPPCGにようこそ!最も長い文字列が最後にあるリストでは、ソリューションが明らかに失敗することに気付きました。ここに例。私はラケットをよく覚えていませんが、可能であれば、アルゴリズムをfoldrベースのアプローチに変更し、長さを最大にして、それを持ち越すことをお勧めします。
コール

あー ご指摘いただきありがとうございます。私はそれをテストしなかったとは信じられません。
ダニエルランバート

define(m a)toλ(a)
fedeを

1
まだ行っていない場合は、ヒントも確認してください!
フェデ


3

スクラッチ 27 17170160

the code picture

これは、と呼ばれる文字列のグローバルな(より正確にはすべてのスプライトに関連付けられた)リストを想定していますmylist。緑色のフラグをクリックすると、最も長い単語が変数に残りますw

これがリンクだと思う

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

このメタごとにカウントします。


stop[allここまで必要ですか?
ggorlen

3

ローダ、30バイト

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

オンラインでお試しください!

説明:

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

代替30バイト:

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

オンラインでお試しください!


私のjq答えを書くと、ドロップenumできること、そして代わりに最小値を[[-#_,_1]]選択できることを実感しました。tio.run/…
Kritixi Lithos

@Cowsquack min文字列をアルファベット順に二次的に比較するため、機能しません(配列は二番目の項目によって二次的に比較されるため)。たとえば、入力["b", "a"]"a"出力として提供されます。私はおそらく追加する必要がありますminby...ロダまたは類似した何かに関数を
fergusq

3

APL- 23 16バイト

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

素晴らしい提案と励ましのすべてに感謝します!

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

使用法:

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

説明:

文字(文字列)の各ベクトルの長さを取得し、インデックスとして最大値を使用します。20分前にAPLを開始したばかりなので、これが馬鹿げた方法だとすみません。

オンラインでお試しください!

(明確にするために編集)


1
PPCGへようこそ!
Steadybox

a←あなた:バイトにカウントされません。
Kritixi Lithos

APLが右から左に評価されることを決して忘れないでください:(⌈/(⍴¨⍵))=> ⌈/⍴¨⍵。また、(...)⌷⍵=> ⍵⌷⍨...1バイト保存する
ザカリー

括弧を除いて、これは実際にはかなり良いようです!
ザカリー



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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.