Codegolf — Сгенерировать Шифр

  • Автор темы ЕленаГ
  • Обновлено
  • 22, Oct 2024
  • #1

Сгенерировать шифр по числу и строке

Ваша задача проста. Учитывая строку

 The treasure is here
2
 
and a number 0 <= n <= 9 в качестве входных данных вставьте псевдослучайный печатаемый символ ASCII между каждым символом строки. n times. Such that for each character of s есть n random characters between them. Spaces should be trimmed.

Вход:

  • нить s phrase to encrypt in the cipher
  • целое число n in the range of 0 <= n <= 9

Пример:

Вход:

s

Выход:

Т!0час32еF4трlkехма7 летс#0ты*&р*часе!2яЧ^сБ,час!@е0)ре


Вот так выигрывает самый короткий код! Удачи и получайте удовольствие!

#код-гольф #код-гольф #строка #случайный #криптография

ЕленаГ


Рег
23 May, 2013

Тем
82

Постов
208

Баллов
638
  • 26, Oct 2024
  • #2

С#, 141 131 байт

Довольно похоже на @Geobit's Java-ответ, за исключением того, что сейчас дольше :(

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 main(){

char a[]="A   A A";

f(a,3);
}
 

Полный материал лямбды:

i; f(char*s,int n){ do{ while(*s==32)++s; putchar(*s); i=n; while(i--) putchar(32+rand()%95); }while(*s++); } ||answer||

05AB1E, 11 байт

i;f(char*s,int n){do{while(*s==32)++s;putchar(*s);i=n;while(i--)putchar(32+rand()%95);}while(*s++);}

Попробуйте онлайн!

Объяснение

continue ||answer||

Java 7, 132 124 байта

f("The treasure is here", 2) // THphdwekAtMArbSeU1aDTsZWuqnr2yek1iyUsKshqXewvrVCeTi f("The treasure is here", 2) // TYshlcep6t4Iru7e29aQ1sl/uvQrlzeSJihysDhhOLe1urpte1m

Ничего особенного, просто двойная петля, как и следовало ожидать. Внешний для зацикливания строки, внутренний для заполнения случайных чисел:

(s,n)=>s.replace(/./g,c=>c!=" "?c+crypto.randomBytes(n).toString`base64`.substr(0,n):"") ||answer||

Пайк, 12 11 9 байт

from random import * c=int(input()) print(''.join([i+''.join([chr(randint(33,126))for i in range(c)])for i in input().strip(' ')])[:-c])

Попробуйте здесь!

for(;($s=str_replace(' ','',$argv[1]))[$j]>'';)echo$i++%($argv[2]+1)?chr(rand(33,127)):$s[$j++];

Согласно OP, конечные случайные символы допустимы.

 

Tevis89


Рег
28 Aug, 2007

Тем
55

Постов
176

Баллов
481
  • 26, Oct 2024
  • #3

Октава, 43 байта

import random a,b=input(),input() print(''.join([x+''.join([chr(random.randint(33,126))for c in range(int(b))]) for x in a]))

Это принимает строку (defn cipher [message n] (apply str (remove #(= \space %) (mapcat #(apply str % (for [_ (range n)] (char (rand-nth (range 32 127))))) message)))) and an integer (defn c[m n](apply str(remove #(=\space %)(mapcat #(apply str %(for [_(range n)](char(rand-nth(range 32 127)))))m)))) в качестве ввода. Строка в Octave — это просто массив символов. ($_, $n) = <STDIN>; # Reads in the string into $_, # and the number into $n, from standard input. # (<STDIN> works slightly different from <>.) chomp($_); # Removes the newline from the string. $_ =~ tr/ //d; # `Tr/`ansliterates ASCII space characters # into nothing, effectively `/d`eleting them. $\ = chop($_); # Chop()s off the last character out of $_ and # appends it to the output when print()ing. # (Perl always prints $\ after you call print().) print( map { # Each element of [List 1] will be mapped to: $_, # -- Itself, and # (When mapping, each element is available as $_.) map { # (`map` resembles `foreach` but returns a list.) chr( # -- A random ASCII character, in the range 33 + int(rand(94)) ) # from 33 (!, hex 21) to 126 (~, hex 7E) } 1..$n # ...$n times! (Over the range 1 to $n, actually.) } split(//, $_) ); # [List 1] is $_, split() into characters. is a logical map with ($_,$n)=<>;chomp;y/ //d;$\=chop;print map{$_,map{chr 33+int rand 94}1..$n}split// для любых некосмических персонажей. Код добавляет матрицу с whitespaceTrimmer rows and the same number of columns as whitespaceTrimmer имеет, содержащий числа с плавающей запятой от 33 до 126. Оно неявно округляется до целых чисел и преобразуется в символы ASCII при объединении со строкой. 3, 4 . . выпрямляет это до горизонтального массива символов.

Проверьте это здесь!

 

Samoylovova


Рег
01 Apr, 2020

Тем
87

Постов
193

Баллов
648
  • 26, Oct 2024
  • #4

Python 2, 123 122 118 114 98 байт

Чувак, я желаю 3, 4 wasn't so expensive (and that we didn't have to filter for spaces). Now we have big savings from being allowed to have cipher characters at the end :) Anyways, here ya go:

>34. ||answer||

JavaScript (Firefox 30+), 96 байт

v

Чистый ES6 на два байта длиннее:

s[0]

Вот действительно классный подход, который, к сожалению, на 26 байт длиннее:

~ ||answer||

Р, 97 байт

Безымянная функция, принимающая входные данные s (string) and i .

m

Попробуйте это на R-fiddle

 

Carazz


Рег
18 Aug, 2015

Тем
68

Постов
176

Баллов
526
  • 26, Oct 2024
  • #5

CJam, 21 18 байт

}}~

Попробуйте онлайн!

Принты r random trailing characters.

Объяснение

] ||answer||

Баш, 124 байта

Чистый бить + Coreutils, нет структур потока управления, нет дополнительных языков, нет «оценки»

играл в гольф

~

Тест

ti ||answer||

Q/KDB+, 39 36 34 байта

v ~}}r]~< .43< v

Используемые переменные:

ti

При этом используется прежний наречие, которое применяет функцию слева между каждым элементом справа и его предшественником. (По сути, функция применяется слева между каждым символом справа.)

Сгенерируйте n случайных чисел от 40 до 126, а затем преобразуйте их в символьный эквивалент: (похоже, что в q есть только символы для них)

v

Пример вывода:

!

РЕДАКТИРОВАТЬ:
Сэкономлено 3 байта за счет преобразования raze q в (,/) с использованием обозначения k и аналогично изменено до `:

Спасибо @slackwear за обновление, сбрил 2 байта :)

 

ПАПАНДОПАЛА


Рег
07 Nov, 2007

Тем
76

Постов
217

Баллов
617
  • 26, Oct 2024
  • #6

Java 8, 114 байт

v

играл в гольф ti ) to save a few bytes.

Лямбда, которая принимает целое число и строку. Вдохновленный ответом Java 7, двойной цикл с использованием некоторого синтаксиса потока Java 8 (

?!v

Вход

ti ||answer||

Выход

ti

Скала, 95 94 байта

Ничего особенного, кроме использования mkString в строке. Он рассматривает строку как список символов и позволяет мне вставить разделитель между ними. Мой разделитель — это подходящее количество случайно сгенерированных буквенно-цифровых символов.

 

Miguelbymn


Рег
04 Apr, 2014

Тем
64

Постов
192

Баллов
542
  • 26, Oct 2024
  • #7
s

><> (Рыба), 107 106 103 байт

Попробуйте онлайн!

:}}:

Это не суперслучайно, но это случайно. Просто поместите строку и целое число в стек (Пример: «Привет, мир!», 5).

Полное объяснение

s

Это немного более старая версия кода, пока я не обновлю объяснение. В основном то же самое, просто, может быть, немного легче читать: ti and the integer parameter is m .

o

Мы притворимся, что строковый параметр *+o tells the fish to immediately move left, which wraps around to x | , which adds the space to the register. x , который добавляет в стек пробел. Затем рыба путешествует x shifts the stack to the left (putting | переворачивает стек и ! tells the fish to begin moving downwards.

v2< <1x|! ^3<

ti tells the fish to move in a random direction, ultimately resulting in the fish going right and continuing downwards, or pass over m в конце стека), копирует значение в конце стека, а затем сдвигает его вправо. :} beforehand. These add 1 or 2 respectively to the number on the end of the stack. If the fish travels upwards, it hits ti или 1-} shifts the stack to the right, then having ti снова и возвращается вниз. i ).

m

в позиции 1 в стеке, а эта новая переменная в позиции 0 (мы назовем ее Этот раздел представляет собой функцию, назовем еепробелыТриммер < is. It simply strips spaces that're on the end of the stack (so the beginning of the string) until it runs into a non-space character.

. Оно начинается там, где rv and must travel to the left. It then runs into i И сразу же рыба плывет в

который копирует значение в конец стека, помещает пространство из регистра в конец стека, копирует его, а затем помещает обратно в регистр. l-1 , or more specifically, [ Затем рыба попадает l1-[ pops the new value off the end of the stack, if it is 0 it doesn't execute the next instruction, which in this case is i , который извлекает два последних значения (два, которые мы только что создали) из стека, сравнивает их, помещает 1 в конец стека, если они равны, и 0 в конец стека, если они равны. другой. i , which orders the fish to move downwards (exiting the function).

, вместо этого он выполняет :} which is a trampoline, and that causes the fish to skip the next instruction, which is a i Однако если это 1, то он нашел пробел и выполняет команду i which tells it to pop the last value off the stack (confirmed to be a space), then the fish continues, and runs the function again.

:{{

, поэтому рыба продолжается. Перед рыбой она видит :{{:}l1-[rv , then output the last character on the stack by :{{:}l1-[rv v2< <1x|!}:}-1<v!?:{{:o+* ^3<v ~}}r]~< .43< Рыбе немедленно приказывают плыть прямо мимо v ). It gets the length of the stack from x (который при первом запуске является первым символом y on the end of the stack, then 10, 6 , помещает . . It hits x, y заставляет 2 вычитаться из 6 does, causes the fish to skip the 10 который, помня что a , which ends the program.

если стек пуст, и приземлиться на a6. which causes the fish to bounce over the ; Далее, если в стеке еще есть символы, мы выполняем ! , which stores ; и выполнить ! ), and ? (АКА ?!; coordinates for l на конце стека, которые - , and execute the instruction to the right of that postion (as the fish is swimming right).

, который выталкивает их из конца стопки, а затем телепортирует рыбу в 2 position 6 is the line below this one. l Это не так сложно, как кажется, когда вы понимаете, s , and to the right of that is , which is a no-op. This causes the fish to continue swimming right and actually begin execution at the beginning of the line...

o

позиция 10 тогда Итак, это функция, которая добавляет случайный текст между символами. Это немного сложновато, но это только потому, что я постарался сделать его немного более случайным. Давайте назовем это.

genRandomChars > is actually the setup for the function, and less-so part of the actual function itself. The fish first swims over ?!;a6.>ol2- ~ was at postion 1 on the stack, then you'd know v который копирует значение в конце стека, а затем дважды сдвигает его влево. Если ты помнишь это

теперь находится в конце стека. ! which copies v Затем рыба подплывает ! both at the beginning and end of the stack. ? и сдвигает стек вправо, помещая = creates a new stack, moving =?!v ~ просит рыбу положить длину в конец стопки, вычесть из нее 1, затем :&:& on the old stack). Then the fish simply hits < (длина стека минус 1) в новый стек (поэтому просто оставляем < below.

который снова переворачивает стек (я думаю, что создание нового стека по какой-то причине меняет его) и приказывает рыбе снова плыть вниз, на самом деле начиная функцию с :&:<~ v!?=& and our temporary m Итак, в настоящее время конец стека имеет i . Immediately the fish swims over } , который мы назовем v and moves it to the beginning of the stack. Then 2+ , что вычитает 1 из 1+ and moves it to the beginning of the stack (putting x который просто копирует

в позиции стека 1).

+1xv +2<v }

На самом деле это очень просто. v causes the fish to skip i и выполнить {:} . Remembering what r да, мы помним, что это заставляет рыбу двигаться в любых 4 направлениях. & is simply a mirror, and causes the fish to swim back to " " . Таким образом, рыба поместит 1, 2 или 3 в конец стека и продолжит двигаться влево, оборачиваясь.

Затем рыба выполняет < which causes the last two values on the stack to be popped off, multiplied together, and the result push back on, then the same thing with addition, then the final value is popped off the stack and outputted with < v}:{r&" " . Наш стек теперь снова относительно нормальный и содержит только [ i , s , < v}:{r&" " +1xv +2<v } :&:<~ v!?=& ?!;a6.>ol2- :{{:}l1-[rv v2< <1x|!}:}-1<v!?:{{:o+* ^3<v ~}}r]~< .43< ].

Input: "Hello world!", 5 Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d causes the value on the end of the stack (basically <v}:{r&" " 1xv+ 2<v+ v}< <~v!?=&:&: 6.>ol2-?!;a :{{:}l1-[rv v2< <1x|!}:}-1<v!?:{{:o-+ ^3<v ~}}r]~< .40< позиция 0) не копируется, тогда стек дважды сдвигается вправо (помещая def c(s:String,i:Int)=s.filter(_>32).mkString(scala.util.Random.alphanumeric.take(i).mkString) on the front again), then HfKIedb3l<-Ul%}vod"Bw\"|oa`%rH-}l/-{dMS;!B#X копируется. 3, "Hello world!" should be pretty easy to understand by now. Basically if String.chars равно 0, то мы выходим из функции с помощью (n,s)->s.chars().forEach((c)->{if(c>32)for(int i=0;i<=n;)System.out.print((char)(++i==1?c:33+Math.random()*94));}) , otherwise we execute TVghrveVp Rpti+r0sea3a9nsIjuRXrAReJ; +di=ys`{ ikhKTe4trTZesz и пропустить `char$40+n?87 //Possible characters. ()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ (doing another loop).

Если s:"The treasure is here" n:2 is 0 and we are done outputting slightly random characters, then we execute (,/)({""sv((,/)x;10h$40+n?87)}':)s и посмотрите:

raze{""sv(raze x;`char$40+n?87)}prior s (,/)({""sv((,/)x;`char$40+n?87)}':)s

Здесь нет ничего особенного. Мы удаляем >E "The treasure is here" 2 TkZhf(e&Rt@FrS,edha+-sJTuh.rX@eVKi+3s<7hftey8r*/e from the stack via E() { N=${1// /};paste <(fold -1<<<$N) <(tr -cd "\\40-\\176"<\/dev\/urandom|head -c$(($2*${#N}-$2))|fold -$2)|tr -d '\t\n';} . Затем lS- e# Read line and remove spaces. l~ e# Read and evaluate another line. f{ e# For each character (passing in N)... { e# Do this N times... 95mr e# Push random integer in [0, 95). Sc+ e# Add to space character, giving a random printable ASCII character. }* } e# All characters remaining on the stack are printed implicitly e# at the end of the program. is new, it pops all our values off the stack and places them on the old stack! Because of the reversal issue we reverse with n , затем дважды сдвиньте стек вправо с помощью lS-(ol~f{{95mrSc+\}*} , shufting the stack to the right, giving us [ function(x,n,l=nchar(x))for(i in 1:l)cat(substr(x,i,i),if(i<l)intToUtf8(sample(32:126,n)),sep="") , n , x ], (s,n)=>String.raw({raw:s.split` `.join``},...[for(_ of s)String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32])]) is to remove the extra duplicated (s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[...Array(n)].map(_=>Math.random()*95+32))) из ранее описанной функции, поскольку она нам понадобилась бы, если бы мы выполняли цикл (но это не так, мы выходим). (s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32])) tells the fish to swim down and into from random import* f=lambda s,n:s and(' '<s[0])*eval('s[0]'+'+chr(randint(32,126))'*n)+f(s[1:],n) (перевернут, чтобы показать порядок выполнения), который говорит рыбе просто плыть влево и внутрь. random (because the (:)' это прыжок!). s is actually just to the right of the beginning s(s>32) , что идеально, потому что мы движемся влево.

Следуя всей этой логике, мы можем следить за рыбой до тех пор, пока стек не станет окончательно пустым и программа не завершится сразу после этого. n is executed.

 

Ксана


Рег
14 Apr, 2011

Тем
69

Постов
193

Баллов
558
  • 26, Oct 2024
  • #8

Перл 5, 81 байт

1

Я надеюсь, что следующее поможет вам понять, что делает однострочник:

s>32 ||answer||

Clojure, 126 123 118 122 117 байт

n

Сопоставляет сообщение, вставляет случайные символы, а затем объединяет результат.

Инструкции предполагают, что из результирующей строки следует удалить все пробелы. Если из исходного сообщения должны быть удалены только пробелы, я могу это изменить.

Негольфед:

s ||answer||

Питон 3, 127 байт

@(s,n)[s(s>32);33+94*rand(n,nnz(s>32))](:)'

Вероятно, намного дольше, чем необходимо, но пока это моя игра в гольф.

 

Женяяяяяяяяяяяя


Рег
01 Nov, 2011

Тем
56

Постов
191

Баллов
501
  • 26, Oct 2024
  • #9

PHP, 96 байт

Принимает строку в качестве аргумента 1 и число в качестве аргумента 2.

d- - remove spaces from input F - for i in ^: QV - repeat (number) times: ~KH - random_from(printable) s - sum(^)

Попробуйте онлайн

 

Kopotilovac


Рег
16 Apr, 2020

Тем
85

Постов
227

Баллов
652
  • 26, Oct 2024
  • #10

Питон 3, 133 байта

d-FQV~KHs ||answer||

Node.js, 88 байт

String f(int n,char[]a){ String o=""; int i; for(char b:a) if(b>32) for(i=0, o+=b; i++<n; o+=(char)(33+Math.random()*94)); return o; }

Пример вывода:

String f(int n,char[]a){String o="";int i;for(char b:a)if(b>32)for(i=0,o+=b;i++<n;o+=(char)(33+Math.random()*94));return o;}

Попробуйте онлайн!

 

Luizasavenko


Рег
04 Apr, 2020

Тем
80

Постов
221

Баллов
631
  • 26, Oct 2024
  • #11

С, 102 100 байт

-2 байта для пропуска ð- # remove spaces from input string v # for each char in the string y # push the char ²F # input-2 number of times do: žQ.R # push a random ascii character J # join to string .

ð-vy²FžQ.RJ

Негольфед:

Func<string, int, string> a = (I,n) => { var R=new System.Random(); var o=""; int i; foreach(var c in I) if(c>32) for(i=0,o+=c;i++<n;o+=(char)R.Next(33,127)); return o; };

Использование:

(I,n)=>{var R=new System.Random();var o="";int i,r;foreach(var c in I)if(c>32)for(i=r=0,o+=c;i++<n;){r=R.Next(33,127);o+=(char)r;}return o;};
 

Mifikon


Рег
06 Nov, 2019

Тем
77

Постов
201

Баллов
636
Тем
403,760
Комментарии
400,028
Опыт
2,418,908