울퉁불퉁 한 단어입니까?


31

( 퍼즐 링에 대한 이 도전 에서 영감을 얻었습니다. 해당 퍼즐의 SPOILERS 가 아래에 있으므로 직접 퍼즐을 풀고 싶다면 여기를 읽으십시오!)

단어의 문자가 단어의 이전 문자보다 알파벳순으로 늦게 발생하는 경우 두 문자 사이의 상승 을 호출합니다 . 그렇지 않으면 같은 문자 인 경우를 포함 하여 가을 이라고합니다 .

예를 들어, 단어는 ACE두 상승이 없다 ( ACCE)하고있는 동안에는이 떨어지는 THE(두 폭포 없다 TH하고 H으로 E) 더 상승.

시퀀스가 오름차순 번갈아 가면 Bumpy 라고합니다 . 예를 들어, BUMP상승 ( B- U), 하강 ( U- M), 상승 ( M- P)합니다. 첫 번째 시퀀스는 상승 할 필요는 없습니다 BALD.

도전

주어진 단어가 Bumpy인지 여부를 출력합니다.

입력

  • ASCII 알파벳 (구성된 단어 (반드시 사전에 나오는 단어) [A-Z]또는 [a-z]에서) 문자, 적당한 형식 .
  • 입력이 모두 대문자이거나 모두 소문자이지만 일관성이 있어야합니다.
  • 단어의 길이는 3 자 이상입니다.

산출

truthy / falsey의 여부를 상기 입력 단어에 대한 값은 울퉁불퉁 (truthy) 여부 울퉁불퉁 (falsey)이다.

규칙

  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

진실한 :

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

팔시 :

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


단깃. 같은 편지가 오르거나 떨어지지 않으면 더 쉬울 것입니다.
mbomb007

제공된 예제를 이해하지 못합니다. BUMPTruthy (예 : Bumpy)에 나열된 경우 왜 BUMPYFalsey 목록에 있습니까? "상승과 하강"은 무엇을 의미합니까? 두 개의 상승이 연속적으로 일어날 수 없습니까?
VolAnd

4
@VolAnd 그렇습니다. 상승은 항상 하락을 의미하며 그 반대도 마찬가지입니다. 두 번 연속 상승 BUMPY하기 때문에 거짓 MPY입니다. 다시 말해, 단어가 울퉁불퉁하기 위해 길이가 3 인 하위 문자열을 오름차순 또는 내림차순으로 정렬하지 않아야합니다 (두 개의 연속 문자가 동일한 특수한 경우 제외).
Martin Ender

Puzzling.SE 질문에 대한 답을 망치면 스스로 해결하려는 다른 사람들도 그렇게 할 수 있습니까?
OldBunny2800

1
@ OldBunny2800 나는 전체 스포일러를 넣지 않을 것입니다 (스포일러 뒤에 중요한 정보를 숨겨서 도전하기가 어렵습니다), 경고로 상단에 텍스트를 추가 할 것입니다. 감사!
AdmBorkBork

답변:


31

MATL, 4 바이트

d0>d

설명:

d     % Implicitly take input. Take difference between each element
 0>   % Check whether diff's are positive. Should result in [0 1 0 1 ...] pattern.
   d  % Again take the difference. Any consecutive rises or falls results in a 
      % difference of 0, which is a falsy value in MATL

이것은 첫 번째 MATL 항목이므로 MATLAB / Octave 시도 (이 될 것입니다 @(a)all(diff(diff(a)>0))) 에서이 순진한 포트에서 얼마나 많은 개선이 있는지 궁금합니다 . (가) 있습니다 all어떤 제로가 배열 거짓을 만들기 때문에 필요하지 않습니다 그래서 더 없다 AMATL 포트에.


수정 된 문제를 참조하십시오. 테스트 케이스에 오타가있었습니다. 당신의 접근 방식이 맞았습니다. 실제로, d0>d작동해야합니다 ( A진실성 / 거짓의 정의에 따라 필요하지 않음 )
Luis Mendo

1
루이스를 자신의 언어로 능가하는 좋은 일! 전에 시도했지만 쉬운 일이 아닙니다. ;)
DJMcMayhem

하하 하하하 하하하 그것이 도전 과제를 너무 빨리 읽으면 얻을 수있는 것입니다. 내 방어에서, 두 개의 동일한 글자가 쓰러지는 것은 반 직관적입니다. 그리고 제 (지금 보정) 오해의 소지가 테스트 케이스 도움 하나 :-)하지 않았다
루이스 Mendo

1
@DJMcMayhem 고마워-어쩌면 나는 운이 좋았지 만, 실제로 연속 된 동일한 문자에 대해 생각하지 않았기 때문에 그 질문이 정확히 밝혀졌습니다 ...
Sanchises

1
@immibis MATL (AB)과 Octave에서 가능합니다. 메타 답변을 참조하십시오 .
Sanchises

24

자바 스크립트 (ES6), 75 69 63 46 43 바이트

Neil 덕분에 3 바이트 절약 :

f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1

대신 문자열 매개 변수를 파괴합니다 s.slice(1).


이전 솔루션 :
ETH 프로덕션 덕분에 17 바이트 절약 :

f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1

이전 솔루션에서 단계별로 수행 된 작업 :

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b // (63) Original
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(s[i]<s[i+1]))?f(s,i):b   // (61) No point in reassigning `a`, it's not used again
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^s[i]<s[i+1])?f(s,i):b     // (59) Remove unnecessary parentheses
f=(s,i=0)=>s[i+2]&&(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b         // (55) `a` is now just a waste of bytes
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b:1        // (56) Rearrange conditional expressions to allow for more golfing
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1         // (55) Rearrange conditional expression
f=(s,i=0)=>s[i+2]?(s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1           // (53) `b` is now also a waste of bytes
f=(s,i=0)=>s[i+2]?s[i++]<s[i]^s[i]<s[i+1]&&f(s,i):1             // (51) Remove unnecessary parentheses
f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1                  // (46) Use `s.slice(1)` instead of `i`


이전 솔루션 :
ETH 프로덕션 덕분에 63 바이트 :

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

69 바이트 :

f=(s,i=0,a=s[i++]<s[i])=>i+1<s.length&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

75 바이트 :

f=(s,a=s[0]<s[1])=>{for(i=1;i+1<s.length&&(b=a^(a=s[i++]<s[i])););return b}

단어의 모든 문자는 대소 문자가 동일해야합니다.


2
: 당신은 골프 내려 아주 조금 더 할 수 github.com/ETHproductions/golf/blob/gh-pages/misc/93014.js
ETHproductions

@ETHproductions 링크 내용을 게시해야합니까?
Hedi

당신은 당신이 :-) 싶습니다 할 수있는 경우
ETHproductions

!s[2]|...같은 일을 할 수 있습니까 s[2]?...:1?
Titus

1
파티에 늦어서 죄송하지만 43 바이트는 다음과 같습니다.f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW, 36 바이트

논리적 동등성을 사용하여 골프 다운 :

golfed

언 골프 드 :

ungolfed

먼저 소문자로 변환 한 다음 바이트 배열로 변환합니다. 바이트 배열의 첫 번째 요소가 선행 요소가 없으므로 잘라냅니다. 그런 다음 배열의 각 요소에 대해 이전 요소보다 큰지 확인하고 (U8 문자가 예상대로 ASCII에 매핑 됨) 다음 반복에 대한 결과와 전체 울퉁불퉁 함을보기위한 배열에 저장합니다. 현재 및 이전 부울 검사가 같으면 루프를 종료하고 울퉁불퉁하지 않습니다. 그렇지 않으면 울퉁불퉁합니다!


1
정말 멋진 언어입니다! PPCG에 오신 것을 환영합니다!
DJMcMayhem

1
감사! 나는 4 바이트 답변과 경쟁하지 않을 것이다. 그러나 그것은 나의 기술을 향상시키는 좋은 방법이다 :)
ijustlovemath

여기를 참조 하십시오 . 당신의 점수는 확실히 틀리고 지나치게지나칩니다 . 나는 당신의 대답이 실제로 246450-246549 바이트라고 생각하지 않습니다.
Outgolfer Erik

LabVIEW에 동등한 바이트라는 개념이 있다는 것을 몰랐기 때문에 메모리 탭을 벗어났습니다. 오늘 계산하고 답변을 수정합니다.
ijustlovemath

1
@Erik Windows에서 Firefox를 사용하고 있지만 모바일에서 열면 문제가 발생합니다. 그냥 meta.ppcg.lol이 작동합니다. 어쨌든 이것은 주석의 범위를 벗어납니다.
기금 모니카의 소송

8

파이썬, 56 바이트

lambda s:all((x<y)^(y<z)for x,y,z in zip(s,s[1:],s[2:]))

모든 테스트 사례는 아이디어가 있습니다

의 삼중 문자를 압축하고 모든 삼중이 서로 다른 상승 / 하강 특성을 갖는 왼쪽 및 오른쪽 쌍을 가지고 있는지 테스트합니다.
모두 대문자 또는 모두 소문자로 작동합니다.


6

루비, 57 48 바이트

입력이 모두 대문자 일 것으로 예상합니다.

->s{!s.gsub(/.(?=(.)(.))/){($&<$1)^($1<$2)}[?f]}

repl.it에서 참조하십시오 : https://repl.it/D7SB

설명

정규식 /.(?=(.)(.))/은 각 문자 다음에 두 문자가 추가됩니다. (?=...)긍정적 인 예견입니다. 즉, 다음 두 문자는 일치하지만 일치하는 부분으로 "소비"하지 않습니다. 중괄호 안에는 $&세와의 일치하는 텍스트의 첫 번째 문자입니다 $1$2룩어 내부 촬영 된 문자가 있습니다. 즉, 문자열이 "BUMPY"인 경우 먼저 일치합니다"B" (그리고 거기에 넣어 $&) 캡처 "U""M"(과에 넣어 $1$2). 이 일치 다음 "U"캡처 "M""P"등등합니다.

블록 내부에서 첫 번째 문자 쌍 ( $&$1)이 상승하고 두 번째 문자 ($1$2많은 다른 답변의 대부분처럼) 인 가을 또는 반대의 부사장. 이 ^표현식은 true또는을 반환 false하며, 문자열로 변환되어 일치하는 대신 삽입됩니다. 결과적으로 예제 "BUMPY"는 다음과 같습니다.

"truetruefalsePY"

입력이 모두 대문자임을 알기 때문에 "f" 만의 일환으로 발생 "false"하고 !result[?f]우리에게 답을 제공합니다.


어떻게 작동합니까?
GreenAsJade

1
@ GreenAsJade 내 답변에 설명을 추가했습니다.
Jordan

6

C #, 64 63 55 바이트

unsafe bool B(char*s)=>1>s[2]||*s<s[1]!=*++s<s[1]&B(s);

Scepheo의 제안에서 -8 바이트

이것은 C #에 대한 Hedi 솔루션의 포트입니다 . 나는 또한 재귀 솔루션을 찾았지만 재귀는 좋지 않았다. 내 원래 솔루션은 다음과 같습니다.

내 원본 C #, 96 94 91 바이트

unsafe bool B(char*s,bool f=1>0,int i=0)=>1>s[1]||(s[0]<s[1]?f:1>i?!(f=!f):!f)&B(s+1,!f,1);

1>0대신에 -2 바이트를 사용하십시오 true.

위의 포트 솔루션에 대한 Scepheo의 제안에서 -3 바이트

매번 상승 / 하강이 번갈아 가며 반복적으로 확인되는 자체 호출.

언 골프 드 :

// unsafe in order to golf some bytes from string operations.
// f alternates with each recursive call
// i is 0 for the first call, 1 for all subsequent calls
unsafe bool B(char* s, bool f = 1 > 0, int i = 0) =>
    1 > s[1] ? 1 > 0// (instead of 1 == s.Length) check if s[1] = NULL, and return true.
    : (
        s[0] < s[1] ? f // Rising, so use f...
        : // Else falling
            1 > i ? !(f=!f) // But this is the first call, so use true (but flip f)...
            : !f // Not first call, so use !f...
    )
    & B(s+1, !f, 1) // ...AND the previous value with a recursive call
                    // s+1 instead of s.Substring(1)
;

마지막은 ?:연산자 나 괄호 없이 할 수있는 것 같습니다 :unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo

실제로, 나는 이것을 테스트 할 수 없지만 포인터 자체를 조작하는 것은 더 unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
터무니없는

@Scepheo 이러한 제안으로 StackOverflowExceptions가 있지만 ||비트 OR 대신 부울 OR을 사용하여 작동 |합니다. 게시물을 업데이트했습니다. 감사합니다.
우유

6

C 59 바이트

r;f(s)char*s;{for(r=0;r=*s?~r&1<<(*s>=*++s):0;);return!*s;}

70 바이트의 솔루션은 사례에 대해 1 (참)을 반환 AAA합니다. 예에서 첫 번째 "Falsey"
VolAnd

나는 테스트를 사용 gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)하고 있으며 aaa에 대해 거짓을 느끼고 흥분합니다. 이 버전에서 0이 아닌 것은 거짓이며 0은 진실입니다. 이것이 허용되는지 실제로 궁금합니다.
cleblanc

f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")Visual Studio 2012에서 컴파일 된 호출 23은 처리 할 수있는 값 을 반환 True하지만이 값은 "Falsey"섹션에 있으므로 값이 0예상됩니다.
VolAnd

나는 True와 Falsey에 무엇이 허용되었는지 오해했다. 이제 그 게시물을 읽었으며 "C"의 값이 무엇인지 분명합니다.
cleblanc

메타 합의에 근거한 진실과 거짓에 대한 표준 정의는 다음과 같습니다 .
AdmBorkBork



5

파이썬 2, 88 바이트

간단한 해결책.

s=input()
m=map(lambda x,y:y>x,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

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

행에서 동일한 문자가 상승 또는 하강이 아닌 경우 솔루션은 79 바이트입니다.

s=input()
m=map(cmp,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

5

펄, 34 바이트

에 +3 포함 -p(코드에 포함되어 '있으므로 -e사용할 수 없음)

STDIN에 대문자를 입력하십시오.

bump.pl <<< AAA

bump.pl

#!/usr/bin/perl -p
s%.%$&.z lt$'|0%eg;$_=!/(.)\1./

5

파이썬, 51 바이트

g=lambda a,b,c,*s:((a<b)^(b<c))*(s==()or g(b,c,*s))

like g('B','U','M','P')및 output 1또는을 입력 0합니다.

인수 압축 풀기를 사용하여 처음 세 글자를 가져 와서 처음 두 글자가 두 번째 글자와 다른지 확인합니다. 그런 다음에 대한 곱셈을 사용하여 나머지를 반복합니다 and.


좋은 입력 골프. ;-)
AdmBorkBork

5

젤리 , 6 5 바이트

@Dennis 덕분에 -1 바이트 (누적 감소 사용)

<2\IẠ

모든 테스트 사례는 TryItOnline에 있습니다.

방법?

<2\IẠ - main link takes an argument, s,    e.g. "BUMP"    or "BUMPY"
<    - less than comparison (a dyad)
 2   - literal 2 (a nilad)
  \  - n-wise overlapping reduction when preceded by a dyad-nilad chain
       (i.e. reduce the list by pairs with less than)
                                           e.g. [1,0,1]   or [1,0,1,1]
   I  - consecutive differences,           e.g. [-1,1]    or [-1,1,0]
    Ạ - All, 0 if any values are 0 else 1, e.g. 1         or 0

모두 대문자 또는 모두 소문자로 작동합니다.


4

apt, 8 바이트

Uä> ä- e

온라인으로 테스트하십시오!

작동 원리

Uä> ä- e  // Implicit: U = input string
Uä>       // Map each pair of chars X, Y in U to X > Y.
    ä-    // Map each pair of items in the result to X - Y.
          // If there are two consecutive rises or falls, the result contains a zero.
       e  // Check that every item is truthy (non-zero).
          // Implicit: output last expression

내 솔루션과 동일합니다. 11 배 더 짧습니다. : P
mbomb007

4

C # 105104 바이트

bool f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t>0;}

105 바이트 솔루션 :

bool f(char[]x){bool t=1>0,f=x[0]<x[1];for(int i=2,p=x[1];i<x.Length;)f^=t&=p<(p=x[i++])?!f:f;return t;}

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

공백이 괄호 뒤에 생략 될 수 있으므로 1 바이트의 문자 배열을 사용합니다. f(string x)vsf(char[]x)

bool true / false 대신 int 1/0을 반환 할 수 있으면 101 바이트입니다.

int f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t;}

4

하스켈, 52 바이트

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y

"where"구문을 제거 할 경우이 부분을 더 작게 만들 수있을 것으로 생각되지만 zipWith가 붙어있을 수 있습니다.

이는 상승 (참) 및 하강 (거짓) 목록을 만든 다음이 목록의 인접 항목이 다른 경우 목록을 작성하여 작동합니다.


이것은 이것들 중 하나에 대한 나의 첫 번째 시도이므로, 어딘가에 끔찍한 잘못을 가졌을 경우를 대비하여 나의 사고 과정을 거칠 것입니다.

Ungolfed Version (168 바이트)

isBumpy :: [Char] -> Bool
isBumpy input = and $ areBumps $ riseFall input
  where
    riseFall ax@(x:xs) = zipWith (>) xs ax
    areBumps ax@(x:xs) = zipWith (/=) xs ax

이름을 줄이고 유형 정보를 제거하십시오 (100 바이트)

f x = and $ g $ h x
  where
    h ax@(x:xs) = zipWith (>) xs ax
    g ax@(x:xs) = zipWith (/=) xs ax

h는 한 번만 사용되므로 기본 기능으로 이동하십시오 (86 바이트)

f ax@(x:xs) = and $ g $ zipWith (>) xs ax
  where
    g ax@(x:xs) = zipWith (/=) xs ax

areBumps 및 riseFall이 추상화하기에 충분히 유사하다는 것을 인식하십시오 (73 바이트).

f x  = and $ g (/=) $ g (>) x
  where
    g h ya@(y:ys) = zipWith h ys ya

(꼬리 y)는 ya @ (y : ys) (70 바이트)보다 짧습니다.

f x  = and $ g (/=) $ g (>) x
  where
    g h y = zipWith h (tail y) y

치우다; 불필요한 공백 제거 (52 바이트)

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y

... 저는 기본적으로 똑같은 일을하기 전에 내 이전에 게시 된 짧은 Haskell 답변을 발견했습니다. 나는 물건을 발견하는데 끔찍하다.
테론

작동하지 않는 것을 의미합니까? ;-) 키워드 g h=tail>>=zipWith h를 피하기 위해 전역 함수로 사용 하고 만들 수 있습니다 where.
Christian Sievers

@ChristianSievers 고쳤습니다.이 답변은 이제 내 것과 똑같은 일을하고 내 답변 이이 답변에 더 적합하다는 것을 알았습니다.
BlackCap

4

자바 7 157 153 150 125 117 바이트

int c(char[]z){for(int i=2,a,b,c;i<z.length;i++)if(((a=z[i-1])<(c=z[i])&(b=z[i-2])<a)|(a>=c&b>=a))return 0;return 1;}

언 골프 및 테스트 사례 :

여기에서 시도하십시오.

class M{
  static int c(char[] z){
    for(int i = 2, a, b, c; i < z.length; i++){
      if(((a = z[i-1]) < (c = z[i]) & (b = z[i-2]) < a) | (a >= c & b >= a)){
        return 0; //false
      }
    }
    return 1; //true
  }

  public static void main(String[] a){
    System.out.print(c("ABA".toCharArray()) + ", ");
    System.out.print(c("ABB".toCharArray()) + ", ");
    System.out.print(c("BAB".toCharArray()) + ", ");
    System.out.print(c("BUMP".toCharArray()) + ", ");
    System.out.print(c("BALD".toCharArray()) + ", ");
    System.out.print(c("BALDY".toCharArray()) + ", ");
    System.out.print(c("UPWARD".toCharArray()) + ", ");
    System.out.print(c("EXAMINATION".toCharArray()) + ", ");
    System.out.print(c("AZBYCXDWEVFUGTHSIRJQKPLOMN".toCharArray()) + ", ");

    System.out.print(c("AAA".toCharArray()) + ", ");
    System.out.print(c("ACE".toCharArray()) + ", ");
    System.out.print(c("THE".toCharArray()) + ", ");
    System.out.print(c("BUMPY".toCharArray()) + ", ");
    System.out.print(c("BALDING".toCharArray()) + ", ");
    System.out.print(c("ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) + ", ");
  }
}

산출:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0

@TimmyD Hmm, so it's rise when a > b, but fall when a <= b, instead of > and <?
Kevin Cruijssen

@TimmyD Ok, it's fixed, and even saves 3 bytes. :)
Kevin Cruijssen

1
you can redefine your method to accept char[] so you dont have to transform your input string to char array. that should save a few bytes. PS: java ftw!
peech

1
Did you perhaps means to change String s --> char[]z?

1
You can return a truthy or falsey value, so make your method an int and return 1 or 0 :).. Puts you down to 117 bytes
Shaun Wild

3

PowerShell v2+, 83 bytes

param($n)($a=-join(1..($n.Length-1)|%{+($n[$_-1]-lt$n[$_])}))-eq($a-replace'00|11')

A little bit of a different approach. This loops through the input $n, each iteration seeing whether the previous character $n[$_-1] is -lessthan the current character $n[$_], then casting the result of that Boolean operator to an int with +. Those are -joined together into a string, stored into $a. We then check whether $a is -equal to $a with any substrings of 00 or 11 removed.


3

Python 2.7, 84 bytes

s=input()
b=s[0]<s[1]
o=1
for i in range(len(s)-1):o&=(s[i]<s[i+1])==b;b^=1
print o

Returns 1 for bumpy, 0 for otherwise

Learned some cool stuff with bitwise & and ^.
Starts with boolean b defining first pair as up/down, then tests and flips b for each following pair.
o flips to false if test fails and sticks.
Requires quotes around input (+4 bytes for raw_input() if that breaks some rule)

Test It


3

05AB1E, 9 bytes

SÇ¥0›¥_O_

Explanation

SÇ          # convert to list of ascii values
  ¥         # take delta's
   0›       # check if positive, giving a list of 1's and 0's
            # if they alternate, the word is bumpy
     ¥      # take delta's again, if we have any 0's in the list the word is not bumpy
      _     # logical negation, turning 0 into 1 and everything else to 0
       O    # sum, producing 0 for a bumpy word and 1 for a non-bumpy word
        _   # logical negation, inverting the previous 1 into 0 and vice versa

Try it online!


2

Python 2.7 (again, 84 83 bytes)

def a(s):x=s[1:];return[cmp(s[0],x)]+a(x) if x else []
print len(set(a(input())))>1

Or, 78 77 bytes without the print.

By the way, the above 56 byte Python 2.7 example breaks on, for example, "abbab" or any other input with repeated characters. Never mind, didn't read instructions. Revising.

Okay, down to 83. The triples one is nicer though.


Here's some tips for ya. 1. Remove some whitespace a(x)if x else[]. 2. Use a lambda instead a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[] 3. Use a lambda at the end instead of printing. lambda s:len(set(a(s)))>1 4. if len(set(a(s))) isn't greater than 1, than it's already falsy, so you can take off >1
DJMcMayhem

2

CJam, 15 bytes

l2ew::<2ew::^:*

Try it online! (As a linefeed-separated test-suite.)

Explanation

l    e# Read input.
2ew  e# Get all (overlapping) pairs.
::<  e# Check whether each pair is strictly ascending (1) or not (0).
2ew  e# Get all (overlapping) pairs.
::^  e# Take the bitwise XOR of each pair, giving 1 if a rise and a fall alternate,
     e# and zero if there are two rises or two falls in succession.
:*   e# Product. Gives 1 only if the previous step yielded a list of 1s, meaning
     e# that any two consecutive rises/falls will turn this into a zero.

2

PHP, 80 bytes

$s=$argv[1];for($c=$s[0];$n=$s[++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

or

for($c=$argv[1][0];$n=$argv[1][++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

empty output for false, 1 for true

or Hedi´s recursive approach ported and a little golfed for 70 bytes:

function f($s){return!$s[2]|$s[0]<$s[1]^$s[1]<$s[2]&&f(substr($s,1));}

Actually, this should recurse infinitely for bumpy words, but it does not!


2

Haskell, 30 37 bytes

q f=tail>>=zipWith f;k=and.q(/=).q(>)

Usage:

Prelude> k <$> words "ABA ABB BAB BUMP BALD BALDY UPWARD EXAMINATION AZBYCXDWEVFUGTHSIRJQKPLOMN"
[True,True,True,True,True,True,True,True,True]

Prelude> k <$> words "AAA BBA ACE THE BUMPY BALDING ABCDEFGHIJKLMNOPQRSTUVWXYZ"
[False,False,False,False,False,False,False]

That doesn't accept "bald", foldl1(/=) doesn't do what you think it does.
Christian Sievers

@ChristianSievers Auch, you're right. Thanks for the heads up
BlackCap

2

PHP 7, 137 118 bytes

for($i=0;$i<strlen($argv[1])-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}

Empty output for Bumpy, 0 for Not Bumpy.

This is my first attempt at code golfing and I have to improve a lot, but it was a wonderful method to learn new things for me. I also wanted to challenge myself on that task by using the new PHP 7 Spaceship Operator which seems very interesting.

Anyway I'm not satisfied about it, first of all for the fact that I had to add an extra if(isset($s[$i+2])) to check if the variable exist because I did not find another workaround to the problem, but this is it for now. (Note: I fixed that simply by changing strlen($s)-1 to strlen($s)-2, I couldn't really see that before...).

Testing code:

$as = array("ABA", "ABB", "BAB", "BUMP", "BALD", "BALDY", "UPWARD", 
            "EXAMINATION", "AZBYCXDWEVFUGTHSIRJQKPLOMN", "AAA", "BBA", 
            "ACE", "THE", "BUMPY", "BALDING", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

foreach ($as as $s) {
    for($i=0;$i<strlen($s)-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}
}

Test online


Hello, and welcome to PPCG! Great first post!
NoOneIsHere

Welcome to PPCG! Nice first post. Check out Tips for PHP for some additional golfing suggestions.
AdmBorkBork

1

Javascript ES6, 100 bytes

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}

Try it here:

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}
alert(a(prompt()));

Oh come on two people already beat me to it by 40 bytes... whatever


Hint: "A"<"B", so you don't need to get the chars' charcodes.
ETHproductions

Also, this returns 1 for BUMPY (or anything else that contains both a rise and a fall).
ETHproductions

This doesn't seem to quite work right.
AdmBorkBork

1

Python 3, 148 139 127 bytes

def _(w):*r,=map(lambda a,b:0>ord(a)-ord(b)and-1or 1,w,w[1:]);s=len(r)%2==0and r+[r[0]]or r;return sum(s)in(-1,1)and s==s[::-1]

testing code

positives = ('ABA', 'ABB', 'BAB', 'BUMP', 'BALD', 'BALDY', 'UPWARD', 'EXAMINATION', 'AZBYCXDWEVFUGTHSIRJQKPLOMN')
negatives = ('AAA', 'BBA', 'ACE', 'THE', 'BUMPY', 'BALDING', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

for w in positives:
    print(_(w), w)
    assert _(w)

for w in negatives:
    print(_(w), w)
    assert not _(w)

i really suck at this #facepalm
Jeffrey04

Welcome to PPCG! Check out Tips for Golfing in Python, and take inspiration from the other answers.
AdmBorkBork

1

C, 65 57 60 bytes

 r;f(char*s){for(r=0;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

is fix of

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

that works correctly with any data only at single function call (when the global variable r is initialized to zero).

But in any case this is shorter than previous solution (65 bytes) due to use of for instead of while. But previous (the following) is a little easier to understand:

r;f(char*s){while(*++s)if(!(r=~r&1<<(*s>*(s-1))))break;return r;}

My solution is based on bitwise & with inverted previous and current direction code, where direction code can be 2 (1<<1) for character code increase (*s > *(s-1)) or 1 (1<<0) otherwise. Result of this operation became 0 if we use the same direction code as previous and current, i.e. when word is not Bumpy.

UPDATE:

Code for testing:

#include <stdio.h>
#include <string.h>

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

int main(void)
{
    char * Truthy[] = { "ABA", 
                        "ABB", 
                        "BAB",
                        "BUMP",
                        "BALD",
                        "BALDY",
                        "UPWARD",
                        "EXAMINATION",
                        "AZBYCXDWEVFUGTHSIRJQKPLOMN" };
    char * Falsey[] = { "AAA",
                        "BBA",
                        "ACE",
                        "THE",
                        "BUMPY",
                        "BALDING",
                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    int posTestNum = sizeof(Truthy) / sizeof(char *);
    int negTestNum = sizeof(Falsey) / sizeof(char *);
    int i;
    int rate = 0;
    int tests = 0;
    int res = 0;
    printf("Truthy (%d tests):\n", posTestNum);
    for (i = 0; i < posTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Truthy[i], f(Truthy[i]) ? (rate++, "OK") : "Fail");
        r = 0;
    }
    printf("\nFalsey (%d tests):\n", negTestNum);
    for (i = 0; i < negTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Falsey[i], f(Falsey[i]) ? "Fail" : (rate++, "OK"));
        r = 0;
    }
    printf("\n%d of %d tests passed\n", rate, tests);
    return 0;
}

Per meta consensus, functions have to be reusable. That means you cannot reset r to 0 for free, but must do so from within the function.
Dennis

@Dennis You're right, initialization is required, but only for repeated calls. Let's assume that for a single call that works with any data because compiler provide initialisation for global variables
VolAnd

I think you should make the 60 byte solution your main one, since the 57 byte version isn't valid by that meta post I cited.
Dennis

@Dennis Done! +3 bytes
VolAnd

1

PHP, 100 bytes

for($s=$argv[1];$i<strlen($s)-1;$i++)$s[$i]=$s[$i+1]>$s[$i]?r:f;echo str_replace([rr,ff],'',$s)==$s;

Replaces every char of the string (except the last one obviously) with an r for rise or an f for fall and then checks whether rr or ff occur in the string. To avoid that the last remaining character interfers with that, input must be all uppercase.

I'm very unsatisfied with the loop, for example I have a feeling that there must be a way to combine the $i++ into one of the several $is used in the loop, but I failed to find that way. Maybe someone else sees it.

(That's also why I posted my code, despite it being 20 (!) bytes longer than Titus' nice solution.)


0

Java 8, 114 90 bytes

(c,b)->{b=c[0]<c[1];for(int i=2;i<c.length;i++)if(c[i]>c[i-1]!=(b=!b))return 0;return 1;};

Ungolfed test program

public static void main(String[] args) {
    BiFunction<char[], Boolean, Integer> func = (c, b) -> {
        b = c[0] < c[1];
        for (int i = 2; i < c.length; i++) {
            if (c[i] > c[i - 1] != (b = !b)) {
                return 0;
            }
        }
        return 1;
    };

    System.out.println(func.apply("ABCDEFG".toCharArray(), false));
    System.out.println(func.apply("AZBYCXDGEF".toCharArray(), false));
    System.out.println(func.apply("ZXZXZX".toCharArray(), false));
    System.out.println(func.apply("ZXCYZ".toCharArray(), false));
    System.out.println(func.apply("AAA".toCharArray(), false));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.