Це невміле слово?


31

(Натхненний цим викликом над на Незрозумілі - спойлери для цієї головоломки нижче, тому припиніть читати тут , якщо ви хочете , щоб вирішити цю головоломку на свій власний!)

Якщо буква в слові виникає в алфавітному порядку пізніше попередньої літери в слові, ми називаємо це підйомом між двома літерами. Інакше, у тому числі, якщо це та сама буква , це називається падінням .

Наприклад, слово ACEмає два підйоми ( Aдо Cі Cдо E) і жодне падіння, тоді як THEмає два падіння ( Tдо Hі Hдо E) і жодне піднесення.

Ми називаємо слово Bumpy, якщо послідовність підйомів і падінь чергується. Наприклад, BUMPйде підйом ( Bдо U), падіння ( Uдо M), підйом ( Mдо P). Зауважте, що перша послідовність не повинна бути підйомом - BALDйде осінь-підйом-падіння, а також Bumpy.

Змагання

Давши слово, виведіть, чи це Bumpy чи ні.

Вхідні дані

  • Слово (не обов'язково словникове слово), що складається лише з букв алфавіту ASCII ( [A-Z]або [a-z]) у будь-якому відповідному форматі .
  • Ваш вибір, якщо вхід має великі і малі регістри, але він повинен відповідати.
  • Слово буде мати принаймні 3 символи.

Вихідні дані

Значення truthy / falsey для того, чи є вхідним словом Bumpy (truthy) чи ні Bumpy (falsey).

Правила

  • Прийнятна або повна програма, або функція.
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

Truthy:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Фальсі:

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вона вказана в Труті (тобто Bumpy), чому BUMPYце в списку Фальсі? Що означає "чергування та падіння"? Два підйоми не можуть бути послідовними?
VolAnd

4
@VolAnd Так, це означає, що підйом завжди супроводжується падінням і навпаки. BUMPYє хибною, тому що MPYдає два піднімання поспіль. Іншими словами, жодна підрядок завдовжки 3 не повинна бути відсортованою за зростанням чи у зменшенні, щоб слово було грубим (крім спеціального випадку, коли дві послідовні букви однакові).
Мартін Ендер

Чи можете ви зіпсувати відповідь на питання 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до нашого визначення truthy / falsey)
Луїс Мендо

1
Приємна робота, перевершивши Луїса своєю мовою! Я раніше пробував, і це нелегке завдання. ;)
DJMcMayhem

@DJMcMayhem Haha. Ось, що я занадто швидко читаю виклик. На мій захист, контр-інтуїтивно зрозуміло, що дві рівні букви - це падіння. І оманливі тестові випадки (тепер виправлені) не допомогли також :-)
Луїс Мендо

1
@DJMcMayhem Дякую - хоча, можливо, мені просто пощастило, тому що я насправді не думав про послідовні рівні букви, але це виявилося саме те, про що питали ...
Sanchises

1
@immibis В MATL (AB) та Octave, так. Дивіться цю мета-відповідь.
Санчіз

24

JavaScript (ES6), 75 69 63 46 43 байт

Збережено 3 байти завдяки Нілу:

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

Деструкція параметру рядка замість 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
Ви можете гольфувати
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 Я в Firefox у Windows, але відкриття його на мобільному пристрої також порушує речі. Просто мета.ppcg.lol працює. У всякому разі, це є поза межами коментарів.
Позов по

8

Пітон, 56 байт

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

Усі тестові справи знаходяться на ideone

Прокручує потрійні символи в s і тестує, що всі такі трійки мають ліву і праву пари з різними властивостями підйому / падіння.
Працює як для всіх великих, так і для малих літер.


6

Ruby, 57 48 байт

Очікує, що введення буде великим регістром.

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

Дивіться це на repl.it: https://repl.it/D7SB

Пояснення

Регулярний вираз /.(?=(.)(.))/відповідає кожному символу, за яким слідують ще два символи. (?=...)це позитивний підхід, тобто ми узгоджуємо наступні два символи, але не «споживаємо» їх як частину матчу. Усередині фігурних фігурних дужок $&знаходиться збіглий текст - перший символ із трьох - $1і $2є захопленими символами всередині штриху. Іншими словами, якщо рядок є "BUMPY", вона спочатку збігатиметься "B"(і вкладає її $&) і захоплює"U" і "M"(і вкладає їх у $1і $2). Далі він буде відповідати "U"і захоплення "M"і "P", і так далі.

Всередині блоку ми перевіряємо, чи перша пара символів ( $&і $1) є підйомом, а друга ( $1і $2) - падінням чи навпаки, як і більшість інших відповідей. Це^ вираз повертається trueабо false, який перетворюється на рядок і вставляється замість збігу. Як результат, наш приклад "BUMPY"стає таким:

"truetruefalsePY"

Оскільки ми знаємо, що вхід є великим регістром, ми знаємо, що "f"він відбуватиметься лише як частина "false"та !result[?f]дає нам свою відповідь.


Як це працює?
GreenAsJade

1
@GreenAsJade Я додав пояснення до своєї відповіді.
Йорданія

6

C #, 64 63 55 байт

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

-8 байт із пропозицій Скефео

Це порт рішення Хеді для 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>0замість true.

-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 з цими пропозиціями, але вони працюють з використанням булевих АБО ||замість бітових АБО |. Оновлено публікацію, спасибі
молоко

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" у прикладах
VolAnd

Я тестую, використовуючи, gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)і я отримую хибність для ааа і схвильований. У цій версії ненульовим є фальси, а нуль - правдоподібний. Насправді цікаво зараз, чи це дозволено.
cleblanc

Виклик, f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")складений у Visual Studio 2012, повертає значення, 23яке можна трактувати як, Trueале у питанні це значення знаходиться у розділі "Фальсі", тому значення0 очікується.
VolAnd

Я неправильно зрозумів, що дозволено для Істини та Фальсі. Тепер я прочитав цю публікацію, і мені здається зрозумілим, які значення повинні бути для "C".
клеблан

Ось наші стандартні визначення для truthy та falsey , засновані на мета консенсусу.
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

Пітон, 51 байт

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

Приймає вхід як g('B','U','M','P')і вихід 1або0 .

Використовує розпакування аргументу, щоб взяти перші три букви та перевірити, чи порівнюються перші два порівняно з другими двома. Потім повторюється на решту, використовуючи множення на 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

Japt, 8 байт

Uä> ä- e

Перевірте це в Інтернеті!

Як це працює

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

Те саме, що і моє рішення. За винятком на 11 разів коротше. : P
mbomb007

4

C # 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)протиf(char[]x)

Це 101 байт, якщо я можу повернути int 1/0 замість 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 байти

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

Я підозрюю, що міг би отримати цей шматок менше, якби мені вдалося позбутися конструкції "де", але я, мабуть, застряг із zipWith.

Це працює, створюючи список підйомів (True) і падінь (False), потім складає список, якщо суміжні записи в цьому списку різні


Це моя перша спроба в одному з таких, тому я пройду свій міркувальний процес на випадок, якщо я кудись жахливо помилився.

Версія без вогків (168 байт)

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

Скоротіть імена, видаліть інформацію про тип (100 байт)

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

Перемістіть h до основної функції, оскільки вона використовується лише один раз (86 байт)

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

Зрозумійте, що areBumps and riseFall досить схожі на абстрактні (73 байти)

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

Зауважте, що (хвіст y) коротший ya @ (y: ys) (70 байт)

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

Прибирати; видалити зайві пробіли (52 байти)

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

... і я щойно помітив більш коротку відповідь Haskell, яка була розміщена перед моєю, що робить в основному те саме. Мені страшно бачити речі.
Терон

Ви маєте на увазі той, який не працює? ;-) Ви можете використовувати g h=tail>>=zipWith hта робити глобальну функцію, щоб уникнути whereключового слова.
Крістіан Сіверс

@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замість >і <?
Кевін Кройсейсен

@TimmyD Добре, це виправлено і навіть зберігає 3 байти. :)
Кевін Круїйсен

1
ви можете переосмислити свій метод, щоб прийняти, char[]щоб вам не довелося перетворювати вхідний рядок у масив char. це повинно зберегти кілька байт. PS: java ftw!
peech

1
Ви, можливо, мали намір змінити String s-> char[]z?

1
Ви можете повернути a 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[$_], а потім виливків результату цього булева оператора до міжнар з +. Вони -joinперетворюються разом у рядок, зберігаються в $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 для грудної, 0 для іншого

Вивчила кілька цікавих речей з розрядними & і ^.
Починається з булевого 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-байтний приклад 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для істинного

або рекурсивний підхід Хеді на порту та трохи гольф на 70 байт:

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

Насправді це має повторюватися нескінченно для кумедних слів, але це не так!


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));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.