Введение
Enigma была одной из первых электромеханических машин с шифрованием ротора, используемых во Второй мировой войне. Это означает, что после того, как одна буква закодирована, она изменит ключ для следующей буквы. Это было признано немцами неразрывным из-за огромного пространства ключей. Даже перебор был почти невозможен. Однако в Enigma произошла ошибка проектирования. Шифрование письма никогда не приведет к самому себе. Это означает, что письмо A
может быть зашифровано для каждой буквы, кроме буквы A
.
Давайте рассмотрим пример закодированного сообщения:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Типичное немецкое слово было WETTERBERICHT
, или прогноз погоды на английском. Используя приведенный выше принцип, мы можем определить, в каких местах слово может быть:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Это невозможно, поскольку I
не может быть зашифровано само по себе, поэтому мы переходим на 1 место:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Это также невозможно, поэтому мы снова перемещаем другое место:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Это снова невозможно. На самом деле, первый возможный случай WETTERBERICHT
:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Итак, мы возвращаем нулевую позицию первого возможного вхождения, которая равна 13 .
Задание
- Учитывая закодированное сообщение и слово, найдите индекс первого возможного вхождения .
- Предположим, что будут использоваться только основные прописные буквенные символы (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Если вхождение не найдено, вы можете вывести любое отрицательное целое число, символ или ничего (например
-1
,X
). - Ввод может быть принят в качестве аргумента, в отдельных новых строках, списках или что-либо еще.
- Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Контрольные примеры
Input: BHGEFXWFTIUPITHHLPETTTCLOEWOELM, WETTERBERICHT
Output: 13
Input: ABCDEFGHIJKL, HELLO
Output: 0
Input: EEEEEEEEEEEE, HELLO
Output: -1
Input: XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
Output: 11
Input: HKKH, JJJJJ
Output: -1
E
что никогда не приведет кE
. Вот о чем весь этот вызов.Ответы:
Pyth, 14 байт
Я не уверен, что это нормально, но если ввод невозможен, в stdout ничего не записывается, а в stderr записывается ошибка деления на ноль. Вход занимает 2 строки, вторая заключена в кавычки.
Объяснение:
Попробуй это здесь!
источник
JavaScript, 40
Используя
replace
, это отображает ввод открытого текста в регулярное выражение формы/[^H][^E][^L][^L][^O]/
(например, для ввода открытого текстаHELLO
), а затем использует егоsearch
для проверки первого индекса подстроки зашифрованного текста, который соответствует этому регулярному выражению. Это регулярное выражение означает «шаблон, где первый символ неH
, второго символа нетE
и т. Д.»$&
это специальная последовательность дляreplace
вывода, которая подставляет значение, соответствующее первомуreplace
аргументу (в этом случае каждому отдельному символу соответствует/./
).источник
$&
! Спасибо, что научил меня чему-то сегодня.$'
в процессе исследования этого ответа, который предоставляет« ту часть строки, которая предшествует / следует за совпадающей подстрокой »Симулятор машины Тьюринга - 15660 байт (неконкурентный)
Не может быть проблемы с Enigma, не проверяя машинный код.
Проверьте это здесь
Краткий обзор:
источник
SWI-Пролог, 115 байт
Пример использования:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. При этом используются строки кодов символов, объявленные с помощью обратных кавычек. Ответ унифицирован сR
. Если совпадений не найдено, выводитсяfalse.
.Объяснение:
Попробуй здесь
источник
Рубин,
9179 байтПроклинаю тебя
Enumerator
! Почему я должен преобразовывать строку в массив в Enumerator для массива и тратить драгоценные байты? > :(источник
[*...]
в качестве альтернативы #to_a для игры в гольф - приятное прикосновение.CJam,
1716 байтовПопробуй это здесь .
Спасибо @PeterTaylor за сохранение байта.
Объяснение:
источник
array block #
может спасти вас чарс:ll:A,ew{A.=:+!}#
ew
(делать ломтики), все остальное просто следует.MATL , 27 байт
Примеры
объяснение
источник
Haskell, 72 байта
Использование:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Простой рекурсивный подход: если слово
w
может быть помещено в начало строкиs
, вернуть счетчик индексаi
, иначе повторить сi
приращением и хвостомs
. Остановитесь и вернитесь,-1
если длинаs
меньше, чем длинаw
.источник
Python 2.7, 111 символов
Пробует все начальные позиции (а) и проверяет совпадение любых букв (используя понимание списка). Он возвращает «None» (Python «NULL»), если ничего не найдено (конец цикла for и ничего не возвращается, по умолчанию «None»).
Тестирование:
источник
def d(c,s): for a in range(len(c)): if a not in[a+(c+s)[a+i:].index(l)for i,l in enumerate(s)]:return a
Брахилог , 48 байт
Это прямой перевод моего пролога.
brachylog_main/2
Генерируются предикат ожидает , что список из двух кодов символьных строк с кодированной строкой сначала в качестве входных данных, и возвращает индекс в качестве вывода, например ,brachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.объяснение
источник
Japt, 12 байт (неконкурентный)
Мне нужна помощь с этим.
источник
.search
? FacepalmUàVr'."[^$&]
за 12.PHP - 155 байт
Сохранить как
crack.php
и запустить с аргументами в командной строке. Например:источник
for($r=-1;$i<strlen($p=$argv[1])-$l=strlen($q=$argv[2]);$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l&&$r=$i)break;echo"$r↵";
levenshtein
, но, вероятно, простая итерация внутри итерации могла бы сделать это за меньшее количество байтов.JavaScript,
129121118119 *118 байтw
это закодированное сообщение,t
это тестовая строка. Это не использует регулярные выражения, а просто сравнивает букву за буквой, сдвигая тестовую строку (то есть "WETTERBERICHT"), добавляя пробел перед ней. Легко и скучно.* тестовый пример без совпадений не работает, теперь работает
источник
𝔼𝕊𝕄𝕚𝕟, 14 символов / 25 байтов
Try it here (Firefox only).
Престижность @apsillers за идею.
объяснение
источник
TeaScript, 14 байтов
20Похоже на умное решение JavaScript @aspillers .
Не конкурирует, потому что использует функции, сделанные после этого конкурса
объяснение
источник
$&
работает вместо${l}
?Рубин,
4336 байтредактировать: интерполяция строк внутри интерполяции строк внутри регулярного выражения, yikes.
Ленивый подход: переводит слово в «отрицательное» регулярное выражение -
=~
оператор делает все остальное.Контрольная работа:
источник
Python 3 , 79 байт
Попробуйте онлайн!
источник
05AB1E , 14 байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Джольф , 14 байт
Попробуй это здесь!
источник
Perl, 38 + 1 = 39 байт
где вход выглядит так:
Это та же идея, что и у javascript.
источник
Java, 136 символов
Решение на основе регулярных выражений, основанное на версии JavaScript от apsillers .
источник
Brachylog (v2), 16 байт
Попробуйте онлайн!
Брахилог, как правило, очень хорош при неудаче, когда решить что-то невозможно.
Это не один из тех времен.
(принимает входные данные в виде списка
[message, word]
. Заголовок печатает все это очень красиво, но результат действительного предиката - просто число, если он успешен)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
кажется, работает так же хорошо для того же количества байтов.источник
C ++ (gcc) ,
160153150 байтПопробуйте онлайн!
источник
goto
и без всех ошибок ...Perl 5 , 46 байт
Использует идею регулярного выражения @apsillers.
Попробуйте онлайн!
источник