มันเป็นคำที่เป็นหลุมเป็นบ่อหรือไม่?


31

(แรงบันดาลใจจากความท้าทายนี้ในเรื่อง Puzzling - สปอยเลอร์สำหรับปริศนานั้นอยู่ด้านล่างดังนั้นหยุดอ่านที่นี่ถ้าคุณต้องการแก้ปริศนานั้นด้วยตัวคุณเอง!)

หากตัวอักษรในคำเกิดขึ้นตามตัวอักษรช้ากว่าตัวอักษรก่อนหน้าในคำนั้นเราเรียกว่าการเพิ่มขึ้นระหว่างตัวอักษรสองตัว มิฉะนั้นรวมทั้งถ้าหากมันเป็นตัวอักษรเดียวกันก็เรียกว่าฤดูใบไม้ร่วง

ยกตัวอย่างเช่นคำว่าACEมีสองเพิ่มขึ้น ( AไปCและCไปE) และไม่มีการตกอยู่ในขณะที่THEมีสองน้ำตก ( TไปHและHไปE) และไม่มีการเพิ่มขึ้น

เราเรียกคำว่าBumpyหากลำดับของการเพิ่มขึ้นและตกสลับกัน ตัวอย่างเช่นBUMPเพิ่มขึ้น ( Bเป็นU) ตก ( Uเป็นM) เพิ่มขึ้น ( Mเป็นP) โปรดทราบว่าลำดับแรกไม่จำเป็นต้องเพิ่มขึ้น - BALDไปตกเพิ่มขึ้นและยังเป็นหลุมเป็นบ่อ

ความท้าทาย

ได้รับคำเอาท์พุทไม่ว่าจะเป็น Bumpy หรือไม่

อินพุต

  • คำ (ไม่จำเป็นต้องเป็นคำพจนานุกรม) ประกอบด้วยอักษร ASCII ( [A-Z]หรือ[a-z]) ตัวอักษรในรูปแบบที่เหมาะสมใด
  • ตัวเลือกของคุณหากอินพุตเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมด แต่ต้องสอดคล้องกัน
  • คำจะมีความยาวอย่างน้อย 3 ตัวอักษร

เอาท์พุต

ค่าความจริง / ความเท็จไม่ว่าจะเป็นคำที่ป้อนเป็น Bumpy (ความจริง) หรือไม่เป็น Bumpy (falsey)

กฎระเบียบ

  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

Truthy:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# 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


Dangit นี่จะง่ายกว่านี้ถ้าตัวอักษรเดียวกันไม่ขึ้นหรือลง
mbomb007

ฉันไม่เข้าใจตัวอย่างที่ให้มา: หากBUMPมีการระบุไว้ใน Truthy (เช่น Bumpy) ทำไมBUMPYอยู่ในรายการ Falsey "ขึ้นและลงสลับกัน" หมายความว่าอย่างไร การเพิ่มขึ้นสองครั้งไม่สามารถทำได้อย่างต่อเนื่องใช่หรือไม่
ฉบับที่

4
@ โวลต์และใช่ก็หมายความว่าการเพิ่มขึ้นจะตามมาด้วยการล่มสลาย 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ไม่จำเป็นเพราะศูนย์ใด ๆ ที่สร้างอาร์เรย์ที่เป็นเท็จดังนั้นจึงไม่มีAในพอร์ต MATL


ดูการแก้ไขที่ถูกต้อง มีการพิมพ์ผิดในกรณีทดสอบ วิธีการของคุณถูกต้อง ในความเป็นจริงd0>dควรทำงาน (คุณไม่จำเป็นต้องAเป็นไปตามคำจำกัดความของความจริงของเรา / falsey)
Luis Mendo

1
เยี่ยมมากทำงานได้ดีกว่า Luis ในภาษาของเขา! ฉันเคยลองมาก่อนและนั่นไม่ใช่เรื่องง่าย ;)
DJMcMayhem

@DJMcMayhem ฮ่าฮ่า นั่นคือสิ่งที่ฉันได้รับสำหรับการอ่านความท้าทายเร็วเกินไป ในการป้องกันของฉันมันตอบโต้ได้ง่ายว่าตัวอักษรสองตัวที่เท่ากันนั้นลดลง และกรณีทดสอบที่ทำให้เข้าใจผิด (ไม่ได้รับการแก้ไข) ก็ไม่ได้ช่วย :-)
Luis Mendo

1
@DJMcMayhem ขอบคุณ - แม้ว่าฉันอาจโชคดีเพราะฉันไม่ได้คิดเกี่ยวกับตัวอักษรที่เท่ากันติดต่อกัน แต่กลับกลายเป็นว่าสิ่งที่ถาม ...
Sanchises

1
@immibis ใน MATL (AB) และอ็อกเทฟใช่ ดูนี้คำตอบ Meta
Sanchises

24

JavaScript (ES6), 75 69 63 46 43 ไบต์

บันทึก 3 ไบต์ด้วย Neil:

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

Destructuring s.slice(1)พารามิเตอร์สตริงแทน


โซลูชันก่อนหน้า:
บันทึกแล้ว 17 ไบต์ด้วย ETHproductions:

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`


โซลูชันก่อนหน้า:
63 ไบต์ด้วย 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 ไบต์:

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?
ติตัส

1
ขออภัยที่มาสายสำหรับปาร์ตี้ แต่สำหรับ 43 bytes ฉันให้คุณ:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW ขนาดเทียบเท่า 36 ไบต์

ใช้วิธีลอจิกเทียบเท่า:

golfed

Ungolfed:

ungolfed

ก่อนอื่นเราแปลงเป็นตัวพิมพ์เล็กจากนั้นเป็นอาร์เรย์ไบต์ ตัดแต่งองค์ประกอบแรกของอาร์เรย์ไบต์เนื่องจากไม่มีแบบอย่าง จากนั้นสำหรับแต่ละองค์ประกอบในอาเรย์ให้ตรวจสอบว่ามันดีกว่าองค์ประกอบก่อนหน้า (U8 ถ่านแมปไปยัง ASCII ตามที่คุณคาดหวัง) และเก็บผลลัพธ์สำหรับการวนซ้ำครั้งถัดไป หากการตรวจสอบบูลีนปัจจุบันและก่อนหน้านั้นเท่ากันเราจะยุติลูปและจะไม่เป็นหลุมเป็นบ่อ อื่นมันเป็นหลุมเป็นบ่อ!


1
ช่างเป็นภาษาอะไรที่ยอดเยี่ยม! ยินดีต้อนรับสู่ PPCG!
DJMcMayhem

1
ขอบคุณ! ฉันจะไม่แข่งขันกับ 4 คำตอบไบต์ แต่มันเป็นวิธีที่ดีที่จะพัฒนาทักษะของฉัน :)
ijustlovemath

ดูที่นี่ คะแนนของคุณผิดและมากเกินไปอย่างแน่นอน ฉันไม่คิดว่าคำตอบของคุณคือ 246450 - 246549 ไบต์
Erik the Outgolfer

ฉันกำลังออกจากแท็บหน่วยความจำเนื่องจากฉันไม่รู้ว่ามีแนวคิดเทียบเท่าไบต์สำหรับ LabVIEW จะนับพวกเขาและแก้ไขคำตอบในวันนี้
ijustlovemath

1
@Erik ฉันใช้งาน Firefox บน Windows แต่การเปิดใช้งานบนมือถือยังทำให้สิ่งต่างๆ เพียงแค่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

รหัสไปรษณีย์ผ่าน triples ของตัวละครใน s และการทดสอบที่ triples ดังกล่าวทั้งหมดมีคู่ซ้ายและขวาที่มีคุณสมบัติเพิ่มขึ้น / ลดลงที่แตกต่างกัน
ใช้งานได้ทั้งตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมด


6

Ruby, 57 48 ไบต์

คาดว่าอินพุตจะเป็นตัวพิมพ์ใหญ่ทั้งหมด

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

ดูได้ที่ repl.it: https://repl.it/D7SB

คำอธิบาย

การแสดงออกปกติ/.(?=(.)(.))/ตรงกับตัวละครแต่ละตัวที่ตามมาด้วยตัวละครอีกสองตัว (?=...)เป็น lookahead เชิงบวกซึ่งหมายความว่าเราจับคู่อักขระสองตัวที่ตามมา แต่ไม่ "กิน" เป็นส่วนหนึ่งของการจับคู่ ด้านในเครื่องหมายปีกกา$&คือข้อความที่ตรงกันซึ่งเป็นอักขระตัวแรกของทั้งสามตัว$1และ$2เป็นตัวอักษรที่จับภายใน lookahead กล่าวอีกนัยหนึ่งถ้าเป็นสตริง"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);

-8 ไบต์จากคำแนะนำของ Scepheo

นี่คือพอร์ตของโซลูชันของ Hediสำหรับ C # ฉันยังคิดวิธีแก้ปัญหาแบบเรียกซ้ำอีกด้วย แต่การเรียกซ้ำไม่ดี โซลูชันดั้งเดิมของฉันอยู่ด้านล่าง

ฉันต้นฉบับ 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);

-2 ไบต์โดยใช้แทน1>0true

-3 ไบต์จากคำแนะนำของ Scepheo สำหรับโซลูชันพอร์ตด้านบน

เรียกตัวเองซ้ำ ๆ การตรวจสอบว่าการเพิ่มขึ้น / ลดลงสลับในแต่ละครั้ง

Ungolfed:

// 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 ด้วยคำแนะนำเหล่านั้น แต่พวกเขาทำงานโดยใช้แบบบูลหรือแทนค่าที่เหมาะสมหรือ|| |อัปเดตโพสต์ขอบคุณ
นม

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 และตื่นเต้น ในรุ่นนี้ไม่ใช่ศูนย์เป็นเท็จและศูนย์เป็นจริง จริง ๆ แล้วสงสัยว่าตอนนี้ถ้าได้รับอนุญาต
cleblanc

การf("ABCDEFGHIJKLMNOPQRSTUVWXYZ")คอมไพล์ใน Visual Studio 2012 ส่งคืนค่า23ที่สามารถปฏิบัติได้Trueแต่ในคำถามค่านี้อยู่ในส่วน "Falsey" ดังนั้นค่าที่0คาดไว้
ฉบับที่

ฉันเข้าใจผิดว่า True และ Falsey อนุญาตอะไร ตอนนี้ฉันได้อ่านโพสต์นั้นและดูเหมือนชัดเจนว่าค่าจะต้องเป็น "C"
cleblanc

นี่คือคำจำกัดความมาตรฐานของเราสำหรับความจริงและความเท็จบนพื้นฐานของฉันทามติ Meta
AdmBorkBork


5

JavaScript (ES6), 65 ไบต์

s=>[...s].map(C=>(c?(R=c<C,i++?t&=r^R:0,r=R):t=1,c=C),c=r=i="")|t

.mapคือไม่แน่นอนทางออกที่ดีที่สุด


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')และผลหรือ10

ใช้อาร์กิวเมนต์การเปิดกล่องเพื่อใช้ตัวอักษรสามตัวแรกและตรวจสอบว่าทั้งสองตัวแรกเปรียบเทียบแตกต่างจากตัวที่สองหรือไม่ จากนั้นให้เรียกใช้ส่วนที่เหลือandซ้ำโดยใช้การคูณ


กอล์ฟอินพุตที่ดี ;-)
AdmBorkBork

5

เยลลี่ , 6 5 ไบต์

-1 ไบต์ขอบคุณ @Dennis (ใช้การลดลงแบบสะสม)

<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

Japtet, 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

เช่นเดียวกับทางออกของฉัน ยกเว้นสั้นกว่า 11x : P
mbomb007

4

C # 105 104 ไบต์

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

ลองออนไลน์

การใช้อาร์เรย์ของตัวอักษรที่บันทึกไว้หนึ่งไบต์เนื่องจากสามารถเว้นช่องว่างหลังวงเล็บได้ f(string x)VSf(char[]x)

มันคือ 101 ไบต์ถ้าฉันสามารถคืน int 1/0 แทนบูลจริง / เท็จ

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 ไบต์

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

ฉันสงสัยว่าฉันจะได้รับชิ้นเล็กลงถ้าฉันจัดการเพื่อกำจัดการสร้าง "ที่" แต่ฉันอาจติดอยู่กับ zipWith

สิ่งนี้ทำงานได้โดยการทำรายการของการเพิ่มขึ้น (จริง) และน้ำตก (เท็จ) จากนั้นทำรายการว่ารายการที่อยู่ติดกันในรายการนี้แตกต่างกันหรือไม่


นี่คือความพยายามครั้งแรกของฉันที่หนึ่งในเหล่านี้ดังนั้นฉันจะผ่านกระบวนการคิดของฉันในกรณีที่ฉันไปผิดอย่างน่ากลัวที่ไหนสักแห่ง

เวอร์ชันที่ไม่ได้รับการอัปโหลด (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

ตระหนักดีว่าการกระโดดและการตกลงมามีความคล้ายคลึงกับนามธรรมมากพอ (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 ที่โพสต์ก่อนหน้านี้ซึ่งเป็นแบบเดียวกัน ฉันแย่มากที่จำสิ่งต่างๆ
Teron

คุณหมายถึงคนที่ไม่ทำงานเหรอ? ;-) คุณสามารถใช้g h=tail>>=zipWith hและทำให้เป็นฟังก์ชันสากลเพื่อหลีกเลี่ยงwhereคำหลัก
Christian Sievers

@ChristianSievers แก้ไขมันและฉันเพิ่งสังเกตเห็นคำตอบนี้ซึ่งตอนนี้ทำสิ่งเดียวกันเป็นของฉันการแสดงคำตอบของฉันเหมาะสมกว่าเป็นความคิดเห็นของคนนี้
BlackCap

4

Java 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 อืมดังนั้นมันจะเพิ่มขึ้นเมื่อa > bแต่ตกเมื่อa <= bแทนที่จะ>และ<?
Kevin Cruijssen

@ TimmyD ตกลงมันคงที่และยังประหยัดได้ 3 ไบต์ :)
Kevin Cruijssen

1
คุณสามารถกำหนดวิธีการของคุณให้ยอมรับได้ใหม่char[]เพื่อที่คุณจะได้ไม่ต้องแปลงสตริงอินพุตของคุณเป็นอาร์เรย์อาเรย์ ที่ควรบันทึกไม่กี่ไบต์ PS: java ftw!
peech

1
คุณอาจหมายถึงการเปลี่ยนแปลงString s-> char[]zใช่ไหม

1
คุณสามารถส่งกลับค่าtruthyหรือfalseyทำให้ดังนั้นวิธีการของคุณเป็น int และผลตอบแทน 1 หรือ 0 :) .. ทำให้คุณลงไปที่ 117 ไบต์
Shaun Wild

3

PowerShell v2 +, 83 ไบต์

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

วิธีการที่แตกต่างกันเล็กน้อย ลูปนี้ผ่านการป้อนข้อมูล$nแต่ละย้ำเห็นว่าตัวอักษรก่อนหน้า$n[$_-1]เป็น-lESS tฮันตัวละครในปัจจุบัน$n[$_]แล้วหล่อผลจากการที่ผู้ประกอบการบูลีนไปยัง int +กับ เหล่านี้จะ-joined $aเข้าด้วยกันเป็นสตริงเก็บไว้ใน จากนั้นเราจะตรวจสอบว่า$aเป็น-eqไปได้หรือไม่เมื่อใช้$aกับสตริงย่อย00หรือ11ลบออก


3

Python 2.7, 84 ไบต์

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

ส่งคืน 1 สำหรับ bumpy, 0 เป็นอย่างอื่น

เรียนรู้สิ่งดีๆด้วย bitwise & และ ^
เริ่มต้นด้วยบูลีน b กำหนดคู่แรกเป็นขึ้น / ลงจากนั้นทดสอบและพลิก b สำหรับแต่ละคู่ต่อไปนี้
o พลิกเป็นเท็จหากการทดสอบล้มเหลวและเกาะติด
ต้องใช้เครื่องหมายคำพูดรอบอินพุต (+4 ไบต์สำหรับ raw_input () หากมีการฝ่าฝืนกฎ)

ทดสอบมัน


3

05AB1E , 9 ไบต์

SÇ¥0›¥_O_

คำอธิบาย

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

ลองออนไลน์!


2

Python 2.7 (อีกครั้ง, 84 83 ไบต์)

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

หรือ78 77 ไบต์โดยไม่ต้องพิมพ์

โดยวิธีการตัวอย่างข้างต้น 56 byte Python 2.7 แบ่งเช่น"abbab"หรืออินพุตอื่น ๆ ที่มีตัวละครซ้ำ ไม่เป็นไรไม่ได้อ่านคำแนะนำ การแก้ไข

โอเคลงมาที่ 83. อเนกประสงค์สามอันนั้นดีกว่า


นี่คือเคล็ดลับสำหรับคุณ 1. ลบช่องว่างa(x)if x else[]ออก 2. ใช้แลมบ์ดาแทนa=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. ใช้แลมบ์ดาที่ส่วนท้ายแทนที่จะพิมพ์ lambda s:len(set(a(s)))>14. หากlen(set(a(s)))ไม่มากกว่า 1 มากกว่าเท็จดังนั้นคุณสามารถบินได้>1
DJMcMayhem

2

CJam , 15 ไบต์

l2ew::<2ew::^:*

ลองออนไลน์! (ในฐานะชุดทดสอบที่แยกบรรทัดป้อนบรรทัด)

คำอธิบาย

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 ไบต์

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

หรือ

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

เอาต์พุตว่างสำหรับเท็จ1สำหรับจริง

หรือวิธีการเรียกซ้ำของ Hedi ได้รับการจัดพอร์ตและgolfedเล็กน้อยสำหรับ 70 ไบต์:

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

ที่จริงแล้วสิ่งนี้ควรจะเพิ่มใหม่อย่างไม่ จำกัด สำหรับคำที่เป็นหลุมเป็นบ่อ แต่มันไม่ได้!


2

Haskell, 30 37 ไบต์

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

การใช้งาน:

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]

ไม่ยอมรับ "หัวล้าน" foldl1(/=)ไม่ทำในสิ่งที่คุณคิด
Christian Sievers

@ChristianSievers Auch คุณพูดถูก ขอบคุณสำหรับหัวขึ้น
BlackCap

2

PHP 7, 137 118 ไบต์

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

เอาต์พุตว่างสำหรับ Bumpy 0สำหรับ Not Bumpy

นี่เป็นความพยายามครั้งแรกของฉันในการตีกอล์ฟและฉันต้องปรับปรุงมาก แต่มันเป็นวิธีที่ยอดเยี่ยมในการเรียนรู้สิ่งใหม่สำหรับฉัน ฉันต้องการท้าทายตัวเองในงานนั้นด้วยการใช้ PHP 7 Spaceship Operator ใหม่ซึ่งน่าสนใจมาก

อย่างไรก็ตามฉันไม่พอใจเกี่ยวกับมันก่อนอื่นสำหรับข้อเท็จจริงที่ว่าฉันต้องเพิ่มพิเศษif(isset($s[$i+2]))เพื่อตรวจสอบว่าตัวแปรที่มีอยู่เพราะฉันไม่พบวิธีแก้ปัญหาอื่น แต่ตอนนี้มันเป็นสำหรับตอนนี้ (หมายเหตุ: ฉันแก้ไขแล้วเพียงแค่เปลี่ยนstrlen($s)-1ไปstrlen($s)-2ฉันไม่สามารถเห็นสิ่งนั้นมาก่อน ... )

รหัสการทดสอบ:

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

ทดสอบออนไลน์


สวัสดีและยินดีต้อนรับสู่ PPCG! โพสต์แรกสุดยอด!
ไม่มี

ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี ตรวจสอบคำแนะนำสำหรับ PHPสำหรับคำแนะนำเพิ่มเติมเกี่ยวกับการเล่นกอล์ฟ
AdmBorkBork

1

Javascript ES6, 100 ไบต์

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}

ลองที่นี่:

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

โอ้มีคนสองคนที่เอาชนะฉันไปแล้วด้วย 40 ไบต์ ... อะไรก็ตาม


คำแนะนำ: "A"<"B"ดังนั้นคุณไม่จำเป็นต้องรับรหัสของตัวอักษร
ETHproductions

นอกจากนี้สิ่งนี้จะส่งกลับ1สำหรับBUMPY(หรือสิ่งอื่นใดที่มีทั้งการเพิ่มขึ้นและการตก)
ETHproductions

ดูเหมือนจะไม่ได้ผลนัก
AdmBorkBork

1

Python 3 148 139 127 ไบต์

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]

รหัสการทดสอบ

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)

ฉันดูด #facepalm นี้จริงๆ
Jeffrey04

ยินดีต้อนรับสู่ PPCG! ดูเคล็ดลับสำหรับการเล่นกอล์ฟใน Pythonและรับแรงบันดาลใจจากคำตอบอื่น ๆ
AdmBorkBork

1

C, 65 57 60 ไบต์

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

คือการแก้ไขของ

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

ที่ทำงานได้อย่างถูกต้องกับข้อมูลใด ๆ ที่เรียกใช้ฟังก์ชันเดียวเท่านั้น (เมื่อตัวแปรโกลบอลrถูกกำหนดค่าเริ่มต้นเป็นศูนย์)

แต่ในกรณีใด ๆ นี้จะสั้นกว่าการแก้ปัญหาก่อนหน้านี้ (65 bytes) เนื่องจากการใช้แทนfor whileแต่ก่อนหน้านี้ (ต่อไปนี้) เป็นเรื่องง่ายที่จะเข้าใจ:

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

วิธีการแก้ปัญหาของฉันขึ้นอยู่กับระดับบิตที่&มีรหัสทิศทางย้อนกลับก่อนหน้าและปัจจุบันซึ่งรหัสทิศทางสามารถเป็น2( 1<<1) สำหรับการเพิ่มรหัสตัวอักษร ( *s > *(s-1)) หรือ1( 1<<0) เป็นอย่างอื่น ผลลัพธ์ของการดำเนินการนี้กลายเป็น 0 ถ้าเราใช้รหัสทิศทางเดียวกันกับก่อนหน้าและปัจจุบันเช่นเมื่อคำไม่เป็นหลุมเป็นบ่อ

UPDATE:

รหัสสำหรับการทดสอบ:

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

ต่อฉันทามติ meta, ฟังก์ชั่นได้จะต้องนำมาใช้ใหม่ นั่นหมายความว่าคุณไม่สามารถรีเซ็ตrเป็น0ฟรีได้ แต่ต้องทำจากภายในฟังก์ชัน
Dennis

@Dennis คุณถูกต้องต้องมีการเริ่มต้น แต่สำหรับการโทรซ้ำเท่านั้น สมมติว่าสำหรับการโทรครั้งเดียวที่ทำงานกับข้อมูลใด ๆ เพราะคอมไพเลอร์ให้การเริ่มต้นสำหรับตัวแปรทั่วโลก
VolAnd

ฉันคิดว่าคุณควรจะแก้ปัญหา 60 byte ของคุณหลักเนื่องจากรุ่น 57 ไบต์ไม่ถูกต้องโดยเมตาโพสต์ที่ฉันอ้างถึง
เดนนิส

@Dennis Done! +3 ไบต์
VolAnd

1

PHP, 100 ไบต์

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;

แทนที่อักขระทุกตัวของสตริง (ยกเว้นอันสุดท้าย) ด้วยการrขึ้นหรือfลงและตรวจสอบว่าเกิดขึ้นrrหรือไม่ffในสตริง เพื่อหลีกเลี่ยงการที่อักขระตัวสุดท้ายที่เหลือสอดแทรกอยู่นั้นอินพุตจะต้องเป็นตัวพิมพ์ใหญ่ทั้งหมด

ฉันไม่พอใจกับลูปมากตัวอย่างเช่นฉันรู้สึกว่าต้องมีวิธีที่จะรวม$i++เข้าเป็นหนึ่งในหลาย ๆ อัน$iที่ใช้ในลูป แต่ฉันไม่สามารถหาวิธีนั้นได้ บางทีคนอื่นเห็นมัน

(นั่นเป็นเหตุผลที่ฉันโพสต์รหัสของฉันแม้ว่าจะเป็น 20 (!) ไบต์ยาวกว่าโซลูชันที่ดีของ Titus)


0

Java 8, 114 90 ไบต์

(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

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.