(Вдохновленный этим испытанием на 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
var QUESTION_ID=93005,OVERRIDE_USER=42963;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
BUMP
в списке «Истина» (то есть, «ухабистый»), почемуBUMPY
в списке «Фолси»? Что значит «взлетает и падает поочередно»? Два подъема не могут быть подряд?BUMPY
ложно, потому чтоMPY
дает два последовательных подъема . Другими словами, никакая подстрока длины 3 не должна сортироваться по возрастанию или по убыванию, чтобы слово было неровным (кроме особого случая, когда две последовательные буквы идентичны).Ответы:
MATL, 4 байта
Объяснение:
Это моя первая запись в MATL, поэтому мне интересно, насколько можно улучшить этот наивный порт от моей попытки MATLAB / Octave (что будет
@(a)all(diff(diff(a)>0))
). Обратите внимание, чтоall
нет необходимости, потому что любой ноль делает массив ложным, поэтомуA
в порту MATL его нет.источник
d0>d
должно работать (вам не нужноA
согласно нашему определению истины / фальси)JavaScript (ES6),
7569634643 байтаСохранено 3 байта благодаря Нейлу:
Уничтожение строкового параметра вместо
s.slice(1)
.Предыдущее решение:
17 байтов сэкономлено благодаря ETHproductions:
Что произошло из предыдущего решения шаг за шагом:
Предыдущие решения:
63 байта благодаря ETHproductions:
69 байт:
75 байтов:
Все буквы в слове должны иметь одинаковый регистр.
источник
!s[2]|...
сделать так же, какs[2]?...:1
?f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
LabVIEW, 36 эквивалентных байтов
Гольф, используя логические эквивалентности:
Ungolfed:
Сначала мы конвертируем в нижний регистр, затем в байтовый массив. Обрезать первый элемент байтового массива, поскольку у него нет прецедента. Затем для каждого элемента в массиве проверьте, больше ли он, чем предыдущий (символ U8 отображается в ASCII, как вы ожидаете), и сохраните результат для следующей итерации, а также в массиве для просмотра общей выпуклости. Если текущая и предыдущая логическая проверка равны, мы завершаем цикл, и он не является ухабистым. Остальное неровное!
источник
Python, 56 байт
Все тесты в идеоне
Пролистывает тройки символов в s и проверяет, что все такие тройки имеют левую и правую пары с различными свойствами подъема / спада.
Работает как в верхнем, так и в нижнем регистре.
источник
Рубин,
5748 байтовОжидается, что ввод будет в верхнем регистре.
Смотрите его на repl.it: https://repl.it/D7SB
объяснение
Регулярное выражение
/.(?=(.)(.))/
соответствует каждому символу, за которым следуют еще два символа.(?=...)
является положительным взглядом, означающим, что мы сопоставляем два последующих символа, но не «потребляем» их как часть совпадения. Внутри фигурных скобок$&
находится совпавший текст - первый символ из трех -$1
и они$2
являются захваченными символами в предвкушении. Другими словами, если строка есть"BUMPY"
, она сначала будет соответствовать"B"
(и вставлять ее$&
) и захватывать"U"
и"M"
(и вставлять их в$1
и$2
). Далее он будет соответствовать"U"
и захвату"M"
и"P"
, и так далее.Внутри блока мы проверяем, является ли первая пара символов (
$&
и$1
) повышением, а вторая ($1
и$2
) - падением или наоборот, как и большинство других ответов. Это^
выражение возвращаетtrue
илиfalse
, которое преобразуется в строку и вставляется вместо совпадения. В результате наш пример"BUMPY"
становится таким:Поскольку мы знаем, что ввод вводится
"f"
только в верхнем регистре, мы знаем, что произойдет только как часть"false"
и!result[?f]
дает нам наш ответ.источник
C #,
646355 байтов-8 байт из предложений Скефео
Это порт решения Хеди для C #. Я также придумал рекурсивное решение, но рекурсия была не так хороша. Мое оригинальное решение ниже.
My Original C #,
969491 байт-2 байта, используя
1>0
вместоtrue
.-3 байта из предложений Scepheo для решения порта выше
Вызывает себя рекурсивно, проверяя, что подъем / падение чередуются каждый раз.
Ungolfed:
источник
?:
оператора или скобок:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
||
вместо побитового ИЛИ|
. Обновил пост, спасибо.C 59 байт
источник
AAA
- первый «Falsey» в примерахgcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
и я получаю ложь для ааа и взволнован. В этой версии ненулевое значение является ложным, а нулевое - правдивым. На самом деле интересно, если это разрешено.f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
скомпилированный в Visual Studio 2012, возвращает значение,23
которое можно рассматривать как,True
но в вопросе это значение находится в разделе «Falsey», поэтому0
ожидаемое значение .Желе , 6 байт
Основано на ответе @sanchises .
Попробуйте онлайн! или проверить все.
объяснение
источник
JavaScript (ES6), 65 байт
.map
это определенно не лучшее решение .источник
Python 2, 88 байт
Простое решение
Попробуйте онлайн
Если бы одинаковые буквы в ряду не были ни подъемом, ни падением, решение было бы 79 байтов:
источник
Perl, 34 байта
Включает +3 для
-p
(код содержит,'
поэтому-e
не может быть использован)Введите заглавные буквы на STDIN:
bump.pl
источник
Python, 51 байт
Принимает вход как
g('B','U','M','P')
и выводит1
или0
.Распаковка аргументов использует первые три буквы и проверяет, отличаются ли первые два от двух. Затем рекурсивно на остаток, используя умножение для
and
.источник
Желе ,
65 байт-1 байт благодаря @Dennis (используйте накопительное сокращение)
Все тесты в TryItOnline
Как?
Работает либо в верхнем, либо в нижнем регистре.
источник
Japt, 8 байт
Проверьте это онлайн!
Как это работает
источник
C #
105104 байта105 байт
Попробуйте онлайн
Использование массива символов сохраняло один байт, так как пробел можно опустить после скобок.
f(string x)
противf(char[]x)
Это 101 байт, если я могу вернуть int 1/0 вместо bool true / false
источник
Haskell, 52 байта
Я подозреваю, что смог бы уменьшить этот кусок, если бы мне удалось избавиться от конструкции «где», но я, вероятно, застрял с zipWith.
Это работает путем составления списка подъемов (True) и падений (False), а затем составления списка, если соседние записи в этом списке отличаются
Это моя первая попытка одного из них, так что я пройду через свой мыслительный процесс на случай, если я где-то ошибся.
Неуправляемая версия (168 байт)
Сократить имена, удалить информацию о типе (100 байт)
Переместите h в основную функцию, так как она используется только один раз (86 байт).
Поймите, что areBumps и riseFall достаточно похожи, чтобы абстрагироваться (73 байта)
Обратите внимание, что (tail y) короче ya @ (y: ys) (70 байт)
Привести в порядок; удалить ненужные пробелы (52 байта)
источник
g h=tail>>=zipWith h
и сделать его глобальной функцией, чтобы избежатьwhere
ключевого слова.Java 7,
157153150125117 байтUngolfed и тестовые случаи:
Попробуй это здесь.
Выход:
источник
a > b
, а когда падаетa <= b
, а не>
и<
?char[]
так что вам не нужно преобразовывать входную строку в массив символов. это должно сэкономить несколько байтов. PS: Ява ftw!String s
->char[]z
?truthy
илиfalsey
, так что сделайте ваш метод целым и верните 1 или 0 :). Устанавливает 117 байтовPowerShell v2 +, 83 байта
Немного другой подход. Это петли через вход
$n
, каждая итерация видит ли предыдущий символ$n[$_-1]
является-l
ESSt
Хань текущего символа$n[$_]
, а затем отливок результата этого булева оператора к междунар с+
. Они-join
объединены в строку, сохранены в$a
. Затем мы проверяем , является ли$a
это-eq
UAL для$a
любых подстрок00
или11
удалены.источник
Python 2.7, 84 байта
Возвращает 1 для ухабистых, 0 для остальных
Изучил некоторые классные вещи с побитовым и & ^.
Начинается с логического b, определяющего первую пару как вверх / вниз, затем проверяет и переворачивает b для каждой следующей пары.
o переворачивается на false, если тест не пройден и зависает.
Требует кавычек вокруг ввода (+4 байта для raw_input (), если это нарушает какое-то правило)
Попробуй это
источник
05AB1E , 9 байтов
объяснение
Попробуйте онлайн!
источник
Python 2.7 (снова
8483 байта)Или
7877 байт без печати.Кстати, приведенный выше пример Python 2.7 с 56 байтами разбивается, например,Неважно, не читал инструкции. Пересмотр."abbab"
или на любой другой ввод с повторяющимися символами.Хорошо, до 83. Тройки один, хотя лучше.
источник
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)))>1
4. еслиlen(set(a(s)))
не больше 1, то это уже ложно, так что вы можете снять>1
CJam , 15 байтов
Попробуйте онлайн! (Как набор тестов с разделением строк).
объяснение
источник
PHP, 80 байт
или
пустой вывод для false,
1
для trueили рекурсивный подход Хеди, портированный и немного играющий в гольф для 70 байтов:
На самом деле, это должно бесконечно повторяться для ухабистых слов, но это не так!
источник
Haskell,
3037 байтИспользование:
источник
foldl1(/=)
не делает то, что вы думаете, что делает.PHP 7,
137118 байтПустой вывод для Bumpy,
0
для Not Bumpy.Это моя первая попытка поиграть в код, и мне нужно много чего улучшать, но это был замечательный способ узнать что-то новое для меня. Я также хотел бросить вызов себе в этой задаче, используя новый оператор PHP 7 Spaceship Operator, который кажется очень интересным.
Во всяком случае, я не удовлетворен этим, прежде всего тем, что мне пришлось добавить дополнительный,(Примечание: я исправил это, просто изменивif(isset($s[$i+2]))
чтобы проверить, существует ли переменная, потому что я не нашел другого обходного пути к проблеме, но это пока что.strlen($s)-1
наstrlen($s)-2
, я не мог увидеть это раньше ...).Тестовый код:
Тест онлайн
источник
Javascript ES6, 100 bytes
Try it here:
Oh come on two people already beat me to it by 40 bytes... whatever
источник
"A"<"B"
, so you don't need to get the chars' charcodes.1
forBUMPY
(or anything else that contains both a rise and a fall).Python 3,
148 139127 bytestesting code
источник
C,
655760 bytesis fix of
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 ofwhile
. But previous (the following) is a little easier to understand:My solution is based on bitwise
&
with inverted previous and current direction code, where direction code can be2
(1<<1
) for character code increase (*s > *(s-1)
) or1
(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:
источник
r
to0
for free, but must do so from within the function.PHP, 100 bytes
Replaces every char of the string (except the last one obviously) with an
r
for rise or anf
for fall and then checks whetherrr
orff
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$i
s 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.)
источник
Java 8,
11490 bytesUngolfed test program
источник