Tulis fungsi atau program yang memuat daftar dan menghasilkan daftar ekstrem lokal.
Dalam daftar, [x_0, x_1, x_2...]
ekstrim lokal adalah x_i
sedemikian rupa sehingga x_(i-1) < x_i
dan x_(i+1) < x_i
atau x_(i-1) > x_i
dan x_(i+1) > x_i
. Perhatikan bahwa elemen pertama dan terakhir dari daftar tidak pernah bisa menjadi ekstrem lokal.
Jadi untuk beberapa contoh
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
Ini kode golf sehingga kode terpendek menang!
1 2 2 1
seharusnya tidak2
dianggap sebagai ekstrem juga? - Saya tahu, ini akan membuat solusinya jauh lebih sulit ...Jawaban:
Mathematica
66 5851Solusi Saat Ini
Dipersingkat berkat sumbangan dari Calle.
Partition[#,3,1]
menemukan tiga kali lipat.(a-b) (b-c)<0
adalah benar jika dan hanya jikab
di bawaha
,c
atau di atasa
,c
. dan melihat mengambil tanda-tanda perbedaan. Ekstrim lokal akan mengembalikan salah satu{-1,1}
atau{1,-1}
.Contohnya
Solusi Sebelumnya
Ini terlihat contoh semua tiga kali lipat (dihasilkan oleh
Partition
) dan menentukan apakah elemen tengah kurang dari kedua ekstrem atau lebih besar dari ekstrem.Solusi Pertama
Ini menemukan tiga kali lipat, dan melihat mengambil tanda-tanda perbedaan. Ekstrim lokal akan mengembalikan salah satu
{-1,1}
atau{1,-1}
.Contoh
Analisis :
%
merujuk pada hasil dari baris sebelumnya masing-masing.Sort@Sign@Differences@x=={-1,1}
mengidentifikasi tiga kali lipat dari {{9, 10, 7}, {10, 7, 6}, {7, 6, 9}, {6, 9, 0}, {9, 0, 3}, {0, 3, 3}, {3, 3, 1}, {3, 1, 10}} sedemikian rupa sehingga tanda (-, 0, +) dari perbedaan terdiri dari a-1
dan a1
. Dalam hal ini adalah:Untuk masing-masing kasus ini, x,
x[[2]]
mengacu pada istilah kedua. Itu semua akan menjadi maxima dan minima lokal.sumber
J - 19 char
Tidak bisa menahannya;)
Penjelasan berikut:
2-/\]
- Atas setiap pasangan elemen dalam argumen (masing-masing infix panjang 2-item), ambil perbedaannya.2*/\
- Sekarang untuk setiap pasang daftar baru, ambil produk.0>
- Uji apakah masing-masing hasil kurang dari 0. Ini hanya terjadi jika multiplikasi memiliki tanda bolak-balik, yaitu tidak terjadi jika mereka memiliki tanda yang sama atau salah satu dari nol.0,
- Nyatakan bahwa elemen pertama bukanlah elemen ekstrem.}:
- Potong elemen terakhir, karena itu tidak mungkin menjadi ekstrim juga.#~
- Gunakan nilai sebenarnya di sisi kanan untuk memilih item dari daftar di sisi kiri.Pemakaian:
sumber
Javascript -
6245 KarakterEdit
sumber
Ruby,
8370605549 karakterMencetak semua ekstrem lokal ke STDOUT.
Menggunakan<=>
operator "pesawat ruang angkasa", yang sangat saya sukai. (Mengembalikan 1 jika hal pertama lebih besar dari yang kedua, -1 jika lebih kecil, dan 0 jika sama. Karena itu, jika mereka menambah -2 atau 2, itu berarti tengah adalah ekstrim.)Tidak lagi, seperti yang ditunjukkan oleh @daniero bahwa cara "jelas" sebenarnya lebih pendek!Berubah lagi! Sekarang menggunakan algoritma luar biasa yang ditemukan dalam jawaban MT0 (+1 kepadanya!).
Juga, saya suka
each_cons
yang memilih setiapn
grup elemen berurutan dalam sebuah array. Dan trailingif
juga menarik.Secara keseluruhan, saya suka betapa elegan tampilannya.
Beberapa contoh dijalankan:
sumber
f=->a{a.each_cons(3){|x,y,z|p y if((x<=>y)+(z<=>y)).abs==2}}
x>y&&y<z||x<y&&y>z
(bahkan operator ruang angkasa sangat cantik);)!((x..z)===y)
bahkan lebih pendek meskipun tidak sepintarx < z
.C ++ - 208 karakter
Solusi terlama lagi:
Untuk menggunakan, masukkan bilangan bulat Anda, maka karakter apa pun yang akan merusak aliran input - karakter non-angka apa pun harus berfungsi.
Memasukkan:
0 1 0 x
Keluaran:
1
sumber
deque
alih - alih avector
untuk mendapatkan 2 karakter.i
danj
, Anda dapat mendeklarasikanint i;
tepat setelah pengumpulan dan menggunakannya adalah dua loop, bukan mendeklarasikan dua variabel.i++
dalam for for loop Anda dan memulai kondisi Anda denganif(v[++i]>[i-1]...
tujuan untuk mendapatkan satu karakter lagi.Matlab - 45 byte
sumber
Python 2.7 - 73 byte
Tidak terlalu mengesankan (Lihat setiap elemen daftar kecuali yang pertama dan terakhir, lihat apakah itu lebih besar atau lebih kecil dari tetangganya).
Saya kebanyakan hanya mempostingnya karena tidak semua orang tahu Anda bisa melakukannyax<y>z
dan membuatnya berfungsi. Saya pikir itu agak rapi.Ya,
x<y>z
adalah fitur keren dari python, tetapi sebenarnya tidak optimal dalam hal ini. Berkat VX untuk trik multiplikasi, itu tidak terjadi pada saya sama sekali. Wrzlprmft mengingatkan saya bahwa mendeklarasikan fungsi anonim lebih sedikit penekanan daripadadef x(y):
.sumber
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
akan mengurangi kode sebanyak 11 karakter ...def e(l):\n
jumlah karakter yang samae=lambda l:
, tetapi saya lupa bahwa Anda tidak perlu menggunakanreturn
kata kunci. Terima kasih!(l[i]-l[i-1])*(l[i]-l[i+1])
adalah1
jikal[i]
adalah ekstrim lokal dan0
jika tidak, saya tidak perlu menggunakan>0
. Saya bisa membiarkan python menafsirkannya sebagai bool. :)\n
sama sekali dalam deklarasi! Itu akan menyelamatkan dua karakter, tetapi dimasukkannyareturn
masih membuatnya tidak layak.Haskell 50
sumber
x>p&&x>n
memiliki satu karakter lebih sedikit darix>max p n
:-),
tidak diperlukan juga.x>p&&x>n
menjadi(x>p)==(x>n)
minimum lokal juga, tambahkan 4 karakter lagi.Jelly , 8 byte
Cobalah online!
Penjelasan
Suatu elemen hanya merupakan ekstrim lokal jika perbedaannya dengan tetangga kirinya memiliki tanda yang berlawanan dengan perbedaannya dengan tetangga kanannya, yaitu tanda-tanda perbedaannya berbeda 2 atau -2. Jelly memiliki sejumlah primitif yang berguna untuk berurusan dengan "menemukan elemen dengan properti tertentu" (khususnya, kita dapat menemukan elemen dengan properti tertentu dalam satu daftar dan menggunakannya untuk mengekstrak elemen dari daftar yang berbeda), artinya kita dapat menerjemahkan kembali ke daftar asli kurang lebih secara langsung (kita hanya perlu mengimbangi dengan 1 karena elemen pertama dan terakhir dari daftar asli hilang dalam pengambilan perbedaan).
sumber
Python dengan Numpy -
81 7467 byte (6154 tanpaimport
garis)Input harus berupa array Numpy.
sumber
C, 83
sumber
awk - 32 karakter
Tidak ada harapan mengalahkan bahasa seperti J atau APL pada singkatnya, tapi saya pikir saya akan tetap memakai topiku. Penjelasan:
a
,b
, danc
terusx_i
,x_(i-1)
danx_(i-2)
b-c
dana-b
perkiraan turunannya sebelum dan sesudahx_(i-1)
x_(i-1)
, karenanya ekstrem lokal, jadi cetaksumber
Brachylog , 17 byte
Cobalah online!
Mengambil input melalui variabel input dan menghasilkan output melalui variabel output.
Jika menjalankan nilai dapat dijamin tidak ada,
s₃{{⌉|⌋}.&bh}
akan menghemat empat byte.sumber
Perl 5
-p
, 49 byteCobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
4342 byteCobalah online!
Saya kira
Nothing
terlalu panjang ...sumber
05AB1E ,
1110 byteCobalah secara online atau verifikasi beberapa kasus uji lagi .
Penjelasan:
sumber
PHP,
116 114113Contoh penggunaan:
sumber
Haskell, 70C
Versi golf
Versi tidak disatukan
sumber
Javascript: 102 karakter
sumber
APL, 19 byte
Saya mengonversi versi 20 char J ke APL. Tapi saya menambahkan nol ke awal dan akhir bukannya menghapus digit pertama dan terakhir. Kalau tidak, ia berfungsi seperti versi J.
⍵
- parameter formal omega. Ini adalah input ke fungsi.sumber
{x@1+&0>2_*':-':0 0,x}
. 6 dari karakter ini (2_
dan0 0,
) dihabiskan untuk melindungi dari kesalahan panjang jika argumen lebih pendek dari dua item, jadi jika bukan karena masalah itu akan menjadi 16 ... Aksi juga sedikit berbeda - kita harus mengubah daftar boolean ke dalam daftar indeks dengan1+&
dan menggunakannya untuk mengindeksx
lagi - tetapi lebih pendek dan juga hal yang sangat K-ish untuk dilakukan.Python 2 , 59 byte
Cobalah online!
Fungsi ini sebagian besar menghindari bisnis pengindeksan yang mahal, dengan mengambil elemen daftar sebagai argumen, alih-alih daftar itu sendiri. Meskipun ada lebih dari satu elemen yang tersisa dalam daftar, kami secara rekursif membangun daftar, memeriksa maksimum pada setiap langkah.
sumber