C'è un dosso?


39

Dato un elenco di numeri interi positivi, determinare se esiste un elemento maggiore dei suoi due vicini o inferiore ai suoi due vicini (un "bump"). Per essere chiari un bump non può mai essere il primo o l'ultimo elemento dell'elenco perché hanno un solo vicino.

Il tuo programma dovrebbe generare uno di due valori coerenti, ciascuno corrispondente a un elenco senza dossi o a un elenco con dossi. Quali siano i valori non è importante che tu possa sceglierli tu stesso.

Questo è quindi le risposte verranno classificate in byte con un numero inferiore di byte migliori.

Casi test

[] -> 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 Case Request: numeri diversi da 0-1-2-3, anche i negativi sono ammessi / non ammessi?
Magic Octopus Urn

Caso di prova suggerito: [1,3,3](assicura che le risposte usando l'algoritmo di Dennis prendano il segno degli incrementi piuttosto che usare semplicemente gli incrementi stessi)
ETHproductions

1
@ETHproductions Non è già coperto da [1,2,2]? Oppure mi sfugge qualcosa?
Finanzia la causa di Monica il

2
@NicHartley, i delta di [1,2,2]sono gli stessi dei segni di quei delta, ma non è così [1,3,3].
Shaggy,

Risposte:


15

Gelatina , 5 byte

IṠIỊẠ

Restituisce 0 se c'è un bump, 1 in caso contrario.

Provalo online!

Come funziona

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
Che cos'è "Incrementi?". Cosa viene incrementato e cosa fa?
Wheat Wizard

1
@WheatWizard Penso che questo sia l'equivalente del comando delta (¥) di 05AB1E: viene popolato un array [n0, n1, n2, n3] e viene spinto l'array [n1-n0, n2-n1, n3-n2].
Kaldo,

10

JavaScript (ES6), 38 byte

Restituisce un valore booleano.

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

Casi test

Come?

Usiamo a per memorizzare il valore precedente di n . Impostiamo x su 1 se a <n , -1 se a> n o 0 se a = n . E testiamo se old_x * x <0 , che è possibile solo se ( old_x = 1 e x = -1 ) o ( old_x = -1 e x = 1 ).

Poiché x è inizializzato nella funzione di callback anonimo di some () , è costretto a NaN durante la prima iterazione, il che rende falsa la verifica.


Questo lancerà in modalità rigorosa.
Aluan Haddad,

2
@AluanHaddad Bene, il 99% del codice golfizzato da JS verrà lanciato in modalità rigorosa solo a causa di variabili non dichiarate. PPCG e codereview non si mescolano bene. : P
Arnauld,

È giusto, non sono molto per il golf.
Aluan Haddad,

4
Allora perché commentarlo lol
Mark C.

8

Haskell , 42 byte

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

Provalo online!

Spiegazione

Innanzitutto abbiamo la funzione fche accetta una funzione binaria e un elenco e applica la funzione binaria a ogni coppia adiacente nell'elenco.

Quindi la nostra funzione principale si applica f(-)all'elenco di input. Questo calcola l'elenco delle differenze. Quindi applichiamo f(*)all'elenco per moltiplicare ogni coppia adiacente. Infine chiediamo se qualsiasi coppia è inferiore a zero.

Un numero nell'elenco finale può essere negativo solo se è il prodotto di un numero negativo e positivo dall'elenco differenze. Pertanto, al fine di produrre una voce negativa (e quindi restituire vero) l'elenco originale deve passare da crescente a decrescente o viceversa, ovvero deve avere un bump.


Bel modo di gestire la lista vuota!
Laikoni,


5

Ottava con pacchetto immagini, 34 32 byte

2 byte salvati grazie a @StewieGriffin !

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

Provalo online!

Spiegazione

Calcola le differenze consecutive, le dispone in blocchi scorrevoli di lunghezza 2, ottiene il prodotto di ciascun blocco e verifica se tale prodotto è negativo.


0||prod(...)salva 2 byte. È inoltre possibile saltare l'intera anyparte e utilizzare la definizione di verità / falsa predefinita per salvare 5 byte .
Stewie Griffin,

Accidenti, il salvataggio di 5 byte renderà la tua soluzione più breve della mia :( Ottimo uso del pacchetto di immagini. Non sapevo che fosse su TIO.
Stewie Griffin,

1
@StewieGriffin Poiché la sfida richiede due valori coerenti, non posso rimuoverli any. Grazie per l' 0||idea!
Luis Mendo,

4

R, 48 byte

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

Provalo online!

Come funziona passo per passo usando c (1,4,1,4) come esempio:

> 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

Come bonus, ecco una soluzione di lunghezza e concetto simili usando il pacchetto zoo:

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

1
! pulito Nota per sé: ricordare embedesiste. E 'un peccato che rowProdse colProdsnon esiste come alias a R.
Giuseppe

1
@Giuseppe per disperazione ho effettivamente verificato se esistessero :) ma in effetti solo rowSumse rowMeans...
plannapus,

1
beh, almeno guardando i documenti, .colSumsrimodelleremo l'input in una matrice basata su input aggiuntivi che probabilmente ha un'applicazione da golf da qualche parte .... ora devo solo trovarne uno!
Giuseppe,

@Guiseppe: dai un'occhiata alle funzioni nel matrixStatspacchetto.
Michael M,

@MichaelM Sfortunatamente a causa della lunghezza del nome del pacchetto non lo rende competitivo (57 byte:) function(x)any(matrixStats::colProds(embed(diff(x),2)))<0. Ma per qualsiasi cosa diversa dal code golf, questo pacchetto è davvero un tesoro.
plannapus,

4

Haskell , 33 byte

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

Provalo online!

True se c'è un dosso, errori se non c'è.


l`zip3`tail l$drop 2lè solo un pelo più corto. Mi chiedo se il pattern matching sia in qualche modo ancora più breve?
Lynn,

3

Perl 6 , 39 byte

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

Provalo online!

$_è l'argomento elenco di questa funzione anonima. .[1..*]è lo stesso elenco, ma con il primo elemento eliminato. Zcmpcomprime le due liste insieme cmpall'operatore, risultando in una lista di Ordervalori. Ad esempio, per un elenco di input 1, 2, 2, 2, 1ciò comporterebbe l'elenco More, Same, Same, Less.

Ora dobbiamo solo sapere se quell'elenco contiene due elementi adiacenti More, Lesso Less, More. Il trucco che ho usato è di convertire l'elenco in una stringa delimitata da spazi ~, quindi verificare se contiene sottostringa re Lo s M. (Il primo non può essere giustoe L perché Sametermina anche con una "e".)

L'operatore di corrispondenza intelligente restituisce un Matchoggetto (se la corrispondenza ha avuto esito positivo) o Nil(in caso contrario), quindi soconverte qualsiasi valore in un valore booleano.



3

Ruby , 55 46 byte

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

Provalo online!

Un lambda che accetta un array e ritorna booleano.

-9 byte: sostituisci (x<y&&y>z)||(x>y&&y<z)con (y-x)*(y-z)>0(grazie a 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
Io credo che si può usare |al posto di ||, risparmiando 1 byte.
Yytsi,


Salva 1 byte con '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)

Ciao e benvenuto nel sito. Non ho familiarità con PostgreSQL ma potresti essere in grado di ridurre la quantità di spazi bianchi che usi. In generale la maggior parte delle lingue non richiede la maggior parte dei tipi di spaziatura che usi.
Wheat Wizard

@WheatWizard sono i dati di esempio nel database, è irrilevante.
Evan Carroll,

Qual è il tuo codice allora? Non consentiamo che l'input venga inserito direttamente nel codice anziché nell'input. Se questo è il caso, dovresti riscriverlo in modo che richieda input tramite un metodo standard .
Wheat Wizard

@WheatWizard dal link che hai fornito, codegolf.meta.stackexchange.com/a/5341/23085
Evan Carroll

1
Ok se questo è il formato di input che stai usando va bene allora. Buona fortuna a giocare a golf qui, è bello vedere le persone giocare a golf in lingue meno comunemente usate.
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 grazie a @ OlivierGrégoire .
-13 byte grazie a @Nevay .

Provalo online.


1
84 byte . Ho cambiato l'ordine di iterazione (scendendo), ho scambiato i due operandi di moltiplicazione e quindi ho potuto rimuovere un superfluo -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;}(ritorna -1per casi veritieri, 3per casi falsi) - oppure, se si utilizza la presenza / assenza di un'eccezione come valore di ritorno 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)

Provalo online!

Salvato 2 byte grazie a Giuseppe


3
È possibile eliminare le parentesi graffe {}per -2 byte.
Giuseppe,

additionally, I think that you can port Stewie Griffin's approach for 42 bytes
Giuseppe

@Giuseppe, I think Stewie ported my method, with the difference that mine can properly handle the empty vector as listed in the test cases. Matlab is a bit more lenient with empty vectors compared to R.
NofP

c() is NULL which is not the same as the empty vector of integers, integer(0), whereas in MATLAB [] is a double by default, but if you want to keep it this way, that's perfectly reasonable.
Giuseppe

3

J, 16 15 bytes

-1 byte thanks to FrownyFrog

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

Try it online!

Original: 16 bytes

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

2-/\] - differences of each adjacent items

2*/\ - products of each adjacent items

[:<./ - the minimum

0> - is negative?

Try it online!


Hello ! Could this not be shortened to this simpler explicit form 0><./2*/\2-/\ (13 bytes) ?
Mathias Dolidon

@Mathias Dolidon This works in the interpreter but here in PPCG it's common to provide a function (J verb) if there is some input. If the verb is tacit one, we don't count the assignment f=. bytes. Please have in mind that I'm relatively new user :)
Galen Ivanov

So am I, and you've clarified the rule for me. Thanks ! :)
Mathias Dolidon

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

@ FrownyFrog Thank you! It seems that I rarely use e. :)
Galen Ivanov



2

Attache, 39 bytes

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

Try it online!

Pretty happy with how this turned out.

Explanation

This is a composition of four functions:

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

Delta gets the differences between elements. =

Then, Sign is applied to each difference, giving us an array of 1s, 0s, and -1s. =

Then, Slices&2 gives all slices of length two from the array, giving all pairs of differences.

Finally, Any&:&{_*~?Sum[__]} is equivalent to, for input x:

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

This searches for elements which sum to zero but are not zero. If any such pair of elements exist, then there is a bump.



2

Husk, 7 bytes

V<0Ẋ*Ẋ-

Try it online!

Explanation

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 bytes

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

Try it online!

Explanation:

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

s₃.¬≤₁∧¬≥₁

Try it online!

Succeeds (true.) if there is a bump, and fails (false.) if there is no bump.

Explanation

This is fairly readable already:

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

2

05AB1E, 7 bytes

¥ü‚P0‹Z

Try it online!

Explanation

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

Wasn't there a 1-byte alternative to 0‹ that basically checks the number for a negative sign?
Magic Octopus Urn

@MagicOctopusUrn: d used to check that top of stack only contained [0-9], which is the opposite of what we want here. But now it's more intelligent and negative/floats are also counted as numbers.
Emigna

Ahhhh... coulda sworn a saw the negative sign and returned true or something... But I think you're right, I'm remembering your d trick.
Magic Octopus Urn

2

Brachylog, 10 bytes

s₃s₂ᶠ-ᵐ×<0

Try it online!

Not nearly as neat and elegant as @Fatalize's existing 10 byte answer, but it works!

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 Language (Mathematica), 37 36 bytes

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

Gives the opposite of the test case answers (False and True reversed). Prepend a ! to switch to the normal form.

OR

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

Also reversed output, so replace FreeQ with MatchQ for normal form.

Explanation: Take the sign of the differences of the sequence. Iff the resulting sequence includes {1,-1} or {-1,1} there is a bump. The absolute value the differences of {1,-1} or {-1,1} is 2 in either case.

Shave off another byte by squaring the final list instead of taking the absolute value:

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

Try it online!


1

Perl, 35 bytes

Includes +3 for -p

bump.pl:

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

Run as:

bump.pl <<< "3 1 2"

1

Julia 0.6, 57 56 bytes

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

Basically just totallyhuman's python answer. -1 byte from user71546

Try it online!

Julia 0.6, 39 bytes

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

Lispy recursion style, aka Dennis's python answer. Returns true when a bump exists, otherwise throws an error. This should maybe be 42 bytes since you have to splat it when calling. Eg for a=[1,2,1] you call as f(a...). f(a)=f(a...) would remove that need, but is longer. I need to get better a recursion, and I don't really like writing code that throws an error.

Try it online!


1
seems the space after for is not necessary ;)
Shieru Asakoto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.