융기가 있습니까?


39

양의 정수 목록이 주어지면 두 이웃보다 크거나 두 이웃보다 작은 요소 ( "범프")가 있는지 판별합니다. 범프를 명확하게하는 것은 하나의 이웃 만 있기 때문에 목록의 첫 번째 또는 마지막 항목이 될 수 없습니다.

프로그램은 범프가없는 목록 또는 범프가있는 목록에 해당하는 두 개의 일관된 값 중 하나를 출력해야합니다. 값이 중요하지 않은 것은 직접 선택할 수 있습니다.

이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

테스트 사례

[] -> 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
테스트 케이스 요청 : 0-1-2-3 이외의 숫자도 허용 / 허용되지 않습니까?
Magic Octopus Urn

제안 된 테스트 사례 : [1,3,3](Dennis 알고리즘을 사용한 답변이 증분 자체를 사용하지 않고 증분의 부호를
갖도록

1
@ETHproductions 아직 다루지 않았 [1,2,2]습니까? 아니면 뭔가 빠졌습니까?
Nic Hartley

2
@NicHartley의 델타는 [1,2,2]해당 델타의 부호와 동일하지만의 경우에는 그렇지 않습니다 [1,3,3].
얽히고 설킨

답변:


15

젤리 , 5 바이트

IṠIỊẠ

반환 0 범프,이 있다면 1 이 아니라면.

온라인으로 사용해보십시오!

작동 원리

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
"증분"이란 무엇입니까? 증가하고있는 것은 무엇이며 어떻게합니까?
밀 마법사

1
@WheatWizard 이것이 05AB1E의 델타 (¥) 명령과 동일하다고 생각합니다. 배열 [n0, n1, n2, n3]이 팝업되고 배열 [n1-n0, n2-n1, n3-n2]가 푸시됩니다.
Kaldo

10

자바 스크립트 (ES6), 38 바이트

부울을 반환합니다.

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

테스트 사례

어떻게?

우리는 사용 이전 값을 저장하기 위해 N을 . 우리는 집합 X를 경우 은 <N , -1 경우 A> N 또는 0 의 경우 A = N . 그리고 old_x * x <0 인지 테스트합니다 . 이는 ( old_x = 1x = -1 ) 또는 ( old_x = -1x = 1 ) 경우에만 가능합니다 .

xsome () 의 익명 콜백 함수로 초기화 되기 때문에 첫 번째 반복 중에 NaN 으로 강제 변환되어 테스트가 잘못됩니다.


이것은 엄격 모드에서 발생합니다.
Aluan Haddad

2
@AluanHaddad 글쎄, JS 골프 코드의 99 %는 선언되지 않은 변수 때문에 엄격 모드에서 발생합니다. PPCG와 코드 검토가 잘 섞이지 않습니다. : P
Arnauld

그것은 공평합니다. 저는 골프를 많이하지 않습니다.
Aluan Haddad

4
그렇다면 왜 그것에 대해 lol
Mark C.

8

하스켈 , 42 바이트

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

온라인으로 사용해보십시오!

설명

먼저 f이진 함수와 목록을 가져와 이진 함수를 목록의 모든 인접한 쌍에 적용하는 함수가 있습니다.

그런 다음 주요 기능 f(-)이 입력 목록에 적용됩니다 . 차이 목록을 계산합니다. 그런 다음 f(*)모든 인접한 쌍을 곱하기 위해 목록에 적용 합니다. 마지막으로 어떤 쌍이 0보다 작은 지 묻습니다.

끝 목록의 숫자는 차이 목록의 음수와 양수의 곱인 경우에만 음수 일 수 있습니다. 따라서 음수 항목을 생성 한 다음 true를 반환하려면 원래 목록이 증가에서 감소로 또는 그 반대로 전환되어야합니다. 즉, 충돌이 발생해야합니다.


빈 목록을 다루는 좋은 방법!
Laikoni


5

이미지 패키지가있는 옥타브 , 34 32 바이트

@StewieGriffin 덕분에 2 바이트가 절약 되었습니다 !

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

온라인으로 사용해보십시오!

설명

연속적인 차이를 계산하고 길이가 2 인 슬라이딩 블록으로 정렬하고 각 블록의 곱을 구한 다음 해당 제품이 음수인지 테스트합니다.


0||prod(...)2 바이트를 절약합니다. 전체 any부분을 건너 뛰고 기본 진리 / 거짓 정의를 사용하여 5 바이트절약 할 수도 있습니다 .
Stewie Griffin

..이 TIO에 있던 이놈은 5 바이트를 저장하는 것은 나보다 :( 이미지 패키지의 좋은 사용 솔루션을 짧게 만들 것입니다 몰랐어요
스튜이 그리핀

1
@StewieGriffin 도전에는 두 가지 일관된 값이 필요하므로 제거 할 수 없습니다 any. 0||아이디어 주셔서 감사합니다 !
Luis Mendo

4

R, 48 바이트

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

온라인으로 사용해보십시오!

c (1,4,1,4)를 예로 사용하여 단계별로 작동하는 방법 :

> 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

보너스로, 다음은 package를 사용하는 비슷한 길이와 개념의 솔루션입니다 zoo.

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

1
산뜻한! 자기 자신에 대한 메모 : 기억 embed이 존재합니다. 그것은 너무 나쁜 rowProdscolProdsR.의 별칭으로 존재하지 않는
주세페

1
내가 실제로 존재하는 경우 확인 :)하지만 실제로 단지 절망의 밖으로 @Giuseppe rowSumsrowMeans...
plannapus

1
글쎄, 적어도 문서를 살펴보면 .colSums어딘가 골프 응용 프로그램이있는 추가 입력을 기반으로 입력을 행렬로 재구성 할 것입니다 .... 이제 하나만 찾아야합니다!
주세페

@Guiseppe : matrixStats패키지 의 기능을 살펴보십시오 .
Michael M

@MichaelM 불행히도 패키지 이름의 길이로 인해 경쟁력이 없습니다 (57 바이트 :) function(x)any(matrixStats::colProds(embed(diff(x),2)))<0. 그러나 코드 골프 이외의 다른 용도로이 패키지는 실제로 보물 상자입니다.
plannapus


3

펄 6 , 39 바이트

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

온라인으로 사용해보십시오!

$_이 익명 함수에 대한 목록 인수입니다. .[1..*]동일한 목록이지만 첫 번째 요소가 삭제되었습니다. 연산자 Zcmp와 함께 두 목록을 압축하여 값 cmp목록을 생성 Order합니다. 예를 들어, 입력 목록의 1, 2, 2, 2, 1경우 list가 More, Same, Same, Less됩니다.

이제 우리는 단지 그 목록은 인접한 두 요소가 포함되어 있는지 여부를 알 필요가 More, Less또는 Less, More. 내가 사용한 트릭은을 사용하여 목록을 공백으로 구분 된 문자열로 변환 ~한 다음 하위 문자열 re L또는을 포함하는지 테스트하는 것 s M입니다. (첫 번째 는 "e"로 끝나기 e L때문에 할 수 없습니다 Same.)

스마트 일치 연산자는 Match개체가 일치하거나 일치 Nil하지 않은 경우 개체를 반환하므로 개체를 so부울 값으로 변환합니다.



3

루비 , 55 46 바이트

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

온라인으로 사용해보십시오!

배열을 수락하고 부울을 반환하는 람다.

-9 바이트 : 교체 (x<y&&y>z)||(x>y&&y<z)(y-x)*(y-z)>0(덕분에 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
내가 생각하는 당신이 사용할 수있는 |대신에 ||당신에게 1 바이트를 저장.
Yytsi


'0 <(yx) * y- = z'로 1 바이트 저장
GB

3

PostgreSQL 173 바이트

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)

안녕하세요. 사이트에 오신 것을 환영합니다. PostgreSQL에 익숙하지 않지만 사용하는 공백의 양을 줄일 수 있습니다. 일반적으로 대부분의 언어는 사용하는 대부분의 간격을 요구하지 않습니다.
밀 마법사

@WheatWizard 데이터베이스의 샘플 데이터이므로 관련이 없습니다.
Evan Carroll

그럼 코드가 뭐야? 입력 대신 입력을 코드에 직접 삽입 할 수 없습니다. 이 경우 표준 방법을 통해 입력을받을 수 있도록 다시 작성해야합니다 .
밀 마법사

제공 한 링크에서 @WheatWizard
Evan Carroll

1
그게 당신이 사용하는 입력 형식이라면 괜찮습니다. 여기서 운이 좋은 골프는 사람들이 자주 사용하지 않는 언어로 골프를하는 것을 보는 것이 좋습니다.
밀 마법사

3

자바 8 108 104 101 86 84 79 72 바이트

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

@ OlivierGrégoire 덕분에 -2 바이트 . @Nevay
덕분에 -13 바이트 .

온라인으로 사용해보십시오.


1
84 바이트 . 반복 순서를 변경하고 (내림차순) 두 곱셈 피연산자를 교체 한 다음 불필요한을 제거 할 수있었습니다 -1.
Olivier Grégoire

1
79 바이트 : a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}( -1진실한 경우, 거짓 인 경우를 반환 3) – 또는 예외의 유무를 반환 값 55 바이트로 사용하는 경우 :a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
Nevay

1
72 바이트 :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 바이트

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

온라인으로 사용해보십시오!

주세페 덕분에 2 바이트 절약


3
{}-2 바이트 의 중괄호 를 제거 할 수 있습니다 .
주세페

또한 Stewie Griffin의 접근 방식을 42 바이트로
Giuseppe

@ Giuseppe, Stewie가 내 방법을 이식했다고 생각합니다. 테스트 사례에 나열된 것처럼 빈 벡터를 올바르게 처리 할 수 ​​있다는 차이점이 있습니다. Matlab은 R에 비해 빈 벡터에 약간 관대합니다.
NofP

c()이며 NULL, 정수의 빈 벡터와 동일하지 않은 integer(0), MATLAB에서 반면 것은 []A는 double기본적으로하지만, 당신이이 방법을 유지하려는 경우, 그것은 완벽하게 합리적이다.
주세페

3

J , 16 15 바이트

FrownyFrog 덕분에 -1 바이트

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

온라인으로 사용해보십시오!

원본 : 16 바이트

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

2-/\] -인접한 각 항목의 차이점

2*/\ -각 인접 품목의 제품

[:<./ -최소

0> -부정적이야?

온라인으로 사용해보십시오!


여보세요 ! 이 간단한 명시 적 형식 0> <./ 2 * / \ 2-/ \ (13 바이트)로 단축 할 수 없습니까?
Mathias Dolidon

@Mathias Dolidon 이것은 인터프리터에서 작동하지만 PPCG에서는 입력이있는 경우 함수 (J 동사)를 제공하는 것이 일반적입니다. 동사가 암묵적 인 경우 할당 f=.바이트를 계산하지 않습니다 . 내가 비교적 새로운 사용자라는 것을 명심하십시오 :)
Galen Ivanov

나도 마찬가지입니다. 당신은 저를위한 규칙을 분명히했습니다. 감사 ! :)
Mathias Dolidon

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

@ FrownyFrog 감사합니다! e를 거의 사용하지 않는 것 같습니다. :)
Galen Ivanov



2

첨부 , 39 바이트

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

온라인으로 사용해보십시오!

이것이 어떻게 나타 났는지에 매우 만족합니다.

설명

이것은 네 가지 기능으로 구성되어 있습니다.

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

Delta요소 간의 차이를 얻습니다. =

그런 다음 Sign각 차이에 적용되어 1s, 0s 및 -1s 의 배열을 제공합니다 . =

그런 다음 Slices&2배열에서 길이 2의 모든 슬라이스를 제공하여 모든 쌍의 차이를 제공합니다.

마지막으로 Any&:&{_*~?Sum[__]}입력과 x같습니다.

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

합계는 0이지만 0이 아닌 요소를 검색합니다. 그러한 요소 쌍이 존재하면 충돌이 발생합니다.




2

옥타브 , 33 바이트

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

온라인으로 사용해보십시오!

설명:

@(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 바이트

s₃.¬≤₁∧¬≥₁

온라인으로 사용해보십시오!

true.범프가 있으면 성공 ( )하고 범프 false.가 없으면 실패 ( )합니다.

설명

이것은 이미 꽤 읽을 수 있습니다 :

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

2

05AB1E , 7 바이트

¥ü‚P0‹Z

온라인으로 사용해보십시오!

설명

¥         # 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‹기본적으로 숫자를 음수 부호로 확인 하는 1 바이트 대안이 없었습니까 ?
Magic Octopus Urn

@MagicOctopusUrn : d스택 상단에만 포함되어 있는지 확인하는 데 사용됩니다 [0-9]. 여기서 원하는 것과 반대입니다. 그러나 이제는 더 지능적이고 음수 / 부동 수도 숫자로 계산됩니다.
Emigna

아아 .. 맹세 anegative징조가 사인을 보고 사실 또는 무언가를 돌려 주었을 수도 있지만 ... 당신이 옳다고 생각합니다 d.
Magic Octopus Urn

2

Brachylog , 10 바이트

s₃s₂ᶠ-ᵐ×<0

온라인으로 사용해보십시오!

@Fatalize의 기존 10 바이트 답변만큼 깔끔하고 우아하지는 않지만 작동합니다!

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 바이트

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

테스트 사례 답변의 반대 (False 및 True가 반대로)를 제공합니다. a !를 앞에 붙여서 일반 양식으로 전환하십시오.

또는

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

또한 출력을 반전되므로 교체 FreeQMatchQ정상 폼.

설명 : 순서의 차이점을 표시하십시오. 결과 시퀀스에 {1, -1} 또는 {-1,1}이 포함 된 경우 충돌이 있습니다. 두 경우 모두 {1, -1} 또는 {-1,1}의 차이의 절대 값은 2입니다.

절대 값을 사용하는 대신 최종 목록을 제곱하여 다른 바이트를 제거하십시오.

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

온라인으로 사용해보십시오!


1

펄, 35 바이트

포함 +3을 위해-p

bump.pl:

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

다음으로 실행 :

bump.pl <<< "3 1 2"

1

줄리아 0.6 , 57 56 바이트

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

기본적으로 완전히 인간의 파이썬 답변입니다. 사용자에서 -1 바이트

온라인으로 사용해보십시오!

줄리아 0.6 , 39 바이트

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

Lispy 재귀 스타일, 일명 Dennis의 Python 답변. true범프가 존재하면 반환 하고, 그렇지 않으면 오류가 발생합니다. 호출 할 때 표시해야하므로 42 바이트 여야합니다. 예를 a=[1,2,1]들어으로 전화하십시오 f(a...). f(a)=f(a...)그 필요성을 제거하지만 더 길다. 재귀를 더 잘해야하며 오류가 발생하는 코드를 작성하는 것을 정말로 좋아하지 않습니다.

온라인으로 사용해보십시오!


1
보이는 공간 후에는 for필요하지 않습니다)
Shieru Asakoto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.