Бит четности , является одним из простейших форм контрольной суммы. Во-первых, вы должны выбрать паритет, четный или нечетный. Допустим, мы выбираем даже. Теперь нам нужно сообщение для передачи. Допустим, наше сообщение "Foo". Это записано в двоичном виде как:
01000110 01101111 01101111
Теперь мы посчитаем общее число 1
's там, которое составляет 15. Поскольку 15 - нечетное число, мы должны добавить один дополнительный бит в конец нашего сообщения, и теперь у нас будет четное число битов' on ' , Этот последний добавленный бит известен как «бит четности». Если бы мы выбрали нечетную четность для нашей контрольной суммы, нам пришлось бы добавить дополнительный «0», чтобы число битов оставалось нечетным.
Соревнование:
Вы должны написать программу или функцию, которая определяет правильный бит четности для строки. Ваша программа должна принимать два входа:
Строка,
s
. Это сообщение, на которое будет рассчитана контрольная сумма. Это будет ограничено 95 печатными символами ASCII.Символьная или односимвольная строка
p
, которая будет либоe
для четной четности, либоo
для нечетной четности.
и получить значение truey-falsey, представляющее правильный бит четности. Правда, если это 1
, и ложь, если это 0
.
Встроенные функции, которые считают количество включенных битов в строке или символе, не допускаются. Например, функция, f
которая делает это: f('a') == 3
или f('foo') == 16
запрещена. Все остальное, например базовое преобразование, является честной игрой.
Тест IO:
(without the quotes)
s: "0"
p: 'e'
output: 0
s: "Foo"
p: 'e'
output: 1
s: "Hello World!"
p: 'o'
output: 0
s: "Alex is right"
p: 'e'
output: 1
s: "Programming Puzzles and Code-Golf"
p: 'e'
output: 0
s: "Programming Puzzles and Code-Golf"
p: 'o'
output: 1
Это Codegolf, поэтому применяются стандартные лазейки, и выигрывает самый короткий ответ в байтах.
o
имеет даже паритет.str(int(s, 2)).count('1')
? Нет, я бы не подумал, что это единственная встроенная функция, которая нарушает это правило. Мое редактирование делает это более ясным?char == single_char_string
. Я также отредактировал это в посте.Ответы:
MATL ,
87 байтПопробуйте онлайн! Или проверьте все тестовые случаи одновременно .
источник
Java, 97 байт
Потому что, вы знаете, Java.
Это лямбда для
BiFunction<String, Character, Boolean>
.e
и,o
кажется, полностью изменен в операторе возврата, потому что, очевидно, моя логика была обратной.источник
Python 2, 51 байт
Это основано на идее Sp3000 подсчитывать 1 в строковом представлении списка кодов символов в двоичном формате, а не суммировать для каждого символа.
Новый трюк - справиться
e
иo
с этим тоже. Если бы этоe
было нечетно иo
четно, мы могли бы просто добавить бит четности в строку перед выполнением подсчета (переключая их, потому что «1» - это Истина). К сожалению, это не так. Но если мы удалим все, кроме последних двух битов, то это правда.Это делается путем удаления первого
9
символа строкового представления.источник
eo
!Желе,
98 байтПопробуйте онлайн!
Спасибо Денису за байт!
источник
V}
... это было действительно круто !!! (Деннис настоящий игрок в гольф) +1 Это превзошло все мои попытки.C, 62 байта
XOR обладает приятным свойством, которое можно использовать для сокращения строк до одного символа, сохраняя при этом четность.
Ideone.
источник
27030>>((p^p>>4)&15)&1
должен вычислить соотношение p и даже на 1 байт корочеchar *s
это не нужноf(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}
%3
truthy if it's a 1
27030>>((p^p>>4)&15)&1
, Ну, очевидно. ;-)Python,
5857 байтисточник
lambda s,p:`map(bin,map(ord,s))`.count('1')%2^(p>'e')
!=p>'e'
.lambda s,p:`map(bin,map(ord,p+s))`[8:].count('1')%2
Pyth, 12 байт
Тестирование.
источник
JavaScript (ES6),
8472 байтаБитовое чередование оказалось короче, чем преобразование в базу 2 и подсчет
1
s.источник
Perl, 29 байт
Включает +2 для
-p
Выполнить с вводом в STDIN в качестве строки пространства символов четности, например
parity.pl
источник
J, 27 байт
использование
источник
JavaScript (ES6), 69 байт
источник
PowerShell v2 +, 91 байт
/ я плачу в углу
Да ... итак, базовая конверсия не подходит для PowerShell. Преобразование из входной строки в двоичное представление
$a|%{[convert]::toString(+$_,2)}
само по себе составляет 32 байта ...Принимает ввод
$a
и$b
, явно приводя$a
как char-массив в процессе. Затем мы проверяем,$b
является ли это-eq
UALo
и-xor
другой половиной программы. Для этой части мы берем входную строку$a
, пропускаем ее через цикл, чтобы преобразовать каждую букву в двоичную,-join
все вместе, чтобы сформировать одну сплошную строку, и-replace
все0
без нуля. Затем мы посчитаем.length
эту строку и возьмем ее mod-2, чтобы определить, является ли она четной или нечетной, что будет удобно либо,0
либо1
, идеально подходит для-xor
.Вернется
True
илиFalse
соответственно. Смотрите тестовые случаи ниже:источник
Фактор, 85 байт
По какой-то причине я не мог обернуть голову вокруг этого до тех пор, пока несколько минут назад я не упростил (и, возможно, сократил?) Код.
?
похож на троичный оператор: он проверяет достоверность третьего элемента стека и выбирает либоtrue
значение, либоfalse
значение.Это примерно эквивалентно следующему C-подобному псевдокоду:
Остальная часть кода довольно проста:
источник
Машинный код IA-32, 15 байтов
HexDump:
Код сборки:
Это функция, которая получает свой первый аргумент (строку) в
ecx
и второй аргумент (символ) вdl
. Он возвращает результатeax
, поэтому он совместим сfastcall
соглашением о вызовах.Этот код изменяет правила, когда он использует
setpo
инструкцию:Эта инструкция устанавливает
al
бит четности, вычисленный предыдущей инструкцией, поэтому в правилах у меня есть два куска:xor
), которая вычисляет бит четности.setpo
Инструкция только перемещает его вal
регистр.Этим семантическим деталям нет пути, вот объяснение того, что делает код.
Представления персонажей:
Если мы добавим 1 к ним, они получат правильное соотношение:
Таким образом, мы
XOR
все символы строки, инициализирующиеal
эти значения, что дает ответ.Первая инструкция
movzx eax, dl
вместо более очевидной (и более короткой)mov al, dl
, потому что я хочу иметь номер 0 в регистре (ah
в данном случае), чтобы иметь возможность сравнивать его в правильном порядке (0, [ecx]
а не[ecx], 0
).источник
Юлия,
58474540 байтЭто функция, которая принимает строку и символ и возвращает целое число.
Чтобы получить число единиц в двоичном представлении, мы сначала применяем
bin
функцию к каждому символу в строке, которая дает нам массив двоичных строк. Затем сведите их к одному использованиюprod
(поскольку*
в Julia используется конкатенация строк) и возьмите пересечение множества этой строки и код символа для1
, что дает нам строку единиц. Последний индекс этой строки - это число единиц. Мы XOR это с 1, если предоставленный символ o и 0 в противном случае, затем получить четность, используя побитовое И 1.Попробуйте онлайн! (включает все тестовые случаи)
Благодаря Деннису сэкономлено 18 байт!
источник
05AB1E ,
15, 13 байтовКод:
Пример ввода:
Пример вывода:
Объяснение:
Спасибо Аднану за сохранение 2 байта.
источник
²
команды. Это автоматически выдвигает второй вход поверх стека. Кроме того, строки из двух символов могут быть сокращены с помощью„
. Так"oe"
эквивалентно„
. Для 13 байтов:€ÇbSOÈ„oe²k<^
:)Рубин, 57 байт
Если
0
бы в Ruby была ложь, то,==
вероятно, можно было бы переключиться на просто-
, или могли бы быть другие оптимизации, но это не так.источник
Сетчатка , 102 байта
Принимает строку в первой строке и букву во второй строке. Использует кодировку ISO 8859-1.
Попробуйте онлайн
Класс символов в первой строке соответствует любому символу с нечетным числом единиц в двоичном представлении.
Описание того, как четное / нечетное обнаружение с помощью регулярных выражений работает здесь .
источник
Октава, 56 байт
bitunpack
Функция, для ASCII символов, возвращает их в прямом порядке байт порядка. Таким образом, поместив флаг четности в конец нашей строки, распаковав все это и отбросив последние 5 битов, мы можем затем суммировать все значение mod 2 для нашего окончательного ответа.Использование:
источник
Обыкновенный Лисп, 87
s
.p
в строке"oe"
(0 или 1). Например, если их 4, остаток равен нулю. Если p естьo
, то дополнительный бит не должен быть добавлен, и тест возвращает false.Довольно отпечатанных
источник
Java, 91 байт
Я сделал то же самое, что и @ CAT97, но удалил некоторые символы, используя модуль 8 и конкатенацию @Luis Mendo и используя int вместо логического.
Это лямбда для
BiFunction<String, Character, Boolean>
.источник
Matlab, 49 байт
где:
Например:
источник
Инструменты Bash и Unix (72 байта)
Исключает
s
как первый иp
как второй аргумент. К счастью, последние 3 битаo
иe
имеет нечетную и четность соответственно.Предоставление ввода через
<<<
добавляет символ перевода строки, но четность\n
четна, так что это не проблема.источник