Это ухабистое слово?


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 символов.

Выход

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

Правила

  • Допустимы либо полная программа, либо функция.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

Truthy:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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в списке «Фолси»? Что значит «взлетает и падает поочередно»? Два подъема не могут быть подряд?
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согласно нашему определению истины / фальси)
Луис Мендо

1
Отличная работа, превзойти Луиса на своем родном языке! Я пробовал раньше, и это нелегкая задача. ;)
DJMcMayhem

@DJMcMayhem Ха-ха. Вот что я получаю за то, что слишком быстро читаю вызов. В мою защиту нелогично, что две равные буквы - это падение. И (теперь исправленные) вводящие в заблуждение тестовые примеры тоже не помогли :-)
Луис Мендо

1
@DJMcMayhem Спасибо - хотя, может быть, мне просто повезло, потому что я на самом деле не думал о последовательных равных буквах, но это оказалось именно тем, о чем спрашивали ...
Sanchises

1
@immibis В MATL (AB) и Октаве, да. Смотрите этот мета-ответ.
Санчиз

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

Можно !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:

ungolfed

Сначала мы конвертируем в нижний регистр, затем в байтовый массив. Обрезать первый элемент байтового массива, поскольку у него нет прецедента. Затем для каждого элемента в массиве проверьте, больше ли он, чем предыдущий (символ U8 отображается в ASCII, как вы ожидаете), и сохраните результат для следующей итерации, а также в массиве для просмотра общей выпуклости. Если текущая и предыдущая логическая проверка равны, мы завершаем цикл, и он не является ухабистым. Остальное неровное!


1
Какой классный язык! Добро пожаловать в PPCG!
DJMcMayhem

1
Благодарность! Я никогда не буду соревноваться с 4-байтовыми ответами, но это хороший способ улучшить мои навыки :)
ijustlovemath

Смотрите здесь . Ваша оценка определенно неверна и чрезмерно завышена . Я не думаю, что ваш ответ действительно 246450 - 246549 байт.
Эрик 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:]))

Все тесты в идеоне

Пролистывает тройки символов в s и проверяет, что все такие тройки имеют левую и правую пары с различными свойствами подъема / спада.
Работает как в верхнем, так и в нижнем регистре.


6

Рубин, 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 #. Я также придумал рекурсивное решение, но рекурсия была не так хороша. Мое оригинальное решение ниже.

My Original 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 байта из предложений 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 (True) для case 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но в вопросе это значение находится в разделе «Falsey», поэтому 0ожидаемое значение .
VolA и

Я неправильно понял, что было разрешено для True и Falsey. Сейчас я прочитал этот пост, и, кажется, ясно, какие значения должны быть для "C".
cleblanc

Вот наши стандартные определения истины и фальши , основанные на мета-консенсусе.
AdmBorkBork



5

Python 2, 88 байт

Простое решение

s=input()
m=map(lambda x,y:y>x,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

Попробуйте онлайн

Если бы одинаковые буквы в ряду не были ни подъемом, ни падением, решение было бы 79 байтов:

s=input()
m=map(cmp,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

5

Perl, 34 байта

Включает +3 для -p(код содержит, 'поэтому -eне может быть использован)

Введите заглавные буквы на STDIN:

bump.pl <<< AAA

bump.pl

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

5

Python, 51 байт

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

Принимает вход как g('B','U','M','P') и выводит 1или 0.

Распаковка аргументов использует первые три буквы и проверяет, отличаются ли первые два от двух. Затем рекурсивно на остаток, используя умножение для 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

То же, что и мое решение. За исключением 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)против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 и riseFall достаточно похожи, чтобы абстрагироваться (73 байта)

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

Обратите внимание, что (tail 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 19.09.16

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

Ungolfed и тестовые случаи:

Попробуй это здесь.

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[]так что вам не нужно преобразовывать входную строку в массив символов. это должно сэкономить несколько байтов. PS: Ява ftw!
peech

1
Возможно, вы хотели изменить String s-> char[]z?

1
Вы можете вернуть значение truthyили falsey, так что сделайте ваш метод целым и верните 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это -eqUAL для $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 переворачивается на false, если тест не пройден и зависает.
Требует кавычек вокруг ввода (+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 байт без печати.

Кстати, приведенный выше пример Python 2.7 с 56 байтами разбивается, например, "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;

пустой вывод для false, 1для true

или рекурсивный подход Хеди, портированный и немного играющий в гольф для 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(/=)не делает то, что вы думаете, что делает.
Кристиан Сиверс

@ChristianSievers Ой, ты прав. Спасибо за внимание
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;}
}

Тест онлайн


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.