Tantangannya adalah untuk menulis implementasi terpendek untuk menemukan peningkatan berikutnya terpanjang .
Contoh : Misalkan S adalah urutan 1 5 7 1 8 4 3 5 [panjang S = 8]
- Kami memiliki 1 sub-urutan panjang 0 [akan menganggapnya meningkat]
- 6 sub-urutan panjang 1 {1,5,7,8,4,3} [semuanya dianggap meningkat]
- (7 * 8) / 2 sub-urutan panjang 2 [tetapi kami akan menghapus duplikat], peningkatan sub-seq berwarna hitam pekat.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[perhatikan bahwa kami hanya tertarik pada peningkatan sub-urutan]
[Anda tidak dapat mengubah urutan elemen di dalam urutan, sehingga tidak ada sub-urutan [37] dalam contoh urutan]
- Kami memiliki sub-urutan panjang 4 yang meningkat yaitu 1578, tetapi tidak ada sub-urutan panjang 5, jadi kami mempertimbangkan panjang sub-urutan terlama yang meningkat = 4.
Masukan :
a 1 a 2 ... a N (Urutan)
semua angka adalah bilangan bulat positif kurang dari 10 3
N <= 1000
Keluaran :
Satu bilangan bulat yang menunjukkan panjang sub-urutan terpanjang dari urutan input.
sample input(1)
1 2 4 2 5
sample output(1)
4
sample input(2)
1 5 7 1 8 4 3 5
sample output(2)
4
Kode Anda harus berjalan tepat waktu, silakan uji kode Anda pada kasus ini sebelum mengirimkannya di sini (juga tautannya berisi solusi c ++ 11 290 byte saya)
Anda dapat mengambil input dari file / stdin atau sebagai parameter fungsi dan Anda dapat mencetak output ke file / stdout atau hanya mengembalikan nilai jika Anda menulis fungsi
Papan Skor
- Dennis CJam - 22
- isaacg Pyth - 26
- Howard GolfScript - 35
- bangga haskeller Haskell - 56
- Ray Python 3 - 66
- Ruby histokrat - 67
- DLeh C # - 92
- YosemiteMark Clojure - 94
- faubiguy Python 3 - 113
function f(){...}
) atau fungsi dalam (adil...
)? Jika kita menghitung fungsi luar, apakah fungsi anonim diizinkan?Jawaban:
CJam, 22 byte
Cobalah online.
Contoh
Program mencetak
57
untuk test case ini setelah 0,25 detik.Bagaimana itu bekerja
Saya mengambil ide umum dari jawaban @ Ray .
sumber
Python 3, 66
Perhatikan bahwa semua angka berada dalam kisaran [1, 999], kita dapat menggunakan array
b
untuk mempertahankan panjang urutan terpanjang yang berakhir dengan setiap angka.b[x] = d
berarti bahwa urutan terpanjang berakhir denganx
memiliki panjangd
. Untuk setiap angka dari input, kami memperbarui array menggunakanb[x] = max(b[:x]) + 1
dan kemudian kami menyelesaikan pekerjaan dengan mengambilmax(b)
akhirnya.Kompleksitas waktu adalah
Di)O (mn) , di manam
selalu 1000 dann
merupakan jumlah elemen input.Wow, sepertinya ungolfed sudah :) Anda bisa mengujinya menggunakan stdin / stdout dengan menambahkan baris:
sumber
for x in a: max(b)
terlihat cukup banyak O (n ^ 2).O(1000 n)
dan 1000 adalah konstan. Anda juga bisa menganggapnya sebagaiO(m n)
.O(1)
;-)print
lebih pendek darireturn
.Python - 113
sumber
a+=[i]*(a==[]or i>a[-1]);z=0
dan pencetakanlen(a)
(tanpa tanda kurung) Anda dapat menyimpan 4 karakter.Pyth , 26
293339Solusi Port of @ ray. Lulus tes resmi. Sekarang menggunakan input STDIN yang dipisahkan oleh ruang, bukan panggilan fungsi.
Jalankan sebagai berikut:
Penjelasan:
Waktu tak terbatas:
Pyth , 18
Catatan teknis: Saya melihat ada bug di kompiler Pyth saya saat menulis golf ini.
L
tidak bekerja Itu sebabnya ada komit terbaru ke repositori git di atas.sumber
Clojure, 94 karakter
Menggunakan pendekatan @ Ray untuk memperbarui hasil dalam vektor 1000-item:
Per permintaan, dengan pernyataan cetak (akan mencetak jawaban dan mengembalikan nol). Input harus berupa vektor (g [1 2 3]) atau daftar (g '(1 2 3)):
sumber
Haskell,
585756 karakterIni menggunakan algoritma yang pernah saya lihat di internet, tetapi saya tidak dapat menemukannya. Dibutuhkan waktu yang tidak terlalu lama untuk test case yang diberikan di komputer saya dengan GHCi (mungkin akan lebih cepat jika dikompilasi).
sumber
GolfScript, 35 karakter
Implementasi bekerja sebagai program lengkap dengan input pada STDIN (tanpa nomor panjang yang diberikan). Implementasinya cepat, bahkan untuk input yang lebih lama (coba di sini ).
Contoh:
sumber
$
O (n log n) algoritma adalah O (n ^ 2 log n).Ruby, 67
Ini berjalan dalam 30 detik pada input besar, apakah itu dianggap tepat waktu? : p
Ini adalah rekursi yang brutal, tetapi dengan beberapa memoisasi.
sumber
C #,
17292 karakterTidak ada yang istimewa, tapi saya melakukannya jadi saya pikir saya mungkin juga menyerahkannya.
Terima kasih Armin dan Bob atas peningkatan mereka!
sumber
=>
tidak perlu. Anda juga dapat memindahkani=0
deklarasi di luarfor
loop, keint c=2,m=2,i=0;for(;
. Anda juga dapat menjatuhkan kawat gigi di sekitarfor
tubuh, karena Anda hanya memiliki satu pernyataan di sana.c++;if(c>m)m=c;
bisam=c++>m?m:c;
, dan Anda bisa kembali memasang kawat gigi di sekitarnya.if(i>0)
centang dengan membuatfor
loop mulai dari 1. Anda dapat lebih pendek mempersingkat yangint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
disarankan sebelumnyaint c=2,m=2,i=0;for(;i++<j.Length;)
. Seluruh bagian itu dapat dikonversi menjadiint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(menggunakan terner lain untuk menggantikan yang tersisaif
- aturan praktis adalah terner lebih pendek jikaif
tubuh Anda hanya tugas.m=c>m?m:c
seharusnyam=c>m?c:m
. Dan jika Anda menambahkan saran @ Armin, Anda mendapatkan 92 byte, hampir setengah ukurannya!int a(int[] j){int c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?c:m;}return m;}
J , 19 byte
Cobalah online!
Berjalan di O (n log n) , menggunakan jenis kesabaran yang dimodifikasi karena hanya panjang, bukan urutan aktual, yang diperlukan.
Penjelasan
sumber
Bash + coreutils, 131 byte
Solusi ini gagal mengerikan pada persyaratan yang tepat waktu , dan bahkan tidak terlalu pendek, tapi saya suka bahwa hal semacam ini setidaknya secara teoritis mungkin dalam skrip shell, jadi saya tetap memposting. Ini berjalan dengan kompleksitas waktu yang menginduksi keabadian O (2 ^ n).
Input adalah daftar yang dipisahkan koma, dilewatkan sebagai argumen baris perintah tunggal:
Perluasan Brace digunakan untuk membangun daftar semua kemungkinan berikutnya.
,:},{
, yang menghasilkan string seperti1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Ini adalah ekspansi bash brace yang valid, yang ketikaeval
diedarkan denganecho
menghasilkan daftar yang dipisahkan oleh spasi ini1,5,7,1,8,4,3,5 1,5,7,1,8,4,3,: 1,5,7,1,8,4,:,5 1,5,7,1,8,4,:,: ...
sort -C
menguji peningkatan pesanan, dan jika demikian, gunakanwc -w
untuk mencetak panjang daftarsumber
Stax , 21 byte
Jalankan dan debug itu
Ini memiliki dua kasus uji, salah satunya adalah kasus 1000 elemen. Itu berjalan satu dalam 24 detik di mesin saya. Ia menggunakan pendekatan pemrograman dinamis klasik untuk jenis masalah ini.
sumber
J 34
Perhatikan bahwa saya membaca input standar juga.
Tanpa membaca input standar, dagingnya 26 karakter.
Hanya perhatikan bahwa saya berjalan lambat untuk input besar, oh well.
sumber
C ++ (gcc) , 129 byte
Cobalah online!
sumber
C # (.NET Core) , 155 byte
Menggunakan array untuk menghitung kenaikan terpanjang yang berakhir pada setiap posisi dalam input array (pemrograman dinamis), kemudian mengembalikan nilai terbesar. Misalnya, array yang dihitung untuk input
[1,5,7,1,8,4,3,5]
akan menjadi[1,2,3,1,4,2,2,3]
, dan nilai terbesar4
dikembalikan.Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 38 byte
Cobalah online!
Tentu saja ada Mathematica built-in untuk menemukan urutan yang paling lama dipesan. Namanya sangat panjang: ini merupakan lebih dari setengah solusi, dan saya tidak akan terkejut jika ada orang yang bermain golf dengan solusi ini.
sumber