Генерация шифра с учетом числа и строки
Ваша задача проста. Учитывая строку s
и число в 0 <= n <= 9
качестве входных данных, вставьте псевдослучайный печатный символ ASCII между каждым символом строки n
раз. Такой, что для каждого символа между ними s
есть n
случайные символы. Пространства должны быть обрезаны.
Входные данные:
- строковая
s
фраза для шифрования в шифре - целое число
n
в диапазоне0 <= n <= 9
Пример:
Входные данные:
The treasure is here
2
Выход:
T ! 0 h 32 e F4 t 0i r lk e hm a 7y s # 0 u * & r * h e ! 2 i H ^ s B, h ! @ E 0) r $ h e
Это код-гольф, поэтому выигрывает самый короткий код! Удачи и получайте удовольствие!
code-golf
string
random
cryptography
jacksonecac
источник
источник
n
символов состоит изn
копий одного и того же случайного символа, они все еще случайные, но они не является статистически независимым. И так далееO
были более вероятными, чем пробелы или~
? Если оно должно быть равномерным, то вы должны сказать об этом явно. И если оно не должно быть равномерным, то вы должны хотя бы указать, что каждый персонаж должен иметь ненулевую вероятность. Вы также указаны в предыдущем комментарии , что каждый символ имеет иметь независимое распределение, так что, если это важно, следует отметить , в задаче. Существует очень широкий спектр случайности.Ответы:
C #,
141131 байтОчень похоже на Java-ответ @ Geobit , за исключением более длинного в настоящее время :(
Полный лямбда-материал:
источник
R=...
вы можете просто использовать напрямую,new System.Random().Next(...)
я думаю05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
Java 7,
132124 байтаНичего особенного, просто двойная петля, как и следовало ожидать. Наружный цикл для петли, внутренний для заполнения случайных чисел:
источник
k
:String f(int n,char[]a){String o="";for(char b:a)if(b>32){o+=b;for(int i=0;i++<n;o+=(char)(33+Math.random()*94));}return o;}
(125 байт)char
актерами. Благодарность!Пайк,
12119 байтПопробуй это здесь!
Конечный случайный символ в порядке в соответствии с OP.
источник
Октава, 43 байта
Это принимает строку
s
и целое число вn
качестве входных данных. Строка в Octave - это просто массив символов.s>32
является логической картой1
для любых непространственных символов. Код добавляет матрицу соn
строками и таким же количеством столбцов, чтоs(s>32)
и содержит числа с плавающей запятой в диапазоне от 33 до 126. Она неявно округляется до целых чисел и преобразуется в символы ASCII, когда объединяется со строкойs
.(:)'
выправляет это к горизонтальному массиву символов.Проверьте это здесь!
источник
Python 2,
12312211811498 байтЧувак, хотелось бы, чтобы это
random
было не так дорого (и чтобы нам не приходилось фильтровать места). Теперь у нас есть большая экономия от того, что в конце нам разрешено иметь зашифрованные символы :) В любом случае, вот так:источник
JavaScript (Firefox 30+), 96 байт
Чистая ES6 на два байта длиннее:
Вот действительно крутой подход, который, к сожалению, на 26 байт длиннее:
источник
/. *(?=.)/
, не работает для строк, начинающихся или заканчивающихся в пробелах, не то, чтобы кто-то заботился. (Тебе даже разрешено отследить случайные символы сейчас.)(?=.)
который заботится о пробелах в конце строки.94+33
вместо95+32
R, 97 байт
Безымянная функция принимает входные данные
x
(строку) иn
.Попробуйте это на R-скрипке
источник
CJam ,
2118 байтПопробуйте онлайн!
Печатает
n
случайные символы в конце.объяснение
источник
Баш, 124 байта
Чистый bash + coreutils , нет структур потока управления, нет подъязыков, нет "eval"
Golfed
Тестовое задание
источник
Q / KDB +,
39 3634 байтПеременные в использовании:
При этом используется предыдущее наречие, которое применяет функцию слева между каждым элементом справа и его предшественником. (По сути, применяет функцию слева между каждым символом справа.)
Генерация n случайных чисел от 40 до 126, а затем преобразование их в эквивалентный символ: (q, кажется, только символы для них)
Пример вывода:
РЕДАКТИРОВАТЬ:
3 байта были сохранены путем преобразования размера q в (, /) с использованием записи k и аналогичным образом изменены до `: Благодаря @slackwear за обновление побрили 2 байта :)
источник
10h$
Java 8, 114 байт
Golfed
Лямбда, которая принимает целое число и строку. Вдохновленный ответом Java 7,
String.chars
выполните двойной цикл с использованием некоторого синтаксиса Java 8 Stream ( ) для экономии нескольких байтов.вход
Выход
источник
Скала,
9594 байтаНичего особенного, кроме использования mkString для String. Он обрабатывает строку как список символов и позволяет мне вставить разделитель между ними. Мой разделитель - это соответствующее количество случайно сгенерированных буквенно-цифровых символов.
источник
Random.alphanumeric
заставит каждый кусок быть одинаковым, так что это неубедительный шифр ... Смотрите этот пример:scala> c("Hello", 1) res0: String = Hbeblblbo
filter
. ВызовmkString
String будет рассматривать его как коллекцию символов.> <> (Рыба)
107106103 байтаПопробуйте онлайн!
Это не супер случайно, но это случайно. Просто поместите строку и целое число в стек (пример: «Hello world!», 5).
Полное объяснение
Это немного более старая версия кода, пока я не обновлю объяснение. Это в основном то же самое, просто, может быть, немного легче читать:
Мы притворимся, что строковый параметр is,
s
а целочисленный параметр isi
.Он
<
приказывает рыбе немедленно сдвинуться влево, что оборачивается вокруг" "
, что добавляет пространство, обозначенное в стопке. Затем рыба путешествует&
, что добавляет место в регистр.r
переворачивает стек и{:}
сдвигает стек влево (помещаяi
конец стека), копирует значение в конец стека и затем сдвигает его вправо.v
говорит рыбе начать движение вниз.x
приказывает рыбе двигаться в произвольном направлении, в результате чего рыба движется направо и продолжает движение вниз, либо переходит1+
или2+
заранее. Они добавляют 1 или 2 соответственно к числу в конце стека. Если рыба движется вверх, онаv
снова попадает и спускается вниз.}
сдвигает стек вправо, затем имеетi
позицию 1 в стеке и эту новую переменную в позиции 0 (мы назовем ееm
).Этот раздел является функцией, назовем ее whitespaceTrimmer . Это начинается там, где
<
есть. Он просто удаляет пробелы, которые находятся в конце стека (то есть в начале строки), пока не встретится непробельный символ.Таким образом, рыба немедленно плывет в
<
и должна двигаться влево. Затем он сталкивается с:&:&
копирует значение, которое копирует значение в конец стека, помещает пространство из регистра в конец стека, копирует его и помещает обратно в регистр.Затем рыба попадает
=?!v ~
, или, точнее говоря,=
извлекает последние два значения (два, которые мы только что создали) из стека, сравнивает их, помещает 1 в конец стека, если они равны, и 0 на конец стека, если они разные.?
Выскакивает новое значение с конца стека, если 0 оно не выполняет следующую инструкцию, которая в данном случае!
, вместо этого он исполняетv
, который заказывает рыбу двигаться вниз (выход из функции).Однако, если он равен 1, то он нашел пробел, поэтому он выполняет
!
батут, и это заставляет рыбу пропустить следующую инструкцию, которая являетсяv
, и рыба продолжает. Перед рыбой он видит,~
что говорит ему выкинуть последнее значение из стека (подтверждено, что это пробел), затем рыба продолжает и снова запускает функцию.Рыбе немедленно приказывают плавать прямо на a
>
, затем вывести последний символ в стекеo
(который при первом запуске является первым символомs
). Он получает длину стекаl
, помещает a2
в конец стека и затем-
вычитает 2 изl
. Это поражает,?!;
что, помня, что?
делает, заставляет рыбу пропускать!
если стек пуст, и приземляется;
, что завершает программу.Следуя, если в стеке все еще есть символы, мы выполняем,
!
что заставляет рыбу подпрыгивать над;
и выполнятьa6.
, который хранитa
(AKA10
), и6
в конце стека, которые являютсяx, y
координатами для.
которых они выталкиваются из конца стека, затем телепортирует рыбу10, 6
и выполняет инструкцию справа от этого положения (поскольку рыба плывет вправо).Это менее сложно, чем кажется, когда вы понимаете, что
y
позиция 6 - это линия ниже этой.x
позиция 10 естьv
, а справа от этого есть, что не может. Это заставляет рыбу продолжать плавать правильно и фактически начинать выполнение в начале строки ...
Так что это функция, которая добавляет случайный текст между символами. Это немного глоток, но это только потому, что я пытался сделать это немного более случайным. Давайте назовем это genRandomChars .
:{{:}l1-[rv
Фактически установка для функции, и менее , так часть самой фактической функции. Рыба сначала переплывает,:{{
что копирует значение в конец стека, затем дважды сдвигает его влево. Если вы вспомните, что этоi
было в позиции 1 в стеке, то вы бы знали,i
что теперь это конец стека.Рыба затем переплывает то,
:}
что копируетi
, и сдвигает стопку вправо, помещая ееi
как в начало, так и в конец стопки.l1-[
пусть рыба поместит длину в конец стека, вычтет из нее 1, а затем[
создаст новый стек, переместивl-1
(длина стека минус 1) значения в новый стек (поэтому просто оставляяi
в старом стеке). Затем рыба просто ударяется,rv
что снова переворачивает стопку (я думаю, что создание новой стопки переворачивает ее по какой-то причине), и приказывает рыбе снова плавать вниз, действительно начиная функцию с<
ниже.Так что в настоящее время конец стека имеет
m
и наш временныйi
, который мы будем называтьti
. Сразу же рыба переплывает1-}
, что вычитает 1 изti
и перемещает его в начало стека. Затем,:}
который просто копируетm
и перемещает его в начало стека (помещаяti
в позицию стека 1).Это когда мы попали в эту маленькую вещь:
Это на самом деле очень просто.
!
Заставляет рыбу пропустить|
и выполнитьx
. Помня, чтоx
делает, мы помним, что это заставляет рыбу двигаться в любых 4 направлениях.|
просто зеркало, и заставляет рыбу плыть обратноx
. Таким образом, по сути, рыба поместит 1, 2 или 3 в конец стека и продолжит движение влево, оборачиваясь вокруг.Затем выполняется выполнение fish, в результате
*+o
чего последние два значения в стеке отбрасываются, умножаются вместе, и результат возвращается обратно, затем то же самое с добавлением, затем окончательное значение отбрасывается из стека и выводится с помощьюo
. Наш стек теперь относительно нормально снова , содержащий только [m
,ti
,s
].:}}:
приводит к тому, что значение на конце стека (в основномs
позиция 0) не копируется, затем стек сдвигается вправо дважды (ti
снова помещается на переднюю часть), а затемti
копируется.?!v
должно быть довольно легко понять сейчас. В основном, еслиti
0, то мы выходим из функции с помощьюv
, в противном случае мы выполняем!
и пропускаемv
(делая еще один цикл).Если
ti
равно 0, и мы закончили выводить немного случайные символы, тогда мы выполняемv
и видим:Здесь нет ничего особенного. Удаляем
ti
из стека через~
. Затем]
новый, он выталкивает все наши значения из стека и помещает их в старый стек! Из - за этого вопроса разворота мы с обратнойr
, то сдвигать стек вправо дважды}}~
, shufting стек справа, что дает нам [m
,i
,s
], то~
есть , чтобы удалить лишнюю дублированныйs[0]
ранее в функции , как мы должны были бы, если мы делали петлю (но мы не, мы уходим).v
говорит рыбе плыть вниз и в>34.
(инвертировано, чтобы показать порядок выполнения), что говорит рыбе просто плыть влево и внутрь3, 4
(потому что.
это прыжок!).3, 4
на самом деле только справа от началаwhitespaceTrimmer
, что идеально, потому что мы едем налево.Следуя всей этой логике, мы можем следовать за рыбой до тех пор, пока стек в конечном итоге не станет пустым и программа не выйдет сразу после
whitespaceTrimmer
выполнения.источник
Perl 5, 81 байт
Я надеюсь, что следующее поможет вам понять, что делает однострочник:
источник
Clojure,
126123118122117 байтНаносит на карту сообщение, вставляет случайные символы, затем объединяет результат.
Инструкции предполагают, что все пробелы должны быть удалены из результирующей строки. Если предполагается удалить только пробелы из исходного сообщения, я могу это изменить.
Ungolfed:
источник
Python 3, 127 байт
Вероятно, намного дольше, чем необходимо, но пока это мой гольф.
источник
PHP, 96 байт
Принимает String в качестве аргумента 1 и Number в качестве аргумента 2
Попробуйте онлайн
источник
Python 3, 133 байта
источник
Node.js, 88 байт
Пример выходов:
Попробуйте онлайн!
источник
С,
102100 байт-2 байта для пропуска
continue
.Ungolfed:
Использование:
источник