Две строки являются «эквивалентом Цезаря», если расстояние (считая) между соответствующими символами одинаково. Да, я придумал этот термин. Вот пример:
«Abc» и «Cde» эквивалентны, потому что
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
Капитализация не имеет никакого значения.
«Привет» и «Мир» не являются эквивалентом Цезаря, потому что
distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15
«Abcd» и «Yzab» являются эквивалентом Цезаря, потому что
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Вы должны написать полную программу, которая берет две строки из STDIN и печатает истинное значение, если они эквивалентны Цезарю, и ложное значение, если это не так.
Допустимый ввод
Поскольку использование заглавных букв не имеет значения, допустимо, если ваша программа требует, чтобы входные данные были все в нижнем регистре, в верхнем регистре или в любом другом виде, если вы хотите, если это указано в вашем ответе.
На входе не будет пробелов или знаков пунктуации.
Входы будут одинаковой длины.
Ответы:
Pyth, 9 байт
Две строки ожидаются в нижнем регистре и разделены новой строкой.
Демонстрация.
Как это работает:
.r
вращательная функция перевода Пита. Он сопоставляет каждый элемент в первом аргументе от его первого вхождения во втором аргументе до следующей записи во втором аргументе. В этом случае вторым аргументом являетсяG
строчный алфавит, так что это эквивалентно смещению Цезаря, равному 1.Помещение
=
перед функцией делает ее на месте. Таким образом,=.rzG
присваивает Цезарь сдвигz
на один кz
. Обратите внимание, чтоz
инициализируется в первой строке ввода в Pyth.Это выражение используется внутри карты.
m=.rzGG
применяет это преобразование кz
26 разам, по одному разу для каждого элементаG
, и сохраняет результаты в списке. Это дает список всех возможных смен Цезаряz
.Наконец,
}w
проверяет, находится ли следующая строка ввода в этом списке.источник
CJam,
171211 байтов1 байт сохранен Денисом.
Проверьте это здесь.
Ожидается, что первая строка будет строчной, а вторая - прописной. Отпечатки
1
для кесарево-эквивалентных струн и0
прочее.объяснение
Причина, по которой нам требуется первая строка в нижнем регистре и вторая в верхнем регистре, заключается в том, чтобы гарантировать, что разница всегда положительна. В противном случае взятие по модулю может вернуть что-то отрицательное и не обязательно будет уникальным, даже для строк, эквивалентных Цезарю.
источник
26f%
для сохранения один байт.!
меня не было бы 0 или 1, но пустой или непустой массив.Python2,
68677069 байтPython3,
6766 байтНемного трудно раскрутиться, поэтому просто объясню кусочки:
zip(*raw_input().split())
принимает входные данные, разбивает их на список из двух слов, предполагая, что слова разделены пробелом. После этого каждое слово передается в качестве параметраzip
функции с помощью*
оператора.zip
Функция создает список буквенных пар, для букв в одной и той же позиции.(ord(y)-ord(x))%26for x,y in ...
Это просто преобразует список из 2 букв в генераторное выражение расстояний между этими буквами.{...}
сводит это выражение к набору, по существу выбрасывая дубликатыlen(...)<2
проверяет, остается ли в наборе только один элемент (или 0 для пустых строк), что означает, что все буквы имеют одинаковое расстояние.print
выводит это значениеСпасибо xnor за напоминание о том, что меня
set(...)
можно заменить,{...}
и до этого местаfor
не требуется. Также благодаря Josay для<=1
для<2
оптимизации.источник
<=1
до «<2».{...}
а неset((...))
. Ваш код должен на самом деле напечатать результат.lambda
чтобы сэкономить на письмеprint
илиreturn
.for
; Лексер Python правильно расщепляется26for
.APL (15)
Это требует, чтобы буквы были в верхнем регистре, и печатает или,
1
или0
, вот так:Объяснение:
↑⍞⍞
: прочитайте две строки с клавиатуры и расположите символы в матрице N × 2.⎕A⍳
: для каждого символа найдите, в каком положении он находится⎕A
(заглавный алфавит).-⌿
: для каждого столбца вычтите второе значение из первого значения26|
: возьмите мод-26 каждого из этих чисел.≢∪
: найти количество уникальных значений в списке1=
: Сравните это1
.источник
J, 19 байт
Буквы в одной и той же позиции должны иметь одинаковый регистр.
После преобразования обеих входных строк в их представление кодовой точки
&(3&u:)
мы сравниваем1
с длиной#
кусочка~.
по модулю 2626|
разности-
двух массивов. Кусочек будет,1
если все расстояния Цезаря одинаковы.Использование:
Попробуйте это онлайн здесь.
источник
Юлия,
918783 байтаUngolfed + объяснение:
Это использует тот факт, что строки в Julia могут обрабатываться как символьные массивы и что арифметические операции могут выполняться над символьными значениями. Входные строки могут иметь любую комбинацию заглавных букв, которую вы хотите, при условии, что заглавные буквы в каждой позиции совпадают между строками.
источник
C99,
92 байта с ошибкой10192 байтаДовольно просто; предполагает, что слова являются первым и вторым аргументами, соответственно. Составлено с
-std=c99
.источник
Javascript ( ES7 Draft ), 87 байт
Требуются входные данные для того же случая.
источник
CJam, 13 байтов
Это требует, чтобы первый символ в каждом слове был в верхнем регистре, другие в нижнем регистре.
Попробуй здесь . ( Firefox здесь .)
Жаль, что варианты APL не поддерживают арифметику символов ...
объяснение
источник
Perl, 80
Редактировать : провал оптимизация проскользнул в гольф код. Теперь это соответствует неопрятной версии. (Количество байтов было правильным, хотя.)
Запустите с Perl версии 5.10 (
perl -M5.10.0
илиperl -E …
) дляsay()
. Слегка расширенная версия:Код выводит
1
(правда в Perl), если строки эквивалентны Цезарю, и пустую строку (ложно в Perl), если это не так. Если это слишком слабая интерпретация, мне нужно добавить 2 байта дляsay$p+0
, который печатает1
или0
.Регистр символов должен совпадать между входами.
источник
-i
чтобы взять вторую строку, которая будет хранить ее в переменной$^I
. Кроме того, использование-E
вместо-e
запуска в командной строке даст вамsay
бесплатно, так что вы можете использовать его, не добавляя байтов. Попробуйте запустить это:perl -iteststring -E'say$^I'
вы можете сократить это с помощью-i
трюка.-i
хитрость аккуратна (а я этого не знал!). В этом случае я не думаю, что это помогает, потому что$^I
это дольше, чем<>
.-M5.10.0
. (Но я упомянул-E
переключатель в редактировании)Matlab,
4948 байтовЭто было действительно быстро. К сожалению, получить строку из stdin довольно дорого.
Обратите внимание, что он, как и большинство, если не все ответы, чувствителен к регистру.
РЕДАКТИРОВАТЬ: сбрил один байт, определив анонимную функцию!
источник
Пролог, 56 байт
Не все комбинации случаев поддерживаются.
использование
Попробуйте это онлайн здесь
источник
C 97 байтов
источник
d
и объявляетеa
тип вне параметров, как это:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Скала, 57 байт
Немного дольше, чем другие, и, по сути, эквивалентны, но в другом стиле языка!
У меня также есть эта версия (56 байт):
Но я не знаю, является ли работа за $ 1 совпадением или умышленно ...
источник
x$1
работает безx
определения?Python 2, 80 байт
Принимает 2 одинаковые строки из stdin через пробел:
Проверено на следующих тестовых примерах:
источник
Python 2 -
241237188147 байтПринимает ввод как строчную строку, заключенную в кавычки, через пробел Там должен быть лучший путь..
Ungolfed (260 с лишним байтов)
источник
"
дополнительные 4 с на вашем входе.R 83
84Примерно так же, как и другие решения. Преобразуйте строки в вектор целых чисел. Измените разность векторов на 26. Выполните уникальную обработку по списку, так как проверьте, что длина равна 1. Ожидается, что регистр будет одинаковым в соответствующих символах в каждой строке.
Он ожидает ввода двух строк
источник
<2
вместо==1
.1
или0
Матлаб / Октава,
5352Все входные данные должны быть в одном и том же случае.
К сожалению, Matlab не очень хорош с пользовательским вводом. В качестве анонимного дескриптора это может быть только 35 байт:
Matlab обрабатывает символы строки как вектор чисел. Делая вычитание, мы получаем их различие и
unique
преобразуем этот вектор в вектор, содержащий только уникальные значения. Если есть только одно число, слова эквивалентны caeser и isscalar возвращает 1, в противном случае возвращается 0.источник
Баш,
7148Использование «стандартной» программы Unix
caesar(6)
.Новая версия (с большой помощью от @DigitalTrauma):
1
за правду или ничего за ложь.Если разрешен ввод с помощью аргументов командной строки, его можно сократить до 39 байт :
Старая версия для записи:
источник
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
результат находится во$?
встроенной переменной, где 0 == FALSE и 1 == TRUE, согласно стандартной семантике оболочки.seq -f | bash
немного. Результат$?
не действителен для моего чтения задачи, но, как и мой код, ваш ничего не выводит для false и что-то для true (за исключением пограничного случая двух пустых строк ввода). Во всяком случае, было бы похоже на обман, чтобы использовать все это в моем ответе, может быть, вы должны представить свой собственный.[ 0 == 0 ] ; echo $?
и[ 0 == 1 ] ; echo $?
> <> (Рыба) , 50 байт
Предполагается, что буквы в одной и той же позиции имеют одинаковый регистр.
объяснение
i:3b*(?v
читает первое слово в стек с88+0.
предоставлением циклического перехода~ri-&
удаляет~
разделительное пространство из стека, переворачивает стекr
(первая буква будет сверху), считывает первую букву второго словаi
, вычисляет смещение по первой букве первого слова-
и сохраняет его в регистре&
.l?!^i-&:&-2d*%0)?v
читает каждую следующую букву второго слова, вычитая его из соответствующей буквы первого слова, которая находится наверху стека, вычитает смещение,&:&-
сохраненное в регистре, и проверяет, равен ли результат 0 mod 262d*%
. Если нет, выводит 0 и завершается0n;
.c1.
обеспечивает зацикливание прыжка.1n;
.источник
KDB (Q), 35 байт
объяснение
Тест
источник
Java 281
расширен:
Я мог бы сэкономить 14 байтов, если бы избавился от преобразования всего в верхний регистр, но я чувствую, что полнее его оставить.
источник
Желе , 5 байт
Попробуйте онлайн!
Выводит положительное целое число для эквивалента, 0 в противном случае
Как это работает
источник