Мы определим нечетный / четный шифр ASCII через следующий псевдокод:
Define 'neighbor' as the characters adjacent to the current letter in the string
If the one of the neighbors is out of bounds of the string, treat it as \0 or null
Take an input string
For each letter in the string, do
If the 0-based index of the current letter is even, then
Use the binary-or of the ASCII codes of both its neighbors
Else
If the ASCII code of the current letter is odd, then
Use the binary-or of itself plus the left neighbor
Else
Use the binary-or of itself plus the right neighbor
In all cases,
Convert the result back to ASCII and return it
If this would result in a code point 127 or greater to be converted, then
Instead return a space
Join the results of the For loop back into one string and output it
Например, для ввода Hello
, вывод emmol
, так как
- В
H
очереди к\0 | 'e'
которой являетсяe
e
Поворачивается'e' | 'l'
, или101 | 108
, что109
илиm
- Первый
l
также превращается в101 | 108
илиm
- Второй
l
превращается в108 | 111
, который является111
илиo
o
Поворачивается108 | \0
, илиl
вход
- Предложение, состоящее исключительно из печатных символов ASCII, в любом подходящем формате .
- В предложении могут быть точки, пробелы и другие знаки пунктуации, но всегда будет только одна строка.
- Предложение будет содержать не менее трех символов.
Выход
- Полученный шифр, основанный на правилах, описанных выше, возвращается как строка или вывод.
Правила
- Либо полная программа или функция приемлемы.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Примеры
Ввод в одну строку, вывод в следующую. Пустые строки отдельные примеры.
Hello
emmol
Hello, World!
emmol, ww~ved
PPCG
PSWG
Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl
abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz
!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy
Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66
o
измененияl
в первом примере, я уверен, что ваши спецификации гарантируют, что первыйo
не изменитсяl
во втором примере. Это должно измениться'l' | ','
, что бы это ни было, верно?'l' | ','
, который есть108 | 44 --> 1101111 | 0101100
, который становится108
, который естьl
.,
Происходит выстраиваться сl
, так что нет никаких изменений при двоичном или происходит.Ответы:
Желе ,
3331 байтПрямой подход, который, безусловно, можно сделать короче.
Попробуйте онлайн!
источник
Perl,
6362 байтаВключает +4 для
-lp
Внести вклад в STDIN
oddeven.pl
:Это работает, как показано, но для получения заявленной оценки это должно быть помещено в файл без финальной
;
и новой строки, а escape-\xhh
коды должны быть заменены их литеральными значениями. Вы можете сделать это, поместив приведенный выше код в файл и запустив:источник
Python 2,
138131 байтПопробуйте онлайн (содержит все контрольные примеры)
Меньше гольфа:
Попробуйте онлайн (без игры в гольф)
Я добавляю
\x00
к обеим сторонам строки, чтобы мне не приходилось беспокоиться об этом во время битовой обработки. Я зацикливаюсь на исходных символах строки, выполняя побитовые операции и добавляя их к результату, следуя правилам проверки на четность.источник
|=
... эквивалент в PowerShell был бы$a=$a-bor$b
a?b:c
как JS.C - 101 байт
Нам даже не нужно проверять, является ли это последним элементом в строке, потому что строки в C заканчиваются нулем.
объяснение
Скорее просто:
Используйте & 1 для проверки нечетности / четности и троичных выражений для замены if / elses. Увеличьте char * p, чтобы уменьшить количество требуемых скобок.
источник
Mathematica, 152 байта
объяснение
Преобразует строку в коды ASCII
Разбивает коды ASCII на длину 3, смещает 1, с дополнением 0.
Применяет функцию для каждого раздела.
If...else if... else
в Mathematica .Проверяет, является ли индекс (# 2) нечетным. (
Max
для выравнивания); так как индекс Mathematica начинается с 1, я использовалOddQ
здесь, а неEvenQ
Принимает коды ASCII левого и правого соседей.
Проверяет, является ли код ASCII соответствующего символа нечетным.
Принимает ASCII коды персонажа и левого соседа.
Принимает ASCII коды персонажа и правого соседа.
Применяется или-операция.
Заменяет все числа больше 126 на 32 (пробел).
Преобразует ASCII-код обратно в символы и соединяет их.
источник
From/ToCharacterCode
функциях. Тогда это выглядит как вашаDrop
могут использовать инфиксную запись:#~Drop~{2}
. И кажется, что вы применяетеBitOr
к каждому возможному выводу,Which
так почему бы не применить его потом и только один раз?Рубин
133128108106 байтДжордан помог мне сэкономить 20 байтов, а cia_rana помог мне сэкономить 2 байта :)
s
берется в качестве входной строки.Пример вывода с
s="Test 123 with odd characters. R@*SKA0z8d862"
:объяснение
Приведенный выше код очень нечитабелен, поэтому здесь есть объяснение. Код хакерский, я не знаком с ruby, так что держу пари, что есть более короткий способ сделать это :)
источник
print
вместоp
: р->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
J, 42 байта
Использует свойство, которое глаголы в J могут применяться поочередно, используя герунду
`
для определенных наречий, таких как инфикс\
.использование
объяснение
источник
JavaScript (ES6),
125118114 байтНеловко долго, но
charCodeAt
и вString.fromCharCode
одиночку стоят 29 байтов. : - /Как это устроено
Каждый символ в позиции
i
переводится по следующей формуле, которая охватывает все правила сразу:где
C(n)
возвращает ASCII-код n-го символа входной строки.демонстрация
источник
PHP,
10797 байтвозможно гольф
источник
C #, 145 байт
Полная программа с методикой ungolfed и тестовыми примерами:
Это оказалось дольше, чем я думал ...
источник