Daftar bilangan bulat positif dapat divisualisasikan sebagai jajaran gunung terukur di mana setiap entri daftar mewakili ketinggian satu bagian vertikal pegunungan.
Misalnya, daftarnya
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
bisa menjadi jangkauan
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Orang yang kurang puitis mungkin menyebut ini bagan batang, tapi saya ngelantur.)
Pertanyaan dalam tantangan ini adalah: Berapa banyak puncak yang ada di pegunungan dari beberapa daftar yang berubah-ubah? Pada dasarnya, berapa banyak maksimum lokal yang ada dalam daftar?
Puncak didefinisikan sebagai bagian yang berdekatan dari satu atau lebih kolom dari pegunungan yang semuanya tingginya sama, di mana kolom langsung ke kiri dan kanan tingginya lebih rendah.
Secara visual mudah untuk mengetahui bahwa contoh memiliki empat puncak di lokasi yang di-kurung:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Perhatikan bagaimana bagian (3, 3, 3)
dataran tinggi dihitung sebagai puncak karena merupakan kumpulan kolom berdekatan yang tingginya sama, lebih tinggi dari kolom tetangga.
Yang terakhir (3)
dianggap sebagai puncak juga karena, untuk keperluan tantangan ini, kita akan mendefinisikan tetangga kiri kolom paling kiri dan tetangga kanan kolom paling kanan untuk keduanya menjadi tinggi nol.
Ini berarti bahwa daftar dengan hanya satu nilai, misalnya 1, 1, 1
, dapat diartikan sebagai 0, 1, 1, 1, 0
, dan dengan demikian memiliki satu puncak, tidak satupun: 0, (1, 1, 1), 0
.
Satu-satunya daftar dengan nol puncak adalah daftar kosong.
Tantangan
Tulis fungsi atau program yang mengambil daftar bilangan bulat positif sembarang dan mencetak atau mengembalikan jumlah puncak dalam rentang gunung yang sesuai.
Kode terpendek dalam byte menang. Tiebreaker adalah posting sebelumnya.
Uji Kasus
Input List -> Output Peak Count
[empty list] -> 0
1, 1, 1 -> 1
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3 -> 4
1 -> 1
1, 1 -> 1
2, 2, 2, 2, 2 -> 1
90 -> 1
2, 1, 2 -> 2
5, 2, 5, 2, 5 -> 3
2, 5, 2, 5, 2, 5, 2 -> 3
1, 2, 3, 4 -> 1
1, 2, 3, 4, 1, 2 -> 2
1, 3, 5, 3, 1 -> 1
7, 4, 2, 1, 2, 3, 7 -> 2
7, 4, 2, 1, 2, 1, 2, 3, 7 -> 3
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 -> 10
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 3, 3, 1 -> 4
12, 1, 2, 1, 2, 3, 3, 3, 2, 4, 4, 4, 1, 5, 5, 4, 7, 9 -> 6
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 909 -> 3
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 908, 909 -> 4
sumber
Jawaban:
Pyth, 18 byte
Berdasarkan @ PeterTaylor diulang lebih besar dari solusi, tetapi dengan twist.
++ZQZ
: Tambahkan nol di kedua sisi.eMr ... 8
: Hapus pengulangan.u ... 2 ...
: Terapkan dua kali berikut ini:>VGTG
: Memetakan setiap pasangan angka ke apakah mereka dalam urutan menurun._
: Dan terbalik.A 1 dalam output sesuai dengan a
1, 0
pada langkah sebelumnya, yang sesuai dengana < b > c
dalam input karena pembalikan.s
: Sum (dan cetak)sumber
CJam (
32 26 2421 byte)Input yang diharapkan adalah angka yang dipisahkan ruang.
Demo online ; paket uji lengkap (output yang diharapkan adalah a
1
per test case).Terima kasih kepada Martin karena memberi tahu saya bahwa versi CJam saat ini meningkatkan salah satu operator yang digunakan, menghemat 2 karakter; dan untuk penghematan 3-ar lebih lanjut.
Pembedahan
Dua fase: deduplicate, kemudian identifikasi maxima lokal di setiap set tiga.
sumber
JavaScript (ES6),
5451 bytePenjelasan
Mengambil array angka
Uji
Tampilkan cuplikan kode
sumber
Pyth,
2523 bytePenjelasan:
sumber
0q~0]{2ew::-:g0-}2*1-,
untuk 22.Julia, 66
Pad, membedakan:
y=diff([0;x;0])
.Abaikan dataran tinggi:
y=y[y.!=0]
.Menghitung
+
ke-
nol penyeberangan:sum((y[1:end-1].>0)&(y[2:end].<0))
.sumber
MATLAB,
2927 byteFungsi anonim yang menemukan puncak dalam data dan menghitung berapa banyak. 0 didahului dan ditambahkan ke data untuk memastikan puncak di ujung terdeteksi sesuai pertanyaan.
Ini juga akan bekerja dengan Oktaf . Anda dapat mencoba online di sini . Cukup tempel kode di atas ke dalam baris perintah, dan kemudian jalankan dengan
ans([1,2,1,3,4,5,6,1])
(atau input apa pun lainnya).Karena angkanya selalu + ve, kita dapat menganggap mereka lebih besar dari nol, jadi dapat menghemat 2 byte dengan menggunakan
nnz
alih-alihnumel
.sumber
Python 3, 75 byte
Ini adalah codegolf pertama saya jadi mungkin ada beberapa tempat untuk mengurangi itu, terutama
d=((n==p)&d)+(n>p)
bagian. Namun itu bekerja pada semua test casesumber
Mathematica,
42363332 byteTerima kasih kepada Martin Büttner karena menghemat 1 byte.
PeakDetect
lakukan hampir semuanya!Kasus uji:
sumber
CJam,
2726 byteMenggunakan pengkodean run run untuk menghapus duplikat. Setelah itu kami memeriksa setiap triplet jika yang di tengah adalah angka terbesar.
Coba di sini! Lulus kamar uji Peter Taylor .
sumber
MATL , 22 byte
Menggunakan versi bahasa saat ini / kompiler.
Contoh
Penjelasan
sumber
Mathematica,
55393635 byteSekarang bekerja pada semua test case!
sumber
Last/@
->#&@@@
Retina ,
3331 byteTerima kasih kepada Neil untuk menghemat 2 byte.
Cobalah online!
Mengambil input sebagai daftar yang dipisahkan koma, unary .
sumber
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
tampaknya menghemat 2 byte?JavaScript ES6,
9694 bytePrinsip: runtuh dataran tinggi menjadi puncak tunggal, temukan pilihan yang didefinisikan lebih tinggi daripada elemen berikutnya dan sebelumnya.
Mengambil input sebagai array.
Demo:
sumber
ES6,
5048 byteDisimpan 2 byte berkat @ user81655.
Tidak Disatukan:
sumber
.map()|
sebelumnya.)MATL, 23
Karena kita perlu menggunakan esolang berbasis stack agar kompetitif, saya mengimplementasikan kembali solusi Julia saya di MATL.
Tekan
0
, masukan0
,, gabungkan dua kali.0i0hh
=>x = [0, input(''), 0]
Membedakan.
d
=>x = diff(x)
Gandakan
t
, konversi satu ke boolean dan gunakan untuk mengindeks yang lain.tg)
=>x=x(x!=0)
Gandakan lagi.
t
Pertama:
[1,G])0>
=>y1 = x(1:end-1)>0
Bertukar.
w
Kedua:
[2,0])0<
=>y2 = x(2:end)<0
Logika dan, hitung nilai kebenarannya.
*s
=>sum(y1 & y2)
sumber
[1,G]
->5L
menghemat 3 byte.[2,0]
->6L
menghemat 3 byteand
(&
) dari MATL (dan sama untukor
). Itu selalu bisa digantikan oleh*o
, dan sering dengan adil*
, seperti dalam kasus ini. Apa yang kamu pikirkan? Dengan begitu karakter&
dan|
bisa digunakan untuk fungsi lain di masa depan.Japt, 19 byte
Itu lebih mudah dari yang saya kira, tetapi awalnya sedikit boros karena bug.
Cobalah online!
Bagaimana itu bekerja
Versi yang tidak bersaing, 15 byte
Sebelumnya hari ini, saya menambahkan
è
fungsi, yang sepertif
tetapi mengembalikan jumlah pertandingan daripada pertandingan itu sendiri. Saya juga memperbaiki bug di manaArray.u
akan mengembalikan panjang array daripada array itu sendiri.Cobalah online!
sumber
05AB1E , 9 byte
Cobalah online!
Penjelasan:
sumber
Jelly , 27 byte
Cobalah online!
sumber
GolfScript, 35
Tes online
Pada dasarnya menghapus duplikat, menambahkan 0 untuk kedua ujungnya, dan memeriksa berapa banyak tiga kali lipat memiliki maksimum di tengah.
sumber
Java 8, 141 byte
Mungkin bisa bermain golf dengan menggunakan pendekatan yang berbeda, atau array sebagai input, bukan daftar.
Penjelasan:
Coba di sini.
sumber