Apakah ini Kata yang Sulit?


31

(Terinspirasi oleh tantangan ini pada membingungkan - SPOILER untuk teka-teki di bawah ini, jadi berhentilah membaca di sini jika Anda ingin menyelesaikan teka-teki itu sendiri!)

Jika sebuah huruf dalam sebuah kata muncul secara alfabet lebih lambat dari huruf sebelumnya dalam kata tersebut, kami menyebutnya kenaikan antara kedua huruf tersebut. Kalau tidak, termasuk jika itu surat yang sama , itu disebut jatuh .

Misalnya, kata ACEmemiliki dua naik ( Ake Cdan Cke E) dan tidak ada jatuh, sedangkan THEmemiliki dua jatuh ( Tke Hdan Hke E) dan tidak ada naik.

Kami menyebut kata Bumpy jika urutan naik dan turun bergantian. Sebagai contoh, BUMPnaik naik ( Bke U), jatuh ( Uke M), naik ( Mke P). Perhatikan bahwa deret pertama tidak perlu naik - BALDturun-naik-turun dan juga bergelombang.

Tantangan

Diberi kata, keluaran apakah itu Bumpy atau tidak.

Memasukkan

  • Sebuah kata (tidak harus kata kamus) yang terdiri dari alfabet ASCII ( [A-Z]atau [a-z]) saja, dalam format apa pun yang sesuai .
  • Pilihan Anda jika input semuanya huruf besar atau semua huruf kecil, tetapi harus konsisten.
  • Panjang kata setidaknya 3 karakter.

Keluaran

Nilai truthy / falsey untuk apakah kata input Bumpy (truthy) atau tidak Bumpy (falsey).

Aturan

  • Program lengkap atau fungsi dapat diterima.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

Benar:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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


Dangit. Ini akan lebih mudah jika huruf yang sama tidak naik atau turun.
mbomb007

Saya tidak mengerti contoh yang diberikan: jika BUMPtercantum dalam Truthy (yaitu Bumpy), mengapa BUMPYada dalam daftar Falsey? Apakah yang dimaksud dengan "naik dan turun secara bergantian"? Dua naik tidak bisa berturut-turut?
VolAnd

4
@ Volume Ya, itu berarti kenaikan selalu diikuti oleh jatuh dan sebaliknya. BUMPYpalsu karena MPYmemberikan dua kenaikan berturut-turut. Dengan kata lain, tidak ada substring dengan panjang 3 harus disortir naik atau turun agar kata menjadi bergelombang (terlepas dari kasus khusus di mana dua huruf berurutan identik).
Martin Ender

Bisakah Anda spoiler jawaban untuk pertanyaan Puzzling.SE sehingga orang lain yang ingin menyelesaikannya sendiri dapat melakukannya?
OldBunny2800

1
@ OldBunny2800 Saya tidak akan memasukkan spoiler penuh (Saya tidak ingin membuat tantangan saya di sini sulit dibaca dengan menyembunyikan informasi penting di belakang spoiler), tetapi saya akan menambahkan beberapa teks tambahan ke atas sebagai peringatan. Terima kasih!
AdmBorkBork

Jawaban:


31

MATL, 4 byte

d0>d

Penjelasan:

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

Ini adalah entri MATL pertama saya, jadi saya bertanya-tanya berapa banyak perbaikan yang dapat terjadi dari port naif ini dari upaya MATLAB / Oktaf saya (yang akan menjadi @(a)all(diff(diff(a)>0))). Perhatikan bahwa alltidak perlu karena sembarang nol membuat array salah, jadi tidak ada Adi port MATL.


Lihat tantangan yang diperbaiki. Ada kesalahan ketik dalam test case. Pendekatan Anda benar. Bahkan, d0>dharus bekerja (Anda tidak perlu Asesuai definisi kami tentang kebenaran / falsey)
Luis Mendo

1
Kerja bagus, mengalahkan Luis dalam bahasanya sendiri! Saya sudah mencoba sebelumnya, dan itu bukan tugas yang mudah. ;)
DJMcMayhem

@DJMcMayhem Haha. Itulah yang saya dapatkan karena membaca tantangan terlalu cepat. Dalam pembelaan saya, kontra-intuitif bahwa dua huruf yang sama adalah jatuh. Dan kasus-kasus tes yang menyesatkan (sekarang dikoreksi) juga tidak membantu :-)
Luis Mendo

1
@DJMcMayhem Terima kasih - walaupun mungkin saya hanya beruntung, karena saya tidak benar-benar berpikir tentang huruf yang sama berturut-turut, tapi ternyata persis seperti yang diminta ...
Sanchises

1
@immibis Dalam MATL (AB) dan Oktaf, ya. Lihat jawaban Meta ini .
Sanchises

24

JavaScript (ES6), 75 69 63 46 43 byte

Disimpan 3 byte berkat Neil:

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

Merusak parameter string sebagai ganti s.slice(1).


Solusi sebelumnya:
Disimpan 17 byte berkat produk ETH:

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

Apa yang terjadi dari solusi sebelumnya langkah demi langkah:

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`


Solusi sebelumnya:
63 byte berkat produk ETH:

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 byte:

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 byte:

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

Semua huruf dalam satu kata harus memiliki huruf yang sama.


2
Anda dapat menurunkannya sedikit lebih jauh: github.com/ETHproductions/golf/blob/gh-pages/misc/93014.js
ETHproductions

@ ETHproductions Haruskah saya memposting konten tautan Anda?
Hedi

Anda dapat jika Anda ingin :-)
ETHproduk

Bisakah !s[2]|...melakukan hal yang sama s[2]?...:1?
Titus

1
Maaf karena terlambat ke pesta, tetapi untuk 43 byte saya beri Anda:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW, 36 byte setara

Golf turun menggunakan kesetaraan logis:

golfed

Tidak Disatukan:

ungolfed

Pertama kita konversi ke huruf kecil, kemudian ke byte array. Potong elemen pertama dari array byte karena tidak memiliki preseden. Kemudian, untuk setiap elemen dalam array, periksa apakah lebih besar dari yang sebelumnya (char char U8 ke ASCII seperti yang Anda harapkan) dan simpan hasilnya untuk iterasi berikutnya, serta dalam array untuk melihat keseluruhan kekenyalan. Jika boolean saat ini dan sebelumnya sama, kami mengakhiri loop dan itu tidak bergelombang. Lain, ini bergelombang!


1
Bahasa yang sangat keren! Selamat datang di PPCG!
DJMcMayhem

1
Terima kasih! Saya tidak akan pernah bersaing dengan jawaban 4 byte, tetapi ini adalah cara yang bagus untuk meningkatkan keterampilan saya :)
ijustlovemath

Lihat di sini . Skor Anda jelas salah dan terlalu berlebihan . Saya tidak berpikir jawaban Anda benar-benar 246450 - 246549 byte.
Erik the Outgolfer

Saya keluar dari tab Memory, karena saya tidak tahu ada konsep byte yang setara untuk LabVIEW. Akan menghitungnya dan mengedit jawaban hari ini.
ijustlovemath

1
@Erik Saya menggunakan Firefox di Windows, tetapi membukanya di ponsel juga merusak banyak hal. Hanya meta.ppcg.lol berfungsi. Bagaimanapun, ini di luar ruang untuk komentar.
Gugatan Dana Monica

8

Python, 56 byte

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

Semua test case ada di ideone

Ritsleting tiga kali lipat karakter dalam s dan tes bahwa semua tiga kali lipat tersebut memiliki pasangan kiri dan kanan dengan sifat naik turun yang berbeda.
Berfungsi untuk semua huruf besar atau kecil.


6

Ruby, 57 48 byte

Diharapkan input semua huruf besar.

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

Lihat di repl.it: https://repl.it/D7SB

Penjelasan

Ekspresi reguler /.(?=(.)(.))/cocok dengan setiap karakter yang diikuti oleh dua karakter lagi. (?=...)adalah lookahead positif, artinya kami cocok dengan dua karakter berikutnya tetapi jangan "mengkonsumsinya" sebagai bagian dari pertandingan. Di dalam kurung kurawal, $&ada teks yang cocok — karakter pertama dari ketiganya — $1dan $2adalah karakter yang ditangkap di dalam lookahead. Dengan kata lain, jika stringnya adalah "BUMPY", pertama-tama akan cocok "B"(dan memasukkannya $&) dan menangkap "U"dan "M"(dan menempatkannya di $1dan $2). Selanjutnya itu akan cocok "U"dan menangkap "M"dan "P", dan seterusnya.

Di dalam blok kami memeriksa apakah pasangan karakter pertama ( $&dan $1) naik dan yang kedua ( $1dan $2) jatuh atau sebaliknya, seperti sebagian besar jawaban lainnya. ^Ekspresi ini mengembalikan trueatau false, yang akan dikonversi ke string dan disisipkan di tempat pertandingan. Hasilnya, contoh kita "BUMPY"menjadi ini:

"truetruefalsePY"

Karena kita tahu input semua huruf besar, kita tahu "f"hanya akan terjadi sebagai bagian dari "false"dan !result[?f]memberi kita jawaban kita.


Bagaimana cara kerjanya?
GreenAsJade

1
@GreenAsJade Saya telah menambahkan penjelasan untuk jawaban saya.
Jordan

6

C #, 64 63 55 byte

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

-8 byte dari saran Scepheo

Ini adalah port solusi Hedi untuk C #. Saya juga menemukan solusi rekursif, tetapi rekursi itu tidak sebaik itu. Solusi asli saya ada di bawah ini.

My Original C #, 96 94 91 byte

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

-2 byte dengan menggunakan 1>0bukan true.

-3 byte dari saran Scepheo untuk solusi port di atas

Panggilan itu sendiri secara rekursif memeriksa bahwa naik / turun bergantian setiap kali.

Tidak Disatukan:

// 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)
;

Sepertinya yang terakhir dapat dilakukan tanpa ?:operator atau tanda kurung:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo

Sebenarnya, meskipun saya tidak bisa menguji ini, memanipulasi pointer itu sendiri tampak lebih sulit:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo

@ Scepheo Saya mendapat StackOverflowExceptions dengan saran-saran itu, tetapi mereka bekerja menggunakan boolean ATAU ||bukannya bitwise ATAU |. Memperbarui pos, terima kasih.
susu

6

C 59 Bytes

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

Solusi dalam 70 byte mengembalikan 1 (Benar) untuk kasus AAA- "Falsey" pertama dalam contoh
VolAnd

Saya menguji menggunakan gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)dan saya mendapatkan palsu untuk aaa dan bersemangat. Dalam versi ini yang bukan nol adalah falsey, dan nol adalah benar. Sebenarnya bertanya-tanya sekarang apakah ini diizinkan.
cleblanc

Panggilan yang f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")dikompilasi dalam Visual Studio 2012 mengembalikan nilai 23yang dapat diperlakukan sebagai Truetetapi dalam pertanyaan nilai ini di bagian "Falsey", jadi nilai yang 0diharapkan.
VolAnd

Saya salah memahami apa yang diizinkan untuk True dan Falsey. Sekarang saya sudah membaca posting itu dan tampak jelas nilai apa yang harus untuk "C".
cleblanc

Inilah definisi standar kami untuk kebenaran dan kepalsuan , berdasarkan pada konsensus Meta.
AdmBorkBork

5

Jelly , 6 byte

OI>0IẠ

Berdasarkan jawaban @sanchises .

Cobalah online! atau Verifikasi semua.

Penjelasan

OI>0IẠ  Input: string S
O       Convert each char in S to an ordinal
 I      Get the increments between each pair
  >0    Test if each is positive, 1 if true else 0
    I   Get the increments between each pair
     Ạ  Test if the list doesn't contain a zero, 1 if true else 0


5

Python 2, 88 byte

Solusi sederhana.

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:]))

Cobalah online

Jika huruf yang sama berturut-turut bukan naik atau turun, solusinya akan menjadi 79 byte:

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 byte

Termasuk +3 untuk -p(kode mengandung 'jadi -etidak bisa digunakan)

Berikan input huruf besar pada STDIN:

bump.pl <<< AAA

bump.pl

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

5

Python, 51 byte

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

Mengambil input like g('B','U','M','P')dan output 1atau 0.

Gunakan argumen membongkar untuk mengambil tiga huruf pertama dan memeriksa apakah dua yang pertama membandingkan secara berbeda dari dua yang kedua. Kemudian, muncul kembali pada sisanya, menggunakan perkalian untuk and.


Input golf yang bagus. ;-)
AdmBorkBork

5

Jelly , 6 5 byte

-1 byte terima kasih kepada @Dennis (gunakan reduksi kumulatif)

<2\IẠ

Semua test case ada di TryItOnline

Bagaimana?

<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

Berfungsi untuk semua huruf besar atau kecil.


4

Japt, 8 byte

Uä> ä- e

Uji secara online!

Bagaimana itu bekerja

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

Sama seperti solusi saya. Kecuali 11x lebih pendek. : 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;}

Solusi 105 byte:

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

Cobalah online

Menggunakan array karakter yang disimpan satu byte karena ruang dapat dihilangkan setelah tanda kurung. f(string x)vs.f(char[]x)

Ini adalah 101 byte jika saya dapat mengembalikan int 1/0 bukannya 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 byte

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

Saya menduga saya bisa mendapatkan potongan ini lebih kecil jika saya berhasil menyingkirkan konstruksi "di mana", tapi saya mungkin terjebak dengan zipWith.

Ini bekerja dengan membuat daftar naik (Benar) dan jatuh (Salah), kemudian membuat daftar jika entri yang berdekatan dalam daftar ini berbeda


Ini adalah upaya pertama saya di salah satu dari ini, jadi saya akan pergi melalui proses pemikiran saya jika saya salah besar di suatu tempat.

Versi Tidak Digubah (168 byte)

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

Persingkat nama, hapus informasi jenis (100 byte)

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

Pindahkan h ke fungsi utama karena hanya digunakan sekali (86 byte)

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

Sadarilah bahwa Benjolan dan riseFall cukup mirip dengan abstrak (73 byte)

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

Perhatikan bahwa (ekor y) lebih pendek dari ya @ (y: ys) (70 byte)

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

Merapikan; hapus spasi yang tidak dibutuhkan (52 byte)

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

... dan saya baru saja melihat jawaban Haskell pendek yang diposting sebelum saya yang pada dasarnya melakukan hal yang sama. Saya buruk dalam hal menemukan sesuatu.
Teron

Maksudmu yang tidak bekerja? ;-) Anda dapat menggunakan g h=tail>>=zipWith hdan menjadikannya fungsi global untuk menghindari wherekata kunci.
Christian Sievers

@ChristianSievers Memperbaikinya, dan saya baru saja memperhatikan jawaban ini yang sekarang melakukan hal yang persis sama dengan milik saya, menjadikan jawaban saya lebih cocok sebagai komentar untuk yang satu ini.
BlackCap

4

Java 7, 157 153 150 125 117 byte

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

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

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

@ TimmyD Hmm, jadi naik kapan a > b, tapi jatuh kapan a <= b, bukannya >dan <?
Kevin Cruijssen

@ TimmyD Oke, sudah diperbaiki, dan bahkan menghemat 3 byte. :)
Kevin Cruijssen

1
Anda dapat mendefinisikan kembali metode Anda untuk menerima char[]sehingga Anda tidak perlu mengubah string input Anda menjadi array char. yang seharusnya menghemat beberapa byte. PS: java ftw!
peech

1
Apakah Anda mungkin bermaksud mengubah 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));
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.