でこぼこの言葉ですか?


31

(パズルに関するこの挑戦に触発された- そのパズルのネタバレは下にあるので、自分でパズルを解決したい場合はここで読むのをやめてください!)

単語内の文字が単語内の前の文字よりもアルファベット順に遅れている場合、2つの文字の間の上昇と呼びます。それ以外の場合、同じ文字の場合も含めてfallと呼ばれます。

たとえば、単語にACEは2つの上昇(Ato CおよびCto E)があり、下降はありませんが、THE2つの下降(Tto HおよびHto E)および上昇はありません。

立ち上がりと立ち下がりの順序が交互に変わる場合、「バンピー」と呼びます。たとえば、BUMP上昇(Bto U)、下降(Uto M)、上昇(Mto P)になります。最初のシーケンスは上昇である必要はないことに注意してください- BALD下降-上昇-下降になり、またバンピーです。

チャレンジ

単語が与えられたら、バンピーかどうかを出力します。

入力

  • 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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


ダンギット。同じ文字が上昇でも下降でもない場合、これは簡単です。
mbomb007

提供された例を理解していません:BUMPがTruthy(つまりBumpy)にリストされている場合、なぜFalseyリストに含まBUMPYれているのですか?「上昇と下降の交互」とはどういう意味ですか?2つのライズを連続して行うことはできませんか?
VolAnd

4
@VolAndはい、それは、上昇の後に常に下降が続き、その逆も同様であることを意味します。2つの連続した上昇を与えるBUMPYためMPY、虚偽です。つまり、単語がでこぼこになるために、長さ3の部分文字列を昇順または降順で並べ替える必要はありません(2つの連続した文字が同一である特別な場合を除く)。
マーティンエンダー

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ゼロは配列を偽にするため、は不要であることに注意してくださいA。MATLポートにはありません。


修正されたチャレンジを参照してください。テストケースにタイプミスがありました。あなたのアプローチは正しかった。実際、d0>dうまくいくはずです(A真実/偽の定義に従っている必要はありません)
ルイスメンドー

1
素敵な作品、彼の母国語でルイスを凌ぐ!私は以前に試しましたが、それは簡単なことではありません。;)
DJMcMayhem

@DJMcMayhemハハ。それは私が挑戦をあまりにも早く読んで得たものです。私の弁護では、2つの等しい文字が転落であるというのは直観に反しています。そして、(現在修正されている)誤解を招くテストケースも助けにはなりませんでした:-)
ルイスメンドー

1
@DJMcMayhemありがとう-運が良かったかもしれませんが、連続する等しい文字については実際には考えていなかったので、それはまさに求められていたものであることが判明しました...
16

1
@immibis MATL(AB)およびOctaveでは、はい。このメタの回答をご覧ください。
-Sanchises

24

JavaScript(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)


以前のソリューション:
ETHproductionsのおかげで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`


以前のソリューション:
ETHproductionsのおかげで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リンクのコンテンツを投稿すべきですか?
エディ

必要に応じてできます:-)
ETHproductions

!s[2]|...と同じことができますs[2]?...:1か?
タイタス

1
申し訳ありませんが、43バイトのために、パーティーに遅刻のために私はあなたを与える:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
ニール

14

LabVIEW、36相当バイト

論理的等価性を使用してゴルフダウン:

golfed

ゴルフをしていない:

ungolfed

まず小文字に変換してから、バイト配列に変換します。バイト配列には前例がないため、バイト配列の最初の要素を削除します。次に、配列内の各要素について、前の要素よりも大きいかどうかを確認し(U8文字は予想どおりASCIIにマップされます)、次の反復の結果と、全体的な凹凸を表示する配列に結果を保存します。現在のブールチェックと前のブールチェックが等しい場合、ループを終了します。そうでなければ、でこぼこです!


1
なんてクールな言語!PPCGへようこそ!
DJMcMayhem

1
ありがとう!私は4バイトの答えと決して競うことはありませんが、それは私のスキルを向上させる良い方法です:)
ijustlovemath

こちらをご覧ください。あなたの得点は間違いであり、過度に過剰です。あなたの答えは本当に246450-246549バイトだとは思いません。
エリックアウトゴルファー

LabVIEWに相当するバイトの概念があることを知らなかったため、「メモリ」タブから移動していました。本日中にそれらを数え、回答を編集します。
ijustlovemath

1
@Erik私はWindows上のFirefoxを使用していますが、モバイルでそれを開くと問題が発生します。ジャストmeta.ppcg.lolの作品。とにかく、これはコメントの範囲外です。
ファンドモニカの訴訟

8

Python、56バイト

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

すべてのテストケースはideoneにあります

s内の文字のトリプルを圧縮し、そのようなトリプルすべてに異なるライズ/フォールプロパティを持つ左右のペアがあることをテストします。
すべて大文字またはすべて小文字で動作します。


6

ルビー、57 48バイト

入力はすべて大文字である必要があります。

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

repl.itで参照してください:https ://repl.it/D7SB

説明

正規表現は/.(?=(.)(.))/、その後にさらに2文字が続く各文字に一致します。(?=...)は先読みです。つまり、後続の2文字を照合しますが、照合の一部として「消費」することはありません。中括弧の内部では、$&マッチしたテキスト-3-との最初の文字である$1$2先読み内部の捕獲文字です。文字列がある場合は、他の言葉では、"BUMPY"それは最初にマッチします"B"(と、それを置く$&)と、キャプチャ"U""M"(およびそれらを置く$1$2)。次は、それが一致する"U"と捉える"M""P"、というように。

ブロック内では、他のほとんどの回答のように、最初のペアの文字($&および$1)が上昇であり、2番目の($1および$2)が下降であるか、その逆であるかを確認します。この^式はtrueorを返しますfalse。これは文字列に変換され、一致する場所に挿入されます。その結果、例"BUMPY"は次のようになります。

"truetruefalsePY"

我々は、入力がすべて大文字である知っているので、私たちは知っている"f"唯一の一環として行われます"false"し、!result[?f]私たちの答えを与えます。


どのように機能しますか?
GreenAsJade

1
@GreenAsJade答えに説明を追加しました。
ヨルダン

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

@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(True)を返しますAAA-例の最初の「
Falsey

私はを使用gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)してテストを行っていますが、aaaに対してfalseになり興奮しています。このバージョンでは、非ゼロは偽であり、ゼロは真実です。実際にこれが許可されているかどうか疑問に思う。
cleblanc

f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")Visual Studio 2012でコンパイルされた呼び出しは、23扱うことができる値を返しますTrueが、質問ではこの値は「Falsey」セクションにあるため、値が0期待されます。
VolAnd

TrueとFalseyに許可されていることを誤解しました。今、私はその投稿を読みましたが、「C」の値がどうあるべきかは明らかです。
cleblanc

以下は、メタコンセンサスに基づく、真実と偽の標準的な定義です。
AdmBorkBork



5

Python 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

Perl、34バイト

+3を含む-p(コードには含まれている'ため-e使用できません)

STDINに大文字を入力します。

bump.pl <<< AAA

bump.pl

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

5

Python、51バイト

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

またはのような入力g('B','U','M','P')を受け取り、1またはを出力します0

Uses argument unpacking to take the first three letters and check if the first two compare differently from the second two. Then, recurses on the remainder, using multiplication for and.


Nice input golf. ;-)
AdmBorkBork

5

Jelly, 6 5 bytes

-1 byte thanks to @Dennis (use a cumulative reduction)

<2\IẠ

All test cases are at TryItOnline

How?

<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

Works for either all uppercase or all lowercase.


4

Japt, 8 bytes

Uä> ä- e

Test it online!

How it works

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

Same as my solution. Except 11x shorter. :P
mbomb007

4

C# 105 104 Bytes

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 bytes Solution:

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;}

Try it online

Using an array of chars saved one byte since the space can be omitted after the brackets. f(string x) vs f(char[]x)

It is 101 bytes if I can return an int 1/0 instead of bool true/false

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

Haskell, 52 bytes

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

I suspect I could get this a chunk smaller if I managed to get rid of the "where" construct, but I'm probably stuck with zipWith.

This works by making a list of the rises (True) and falls (False), then making a list of if the ajacent entries in this list are different


This is my first attempt at one of these, so I'll go through my thought process in case I've gone horribly wrong somewhere.

Ungolfed Version (168 bytes)

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

Shorten names, remove type information (100 bytes)

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

Move h into the main function as it is only used once (86 bytes)

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

Realise that areBumps and riseFall are similar enough to abstract (73 bytes)

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

Note that (tail y) is shorter than ya@(y:ys) (70 bytes)

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

Tidy up; remove unneeded spaces (52 bytes)

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

... and I've just noticed a shorter Haskell answer that was posted before mine that does basically the same thing. I am terrible at spotting things.
Teron

You mean the one that doesn't work? ;-) You may use g h=tail>>=zipWith h and make it a global function to avoid the where keyword.
Christian Sievers

@ChristianSievers Fixed it, and I just noticed this answer which now does exactly the same thing as mine, rendering my answer better suited as a comment to this one.
BlackCap

4

Java 7, 157 153 150 125 117 bytes

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;}

Ungolfed & test cases:

Try it here.

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()) + ", ");
  }
}

Output:

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.