Đó có phải là một từ Bumpy?


31

(lấy cảm hứng từ thử thách này trên Puzzling - SPOILERS cho câu đố đó ở bên dưới, vì vậy hãy dừng đọc ở đây nếu bạn muốn tự mình giải câu đố đó!)

Nếu một chữ cái trong một từ xuất hiện muộn hơn so với chữ cái trước đó trong từ, chúng ta gọi đó là sự gia tăng giữa hai chữ cái. Mặt khác, kể cả nếu nó cùng một chữ cái , nó được gọi là một mùa thu .

Ví dụ, từ ACEnày có hai lần tăng ( Ađến CCđi E) và không có lần rơi, trong khi THEcó hai lần rơi ( Tđến HHđi E) và không tăng.

Chúng tôi gọi một từ Bumpy nếu chuỗi tăng và giảm xen kẽ. Ví dụ: BUMPđi lên ( Bđến U), giảm ( Uđến M), tăng ( Mđến P). Lưu ý rằng chuỗi đầu tiên không cần phải tăng - BALDđi xuống-tăng-giảm và cũng là Bumpy.

Các thách thức

Đưa ra một từ, đầu ra cho dù đó có phải là Bumpy hay không.

Đầu vào

  • Một từ (không nhất thiết phải là một từ trong từ điển) chỉ bao gồm các chữ cái trong bảng chữ cái ASCII ( [A-Z]hoặc [a-z]), ở bất kỳ định dạng phù hợp nào .
  • Sự lựa chọn của bạn nếu đầu vào là tất cả chữ hoa hoặc tất cả chữ thường, nhưng nó phải nhất quán.
  • Từ này sẽ có ít nhất 3 ký tự.

Đầu ra

Một truthy / falsey giá trị cho dù từ đầu vào là Bumpy (truthy) hay không Bumpy (falsey).

Những quy định

  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

Sự thật:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


Nguy hiểm Điều này sẽ dễ dàng hơn nếu cùng một chữ cái không tăng cũng không giảm.
mbomb007

Tôi không hiểu các ví dụ được cung cấp: nếu BUMPđược liệt kê trong Truthy (tức là Bumpy), tại sao lại BUMPYnằm trong danh sách Falsey? "Tăng và giảm luân phiên" nghĩa là gì? Hai tăng s không thể liên tiếp?
Voland

4
@VolAnd Vâng, điều đó có nghĩa là sự gia tăng luôn được theo sau bởi sự sụp đổ và ngược lại. BUMPYlà giả vì MPYcho hai lần tăng liên tiếp. Nói cách khác, không có chuỗi con có độ dài 3 phải được sắp xếp tăng dần hoặc giảm dần để một từ bị gập ghềnh (ngoài trường hợp đặc biệt có hai chữ cái liên tiếp giống hệt nhau).
Martin Ender

Bạn có thể làm hỏng câu trả lời cho câu hỏi Puzzling.SE để những người khác muốn tự giải quyết nó có thể làm như vậy không?
OldBunny2800

1
@ OldBunny2800 Tôi sẽ không đặt một spoiler đầy đủ vào (Tôi không muốn làm cho thách thức của mình ở đây khó đọc bằng cách ẩn thông tin quan trọng đằng sau một spoiler), nhưng tôi sẽ thêm một số văn bản vào đầu như một cảnh báo. Cảm ơn!
admBorkBork

Câu trả lời:


31

MATL, 4 byte

d0>d

Giải trình:

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

Đây là mục nhập MATL đầu tiên của tôi, vì vậy tôi tự hỏi có bao nhiêu sự cải thiện có thể có từ cổng ngây thơ này từ nỗ lực MATLAB / Octave của tôi (sẽ có @(a)all(diff(diff(a)>0))). Lưu ý rằng điều allnày là không cần thiết bởi vì bất kỳ số 0 nào đều làm cho một mảng sai, vì vậy không có Atrong cổng MATL.


Xem thử thách đã sửa. Có một lỗi đánh máy trong một trường hợp thử nghiệm. Cách tiếp cận của bạn đã đúng. Trên thực tế, d0>dnên hoạt động (bạn không cần Atheo định nghĩa của chúng tôi về sự thật / chim ưng)
Luis Mendo

1
Làm tốt lắm, vượt xa Luis bằng ngôn ngữ của chính mình! Tôi đã thử trước đây và đó không phải là nhiệm vụ dễ dàng. ;)
DJMcMayhem

@DJMcMayhem Haha. Đó là những gì tôi nhận được khi đọc thử thách quá nhanh. Để bảo vệ tôi, nó phản trực giác rằng hai chữ cái bằng nhau là một sự sụp đổ. các trường hợp kiểm tra sai lệch (hiện đã được sửa) cũng không giúp được gì :-)
Luis Mendo

1
@DJMcMayhem Cảm ơn - mặc dù có lẽ tôi đã gặp may mắn, vì tôi thực sự không nghĩ về những chữ cái bằng nhau liên tiếp, nhưng hóa ra đó chính xác là những gì được hỏi ...
Sanchise

1
@immibis Trong MATL (AB) và Octave, vâng. Xem câu trả lời Meta này .
Sanchise

24

JavaScript (ES6), 75 69 63 46 43 byte

Đã lưu 3 byte nhờ Neil:

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

Phá hủy tham số chuỗi thay vì s.slice(1).


Giải pháp trước đó:
Đã lưu 17 byte nhờ vào ETHproductions:

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

Điều gì đã xảy ra từ giải pháp trước từng bước:

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`


Các giải pháp trước đây:
63 byte nhờ vào ETHproductions:

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}

Tất cả các chữ cái trong một từ phải có cùng một trường hợp.


2
Bạn có thể đánh gôn xuống một chút nữa: github.com/ETHproductions/golf/blob/gh-pages/misc/93014.js
ETHproductions

@ETHproductions Tôi có nên đăng nội dung liên kết của bạn không?
Hedi

Bạn có thể nếu bạn muốn :-)
ETHproductions

Có thể !s[2]|...làm giống như s[2]?...:1?
Tít

1
Xin lỗi vì đến bữa tiệc muộn, nhưng với 43 byte tôi đưa cho bạn: f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW, 36 byte tương đương

Đánh xuống bằng cách sử dụng tương đương logic:

chơi gôn

Ung dung:

vô dụng

Đầu tiên chúng ta chuyển đổi thành chữ thường, sau đó đến mảng byte. Cắt bỏ phần tử đầu tiên của mảng byte vì nó không có tiền lệ. Sau đó, đối với từng phần tử trong mảng, hãy kiểm tra xem nó có lớn hơn phần tử trước không (ánh xạ U8 tới ASCII như bạn mong đợi) và lưu trữ kết quả cho lần lặp tiếp theo, cũng như trong một mảng để xem độ gập tổng thể. Nếu kiểm tra boolean hiện tại và trước đó bằng nhau, chúng tôi chấm dứt vòng lặp và nó không bị gập ghềnh. Khác, nó gập ghềnh!


1
Thật là một ngôn ngữ tuyệt vời! Chào mừng đến với PPCG!
DJMcMayhem

1
Cảm ơn! Tôi sẽ không bao giờ cạnh tranh với các câu trả lời 4 byte, nhưng đó là một cách hay để cải thiện kỹ năng của tôi :)
ijustlovemath

Xem tại đây . Điểm của bạn chắc chắnsai và quá mức . Tôi không nghĩ câu trả lời của bạn thực sự là 246450 - 246549 byte.
Erik the Outgolfer

Tôi đã tắt tab Bộ nhớ, vì tôi không biết có một khái niệm về byte tương đương cho LabVIEW. Sẽ đếm chúng và chỉnh sửa câu trả lời sau ngày hôm nay.
ijustlovemath

1
@Erik Tôi đang dùng Firefox trên Windows, nhưng mở nó trên di động cũng phá vỡ mọi thứ. Chỉ cần meta.ppcg.lol hoạt động. Dù sao, điều này là ngoài phạm vi cho ý kiến.
Vụ kiện của Quỹ Monica

8

Python, 56 byte

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

Tất cả các trường hợp thử nghiệm là ở ideone

Kéo qua bộ ba ký tự trong s và kiểm tra rằng tất cả các bộ ba như vậy có cặp trái và phải với các thuộc tính tăng / giảm khác nhau.
Hoạt động cho tất cả chữ hoa hoặc tất cả chữ thường.


6

Hồng ngọc 57 48 byte

Dự kiến ​​đầu vào là tất cả chữ hoa.

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

Xem nó trên repl.it: https://repl.it/D7SB

Giải trình

Biểu thức chính quy /.(?=(.)(.))/khớp với mỗi ký tự theo sau bởi hai ký tự nữa. (?=...)là một cái nhìn tích cực, có nghĩa là chúng tôi phù hợp với hai nhân vật tiếp theo nhưng không "tiêu thụ" chúng như một phần của trận đấu. Bên trong các dấu ngoặc nhọn, $&là văn bản trùng khớp, nhân vật đầu tiên của ba người $1$2là những nhân vật bị bắt bên trong diện mạo. Nói cách khác, nếu chuỗi là "BUMPY", đầu tiên nó sẽ khớp "B"(và đặt nó vào $&) và bắt "U""M"(và đặt chúng vào $1$2). Tiếp theo nó sẽ khớp "U"và chụp "M""P", v.v.

Bên trong khối, chúng tôi kiểm tra xem cặp ký tự đầu tiên ( $&$1) có tăng hay không và ký tự thứ hai ( $1$2) là ngã hoặc ngược lại, giống như hầu hết các câu trả lời khác. ^Biểu thức này trả về truehoặc false, được chuyển đổi thành một chuỗi và được chèn vào vị trí khớp. Kết quả là, ví dụ của chúng tôi "BUMPY"trở thành thế này:

"truetruefalsePY"

Vì chúng tôi biết đầu vào là tất cả chữ hoa, chúng tôi biết "f"sẽ chỉ xảy ra như một phần của "false"!result[?f]cho chúng tôi câu trả lời.


Làm thế nào nó hoạt động?
GreenAsJade

1
@GreenAsJade Tôi đã thêm một lời giải thích cho câu trả lời của mình.
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 từ đề xuất của Scepheo

Đây là một cổng giải pháp của Hedi cho C #. Tôi cũng đã đưa ra một giải pháp đệ quy, nhưng đệ quy không tốt bằng. Giải pháp ban đầu của tôi là dưới đây.

C # gốc của tôi, 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 bằng cách sử dụng 1>0thay vì true.

-3 byte từ đề xuất của Scepheo cho giải pháp cổng ở trên

Gọi chính nó kiểm tra đệ quy rằng tăng / giảm luân phiên mỗi lần.

Ung dung:

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

Có vẻ như người cuối cùng có thể làm mà không cần người ?:vận hành hoặc dấu ngoặc đơn:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo

Trên thực tế, mặc dù tôi không thể kiểm tra điều này, nhưng việc điều khiển con trỏ dường như thậm chí còn khó khăn hơn:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo

@Scepheo Tôi đã nhận được StackOverflowExceptions với các đề xuất đó, nhưng chúng hoạt động bằng cách sử dụng boolean OR ||thay vì bitwise OR |. Cập nhật bài viết, cảm ơn.
sữa

6

C 59 byte

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

Giải pháp trong 70 byte trả về 1 (Đúng) cho trường hợp AAA- "Falsey" đầu tiên trong các ví dụ
VolAnd

Tôi đang thử nghiệm bằng cách sử dụng gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)và tôi nhận được sai cho aaa và vui mừng. Trong phiên bản này, non-zero là falsey, và zero là thật. Thực sự tự hỏi bây giờ nếu điều này được cho phép.
cleblanc

Cuộc gọi f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")được biên dịch trong Visual Studio 2012 trả về giá trị 23có thể được coi là Truenhưng trong câu hỏi giá trị này nằm trong phần "Falsey", vì vậy giá trị được 0mong đợi.
VolAnd

Tôi đã hiểu nhầm những gì được phép cho True và Falsey. Bây giờ tôi đã đọc bài đăng đó và dường như rõ ràng các giá trị phải là gì cho "C".
cleblanc

Đây là định nghĩa tiêu chuẩn của chúng tôi cho sự thật và chim ưng , dựa trên sự đồng thuận của Meta.
admBorkBork



5

Python 2, 88 byte

Giải pháp đơn giản.

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

Dùng thử trực tuyến

Nếu các chữ cái giống nhau không tăng hoặc giảm, giải pháp sẽ là 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

Bao gồm +3 cho -p(mã chứa 'nên -ekhông thể sử dụng)

Cung cấp đầu vào chữ hoa trên 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))

Lấy đầu vào như g('B','U','M','P')và đầu ra 1hoặc0 .

Sử dụng đối số giải nén để lấy ba chữ cái đầu tiên và kiểm tra xem hai chữ cái đầu tiên có so sánh khác với hai chữ cái thứ hai không. Sau đó, đệ quy trên phần còn lại, sử dụng phép nhân cho and.


Đầu vào golf đẹp. ;-)
admBorkBork

5

Thạch , 6 5 byte

-1 byte nhờ @Dennis (sử dụng mức giảm tích lũy)

<2\IẠ

Tất cả các trường hợp thử nghiệm đều có tại TryItOnline

Làm sao?

<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

Hoạt động cho tất cả chữ hoa hoặc tất cả chữ thường.


4

Japt, 8 byte

Uä> ä- e

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

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

Tương tự như giải pháp của tôi. Trừ 11x ngắn hơn. : P
mbomb007

4

C # 105 104 byte

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

Giải pháp 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;}

Dùng thử trực tuyến

Sử dụng một mảng các ký tự được lưu một byte vì không gian có thể được bỏ qua sau dấu ngoặc. f(string x)đấu vớif(char[]x)

Đó là 101 byte nếu tôi có thể trả về int 1/0 thay vì 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

Tôi nghi ngờ tôi có thể có được một khối nhỏ hơn nếu tôi thoát khỏi cấu trúc "ở đâu", nhưng tôi có thể bị mắc kẹt với zipWith.

Điều này hoạt động bằng cách lập danh sách tăng (Đúng) và giảm (Sai), sau đó lập danh sách nếu các mục nhập liền kề trong danh sách này khác nhau


Đây là nỗ lực đầu tiên của tôi tại một trong những điều này, vì vậy tôi sẽ trải qua quá trình suy nghĩ của mình trong trường hợp tôi đã sai lầm khủng khiếp ở đâu đó.

Phiên bản Ungolfed (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

Rút ngắn tên, xóa thông tin loại (100 byte)

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

Di chuyển h vào hàm chính vì nó chỉ được sử dụng một lần (86 byte)

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

Nhận ra rằng Bumps và growFall tương tự nhau đến mức trừu tượng (73 byte)

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

Lưu ý rằng (đuôi y) ngắn hơn ya @ (y: ys) (70 byte)

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

Dọn dẹp; xóa các khoảng trắng không cần thiết (52 byte)

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

... và tôi vừa nhận thấy một câu trả lời ngắn hơn của Haskell đã được đăng trước đó về cơ bản là điều tương tự. Tôi khủng khiếp khi phát hiện ra những điều.
Teron

Bạn có nghĩa là một trong đó không làm việc? ;-) Bạn có thể sử dụng g h=tail>>=zipWith hvà biến nó thành một chức năng toàn cầu để tránh wheretừ khóa.
Christian Sievers

@ChristianSievers Đã sửa nó và tôi chỉ nhận thấy câu trả lời này hiện giống hệt như câu trả lời của tôi, khiến câu trả lời của tôi phù hợp hơn với nhận xét cho câu hỏi này.
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;}

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

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

@TimmyD Hmm, vậy nó tăng khi nào a > b, nhưng giảm khi nào a <= b, thay vì ><?
Kevin Cruijssen

@TimmyD Ok, nó đã được sửa và thậm chí còn tiết kiệm được 3 byte. :)
Kevin Cruijssen

1
bạn có thể xác định lại phương thức của mình để chấp nhận char[]để bạn không phải chuyển đổi chuỗi đầu vào thành mảng char. nên tiết kiệm một vài byte. PS: java ftw!
p336

1
Có lẽ bạn có nghĩa là để thay đổi String s-> char[]z?

1
Bạn có thể trả về một truthyhoặc một falseygiá trị, vì vậy hãy đặt phương thức của bạn thành int và trả về 1 hoặc 0 :) .. Đặt bạn xuống 117 byte
Shaun Wild

3

PowerShell v2 +, 83 byte

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

Một chút của một cách tiếp cận khác nhau. Vòng này thông qua các đầu vào $n, mỗi lần lặp nhìn thấy cho dù các nhân vật trước đây $n[$_-1]-less than các nhân vật hiện tại $n[$_], sau đó đúc kết quả của mà nhà khai thác Boolean đến một int với +. Những cái đó được -joined với nhau thành một chuỗi, được lưu trữ vào $a. Sau đó chúng tôi kiểm tra xem $a-eqphải $avới bất kỳ chuỗi con nào 00hay không 11.


3

Python 2.7, 84 byte

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

Trả về 1 cho gập ghềnh, 0 cho khác

Đã học một số thứ hay ho với bitwise & và ^.
Bắt đầu với boolean b xác định cặp đầu tiên là lên / xuống, sau đó kiểm tra và lật b cho mỗi cặp sau.
o lật sang sai nếu thử nghiệm thất bại và dính.
Yêu cầu trích dẫn xung quanh đầu vào (+4 byte cho raw_input () nếu điều đó phá vỡ một số quy tắc)

Kiểm tra nó


3

05AB1E , 9 byte

SÇ¥0›¥_O_

Giải trình

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

Hãy thử trực tuyến!


2

Python 2.7 (một lần nữa, 84 83 byte)

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

Hoặc, 78 77 byte mà không cần in.

Nhân tiện, ví dụ Python 2.7 56 byte ở trên phá vỡ, ví dụ, "abbab" hoặc bất kỳ đầu vào nào khác có các ký tự lặp lại. Đừng bận tâm, đã không đọc hướng dẫn. Sửa đổi.

Được rồi, xuống còn 83. Mặc dù vậy, bộ ba này đẹp hơn.


Đây là một số lời khuyên cho bạn. 1. Xóa một số khoảng trắng a(x)if x else[]. 2. Sử dụng lambda thay vì a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Sử dụng lambda ở cuối thay vì in. lambda s:len(set(a(s)))>14. nếu len(set(a(s)))không lớn hơn 1, so với mức giả mạo, vì vậy bạn có thể cất cánh>1
DJMcMayhem

2

CJam , 15 byte

l2ew::<2ew::^:*

Hãy thử trực tuyến!(Là một bộ thử nghiệm được phân tách bằng nguồn cấp dữ liệu.)

Giải trình

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 byte

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

hoặc là

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

đầu ra trống cho sai, 1 cho đúng

hoặc cách tiếp cận đệ quy Hedi hungs được chuyển và một chút golf cho 70 byte:

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

Trên thực tế, điều này sẽ tái diễn vô hạn cho những từ gập ghềnh, nhưng không!


2

Haskell, 30 37 byte

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

Sử dụng:

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]

Điều đó không chấp nhận "hói", foldl1(/=)không làm những gì bạn nghĩ nó làm.
Christian Sievers

@ChristianSievers Auch, bạn nói đúng. Cảm ơn những người đứng đầu
BlackCap

2

PHP 7, 137 118 byte

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

Đầu ra trống cho Bumpy, 0cho Không Bumpy.

Đây là nỗ lực đầu tiên của tôi trong môn đánh gôn và tôi phải cải thiện rất nhiều, nhưng đó là một phương pháp tuyệt vời để học những điều mới cho tôi. Tôi cũng muốn thử thách bản thân mình bằng cách sử dụng Toán tử tàu vũ trụ PHP 7 mới có vẻ rất thú vị.

Dù sao, tôi không hài lòng về điều đó, trước hết vì thực tế là tôi phải thêm một phần bổ sung if(isset($s[$i+2]))để kiểm tra xem biến có tồn tại không vì tôi không tìm thấy cách giải quyết khác cho vấn đề, nhưng bây giờ là lúc này. (Lưu ý: Tôi đã sửa lỗi đó đơn giản bằng cách thay đổi strlen($s)-1thành strlen($s)-2, tôi thực sự không thể thấy điều đó trước khi ...).

Mã kiểm tra:

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

Kiểm tra trực tuyến


Xin chào, và chào mừng đến với PPCG! Bài đăng đầu tiên tuyệt vời!
NoOneIsHãy

Chào mừng đến với PPCG! Đẹp bài đầu tiên. Kiểm tra Mẹo cho PHP để biết thêm một số gợi ý chơi gôn.
admBorkBork

1

Javascript ES6, 100 byte

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}

Hãy thử nó ở đây:

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

Ồ, hai người đã đánh bại tôi tới 40 byte ... bất cứ điều gì


Gợi ý "A"<"B":, vì vậy bạn không cần phải lấy mã số của ký tự.
Sản xuất ETH

Ngoài ra, điều này trả về 1cho BUMPY(hoặc bất cứ điều gì khác có chứa cả tăng và giảm).
Sản xuất ETH

Điều này dường như không hoạt động đúng.
admBorkBork

1

Con trăn 3 148 139 127 byte

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]

mã kiểm tra

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)

tôi thực sự bị hút vào #facepalm này
Jeffrey04

Chào mừng đến với PPCG! Kiểm tra Mẹo chơi gôn trong Python và lấy cảm hứng từ các câu trả lời khác.
admBorkBork

1

C, 65 57 60 byte

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

là sửa chữa của

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

chỉ hoạt động chính xác với bất kỳ dữ liệu nào khi gọi hàm duy nhất (khi biến toàn cục rđược khởi tạo về 0).

Nhưng trong mọi trường hợp, điều này ngắn hơn giải pháp trước đó (65 byte) do sử dụng forthay vì while. Nhưng trước đây (sau đây) dễ hiểu hơn một chút:

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

Giải pháp của tôi dựa trên bitwise &với mã hướng hiện tại và mã đảo ngược, trong đó mã hướng có thể là 2( 1<<1) để tăng mã ký tự (*s > *(s-1) ) hoặc 1( 1<<0) nếu không. Kết quả của hoạt động này trở thành 0 nếu chúng ta sử dụng cùng mã hướng như trước và hiện tại, tức là khi từ không phải là Bumpy.

CẬP NHẬT:

Mã kiểm tra:

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

Theo sự đồng thuận meta, các chức năng phải được tái sử dụng . Điều đó có nghĩa bạn không thể đặt lại rđể 0cho miễn phí, nhưng phải làm như vậy từ bên trong hàm.
Dennis

@Dennis Bạn nói đúng, việc khởi tạo là bắt buộc, nhưng chỉ đối với các cuộc gọi lặp lại. Giả sử rằng với một cuộc gọi duy nhất hoạt động với bất kỳ dữ liệu nào vì trình biên dịch cung cấp khởi tạo cho các biến toàn cục
VolAnd

Tôi nghĩ bạn nên biến giải pháp 60 byte thành giải pháp chính của mình, vì phiên bản 57 byte không hợp lệ bởi bài đăng meta mà tôi đã trích dẫn.
Dennis

@Dennis Xong! +3 byte
VolAnd

1

PHP, 100 byte

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;

Thay thế mọi char của chuỗi (trừ cái cuối cùng rõ ràng) bằng một r cho tăng hoặc một fcho mùa thu và kiểm tra sau đó cho dù rrhay ffxảy ra trong chuỗi. Để tránh rằng ký tự còn lại cuối cùng can thiệp vào đó, đầu vào phải là tất cả chữ hoa.

Tôi rất không hài lòng với vòng lặp, ví dụ tôi có cảm giác rằng phải có cách kết hợp $i++thành một trong nhiều $is được sử dụng trong vòng lặp, nhưng tôi đã thất bại trong việc tìm ra cách đó. Có lẽ người khác nhìn thấy nó.

(Đó cũng là lý do tại sao tôi đăng mã của mình, mặc dù nó dài hơn 20 (!) Byte so với giải pháp tốt đẹp của Titus.)


0

Java 8, 114 90 byte

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

Chương trình thử nghiệm

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));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.