Реализуйте этот ключевой шифр
Цель
Используйте алгоритм (объясненный в разделе Алгоритм) для реализации определенного шифра.
Программа должна прочитать ввод из STDIN или ближайшего доступного эквивалента, использовать алгоритм для генерации зашифрованного текста и ключа.
Зашифрованный текст и ключ будут записаны в STDOUT или ближайший доступный эквивалент. Разрешен любой формат, если он выводит зашифрованный текст и ключ.
Алгоритм
Преобразуйте символы в строке в соответствующие значения ASCII. Например:
Hello -> 72 101 108 108 111
Далее вам нужно будет сгенерировать ключ, пока строка со случайными числами находится в диапазоне 0-9.
Hello -> 62841
Добавьте целые числа в последовательности случайных чисел к значениям ASCII строки. В приведенных выше примерах 72 станет 78, а 101 станет 104.
72 + 6 = 78, 101 + 2 = 103, 108 + 8 = 116, etc
Затем преобразуйте новые значения обратно в символы. В приведенных выше примерах текст Hello
стал Ngtpp
.
Примеры
(Это просто примеры того, как может выглядеть результат. Результат может и будет варьироваться.)
Hello World
Lfrlu)_supg
41606984343
This will be encoded
Zhjs$~koo gj$iuhofgj
60104723305544750226
правила
- Вы можете предположить, что ввод будет содержать только символы в диапазоне az, AZ и пробелах.
- Материалы должны быть полными программами или функциями.
- Материалы будут оцениваться в байтах.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому выигрывает самый короткий код.
(Это одна из моих первых проблем, если с ней что-то не так, не стесняйтесь рассказать мне, как я могу ее улучшить.)
preferably with the format (ciphertext)\n(key).
«предпочтительные функции» и код гольф не очень хорошо сочетаются. Вы должны сделать это обязательным или разрешить другие выходные форматы. 3. Ключ должен быть напечатан без пробелов? Как насчет печати в формате списка, например[0, 5, 2, ...]
?Ответы:
Желе ,
129 байтПопробуйте онлайн!
Как это устроено
источник
Python 3, 130 байт
Спасибо @Rod за указание на ошибку
Функция, которая принимает ввод через аргумент в виде строки и печатает в STDOUT.
Как это устроено
Попробуйте это на Ideone
источник
m=10**len(x);k=str(randint(m,m*10))[1:];
и вы даже сохраняете байт в процессе c:randint
включает все, что вам нужно сделатьm*10-1
. Я только что подумал, как исправить это для того же количества байтов.Pyth - 16 байт
Ожидание решения ОП по форматам вывода.
Тестовый пакет .
источник
На самом деле, 17 байтов
Попробуйте онлайн!
Объяснение:
источник
CJam - 14 байтов
Когда я увидел математику кода ascii, я понял, что должен написать ответ CJam.
Попробуйте это онлайн здесь .
источник
MATL, 13 байт
Вывод выглядит так:
Попробуйте онлайн!
Объяснение:
источник
r
илиYr
PowerShell v2 +,
7977 байтПринимает ввод
$n
, перебирает каждый символ и получаетRandom
элемент из0..9
каждой итерации. Сохраняет эти числа (в виде массива) в$x
. Трубы, которые объединяются в другой цикл. Каждая итерация берет текущий элемент$_
, добавляет его к позиционному символу, вырезанному из$n
(неявное приведение char к int), а затем повторно приводит к[char]
. Оставляет это на конвейере. Это заключено в скобки и-join
объединено, чтобы сформировать слово. Это осталось на конвейере. Кроме того, номер$x
также-join
записывается вместе и остается на конвейере. Они неявно печатаются сWrite-Output
символом в конце выполнения, что приводит к тому, что по умолчанию они печатаются с новой строкой.пример
источник
C #,
252247245232216 байтРазмер довольно плох по сравнению с другими решениями, но тем не менее ...
Это мой второй ответ на Codegolf, и я довольно новичок в рассмотрении C #, поэтому я хотел бы услышать, как сделать его короче :)
Ungolfed:
static
из класса pисточник
b++<i.Count()
и оставить третий пункт пустым? Кроме того, я не думаю, что вам нужен завершающий символ новой строки, поэтому последний вызовWriteLine
может бытьWrite
вместо этого.var
. т.е.var c=
вместо того,string c=
чтобы побрить несколько байтов.Console.ReadLine()
виде строки?i.Length
корочеi.Count()
, вам не понадобится System.Linq. Строка имеет индексатор символов. Также объекты создания новых случайный в петле меньше байт:new Random().Next(10)
.CJam, 11 байт
Попробуйте онлайн!
Как это устроено
источник
05AB1E ,
1817 байтобъяснение
Попробуйте онлайн
источник
Python 3, 112 байт
c - это функция, которая возвращает зашифрованный текст и ключ
Вот код, который делает то же самое и немного более читабелен
Выход:
источник
PHP,
638682 байтаИзменить: забыл распечатать ключ ...
Спасибо Алексу Ховански за то, что он сэкономил мне 4 байта.
Ввод осуществляется через аргумент командной строки. Берет каждый символ в строке и добавляет случайный int от 0-9 к своему ASCII-коду, а затем преобразует код обратно в ASCII. К каждому случайному числу добавляется
$s
, который печатается в конце.источник
$s.=$r
после 2-ой полу в цикл for, сохранив байт, потому что вы можете сбросить его конечную половину. Тогда в вашем цикле будет только один оператор, поэтому вы можете вырезать упаковочные скобки, сохранив еще 2 байта. Затем, в конце, вы можете поместить$s
внутрь строки в кавычках, сохраняя.
оператор еще на один байт. :)J, 32 байта
эквивалент Python:
источник
Perl, 34 байта
Включает +1 для
-p
источник
Perl, 65 байт
Мне потребовалось некоторое время, чтобы понять, как получить ввод без новой строки в конце. Принимает это как командную строку arg
источник
$;
не запускается пустым, поэтому он печатает старое содержимое и rand никогда не может сгенерировать 9. Их легко исправить, а использование STDIN сделает ваш код короче :-)<>=~/./g
. И нет,int
в Perl усекается до 0, он не округляется.perl -wle 'print int 8.6'
выходы8
Python 2,
8499 байтИспользует
id()
значение строки для генерации случайных чисел.Попытайся
источник
map(chr,[ord(a)+int(b)for a,b in zip(x,y)])
наmap(lambda x,y:chr(ord(x)+int(y)),x,y)
? это должно что-то спастиСенва , 74 байта
Вот самая короткая программа, которую я сделал:
Небольшое объяснение? (Примечание: БМ означает Back-Memory ):
Это кажется больше теперь, правда: p? Может быть, возможно оптимизировать этот код, но на данный момент это самый короткий, который я нашел.
источник
C #, 174 байта
Ungolfed:
Довольно просто, правда.
источник
Perl 6: 55 или 70 байт
Как анонимная функция, которая принимает строковый параметр и возвращает список из двух строк (54 символа, 55 байтов) :
Как программа, которая читает из STDIN и записывает в STDOUT (69 символов, 70 байт) :
источник