Temukan kata terpanjang dalam sebuah array


24

Tantangan Anda adalah mengambil array string dan menghasilkan string terpanjang dalam array. Sehingga untuk

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

hasilnya akan biggest.

Jika dua elemen array memiliki panjang yang sama, Anda harus memilih salah satu yang muncul pertama kali dalam array. Itu berarti jika array terlihat seperti ini:

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

outputnya one, tetapi jika arraynya terlihat seperti ini:

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

outputnya adalah two.


Karena ini adalah , kode terpendek dalam byte akan menang.


3
2 Catatan: 1Ini berat berkecil hati jika pertanyaannya diubah dan membatalkan jawaban yang ada, dan 2yang Sandbox ada untuk persis alasan (pastikan tantangan baik sebelum posting)
user202729

4
Karena saya tidak berpikir ada orang lain yang menyebutkannya - Hai, dan selamat datang di PPCG!
AdmBorkBork

1
Tidak, Anda tidak perlu menangani case di mana array kosong. Tetapi jika Anda mau, Anda bisa.
Doggo

4
2 jam? Itu jauh, jauh terlalu cepat untuk menerima jawaban.
Shaggy

6
Biasanya Anda menunggu seminggu
Christopher

Jawaban:


31

Imperio Tampio , 168 byte

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 online

Tidak Disatukan:

Daftar untuk alkali di 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 online

Satu-satunya peluang bermain golf ini adalah untuk menggantikan pisin alkio(yang berarti "elemen terpanjang") dengan x.

Terjemahan:

Item terpanjang dalam daftar adalah, tergantung pada apakah panjang item pertama lebih besar atau sama dengan panjang setiap elemen dalam daftar, baik

  • item pertama dalam daftar, atau
  • item terpanjang di bagian belakang daftar.

21
Apakah ini ... Apakah ini ... Bagaimana Anda ... Apa?
auhmaan

3
Google Translate dari Finlandia: Daftar x bergantung pada apakah panjang elemen pertama lebih besar atau sama dengan panjang setiap elemen, baik item pertama atau ekor x.
Adám

2
@ Adám dulu saya pikir APL sulit dibaca. Rupanya yang perlu Anda kalahkan adalah memindahkan gamefield ke bahasa di mana bahasa Inggris adalah komoditas langka.
Uriel

3
Siapa yang butuh COBOL, AppleScript atau Inform 7? Siapa yang butuh Arnold Chef atau Shakespeare? Anda memiliki Imperio Tampio! Oh, monster spageti terbang saya, Bahasa Finlandia dari semua bahasa? Saya tidak belajar itu dalam waktu dekat ...
fede s.

1
@ Feder. Anda bisa mengatakan, "Olkoon suomalainen suudelma uusi suudelma." (Biarkan ciuman Finlandia menjadi ciuman baru, itu menciptakan objek ciuman baru)
fergusq

20

Python , 23 byte

lambda a:max(a,key=len)

Cobalah online!


1
Maaf karena saya tidak mengonversi ini dengan benar.
Doggo

1
Saya memperbarui potongan kode, tetapi seperti yang tertulis, itu sudah mencapai fungsi ini.
Neil

1
Ini juga akan bekerja tidak berubah dalam Python 3.
anonim memilih

17

Haskell , 35 byte

-3 byte terima kasih kepada Zgarb.

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

Cobalah online!

Saya suka kode ini. Anda tahu mengapa? Karena Haskell mendukung solusi yang jauh lebih elegan dengan fungsi-fungsi dari perpustakaan acak.

maximumBy(compare`on`length).reverse

Itu bisa dibaca! Kecuali, itu tidak valid.

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

Jika bukan karena impor, ini akan menjadi pengiriman yang sempurna untuk mendapatkan semua upvotes. : P

(Juga, ini menggunakan satu ujung golf dan menggunakan lipatan.)


2
Tanpa persyaratan tambahan "kejadian-pertama-dalam-kasus", keindahan ini akan berfungsi: snd.maximum.map((,)=<<(0<$)) Cobalah secara online! .
Laikoni

1
Hanya untuk referensi: ada built-in 29 byte yang membosankan import Data.Lists;argmax(0<$).
nimi

1
Woah, bagaimana lbukan bagian dari fold? Bagaimana cara membedakan antara itu dan fungsi bernama foldl?
12Me21

1
@ 12Me21 Ini adalah bagian dari nama fungsi foldl1. Saya pikir bagian dari penjelasan itu mungkin membingungkan, maaf ...
totallyhuman

1
35 byte dengan fungsi bukan lambda. Menariknya, Anda harus mengganti 0dengan aatau sesuatu yang lain, jika tidak GHC mengeluh tentang tipe numerik yang ambigu.
Zgarb


8

UNGGUL, 36 42 byte

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

Dimasukkan sebagai rumus array (ctrl-shift-enter). Array input harus dimasukkan dalam kolom A.

Rumus mengembalikan pertandingan pertama dengan panjang maksimum.

Bergantung pada pengaturan wilayah Anda, gantikan ,dengan ;; panjang kode tetap tidak berubah. Dari 16 bahasa yang tercantum di sini , nama fungsi bahasa Inggris adalah yang terpendek untuk rumus ini.

Penjelasan:

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

Untuk apa yang ,disebut terakhir? Formula masih berfungsi tanpa itu
Anastasiya-Romanova 秀

Final ,adalah parameter untuk MATCH yang mengembalikan kecocokan tepat pertama, seperti yang dipersyaratkan oleh pertanyaan (direvisi). Jika ditinggalkan, maka MATCH mengharapkan array dalam urutan menaik, dan mengembalikan kecocokan terakhir alih-alih yang pertama jika ada beberapa elemen dengan panjang yang sama.
pbeentje

Yakin? Saya sudah membandingkan kedua formula dan keduanya datang dengan hasil yang sama persis
Anastasiya-Romanova 秀

Apakah Anda menggunakan array input yang memiliki dua string (berbeda) dengan panjang yang sama? Meninggalkan koma (titik koma) memberi saya string terakhir dengan panjang maksimum, seperti yang diharapkan ... (Excel 2016, 64-bit)
pbeentje

Sayangnya komunitas telah memutuskan bahwa menggunakan rentang bernama dengan cara ini tidak valid, jadi saya sarankan untuk kasus khusus ini Anda beralih menggunakan A:Adan menjadikannya array yang formal dengan {...}, jika tidak, pos yang hebat!
Taylor Scott

7

APL (Dyalog Unicode) , 9 byte SBCS

⊢⊃⍨∘⊃∘⍒≢¨

Cobalah online!

 dari argumen,

⊃⍨ pilih elemen dengan indeks yang merupakan

 pertama dari

 indeks dalam urutan menurun dari

≢¨ panjang masing-masing


7

Prolog (SWI) , 98 92 72 69 byte

Predikat tingkat atas adalah *.

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

Cobalah online!

Penjelasan

Baris pertama mendefinisikan predikat diad /untuk menjadi kependekan atom_length/2yang benar jika panjang argumen pertama adalah argumen kedua. Ini menghemat 3 byte dari penggunaan atom_lengthdua kali.

Predikat utama kami didefinisikan sebagai diadik di *mana argumen pertama adalah daftar dan argumen kedua adalah elemen terpanjang dari daftar itu.

Baris kedua adalah kasus dasar kami yang menyatakan bahwa elemen terpanjang dari daftar satu elemen adalah elemen itu.

Baris ketiga menyatakan bahwa untuk daftar dengan setidaknya 2 elemen, elemen terpanjang adalah:

Jika panjang elemen kedua lebih panjang dari elemen pertama, elemen terpanjang ada dalam daftar tanpa elemen pertama.

Kalau tidak, elemen terpanjang ada dalam daftar tanpa elemen kedua.


Saya tertarik melihat penjelasan tentang cara kerjanya
Kritixi Lithos

@Cowsquack: Saya telah menambahkan penjelasan singkat.
Emigna

7

Pyth , 4 byte

h.Ml

Suite uji.

Penjelasan
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 bagus Anda mengalahkan jawaban Pyth dengan 6 byte bagus.
Doggo

elD_dan ho_lmencapai panjang yang sama.
isaacg

1
@ hakr14 Terima kasih banyak untuk hasil editnya!
Tn. Xcoder

6

PowerShell , 24 byte

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

Cobalah online!

Dibutuhkan input $args[0], pipa yang Sort-Objectdidasarkan pada ength ldalam -durutan pengawalan. Kemudian ambil yang [0]satunya. Karena sort stabil, ini mengambil elemen pertama dalam kasus dasi.


1
Nama baik wuff wuff: D
Doggo

6

Oktaf , 33 byte

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

Input adalah array sel string.

Cobalah online!

Penjelasan

cellfun(@nnz,x)menerapkan nnzfungsi (jumlah nonzeros) untuk setiap string dalam larik input x. Untuk string ASCII, nnzsetara dengan numel(jumlah elemen), tetapi lebih pendek. Hasilnya adalah array numerik dengan panjang string.

Kemudian, [~,]=max(...)berikan indeks maksimum pertama dalam array panjang string. Hasilnya digunakan sebagai kurung kurawal ke dalam xuntuk mendapatkan string yang sesuai.


6

JavaScript (Node.js) , 38 byte

Cobalah online!

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

@ Doggo Itu mengembalikan elemen pertama dalam kasus seri.
LiefdeWen

1
Mengembalikan boolean alih-alih nomor yang ditandatangani di sort () callback tidak berfungsi di semua mesin JS (mis. Itu tidak bekerja di Edge). Pendekatan lain akan seperti itu , yang lebih pendek 1 byte. Namun, tidak ada jaminan bahwa item pertama akan dipilih secara konsisten di seluruh browser jika ada seri.
Arnauld

tetapi jika ia memilihnya secara konsisten di node.js pada TIO tidak cukup baik? \
LiefdeWen

1
Anda harus menggunakan -alih-alih <dalam fungsi komparator.
kamoroso94

1
@ LiefdeWen Ya, tapi itu mengatasi masalah dalam komentar.
Sebastian Simon

5

J , 19, 11, 10 8 byte

0{>\:#@>

Cobalah online!

Terima kasih kepada streetster untuk petunjuknya!

-1 byte terima kasih kepada FrownyFrog!

-2 byte terima kasih kepada Conor O'Brien

Bagaimana itu bekerja:

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

Cobalah online!


1
Ini adalah pendekatan awal saya di K, tetapi kemudian saya menyadari bahwa saya bisa mengurutkan daftar berdasarkan hitungan, turun, dan mengambil item pertama ... Bisakah Anda melakukan hal yang sama dalam J?
streetster

@streetster - Terima kasih! Saya baru menyadari itu. Saya akan mencobanya sekarang, itu bisa jauh lebih pendek.
Galen Ivanov

1
Tidak ada tanda kurung di luar titik ini:0{::]\:#@>
FrownyFrog

Apakah {.@alih-alih 0{::bekerja?
Kritixi Lithos

1
8 byte:0{>\:#@>
Conor O'Brien

4

C #, 43 + 18 = 61 byte

Cobalah online!

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

@ Doggo Itu mengembalikan elemen pertama dalam kasus seri.
LiefdeWen

@LiefdeWen OrderBy stabil jadi ini sebenarnya akan mengembalikan elemen terakhir jika terjadi seri. Contoh: tio.run/##TY7BCsIwDIbvfYqwUwvaF5jbQcHTRMGDB/…
Grzegorz Puławski

1
@ GrzegorzPuławski Oh, begitu, sudah diperbaiki.
LiefdeWen

Saya punya beberapa yang mungkin seseorang dapat membantu mempersingkat a=>a.Aggregate((x,y)=>y.Length>x.Length?y:x)basis 44 byte, basis a=>a.First(x=>x.Length==a.Max(y=>y.Length))43 byte
Monso

1
@ MrLore Itu adalah solusi pertama saya tetapi kemudian dalam dasi itu mengembalikan yang terakhir, karena pesanan tidak terpengaruh.
LiefdeWen


4

PHP, 72 byte

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

4
Halo, dan selamat datang di PPCG! :)
DJMcMayhem

4

Japt -h, 5 3 byte

ÔñÊ

Cobalah

Membalik, mengurutkan berdasarkan panjang dan menampilkan elemen terakhir.



3

K (oK) , 9 byte

*x@>#:'x:

Cobalah online!

Contoh:

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

Penjelasan

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

Catatan:

Dihapus karena ini digolongkan sebagai non-sepele, meskipun pada dasarnya 5 langkah (akan jika ditulis sebagai fungsi {*x@>#:'x}).


3

Java (OpenJDK 8) , 67 byte

Kiriman lain dalam bahasa favorit saya! (baca: satu-satunya yang saya tahu).
Ini tidak berfungsi dengan array kosong, tapi tidak apa-apa.

Golf

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

Tidak disatukan

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.

Cobalah online!


3

Racket , 160 byte, 110 byte

Cobalah online! Pertama kali berkontribusi, saran sangat dihargai!

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

Tidak disatukan

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

Solusi yang diperbarui berdasarkan umpan balik


4
Saya ingin mengucapkan selamat datang ke PPCG atas nama komunitas! Saya perhatikan bahwa solusi Anda ternyata gagal untuk daftar di mana string terpanjang ada di akhir. Contoh di sini . Saya tidak ingat Racket dengan baik, tetapi jika Anda bisa, saya akan merekomendasikan mengubah algoritme Anda menjadi foldrpendekatan berbasis, mengambil panjang max dan membawanya melintasi.
cole

Oh ya Terima kasih telah menunjukkannya. Saya tidak percaya bahwa saya tidak mengujinya.
Daniel Lambert

Anda juga dapat mengubah define(m a)toλ(a)
fede.

1
Periksa juga tipsnya jika belum!
fede s.


3

Gores 27 17 170 160

gambar kode

Ia mengharapkan daftar string global (terlampir pada semua sprite, lebih tepatnya) yang disebut mylist . Setelah mengklik tanda hijau, kata terpanjang akan tersisa di variabel w.

Saya pikir ini tautannya

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

Menghitung sesuai meta ini.


Apakah perlu ke stop[allsini?
ggorlen

3

Rosda , 30 byte

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

Cobalah online!

Penjelasan:

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

Alternatif 30 byte:

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

Cobalah online!


Menulis jawaban jq saya membuat saya sadar bahwa enumbisa dijatuhkan, dan alih-alih minimum dari [[-#_,_1]]dapat dipilih, tio.run/…
Kritixi Lithos

@ Cowsquack Itu tidak berfungsi karena dengan demikian minakan membandingkan string secara abjad (karena array dibandingkan dengan item kedua). Misalnya input ["b", "a"]akan berikan "a"sebagai output. Saya mungkin harus menambahkan minbyfungsi ke Rda atau yang serupa ...
fergusq

3

APL - 23 16 byte

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

Terima kasih kepada semua orang untuk semua saran dan dorongan besar Anda!

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

Pemakaian:

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

Penjelasan:

mendapatkan panjang setiap vektor karakter (string) kemudian menggunakan maksimum sebagai indeks. Saya baru saja memulai APL 20 mnt yang lalu jadi saya minta maaf jika ini cara bodoh untuk melakukannya.

Cobalah secara Online!

(diedit untuk kejelasan)


1
Selamat datang di PPCG!
Steadybox

Tidak a←dihitung terhadap bytecount Anda.
Kritixi Lithos

Jangan pernah lupa APL dievaluasi dari kanan ke kiri: (⌈/(⍴¨⍵))=> ⌈/⍴¨⍵. Juga, (...)⌷⍵=> ⍵⌷⍨...untuk menyimpan satu byte
Zacharý

Selain tanda kurung, ini sebenarnya tampak cukup bagus!
Zacharý

2

ML Standar (MLton) , 55 byte

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

Cobalah online! Contoh penggunaan: & ["abc","de","fgh"]hasil "abc".

Tidak Disatukan:

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

Cobalah online!



2

Funky , 38 byte

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

Dijelaskan

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.

Cobalah online!



2

SNOBOL4 (CSNOBOL4) , 63 57 byte

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

Cobalah online!

Input ada di stdin dan output di stdout.

Secara kasar diterjemahkan ke pseudocode berikut:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.