Apakah ada benjolan?

39

Diberikan daftar bilangan bulat positif menentukan apakah ada elemen yang lebih besar dari dua tetangganya atau kurang dari dua tetangganya ("benjolan"). Untuk lebih jelasnya, benjolan tidak akan pernah menjadi item pertama atau terakhir dari daftar karena mereka hanya memiliki satu tetangga.

Program Anda harus menampilkan salah satu dari dua nilai yang konsisten, masing-masing sesuai dengan daftar tanpa benjolan atau daftar dengan benjolan. Nilai-nilainya tidak penting, Anda dapat memilihnya sendiri.

Ini adalah sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.

Uji kasus

[] -> False
[1] -> False
[1,2] -> False
[1,2,1] -> True
[1,2,2] -> False
[1,2,3] -> False
[1,2,2,1] -> False
[1,2,2,3] -> False
[1,2,1,2] -> True
[1,3,2] -> True
[3,1,2] -> True
[2,2,2] -> False
Wisaya Gandum
sumber
5
Permintaan Case Test: Angka selain 0-1-2-3, juga negatif diizinkan / tidak diizinkan?
Magic Octopus Mm
Kasing uji yang disarankan: [1,3,3](memastikan bahwa jawaban menggunakan algoritme Dennis mengambil tanda kenaikan daripada hanya menggunakan penambahan itu sendiri)
ETHproduksi
1
@ ETHproductions Bukankah itu sudah terlindungi [1,2,2]? Atau apakah saya melewatkan sesuatu?
Nic Hartley
2
@NicHartley, delta [1,2,2]sama dengan tanda-tanda delta itu tetapi tidak demikian halnya [1,3,3].
Shaggy

Jawaban:

15

Jelly , 5 byte

IṠIỊẠ

Mengembalikan 0 jika ada masalah, 1 jika tidak.

Cobalah online!

Bagaimana itu bekerja

IṠIỊẠ  Main link. Argument: A (integer array)

I      Increments; take all forward differences of A.
 Ṡ     Take the signs.
       The signs indicate whether the array is increasing (1), decreasing (-1), or
       constant at the corresponding point. A 1 followed by a -1 indicates a local
       maximum, a -1 followed by a 1 a local minimum.
  I    Increments; take the forward differences again.
       Note that 1 - (-1) = 2 and (-1) - 1 = -2. All other seven combinations of
       signs map to -1, 0, or 1.
   Ị   Insignificant; map each difference d to (-1 ≤ d ≤ 1).
    Ạ  All; return 1 if all differences are insignificant, 0 if not.
Dennis
sumber
1
Apa itu "Penambahan?". Apa yang ditambahkan dan apa fungsinya?
Wheat Wizard
1
@WheatWizard Saya pikir ini setara dengan perintah delta (¥) 05AB1E: sebuah array [n0, n1, n2, n3] di-pop dan array [n1-n0, n2-n1, n3-n2] ditekan.
Kaldo
10

JavaScript (ES6), 38 byte

Mengembalikan boolean.

a=>a.some(x=n=>x*(x=a<n|-(a>(a=n)))<0)

Uji kasus

Bagaimana?

Kami menggunakan a untuk menyimpan nilai n sebelumnya . Kami menetapkan x ke 1 jika a <n , -1 jika a> n atau 0 jika a = n . Dan kami menguji apakah old_x * x <0 , yang hanya mungkin jika ( old_x = 1 dan x = -1 ) atau ( old_x = -1 dan x = 1 ).

Karena x diinisialisasi ke fungsi panggilan balik anonim dari beberapa () , maka dipaksakan untuk NaN selama iterasi pertama, yang membuat tes salah.

Arnauld
sumber
Ini akan melempar dalam mode ketat.
Aluan Haddad
2
@ AluanHaddad Yah, 99% kode golf JS akan melempar dalam mode ketat hanya karena variabel yang tidak dideklarasikan. PPCG dan codereview tidak tercampur dengan baik. : P
Arnauld
Itu adil, saya tidak terlalu suka golf.
Aluan Haddad
4
Lalu mengapa mengomentari itu lol
Mark C.
8

Haskell , 42 byte

any(<0).f(*).f(-)
f a b=zipWith a b$tail b

Cobalah online!

Penjelasan

Pertama kita memiliki fungsi fyang mengambil fungsi biner dan daftar dan menerapkan fungsi biner untuk setiap pasangan yang berdekatan dalam daftar.

Kemudian fungsi utama kami berlaku f(-)untuk daftar input. Ini menghitung daftar perbedaan. Kami kemudian menerapkan f(*)ke daftar untuk mengalikan setiap pasangan yang berdekatan. Terakhir kami bertanya apakah ada pasangan yang kurang dari nol.

Angka dalam daftar akhir hanya bisa negatif jika itu adalah produk dari angka negatif dan positif dari daftar perbedaan. Dengan demikian untuk menghasilkan entri negatif (dan kemudian mengembalikan true) daftar asli harus beralih dari meningkat menjadi menurun atau sebaliknya, yaitu harus memiliki benjolan.

Wisaya Gandum
sumber
Cara yang bagus untuk berurusan dengan daftar kosong!
Laikoni
5

Paket Oktaf dengan Gambar, 34 32 byte

2 byte disimpan berkat @StewieGriffin !

@(x)0||prod(im2col(diff(x),2))<0

Cobalah online!

Penjelasan

Hitung perbedaan berturut-turut, susun dalam blok geser panjang 2, dapatkan produk dari masing-masing blok, dan uji apakah ada produk yang negatif.

Luis Mendo
sumber
0||prod(...)menghemat 2 byte. Anda juga bisa melewati seluruh anybagian, dan menggunakan definisi kebenaran / falsy default untuk menyimpan 5 byte .
Stewie Griffin
Sial, menghemat 5 byte akan membuat solusi Anda lebih pendek dari milik saya :( Penggunaan paket gambar yang bagus. Saya tidak tahu itu ada di TIO.
Stewie Griffin
1
@StewieGriffin Karena tantangan membutuhkan dua nilai yang konsisten saya tidak bisa menghapus any. Terima kasih atas 0||idenya!
Luis Mendo
4

R, 48 byte

function(x)any(apply(embed(diff(x),2),1,prod)<0)

Cobalah online!

Cara kerjanya langkah demi langkah menggunakan c (1,4,1,4) sebagai contoh:

> x=c(1,4,1,4)
> diff(x)
[1]  3 -3  3
> embed(diff(x),2)
     [,1] [,2]
[1,]   -3    3
[2,]    3   -3
> apply(embed(diff(x),2),1,prod)
[1] -9 -9
> any(apply(embed(diff(x),2),1,prod)<0)
[1] TRUE

Sebagai bonus, berikut adalah solusi dengan paket dan konsep yang sama menggunakan zoo:

function(x)any(zoo::rollapply(diff(x),2,prod)<0)
plannapus
sumber
1
rapi! Catatan untuk diri sendiri: ingat embedada. Sayang sekali rowProdsdan colProdstidak ada sebagai alias di R.
Giuseppe
1
@ Giuseppe karena putus asa saya benar-benar memeriksa apakah mereka ada :) tapi memang adil rowSumsdan rowMeans...
plannapus
1
baik, setidaknya melihat melalui dokumen, .colSumsakan membentuk kembali input ke dalam matriks berdasarkan input tambahan yang mungkin memiliki aplikasi golf di suatu tempat .... sekarang saya hanya perlu menemukan satu!
Giuseppe
@Guiseppe: Lihat fungsi-fungsi dalam matrixStatspaket.
Michael M
@MichaelM Sayangnya karena panjang nama paket itu tidak membuatnya kompetitif (57 byte:) function(x)any(matrixStats::colProds(embed(diff(x),2)))<0. Tapi untuk apa pun selain kode golf, paket ini memang merupakan harta karun.
plannapus
4

Haskell , 33 byte

f(p:r@(c:n:_))=(c-p)*(c-n)>0||f r

Cobalah online!

True jika ada masalah, kesalahan jika tidak ada.

benar-benar manusiawi
sumber
l`zip3`tail l$drop 2lhanya rambut yang lebih pendek. Saya ingin tahu apakah pencocokan pola entah bagaimana bahkan lebih pendek?
Lynn
3

Perl 6 , 39 byte

{so~(.[1..*]Zcmp$_)~~/'re L'|'s M'/}

Cobalah online!

$_adalah argumen daftar untuk fungsi anonim ini. .[1..*]adalah daftar yang sama, tetapi dengan elemen pertama yang dijatuhkan. Zcmpritsleting kedua daftar bersama dengan cmpoperator, menghasilkan daftar Ordernilai. Misalnya, untuk daftar input 1, 2, 2, 2, 1ini akan menghasilkan daftar More, Same, Same, Less.

Sekarang kita hanya perlu tahu apakah daftar itu mengandung dua elemen yang berdekatan More, Lessatau Less, More. Trik yang saya gunakan adalah untuk mengubah daftar menjadi string dengan batas ruang ~, kemudian menguji apakah itu berisi substring re Latau s M. (Yang pertama tidak bisa hanya e Lkarena Samejuga diakhiri dengan "e".)

Operator kecocokan cerdas mengembalikan salah satu Matchobjek (jika kecocokan berhasil) atau Nil(jika tidak), jadi sokonversi apa pun itu menjadi nilai boolean.

Sean
sumber
3

Ruby , 55 46 byte

->a{a.each_cons(3).any?{|x,y,z|(y-x)*(y-z)>0}}

Cobalah online!

Seorang lambda menerima sebuah array dan mengembalikan boolean.

-9 byte: Ganti (x<y&&y>z)||(x>y&&y<z)dengan (y-x)*(y-z)>0(terima kasih kepada GolfWolf )

->a{
  a.each_cons(3)              # Take each consecutive triplet
    .any?{ |x,y,z|            # Destructure to x, y, z
      (y-x)*(y-z) > 0         # Check if y is a bump
    }
}
benj2240
sumber
1
Saya pikir Anda bisa menggunakan |alih-alih ||, menghemat 1 byte.
Yytsi
46 byte
Cristian Lupascu
Simpan 1 byte dengan '0 <(yx) * y- = z'
GB
3

PostgreSQL 173 byte

SELECT DISTINCT ON(a)a,x>j and x>k OR x<least(j,k)FROM(SELECT a,x,lag(x,1,x)OVER(w)j,lead(x,1,x)OVER(w)k FROM d WINDOW w AS(PARTITION BY rn ORDER BY xn))d ORDER BY 1,2 DESC;
     a     | c 
-----------+---
 {1}       | f
 {1,2}     | f
 {1,2,1}   | t
 {1,2,1,2} | t
 {1,2,2}   | f
 {1,2,2,1} | f
 {1,2,2,3} | f
 {1,2,3}   | f
 {1,3,2}   | t
 {2,2,2}   | f
 {3,1,2}   | t
(11 rows)
Evan Carroll
sumber
Halo dan selamat datang di situs ini. Saya tidak terbiasa dengan PostgreSQL tetapi Anda mungkin dapat mengurangi jumlah spasi yang Anda gunakan. Secara umum sebagian besar bahasa tidak memerlukan sebagian besar jenis spasi yang Anda gunakan.
Wheat Wizard
@WheatWizard, ini sampel data ke dalam basis data, tidak relevan.
Evan Carroll
Apa kode Anda? Kami tidak mengizinkan input dimasukkan langsung ke dalam kode, bukan input. Jika itu yang terjadi di sini Anda harus menulis ulang sehingga dibutuhkan input melalui metode standar .
Wheat Wizard
@WheatWizard dari tautan yang Anda berikan, codegolf.meta.stackexchange.com/a/5341/23085
Evan Carroll
1
Ok kalau itu format input yang Anda gunakan itu bagus kalau begitu. Best of luck golfing di sini, senang melihat orang-orang bermain golf dalam bahasa yang jarang digunakan.
Wheat Wizard
3

Java 8, 108 104 101 86 84 79 72 byte

a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}

-2 byte terima kasih kepada @ OlivierGrégoire .
-13 byte berkat @Nevay .

Cobalah online.

Kevin Cruijssen
sumber
1
84 byte . Saya mengubah urutan iterasi (turun), menukar dua operan multiplikasi dan kemudian dapat menghapus berlebihan -1.
Olivier Grégoire
1
79 byte: a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}(pengembalian -1untuk kasus 3kebenaran , untuk kasus palsu) - atau, jika menggunakan ada / tidaknya pengecualian sebagai nilai pengembalian 55 byte:a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
Nevay
1
72 byte:a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}
Nevay
3

R , 58 56 byte

function(x)any(abs(diff(sign(diff(c(NA,x)))))>1,na.rm=T)

Cobalah online!

Disimpan 2 byte berkat Giuseppe

NofP
sumber
3
Anda dapat menyingkirkan kawat gigi {}untuk -2 byte.
Giuseppe
selain itu, saya pikir Anda dapat mem- porting pendekatan Stewie Griffin untuk 42 byte
Giuseppe
@ Giuseppe, saya pikir Stewie porting metode saya, dengan perbedaan yang saya dapat dengan benar menangani vektor kosong sebagaimana tercantum dalam kasus uji. Matlab sedikit lebih lunak dengan vektor kosong dibandingkan dengan R.
NofP
c()adalah NULLyang tidak sama dengan vektor kosong bilangan bulat, integer(0)sedangkan di MATLAB []adalah secara doubledefault, tetapi jika Anda ingin tetap seperti ini, itu sangat masuk akal.
Giuseppe
3

J , 16 15 byte

-1 byte terima kasih kepada FrownyFrog

1 e.0>2*/\2-/\]

Cobalah online!

Asli: 16 byte

0>[:<./2*/\2-/\]

2-/\] - Perbedaan dari setiap item yang berdekatan

2*/\ - produk dari setiap item yang berdekatan

[:<./ - minimum

0> - negatif?

Cobalah online!

Galen Ivanov
sumber
Halo! Tidak bisakah ini disingkat menjadi bentuk eksplisit yang lebih sederhana ini 0> <./ 2 * / \ 2 - / \ (13 byte)?
Mathias Dolidon
@Mathias Dolidon Ini berfungsi di interpreter tetapi di sini di PPCG itu umum untuk menyediakan fungsi (J verb) jika ada beberapa input. Jika kata kerjanya tacit one, kami tidak menghitung f=.byte penugasan . Harap diingat bahwa saya pengguna yang relatif baru :)
Galen Ivanov
Saya juga, dan Anda telah menjelaskan aturannya untuk saya. Terima kasih! :)
Mathias Dolidon
1
1 e.0>2*/\2-/\]
FrownyFrog
@ FrownyFrog Terima kasih! Sepertinya saya jarang menggunakan e. :)
Galen Ivanov
2

Japt , 9 byte

ä- ä* d<0

Cobalah online!

Gabungan jawaban Oliver dengan pendekatan yang digunakan oleh beberapa jawaban lain.

Produksi ETH
sumber
2

Attache , 39 byte

Any&:&{_*~?Sum[__]}@Slices&2@Sign@Delta

Cobalah online!

Cukup senang dengan hasilnya.

Penjelasan

Ini adalah komposisi dari empat fungsi:

Delta
Sign
Slices&2
Any&:&{_*~?Sum[__]}

Deltamendapat perbedaan antar elemen. =

Kemudian, Signditerapkan pada setiap perbedaan, memberi kita array 1s, 0s, dan -1s. =

Lalu, Slices&2berikan semua irisan panjang dua dari array, berikan semua pasangan perbedaan.

Akhirnya, Any&:&{_*~?Sum[__]}sama dengan, untuk input x:

Any[&{_*~?Sum[__]}, x]
Any[[el] -> { el[0] and not (el[0] + el[1] = 0) }, x]

Ini mencari elemen yang menjumlahkan ke nol tetapi bukan nol. Jika ada pasangan elemen seperti itu ada, maka ada benjolan.

Conor O'Brien
sumber
2

Sekam , 7 byte

V<0Ẋ*Ẋ-

Cobalah online!

Penjelasan

V<0Ẋ*Ẋ-  Implicit input, say [2,5,5,1,4,5,3]
     Ẋ-  Consecutive differences: [3,0,-4,3,1,-2]
   Ẋ*    Consecutive products: [0,0,-12,3,-2]
V<0      Is any of them negative? Return 1-based index: 3
Zgarb
sumber
2

Oktaf , 33 byte

@(x)0||abs(diff(sign(diff(x))))>1

Cobalah online!

Penjelasan:

@(x)                           % Anonymous function taking x as input
                  diff(x)       % Takes the difference between consecutive elements
             sign(diff(x))      % The sign of the differences
        diff(sign(diff(x)))     % The difference between the signs
    abs(diff(sign(diff(x)))>1   % Check if the absolute value is 2
@(x)abs(diff(sign(diff(x)))>1   % Output as matrices that are treated truthy or falsy
Stewie Griffin
sumber
2

Brachylog , 10 byte

s₃.¬≤₁∧¬≥₁

Cobalah online!

Berhasil (true. ) jika ada masalah, dan gagal ( false.) jika tidak ada masalah

Penjelasan

Ini sudah bisa dibaca:

s₃.           There is a substring of the input…
  .¬≤₁        …which is not non-decreasing…
      ∧       …and…
       ¬≥₁    …which is not non-increasing
Fatalisasi
sumber
2

05AB1E , 7 byte

¥ü‚P0‹Z

Cobalah online!

Penjelasan

¥         # calculate delta's
 ü‚       # pair each element with the next element
   P      # product of each pair
    0‹    # check each if less than 0
      Z   # max
Emigna
sumber
Bukankah ada alternatif 1-byte 0‹yang pada dasarnya memeriksa angka untuk tanda negatif?
Magic Octopus Mm
@MagicOctopusUrn: ddigunakan untuk memeriksa bahwa bagian atas tumpukan hanya berisi [0-9], yang merupakan kebalikan dari yang kita inginkan di sini. Tapi sekarang lebih cerdas dan negatif / mengapung juga dihitung sebagai angka.
Emigna
Ahhhh ... bisakah bersumpah amelihat negativetanda dan mengembalikan yang benar atau sesuatu ... Tapi saya pikir Anda benar, saya ingat dtrik Anda .
Magic Gurita Guci
2

Brachylog , 10 byte

s₃s₂ᶠ-ᵐ×<0

Cobalah online!

Tidak hampir serapi dan seanggun jawaban 10 byte @ Fatalize yang sudah ada, tetapi berhasil!

s₃   % There exists a substring of three elements [I,J,K] in the array such that

s₂ᶠ  % When it's split into pairs [[I,J],[J,K]]

-ᵐ   % And each difference is taken [I-J, J-K]

×    % And those differences are multiplied (I-J)*(J-K)
     % (At a bump, one of those will be negative and the other positive. 
     % At other places, both differences will be positive, or both negative, 
     %  or one of them 0 - ultimately resulting in a non-negative product.)

<0   % The product is negative
sundar - Pasang kembali Monica
sumber
1

Python 2 , 60 byte

lambda l:any(p>c<n or p<c>n for p,c,n in zip(l,l[1:],l[2:]))

Cobalah online!

Hampir sama, berpikir itu akan lebih pendek ...

Python 2 , 63 byte

f=lambda l:l[3:]and(l[0]>l[1]<l[2]or l[0]<l[1]>l[2]or f(l[1:]))

Cobalah online!

benar-benar manusiawi
sumber
1
58 byte menggunakan perkalian sebagai gantinya
Shieru Asakoto
1

Bahasa Wolfram (Mathematica) , 37 36 byte

FreeQ[(d=Differences)@Sign@d@#,-2|2]&

Memberikan kebalikan dari jawaban test case (False dan True terbalik). Berlaku a! untuk beralih ke bentuk normal.

ATAU

Abs@(d=Differences)@Sign@d@#~FreeQ~2&

Juga membalikkan output, jadi gantikan FreeQdenganMatchQ untuk bentuk normal.

Penjelasan: Ambil tanda perbedaan urutan. Jika urutan yang dihasilkan meliputi {1, -1} atau {-1,1} ada benjolan. Nilai absolut perbedaan {1, -1} atau {-1,1} adalah 2 dalam kedua kasus.

Matikan byte lain dengan mengkuadratkan daftar akhir alih-alih mengambil nilai absolut:

FreeQ[(d=Differences)@Sign@d@#^2,4]&

Cobalah online!

Kelly Lowder
sumber
1

Perl, 35 byte

Termasuk +3untuk-p

bump.pl:

#!/usr/bin/perl -p
s%\S+ %$a*1*($a=$&-$')%eg;$_=/-/

Jalankan sebagai:

bump.pl <<< "3 1 2"
Ton Hospel
sumber
1

Julia 0,6 , 57 56 byte

l->any(p>c<n||p<c>n for(p,c,n)=zip(l,l[2:end],l[3:end]))

Pada dasarnya hanya jawaban python yang benar-benar manusiawi. -1 byte dari user71546

Cobalah online!

Julia 0,6 , 39 byte

f(x,y,z,a...)=x>y<z||x<y>z||f(y,z,a...)

Gaya rekursi Lispy, alias jawaban python Dennis. Kembali trueketika ada benjolan, jika tidak menimbulkan kesalahan. Ini mungkin harus 42 byte karena Anda harus memercikkannya saat menelepon. Misalnya untuk a=[1,2,1]Anda memanggil sebagai f(a...).f(a)=f(a...)akan menghapus kebutuhan itu, tetapi lebih lama. Saya perlu mendapatkan rekursi yang lebih baik, dan saya tidak begitu suka menulis kode yang menimbulkan kesalahan.

Cobalah online!

gggg
sumber
1
sepertinya ruang setelahnya fortidak diperlukan;)
Shieru Asakoto