Bir yumru var mı?


39

Verilen pozitif tamsayıların bir listesi göz önüne alındığında, iki komşusundan daha büyük veya iki komşusundan (bir "çarpma") daha az olan bir eleman olup olmadığını belirleyin. Açık bir yumru, asla listenin ilk veya son öğesi olamaz, çünkü yalnızca bir komşuları vardır.

Programınız, her biri ya darbesiz bir listeye ya da darbeli bir listeye karşılık gelen iki tutarlı değerden birini vermelidir. Değerlerin önemi yoktur, kendiniz seçebilirsiniz.

Bu bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.

Test durumları

[] -> 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

5
Test Durumu Talebi: 0-1-2-3 dışındaki sayılar, ayrıca izin verilen / izin verilmeyen negatifler mi?
Magic Octopus Urn

Önerilen test durumu: [1,3,3](Dennis'in algoritmasını kullanan cevapların, yalnızca artışları kullanmak yerine artışların işaretini almasını sağlar)
ETHproductions

1
@ETHproductions Bu zaten kapsamında değil [1,2,2]mi? Yoksa bir şey mi kaçırıyorum?
Nic Hartley

2
@NicHartley, deltaları [1,2,2]bu deltaların belirtileri ile aynıdır ancak durum böyle değildir [1,3,3].
Shaggy,

Yanıtlar:


15

Jöle , 5 bayt

IṠIỊẠ

Bir çarpma varsa 0, değilse 1 döndürür .

Çevrimiçi deneyin!

Nasıl çalışır

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.

1
"Artımlar" nedir? Artan nedir ve bu ne yapar?
Buğday Sihirbazı

1
@WheatWizard Bunun 05AB1E'nin deltas (¥) komutunun eşdeğeri olduğunu düşünüyorum: bir dizi [n0, n1, n2, n3] açılır ve [n1-n0, n2-n1, n3-n2] dizisine basılır.
Kaldo,

10

JavaScript (ES6), 38 bayt

Bir boole döndürür.

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

Test durumları

Nasıl?

N'nin önceki değerini saklamak için a kullanıyoruz . Bu set x için 1 ise , bir <n , -1 , eğer bir> N ya da 0 ise bir n = . Ve biz old_x * x <0 olup olmadığını test ediyoruz , ki bu sadece ( old_x = 1 ve x = -1 ) veya ( old_x = -1 ve x = 1 ) olduğunda mümkündür.

Çünkü x anonim geri arama işlevi için başlatılır bazı () , bunun için zorlama bir NaN Test falsy yapan birinci tekrarda sırasında.


Bu katı modda atacak.
Aluan Haddad,

2
@AluanHaddad JS golf kodunun% 99'u sadece bildirilmemiş değişkenler nedeniyle katı modda çalışacaktır. PPCG ve kod görünümü iyi karışmıyor. : P
Arnauld,

Bu adil, golf için pek bir şey değilim.
Aluan Haddad,

4
Öyleyse neden lol hakkında yorum
Mark C.

8

Haskell , 42 bayt

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

Çevrimiçi deneyin!

açıklama

Öncelikle fbir ikili fonksiyon ve bir liste alan ve ikili fonksiyonu listedeki her bitişik çifte uygulayan fonksiyona sahibiz .

O zaman ana fonksiyonumuz f(-)giriş listesine uygulanır . Bu fark listesini hesaplar. Daha sonra f(*)her bir bitişik çifti çarpmak için listeye uygulanır . Son olarak, herhangi bir çiftin sıfırdan düşük olup olmadığını soruyoruz.

Son listedeki bir sayı, yalnızca fark listesindeki negatif ve pozitif bir sayının ürünü ise negatif olabilir. Bu nedenle, negatif bir giriş üretmek (ve sonra doğru dönmek) için, orijinal liste artandan azalan veya tam tersi şekilde değişmeli, yani bir yumru olmalıdır.


Boş liste ile başa çıkmak için güzel bir yol!
Laikoni


5

Görüntü Paketi ile birlikte Octave , 34 32 bayt

@StewieGriffin ! İle 2 bayt kurtarıldı !

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

Çevrimiçi deneyin!

açıklama

Ardışık farkları hesaplar, 2 uzunluğundaki kayan bloklar halinde düzenler, her bloğun ürününü elde eder ve böyle bir ürünün negatif olup olmadığını test eder.


0||prod(...)2 bayt kaydeder. Ayrıca anybölümün tamamını atlayabilir ve 5 bayttan tasarruf etmek için varsayılan truthy / falsy tanımını kullanabilirsiniz .
Stewie Griffin,

Kahretsin, 5 byte tasarruf senin çözümünü benimkinden daha kısa hale getirecek :( Görüntü paketini iyi kullanmak TIO’da olduğunu bilmiyordum
Stewie Griffin

1
@StewieGriffin Mücadelenin iki tutarlı değer gerektirdiğinden, kaldıramam any. 0||Fikir için teşekkürler !
Luis Mendo

4

R, 48 bayt

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

Çevrimiçi deneyin!

Örnek olarak c (1,4,1,4) kullanarak adım adım nasıl çalışır:

> 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

Bonus olarak, işte paket kullanarak benzer uzunluk ve konseptin bir çözümü zoo:

function(x)any(zoo::rollapply(diff(x),2,prod)<0)

1
düzgün! Kendime not: embedvar olanı hatırla . Bu çok kötü rowProdsve colProdsR 'de takma isim olarak bulunmuyor
Giuseppe

1
@Giuseppe çaresizlikten ben gerçekten var olup olmadığını kontrol ettim :) ama gerçekten de rowSumsve rowMeans...
plannapus

1
En azından dokümanlar üzerinden bakıldığında .colSums, girdiyi muhtemelen bir yerde golf uygulaması olan ek girdilere dayanan bir matris haline getirecek .... şimdi sadece bir tane bulmalıyım!
Giuseppe

@Guiseppe: Paketteki fonksiyonlara bir göz atın matrixStats.
Michael M,

@MichaelM Ne yazık ki paket adının uzunluğu nedeniyle onu rekabetçi yapmıyor (57 bytes:) function(x)any(matrixStats::colProds(embed(diff(x),2)))<0. Ancak kod golf dışında bir şey için bu paket gerçekten bir hazine hazinesidir.
plannapus

4

Haskell , 33 bayt

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

Çevrimiçi deneyin!

True bir yumru varsa, yoksa hataları.


l`zip3`tail l$drop 2lsadece bir saç daha kısa. Desen eşleştirmenin bir şekilde daha da kısa olup olmadığını merak ediyorum?
Lynn,

3

Perl 6 , 39 bayt

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

Çevrimiçi deneyin!

$_Bu isimsiz fonksiyonun liste argümanıdır. .[1..*]Aynı liste, ancak ilk öğe düştü. Zcmpiki listeyi işleçle birlikte sıkıştırır ve sonuçların cmpbir listesini Orderçıkarır. Örneğin, bir giriş listesi için 1, 2, 2, 2, 1bu liste ile sonuçlanır More, Same, Same, Less.

Şimdi sadece o liste iki komşu öğeleri içerip içermediğini bilmek gerekir More, Lessya Less, More. Kullandığım numara, listeyi boşlukla sınırlandırılmış bir dizgeye dönüştürmek ve ~ardından alt dize re Lya da alt dize içerip içermediğini test etmektir s M. (Birincisi olamaz e Lçünkü Sameaynı zamanda bir "e" ile biter.)

Akıllı eşleme işleci bir Matchnesne (eşleşme başarılıysa) veya Nil( başarısız olursa) döndürür , bu nedenle soher ne olursa olsun bir boole değerine dönüştürür.



3

Ruby , 55 46 bayt

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

Çevrimiçi deneyin!

Bir diziyi kabul eden ve boolean döndüren bir lambda.

-9 bayt: Değiştir (x<y&&y>z)||(x>y&&y<z)ile (y-x)*(y-z)>0(sayesinde 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
    }
}

1
Ben düşünüyorum kullanabilirsiniz |yerine ||size 1 byte tasarruf.
Yytsi


'0 <(yx) * y- = z' ile 1 byte tasarruf edin
GB

3

PostgreSQL 173 bayt

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)

Merhaba ve siteye hoşgeldiniz. PostgreSQL'e aşina değilim ama kullandığınız boşluk miktarını azaltabilirsiniz. Genelde çoğu dil, kullandığınız boşluk türlerinin çoğunu gerektirmez.
Buğday Sihirbazı

@WheatWizard veritabanına örnek veri, alakasız.
Evan Carroll,

Kodun nedir o zaman? Girişin, giriş yerine doğrudan koda girmesine izin vermiyoruz. Bu durumda, standart bir yöntemle girdi alabilmesi için yeniden yazmanız gerekir .
Buğday Sihirbazı,

Sağladığınız bağlantıdan @WheatWizard
Evan Carroll

1
Tamam, kullandığınız giriş biçimi buysa, sorun değil. Burada golf şansı en iyisi, insanları daha az kullanılan dillerde golf oynamak görmek güzel.
Buğday Sihirbazı

3

Java 8, 108 104 101 86 84 79 72 bayt

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

@ OlivierGrégoire sayesinde -2 bayt . @Nevay
sayesinde -13 bayt .

Çevrimiçi deneyin.


1
84 bayt . Yineleme sırasını değiştirdim (aşağı iniyordum), iki çarpma operandını değiştirdim ve sonra gereksiz bir şeyi kaldırabilirim -1.
Olivier Grégoire,

1
79 bayt: a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}(döner -1truthy durumlar için, 3Falsey durumlarda) - ya da, varlığını / dönüş değeri 55 bayt, bir özel durum olmadığını kullanılıyorsa:a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
Nevay

1
72 bayt: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 bayt

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

Çevrimiçi deneyin!

Giuseppe sayesinde 2 bayt kaydedildi


3
{}-2 baytlık diş tellerinden kurtulabilirsiniz .
Giuseppe

Ek olarak, Stewie Griffin'in yaklaşımını 42 bayta
Giuseppe,

@Giuseppe, Stewie'nin benim test yöntemlerinde listelenen boş vektörü doğru bir şekilde idare edebileceği farkıyla benim yöntemimi sunduğunu düşünüyorum. Matlab, boş vektörlerle R'ye kıyasla biraz daha yumuşaktır
NofP

c()olduğu NULL, tamsayılar boş vektörü ile aynı olmadığı integer(0), MATLAB'da oysa []bir olduğunu double, varsayılan olarak ancak bu şekilde tutmak istiyorsanız, o mükemmel mantıklı.
Giuseppe

3

J , 16 15 bayt

FrownyFrog sayesinde -1 bayt

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

Çevrimiçi deneyin!

Orijinal: 16 bayt

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

2-/\] - her bitişik öğenin farklılıkları

2*/\ - her bitişik öğenin ürünleri

[:<./ - en az miktar

0> - olumsuz mu?

Çevrimiçi deneyin!


Merhaba ! Bu 0> <./ 2 * / \ 2 - / \ (13 bayt) daha basit olan bu açık formla kısaltılamaz mı?
Mathias Dolidon

@Mathias Dolidon Bu, tercümanda çalışır, ancak burada PPCG'de, bazı girdiler varsa, bir işlev (J fiili) sağlamak yaygındır. Fiil bir tane değilse, atama f=.baytlarını saymayız. Lütfen nispeten yeni bir kullanıcı olduğumu unutmayın :)
Galen Ivanov

Öyleyse ben miyim ve sen benim için kuralı açıklığa kavuştun. Teşekkürler ! :)
Mathias Dolidon

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

@ FrownyFrog Teşekkürler! Görünüşe göre nadiren e kullanıyorum. :)
Galen Ivanov



2

Ataşesi , 39 bayt

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

Çevrimiçi deneyin!

Bunun nasıl sonuçlandığına çok sevindim.

açıklama

Bu dört fonksiyonun bir bileşimidir:

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

Deltaelemanlar arasındaki farkları alır. =

Ardından, Signher bir skalaya uygulanır ve bize bir 1s, 0s ve -1s dizisi verir . =

Ardından, Slices&2dizideki iki tüm uzunluk dilimlerini verir, tüm fark çiftlerini verir.

Son olarak, Any&:&{_*~?Sum[__]}girdi için x:

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

Bu, sıfıra toplanan ancak sıfır olmayan öğeleri arar. Eğer böyle bir eleman çifti varsa, o zaman bir yumru vardır.



2

Kabuğu , 7 bayt

V<0Ẋ*Ẋ-

Çevrimiçi deneyin!

açıklama

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

2

Octave , 33 bayt

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

Çevrimiçi deneyin!

Açıklama:

@(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

2

Brachylog , 10 bayt

s₃.¬≤₁∧¬≥₁

Çevrimiçi deneyin!

true.Bir yumru varsa ( ), başarılı değilse ( ), başarısız olur false..

açıklama

Bu zaten oldukça okunabilir:

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

2

05AB1E , 7 bayt

¥ü‚P0‹Z

Çevrimiçi deneyin!

açıklama

¥         # calculate delta's
 ü‚       # pair each element with the next element
   P      # product of each pair
    0‹    # check each if less than 0
      Z   # max

0‹Negatif bir işaret için sayıyı temelde kontrol eden bunun 1 baytlık bir alternatifi yoktu mu?
Magic Octopus Urn,

@MagicOctopusUrn: Burada sadece istediğimiz yerin tam tersi olan dyığının tepesini kontrol etmek için kullanılır [0-9]. Ama şimdi daha zeki ve negatif / kayan nokta sayısı da sayılıyor.
Emigna,

Ahhhh ... coulda yemin işareti agördü negativeve gerçek bir şeyler geri döndü ... Ama haklısın bence, dnumaranı hatırlıyorum .
Magic Octopus Urn,

2

Brachylog , 10 bayt

s₃s₂ᶠ-ᵐ×<0

Çevrimiçi deneyin!

@ Fatalize'in mevcut 10 byte cevabı kadar temiz ve şık değil, ama işe yarıyor!

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





1

Wolfram Dili (Mathematica) , 37 36 bayt

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

Test senaryosu cevaplarının tersini verir (Yanlış ve Doğru ters). !Normal şekle geçmek için a tuşuna basın.

VEYA

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

Ayrıca çıktıyı ters çevirin, normal form FreeQile değiştirin MatchQ.

Açıklama: Dizideki farklılıkların işaretini alın. Elde edilen dizi {1, -1} veya {-1,1} içeriyorsa, bir yumru var. Mutlak değer, her iki durumda da {1, -1} veya {-1,1} farkları 2'dir.

Mutlak değeri almak yerine son listeyi karıştırarak başka bir baytı tıraşlayın:

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

Çevrimiçi deneyin!


1

Perl, 35 bayt

içerir +3için-p

bump.pl:

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

Olarak çalıştırmak:

bump.pl <<< "3 1 2"

1

Julia 0.6 , 57 56 bayt

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

Temel olarak, sadece insancıl insanın python cevabı. User71546'dan -1 bayt

Çevrimiçi deneyin!

Julia 0.6 , 39 bayt

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

Lispy özyineleme tarzı, aka Dennis'in python cevabı. İade truebir şişlik var olduğunda, aksi hata verir. Bu belki 42 byte olmalı, çünkü onu çağırırken uyarmanız gerekiyor. Örneğin, a=[1,2,1]sizin için arayın f(a...). f(a)=f(a...)bu ihtiyacı giderir, ancak daha uzundur. Daha iyi bir özyinelemeye ihtiyacım var ve hata yapan bir kod yazmaktan gerçekten hoşlanmıyorum.

Çevrimiçi deneyin!


1
sonra forgerekli değil gibi görünüyor ;)
Shieru Asakoto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.