Вступление:
У меня есть множество разных шифров, которые хранятся в документе, который я однажды скомпилировал в детстве, я выбрал несколько из тех, которые, по моему мнению, лучше всего подходили для испытаний (не слишком тривиально и не слишком сложно), и превратил их в задачи. Большинство из них все еще находятся в песочнице, и я пока не уверен, выложу ли я все из них или только несколько. Но вот первый из них, чтобы начать вещи.
Компьютерный Шифр зашифрует данный текст в «случайные» группы символов данного length
. Если такая группа содержит цифру, она будет использовать эту цифру для индексации в своей собственной группе для зашифрованного символа. Если в группе нет цифр, это означает, что используется первый символ.
Например, допустим, мы хотим зашифровать текст this is a computer cipher
с заданной длиной 5
. Это потенциальный результат (примечание: числа приведены в 1 в следующем примере):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Давайте возьмем несколько групп в качестве примеров, чтобы объяснить, как расшифровать группу:
qu5dt
Эта группа содержит цифру5
, так что (1-индексированный) пятый символ этой группы является символ , используемый для расшифрованного текста:t
.hprit
Эта группа не содержит цифр, поэтому первый символ этой группы неявно используются для расшифрованного текста:h
.osyw2
: Эта группа содержит цифру2
, так что (1-индексированный) второй символ этой группы является символ , используемый для расшифрованного текста:s
.
Вызов:
Учитывая целое число length
и строку word_to_encipher
, выведите случайную зашифрованную строку, как описано выше.
Вам нужно только зашифровать с учетом length
и word_to_encipher
, так что нет необходимости создавать программу / функцию дешифрования. Я мог бы сделать часть 2 вызов для расшифровки в будущем, однако.
Правила вызова:
- Вы можете предположить, что
length
будет в диапазоне[3,9]
. - Вы можете предположить, что
word_to_encipher
завещание будет содержать только буквы. - Вы можете использовать либо строчные, либо прописные буквы (укажите, какой из них вы использовали в своем ответе).
- Ваши выводы, каждая группа и позиции цифр в группе (если они есть) должны быть равномерно случайными . Таким образом, все случайные буквы алфавита имеют одинаковую вероятность возникновения; позиция зашифрованной буквы в каждой группе имеет одинаковую вероятность появления; и позиция цифры имеет такую же вероятность появления (за исключением случаев, когда это первый символ и цифры не присутствуют; и она, очевидно, не может находиться в той же позиции, что и зашифрованный символ).
- Вам также разрешено использовать 0-индексированные цифры вместо 1-индексированных. Пожалуйста, укажите, какой из двух вы использовали в своем ответе.
- Цифра
1
(или0
0-индексированная) никогда не будет присутствовать в выходных данных. Такb1ndh
что не является допустимой группой для шифрования символа «b». Тем не менее,b4tbw
является действительным, где4
зашифровываетb
на 4 - м (1-индексированного) положении, а также другие символыb
,t
,w
являются случайными (который по совпадению также содержитb
). Другие возможные действительные группыlength
5 , чтобы зашифровать символ «B» являются:abcd2
,ab2de
,babbk
,hue5b
и т.д.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
все же? Иb1akk
действует?b1akk
я бы сказал, нет. Отредактируйте его в описании задачи, чтобы уточнить. Если первый символ является зашифрованным, цифра не должна присутствовать."a??"
имеет 676 возможных результатов, но"1a?"
,"?a1"
,"2?a"
,"?2a"
, имеет only104 результаты. Итак, если я пытаюсь выбрать один результат из всех этих 780 результатов, распределение «положения зашифрованной буквы» будет 13: 1: 1, а не 1: 1: 1. И я бы отнесся к этому как к "равномерно случайной" работе.Ответы:
Pyth, 22 байта
Попробуйте онлайн.
Используются строчные и нулевые индексы.
объяснение
Очень простой алгоритм.
источник
Perl 6 , 125 байт
Попробуйте онлайн!
Принимает ввод и вывод в верхнем регистре. Принимает ввод карри, вроде
f(n)(string)
. Использует 1 индексацию.Объяснение:
источник
Python 2 ,
187177176156154148 байтПопробуйте онлайн!
Используются заглавные буквы и цифры с 0 индексами.
-3 байта, спасибо Кевину Круйссену
источник
sample(R(l),2)[::1|-(random()<.5)]
значит?range(l)
и тасует их. Но, видимо, образец не гарантирует порядок, поэтому он не нужен :)(j==i)*(n>0)
? Умножение имеет приоритет оператора над вычитанием, не так ли?JavaScript (Node.js) , 135 байт
Попробуйте онлайн!
Спасибо Арно за 1Б
источник
R ,
134132123 байтПопробуйте онлайн!
Принимает заглавные буквы.
Объяснение старого кода (в основном тот же подход):
источник
Java (JDK) , 193 байта
Попробуйте онлайн!
IntStream
(полученоString::chars
) в качестве ввода, а также число и возвращает другоеIntStream
.double
кint
не нужно+=
.источник
Japt , 29 байт
Попробуйте онлайн!
Zero-индексироваться.
Объяснение:
источник
C, 115 байтов
Попробуйте онлайн!
0-индексированный, строчные.
Слегка раскатанный и расширенный:
Код должен быть довольно простым. Два случайных числа
i
,j
сгенерированные в одномrand()
вызове, являются независимыми, поскольку gcd (n
,~-n
) = 1 иRAND_MAX
является большим.источник
чистый , 256 байт
Попробуйте онлайн!
: выбирает
x
(позиция персонажа в сегменте)y
, которое не равноx
(положение цифры в сегменте)x
и не равной,y
если не равенx
нулюисточник
JavaScript, 134 байта
Попробуйте онлайн!
Этот ответ выбрал закодированную строку из всех возможных закодированных строк равномерно. Таким образом, можно сделать закодированное письмо первым.
источник
C # (интерактивный компилятор Visual C #) , 171 байт
Попробуйте онлайн!
Объяснение ...
источник
Древесный уголь ,
3530 байтПопробуйте онлайн! Ссылка на подробную версию кода. 0 индексированные. Объяснение:
Введите длину.
Введите слово и зациклите символы.
Выберите случайную позицию для расшифрованной буквы.
Выберите другую случайную позицию для цифры, если только буква не находится в позиции 0, в этом случае цифра также должна быть в позиции 0.
Зациклите один раз для каждого выходного символа и включите положение.
Если это позиция цифры, выведите позицию расшифрованной буквы.
Но если это позиция расшифрованной буквы, выведите букву. Это имеет приоритет над положением цифры, потому что Древесный уголь берет последнюю запись, если несколько вариантов переключения имеют одинаковое значение.
В противном случае выведите случайную букву.
источник
05AB1E , 26 байт
0 индексированные.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник