Четная строка - это любая строка, в которой четность значений символов ASCII всегда чередуется. Например, строка EvenSt-ring$!
является четной строкой, потому что значения символов ASCII:
69 118 101 110 83 116 45 114 105 110 103 36 33
И соотношения этих чисел:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
Который чередуется весь путь. Однако строка , как Hello world!
это не даже строка , поскольку значения ASCII являются:
72 101 108 108 111 32 87 111 114 108 100 33
И соотношения это:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
Который явно не всегда чередуется.
Соревнование
Вы должны написать либо полную программу, либо функцию, которая принимает строку для ввода и выводит истинное значение, если строка четная, и ложное значение в противном случае. Вы можете принимать входные и выходные данные в любом приемлемом формате, и вы можете предполагать, что вход будет иметь только печатный ASCII (диапазон 32-127). Вам не нужно обрабатывать пустой ввод.
Примеры
Вот несколько примеров четных строк:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
И все эти примеры даже не являются строками:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
Вы также можете использовать это решение без проверки, чтобы проверить любые строки, если вас интересует определенный тестовый пример.
lno
.Ответы:
MATL ,
43 байтаСпасибо Emigna за сохранение байта и спасибо Luis Mendo за исправление некоторых ошибок. Код:
Объяснение:
Попробуйте онлайн!
источник
A
.A
опустить его, благодаря тому, какif
работает MATL .2\
наo
. И код будет выглядеть очень ... обязательно :-)4
еще регулярно4
...05AB1E ,
54 байтаСпас 1 байт благодаря Аднану .
Попробуйте онлайн!
объяснение
источник
Ç¥ÉP
:)Желе ,
754 байтаСохранено 2 байта с использованием идеи дельт от @ Steven H.
Сохранено 1 байт благодаря @ Lynn .
Попробуйте онлайн!или Проверьте все контрольные примеры.
объяснение
источник
%2
→Ḃ
mod
.Python 2, 54 байта
источник
Mathematica,
5044 байтаТекущая версия в основном вся виртуозность Мартина Эндера.
Возвращает
True
илиFalse
. Ничего слишком умного: берет сумму mod-2 каждой пары последовательных кодов ASCII и проверяет, что 0 никогда не получается.Старая версия:
источник
JavaScript (ES6),
605046 байтЯ пробовал рекурсию, но на 51 байте она не стоит того:
Тестовый фрагмент
Показать фрагмент кода
источник
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Brain-Flak ,
13811411284 + 3 = 87 байтСпасибо @Riley за помощь в игре в гольф.
Эта программа обрабатывает пустой ввод как непустую строку.
Попробуйте онлайн!
Объяснение (устарело)
Сдвигает ввод из левого стека вправо при изменении на 2. Находит разницу между каждым смежным символом до тех пор, пока все не будут проверены или одно из различий не станет равным нулю (что может произойти только в непустой строке). Если цикл завершился из-за нечетной строки, переключитесь обратно в левый стек и вытолкните оставшееся на нем значение. В противном случае, оставайтесь в правом стеке и вставьте ноль выше 1, оставшегося в стеке.
источник
([]){{}
->{
и удалите его([])
непосредственно перед закрытием первого цикла.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 байта). Это было получено из вашего исходного модуля. Чтобы она работала с вашей программой, необходимо добавить еще +1 ниладу:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R,
4135 байтРЕДАКТИРОВАТЬ: Сохранено несколько байтов благодаря @JDL с использованием
diff
вместоrle
.объяснение
readline()
читать ввод.utf8ToInt()%%2
преобразовать в значения ascii и mod 2 (сохранить как R-вектор)all(rle()==1)
длина кодировки, чтобы найти прогоны. Все пробеги должны быть равны одному или меньше 2, поскольку никакие пробеги не могут быть отрицательными или 0 (сохраняет один байт вместо==
).источник
prod(...)
а неall(... == 1)
экономит несколько символов.>1
?all
была полностью нулями и единицами.rle
использованияdiff
:all(diff(utf8ToInt(readline())%%2))
(мы получаем предупреждение, но я не думаю, что это запрещено)all(numeric(0))
чтоTRUE
, желаемый ответ на длину одной строки. (Я протестировал, если это имеет значение, против R-3.3.1)Pyth ( вилка ), 9 байт
Нет Ссылка Try It Online, потому что у форка нет собственной версии в онлайн-переводчиках.
Объяснение:
источник
Брахилог , 17 байт
Попробуйте онлайн!
объяснение
источник
Java 8,
77767257 байт-4 байта благодаря @ Geobits .
Объяснение:
Попробуйте онлайн.
источник
boolean
здесь (я знаю, это отстой). Лучшее, что я мог бы получить таким образом (72), используя flag-int, например:boolean c(char[]a){int i=3,b=1;for(int c:a)b=i==(i=c%2)?0:b;return b>0;}
Brain-Flak
155 151 141121Включает +3 для -a
Сохранено 30 байт благодаря 1000000000
Вывод:
истина : 1
ложь : 0 на вершине стека
Попробуйте онлайн! (правда)
Попробуйте онлайн! (falsy)
Лучшее объяснение будет позже (если я могу вспомнить, как это работает через несколько часов ...)
источник
Звездный , 85 байт
Попробуйте онлайн!
Обратите внимание, что, поскольку программа Starry не может сообщить, когда заканчивается ввод произвольной длины, эта программа использует завершающий символ новой строки во вводе, чтобы отметить конец строки. Если вы получите загадочное сообщение об ошибке и неопределенный метод
ord
для,nil:NilClass
то во вводе отсутствует завершающий символ новой строки.объяснение
Основная стратегия, которую использует программа, заключается в том, что она читает символы один за другим из ввода и, если они не являются новой строкой (символ 10), она изменяет значение символа в ASCII на 2 и находит разницу между ним и ранее прочитанным символом. Если разница равна нулю, программа завершается и печатает
0
(Falsey). В противном случае программа возвращается назад и повторяет процесс. Если программа читает новую10
строку, она завершается и печатает (правда).Аннотированная программа
источник
Perl, 24 + 1 (
-p
) = 25 байт-4 байта благодаря @Ton Hospel !
Нужен
-p
флаг. Выходы 1 - это четная строка, иначе ничего. Например :Пояснения : заменяет каждый символ его значением mod 2 (поэтому строка содержит только 0 и 1 после этого). Затем ищите два следующих 1 или 0: если он найдет их, то строка не является четной, в противном случае она есть.
источник
s/./$&&v1/eg;$_=!/(.)\1/
, PS(ord$&)%2
мог бы быть написан как1&ord$&
v1
?\x01
неJ 15 байт
использование
объяснение
источник
Vim, 38 байт
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Предполагает, что входная строка находится в буфере и пуста
"q
. Выводит двоичную бессмыслицу, если истина, ничего, если ложь.s<C-R>=char2nr(@")%2<CR>
: Заменяет символ с 1, если нечетный, 0, если даже. Макрос, в котором он находится, просто делает это с каждым символом в строке (независимо от его длины).:g/00\|11/d<CR>
: Удаляет строку, если 2 последовательных «бита» имеют одинаковое значение. Быстрее, чем обратная ссылка.Обычно в vimgolf, когда вы используете функцию выражения внутри макроса, вы должны делать сам макрос в регистре выражений и использовать некоторые хитрости для завершения табуляции. Это сложнее на этот раз. Я могу найти способ сократить это позже.
источник
Сетчатка , 39 байт
Число байтов предполагает кодировку ISO 8859-1.
Выходы
1
для правдивых и0
ложных.Попробуйте онлайн!(Первая строка включает набор тестов, разделенных переводом строки.)
объяснение
Вдохновленный ответом mbomb007, я недавно разработал довольно короткую
ord()
реализацию в Retina. Это в значительной степени основано на этом, хотя я смог сделать несколько упрощений, так как мне не нужен десятичный результат, поскольку мне нужно только поддерживать печатный ASCII (и я забочусь только о четности результата, поэтому в итоге получаю произвольное смещение тоже хорошо).Этап 1: Сплит
Это просто разделяет ввод на отдельные символы, разделяя его вокруг пустого соответствия и отбрасывая пустые результаты в начале и в конце
_
.Этап 2: заменить
%{
Говорит Retina а) этот этап и следующий должен работать в цикле , пока строка не перестает изменяться путем полной итерации, и что эти два этап должен быть применен к каждой строке (т.е. каждому символу) на входе отдельно.Сама сцена является стандартной техникой для дублирования первого символа ввода. Мы сопоставляем пустую строку (но смотрим только первые два совпадения) и вставляем префикс этого совпадения. Префикс первого совпадения (в начале строки) пуст, так что это ничего не делает, а префикс второго совпадения - это первый символ, который поэтому дублируется.
Стадия 3: Транслитерация
}
указывает на конец цикла. Сама сцена - транслитерация.01
указывает, что его следует применять только к первому символу строки.p
является сокращением для всех печатаемых символов ASCII и_
означает «удалить». Так что, если мы расширим это, транслитерация сделает следующее преобразование:Таким образом, пробелы удаляются, а все остальные символы уменьшаются. Это означает, что эти два этапа вместе создадут диапазон символов от пробела до данного символа (потому что они будут многократно дублировать и уменьшать первый символ до тех пор, пока он не станет пробелом, в котором дублирование и удаление отменяются).
Длина этого диапазона может быть использована для определения четности символа.
Этап 4: заменить
Мы просто отбрасываем все пары символов. Это очищает строки четной длины и уменьшает строки нечетной длины до одного символа (фактически, входной символ, но это не имеет значения).
Этап 5: Матч
Проще найти входные данные, которые не являются четными, поэтому мы считаем количество совпадений либо двух последовательных пустых строк, либо двух последовательных непустых строк. Мы должны получить
0
четные входы и что-то ненулевое в противном случае.Этап 6: Матч
Осталось только инвертировать результат, что мы и делаем, подсчитывая количество совпадений этого регулярного выражения, которое проверяет, что ввод начинается с
0
. Это возможно только в том случае, если результат первого этапа был0
.источник
Clojure, 59 байт
Генерирует все последовательные пары из строки
n
и проверяет, является ли каждая пара нечетной. Если последовательность чисел считается приемлемым форматом, то это 50 байтов.Смотрите это онлайн: https://ideone.com/USeSnk
источник
Юлия,
5553 байтаРазъяснения
Сопоставьте символы с 0 | 1 и проверьте, содержит ли результирующая строка «00» или «11», что делает строку не чередующейся.
источник
Python, 52 байта
Рекурсивная функция. Создает 1 (или True) для четных строк, 0 для нечетных. Умножает четность разности первых двух символов на рекурсивное значение на оставшейся части. Односимвольная строка дает True, как проверено, приравнивая свой первый символ. Это предполагает, что ввод не пуст; иначе нужен еще один байт для
s==s[:1]
илиlen(s)<2
.Python 2, 52 байта
В качестве альтернативы, итеративное решение. Выполняет итерацию по входным символам, сохраняя текущие и предыдущие значения символов mod 2. Умножает бегущий продукт на разницу, которая равна 0 (Falsey) только при равенстве двух последовательных четностей.
«Предыдущее» значение инициализируется значением 2 (или любым значением, отличным от 0 или 1), так что первый символ никогда не совпадает с четностью предыдущего вымышленного символа.
Python, 42 байта, вывод через код выхода
Выходы через код выхода. Завершает с ошибкой ZeroDivisionError, когда два последовательных символа имеют одинаковую четность, в противном случае завершается чисто.
источник
Haskell,
4240 байтПример использования:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Как это работает:
Редактировать: @xnor сохранил два байта. Благодарность!
источник
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
4140 байт-1 персонаж, спасибо Мартину Эндеру
источник
C, 52 байта
Сравнивает четность первых 2 символов, рекурсивно перемещаясь по строке, пока не найдет 2 символа с одинаковой четностью или строку длиной 1 (
s[1] == 0
).Код с некоторыми тестами
источник
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
вам не нужны int, return или [0]*++s
вместо второгоs[1]
вы можете изменитьf(s+1)
наf(s)
. плюс мой предыдущий комментарий довел общее количество до 39; Я должен также добавить, что удалениеreturn
делает его не работающим на ideone, но он все еще работает с gcc на windowsf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
Я бы пошел, но сейчас 5 часов утра, и я просыпаюсь через 3 часа.Пайк, 8 байт
Попробуй это здесь!
источник
C #, 69 байт
Полная программа с тестовыми примерами:
источник
PHP, 69 байт
решение с Regex 81 байт
источник
PowerShell v2 +, 47 байт
(Не совсем поймать обычных конкурентов PowerShell в ...)
Принимает входной сигнал
$args[0]
в виде строки, отбрасывает его какchar
-array, петли через него|%{...}
, каждую итерацию размещения по модулю на трубопроводе (с неявным[char]
для[int]
преобразования). Они инкапсулированы в паранах и помещены в-join
строку, которая подается в левую часть-notmatch
оператора, проверяя00
или или11
(т.е. возвращает,True
если0
и1
s чередуются). Этот логический результат остается в конвейере, а вывод неявным.Тестовые случаи
источник
> <> ,
2927 байтВыводит 1, если слово четное, 0, если слово нечетное.
Вы можете попробовать это онлайн .
Редактировать: спас два байта благодаря Мартину Эндеру
источник
Perl 6 ,
4726 байтExpanded:
источник
Scala, 54 байта
Я уверен, что это можно улучшить.
источник