Зашифруйте строку


31

Ваша задача состоит в том, чтобы зашифровать строку! Вы спрашиваете, что такое пароли?

Возьмите строку в качестве ввода. Эта строка будет содержать только заглавные буквы, строчные буквы, цифры и пробелы.

Вы должны заменить все пробелы подчеркиванием и переместить все числа в конец строки в том порядке, в котором они отображаются слева направо. Затем для каждой буквы в строке случайным образом измените ее на прописные или строчные.

Примеры (регистр символов должен меняться каждый раз):

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

Самый короткий код в байтах побеждает!

Кто бы ни спросил о информационной безопасности SE, выигрывает ли это хороший алгоритм хеширования! - Не волнуйтесь, повелители SE, я просто шучу.


47
Отлично. Теперь вы опубликовали мою схему. Вернитесь назад, меняя все мои пароли ...
Geobits

8
Это даже не алгоритм хеширования паролей ... он будет убит огнем в Security SE XD
Джастин,

1
Если бы в Retina был простой способ сделать случайность ...
mbomb007

4
Это не хороший алгоритм хеширования, потому что он рандомизирован
CalculatorFeline

6
Я испытываю желание использовать некоторые ответы в качестве пароля
MickyT

Ответы:


12

Pyth, 15 байт

s}D`MTrRO2Xzd\_

демонстрация

s}D`MTrRO2Xzd\_
                   Implicit: z = input(), d = ' '
          Xzd\_    In z, replace ' ' with '_'.
      rR           To each character, apply r-function
        O2         Randomly 0 or 1. r 0 is lowercase, r 1 is uppercase.
 }D                Order the characters based on presence in
   `MT             The strings of the numbers 0 to 9.
s                  Concatenate into a string.

27

Лабиринт , 76 байт

 `:_64/"32}
,`    (3  :=-{
"`{"; _v2$  ;`3
"`".:@ ; ".5(`3.
<       "" `^`;>

Еще один сговор с @ MartinBüttner и более безумной стороной лабиринтного спектра - впервые у нас все четыре ^>v<в одной программе. Попробуйте онлайн!

объяснение

Общий алгоритм, который работает в цикле, выглядит следующим образом:

 1.   Read a char
 2.   If EOF:
 3.     Move all digits from auxiliary stack to main
 4.     Output all digits on main stack
 5.     Halt
      Otherwise:
 6.     If char is a letter (c >= 64):
 7.       If random turns left:
 8.         Output char XOR 32
          Otherwise:
 9.         Output char
        Otherwise:
10.       Shift char to auxiliary stack
11.       If char is space (c-32 == 0):
12.         Pull char back from auxiliary stack
13.         Output underscore
          Otherwise:
14.         Continue loop

Чтобы сохранить объяснение компактным, вот примерно то, как каждая часть программы соответствует псевдокоду выше:

введите описание изображения здесь

Вот интересные части.

Получение случайности в Лабиринте

Есть только один способ получить случайность в Лабиринте, и это когда IP пытается идти вперед, но 1) нет ни пути вперед, ни назад, и 2) есть пути, доступные слева и справа. В этом случае IP случайным образом выбирает между левым и правым маршрутами.

Это возможно только с помощью ^>v<операторов, которые выталкивают nи сдвигают строку / столбец nна 1. Например, программа ( попробуйте онлайн! )

" 1
""v!@
  2
   !@

выводит 1 или 2 случайным образом, так как vсмещение столбца со смещением 0 (т. е. столбца, на котором включен IP) на 1, что приводит к

"
""1!@
  v
  2!@

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

Гольф трюки

  • Программа запускается с первого символа в порядке чтения, что, как вы заметите, на самом деле является шагом 6. Однако, выталкивание из пустого стека Лабиринта дает 0, поэтому выполняются шаги 10 и 14, смещая ноль во вспомогательный стек, что эффективно нет оп.

  • Основной стек фактически пуст после каждой итерации, что позволяет нам обрабатывать макет кода, используя >и <неявные нули внизу. >Оборачивает нижнюю строку вокруг так , что IP перемещается от нижнего правого угла к нижнему левому, и <сдвигает строку назад. Затем IP успешно перемещается вверх по левому столбцу, чтобы продолжить цикл.

  • Цифры в лабиринте лопаются nи толкаются 10*n + <digit>. Кроме того, символы передаются по модулю 256 перед выводом. Соединение этих двух значений позволяет нам вывести 95 (подчеркивание), выполнив `3332 (пробел), что работает потому, что -3233 % 256 = 95. Несмотря на то, что есть другие способы превратить 32 в 95 ( ;95самый простой), работа с отрицательным числом позволяет нам немного сжать код левыми поворотами.


2
Каждый злоумышленник, пытающийся использовать этот алгоритм для нахождения моего пароля, обязательно потеряется ...
J_F_B_M

3
Я просто использую эту программу в качестве пароля
ILikeTacos


7

CJam , 25 байтов

lelS'_er{58<}${2mr{eu}&}%

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

объяснение

Перевод моего ответа MATL.

l                            e# read line as a string
 el                          e# make lowercase
   S'_er                     e# replace spaces by underscores
        {58<}$               e# (stable) sort with key "is digit"
              {        }%    e# map block over the string
               2mr           e# generate 0 or 1 equiprobably
                  {eu}&      e# if it's 1, make uppercase

7

CJam, 23 байта

lS'_er{60<}${eu_el+mR}%

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

объяснение

l       e# Read input.
S'_er   e# Turn spaces into underscores.
{60<}$  e# Sort (stably) by whether the character is a digit or not. This moves digits
        e# to the end, without changing the relative order within digits or non-digits.
{       e# Map this block over the characters...
  eu    e#   Convert to upper case.
  _el   e#   Make a copy and convert to lower case.
  +     e#   Join them into one string.
  mR    e#   Randomly choose one of the characters. Of course, this entire block is a
        e#   no-op for non-letter characters.
}%

7

Python, 107 байт

from random import*
lambda s:''.join([choice(c+c.swapcase()),'_'][c<'!']for c in sorted(s,key=str.isdigit))

Улучшение в двух других ответах Python, потому что:

  • [...,'_'][c<'!']используется вместо s.replace(' ','_'), и
  • choice(c+c.swapcase()) используется вместо choice([c.upper(),c.lower()])

О, хорошие улучшения. Отличный ответ! +1 от меня.
DJMcMayhem

7

JavaScript (ES6), 114 101 байт

s=>s.replace(/./g,c=>c>'9'?c[`to${Math.random()<.5?"Low":"Upp"}erCase`]():c>' '?(s+=c,''):'_',s='')+s

47 байтов просто для рандомизации регистра символа ...

Редактировать: благодаря @ edc65 сохранены огромные 13 байтов.


Я снова опаздываю на вечеринку. Низкая / Upp это здорово! Но остальное может быть проще:f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65

@ edc65 Ух ты. Даже объединение замены пробел / подчеркивание с заменой заглавных / строчных букв экономит два байта, но это фантастика!
Нил

7

MATL , 27 байт

k32'_'XEt58<2$S"@rEk?Xk]]v!

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

k         % implicit input. Make lowercase. Non-lettters are not affected
32'_'XE   % replace spaces by underscores
t58<      % duplicate. Create logical index: true for digits, false otherwise
2$S       % sort first string according to second. Sort is stable
"         % for each character in that string
  @       %   push that character
  rEk     %   generate 0 or 1 with 1/2 probability each
  ?       %   if it's a 1
    Xk    %     make uppercase. Non-letters are not affected
  ]       %   end if
]         % end for each
v         % vertically concatenate all stack contents
!         % transpose into a row char array, i.e. a string. Implicit display

5

Python 3, 128 122 118 символов

from random import*
s=lambda x:''.join(choice(i.upper()+i.lower())for i in sorted(x.replace(' ','_'),key=str.isdigit))

Спасибо xnor за то, что сбрил 6 байтов.


Это выглядит короче, чтобы получить числа в конце, отсортировав:lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
xnor

@xnor Спасибо! Я действительно должен учиться и начать использовать лямбды ...
DJMcMayhem

5

Perl 6, 77 75 61 байт

{[~] |S:g/' '/_/.comb(/\D/)».&{(.lc,.uc).pick},|.comb(/\d/)}

S///это как s///за исключением того, что он не изменяется $_на месте


4

Pyth, 17 байт

smrdO2o}N`UT:zd\_

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

объяснение

smrdO2o} N`UT: zd \ _ # z = вход

            : zd \ _ # заменить пробелы подчеркиванием
      o # Сортировать ^ с помощью ключевой функции (N)
       } N`UT # N в "0123456789", дает 1 для чисел, поэтому они сортируются справа
 m # отобразить каждый символ d of ^
  rdO2 # Преобразование случайных чисел в верхний или нижний регистр
s # объединить список обратно в одну строку

4

Mathematica, 86 байт

Спасибо Sp3000 за сохранение 1 байта.

RandomChoice[{ToLowerCase,Capitalize}]@#/." "->"_"&/@Characters@#~SortBy~{DigitQ}<>""&

Аааа, обработка строк Mathematica ... разве это не мило? Это безымянная функция, которая принимает и возвращает строку.

Из-за всего синтаксического сахара порядок чтения немного смешной:

Characters@#

Разбейте строку на символы, иначе мы не сможем ничего с этим поделать.

...~SortBy~{DigitQ}

Сортирует цифры до конца. Оборачивая тестовую функцию в список, мы делаем сортировку стабильной.

...&/@...

Сопоставляет функцию левой руки над каждым символом в списке.

RandomChoice[{ToLowerCase,Capitalize}]

Выбирает случайную изменяющую регистр функцию для текущего символа.

...@#...

Применяет его к текущему персонажу.

.../." "->"_"

Заменяет пробелы подчеркиванием.

...<>""

Наконец объединяет все символы обратно в строку.


3

PowerShell, 113 байт

-join([char[]]$args[0]-replace" ","_"|%{if($_-match"\d"){$d+=$_}else{"'$_'.To$("Low","Upp"|random)er()"|iex}})+$d

PowerShell означает ужасный язык игры в гольф. Разбить на массив символов и заменить пробелы подчеркиванием. Возьмите каждого персонажа и обработайте. Соберите числа в переменную $ d для последующего вывода. Каждый другой символ случайным образом превращается в верхний или нижний регистр, вызывая выражение с помощью 'char'.ToLower()или 'char'.ToUpper(). Если какие-либо цифры были собраны, добавьте их в конце.


PowerShell великолепен и делает все. : D Вы можете сохранить несколько байтов, используя $_-in0..9и -inоператор , введенный в PowerShell v3 вместо регулярных выражений -match.
AdmBorkBork

3

Юлия, 88 87 78 байт

s->join([c<33?'_':rand([ucfirst,lcfirst])("$c")for c=sort([s...],by=isdigit)])

Это анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, назначьте его переменной.

Сначала мы разбиваем входную строку на массив ее символов и сортируем массив в соответствии с тем, является ли каждый символ цифрой. Это поддерживает порядок в тексте и цифрах, но подталкивает цифры до конца. Затем для каждого символа в массиве мы проверяем, является ли это пробелом. Если это так, замените символом подчеркивания, в противном случае случайным образом выберите один из символов ucfirstили lcfirstприменить его к символу, преобразовав его соответственно в верхний или нижний регистр. Соедините массив в строку, и все готово!

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

Сохранено 9 байт благодаря Sp3000!


2

Perl, 51 48 байт

Включает +2 для -lp

Запустите с помощью ввода на STDIN:

perl -lp passwordify.pl <<< "Hel1lo wo4rld"

passwordify.pl:

s%\pL%$&^$"x rand 2%eg;$_=y/ 0-9/_/dr.s/\D//gr

1

Фактор, 154 байта

или 222 с импортом kernel splitting sequences ascii combinators.random regexp

: f ( x -- y ) R/ \d/ R/ \D/ [ all-matching-subseqs ] bi-curry@ bi [ { [ >upper ] [ >lower ] } call-random ] map [ "" join ] bi@ " " "_" replace prepend ;

Я не слишком хорош в игре в гольф, и я не уверен, что выбрал здесь лучший подход, но думал, что попробую


1

Рубин, 84 байта

Анонимная функция. Удаление пробела раньше c.downcaseвызывает синтаксическую ошибку по какой-то причине, и я не уверен почему.

->s{q="";s.gsub(/./){|c|c=~/\d/?(q+=c;p):c==" "??_:rand<0.5?c.upcase: c.downcase}+q}

1

Луа, 125 байт

Когда объект встречается с функционалом, вы можете делать красивые вещи даже в Lua! Я не думаю, что смогу сыграть в гольф, это уже довольно большой беспорядок, и я уже рад побить большинство ответов питона: D.

s=""print((...):gsub("%d",function(d)s=s..d return""end):gsub("%s","_"):gsub("%a",1<math.random(2)and s.upper or s.lower)..s)

Неуправляемый и объяснения

s=""                       -- Initialise the string that will contains the digits
print((...)                -- apply the following to the argument then print it
  :gsub("%d",function(d)   -- iterate over the digits
    s=s..d                 -- concatenate them in s
    return""               -- remove them from the arg
   end)
  :gsub("%s","_")          -- replace spaces by underscores
  :gsub("%a",              -- iterate over letters
    1<math.random(2)       -- pick a random integer between 1 and 2
      and s.upper          -- if it is 2, use the function upper() of object s
      or s.lower)          -- else, use the function lower() of object s
  ..s)                     -- concatenate with s

1

Серьезно, 25 байт

,`'_' (Æ≈"ûù"J£ƒ`M;ì;(-+Σ

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

Объяснение:

,`'_' (Æ≈"ûù"J£ƒ`M;ì;(-+Σ
,`              `M         map over input:
  '_' (Æ                     replace spaces with underscores
        ≈                    cast to int (does nothing if cast fails)
         "ûù"J£ƒ             randomly upper- or lowercase it (does nothing if not letter)
                  ;ì;(-+   move ints to back
                        Σ  join

1

IPOS - не конкурирует, 14 байтов

S'_RE`N-`dE!k?

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

Это работает с версией 0.1 интерпретатора .

Пример запуска

> python IPOS.py S'_RE`N-`dE! k? -i "pa55 w0rd"
Pa_WrD550

объяснение

     # Неявный: поместить ввод в стек (C)
S # Вставить пробел в стек (B)
'_ # Вставьте подчеркивание в стек (A)
R # В C заменить B на A -> заменить подчеркивания пробелами
     # стек теперь содержит только замененную строку (C)
E # Нажмите пустую строку (B)
`# Запустить командный литерал,
     # стек для этого инициализируется одним символом (B) позже
N # Вставьте цифры 0-9 как строку в стек (A)
- # Удалить каждый символ из B, который находится в A
`# Завершить командный литерал (A)
d # разделить C на B, отсортировать части по убыванию с ключом A и соединить обратно на B.
     # Функция ключа A преобразует каждый символ строки в пустую строку, если это цифра.
     # Поскольку полученный символ не содержит цифры, его ключевое значение - это длина.
     # Это сопоставляет ключ 0 с цифрами и ключ 1 с не цифрами. Сортировка по убыванию
     # order перемещает цифры вправо и оставляет не цифры в том порядке, в котором они были раньше.
E # толкнуть пустую строку
! k # Нажмите команду k (= swapcase)
? # Применить ^ к каждому персонажу случайным образом
     # Неявный: вывод содержимого стека

1

PHP, 368 байт

$str = "pa55 w0rd";
$str = str_replace(" ","_",$str);
$output AND $numStr = "";
$numArray = ['0','1','2','3','4','5','6','7','8','9'];
for($i=0;$i<strlen($str);$i++){
    in_array($str[$i],$numArray)?($numStr = $numStr.$str[$i]):((rand(10,100)%2==0)?$str[$i] = strtoupper($str[$i]) AND $output = $output.$str[$i]:$output = $output.$str[$i]);
}
echo $output = $output.$numStr;

Код Ungolfed:

$str = "pa55 w0rd";
$str = str_replace(" ","_",$str);
$len = strlen($str);
$output = "";
$numStr = "";
$numArray = ['0','1','2','3','4','5','6','7','8','9'];
for($i=0;$i<$len;$i++){
  if(in_array($str[$i],$numArray)){
    $numStr = $numStr.$str[$i];
  }else {
      if(rand(10,100)%2==0)
      {
        $str[$i] = strtoupper($str[$i]);
      }
      $output = $output.$str[$i];
  }
}
$output = $output.$numStr;
echo $output;

Это отличное начало, но вы можете играть в гольф намного больше. Пожалуйста, измените все переменные на имена из 1 символа и удалите лишние пробелы. Когда вы это сделаете, это будет первоклассный гольф!
NoOneIsHere

0

Python 2, 179 байт

from random import*
f=lambda s,a=[str.upper,str.lower],n='0123456789':''.join(map(lambda x:choice(a)(x),filter(lambda x:x not in n,s).replace(' ','_')))+filter(lambda x:x in n,s)

Здесь, вероятно, есть много возможностей для улучшения, над которым я поработаю позже.


0

AWK, 128 байт

{srand();for(;++i<=split($0,a,"");){s=a[i];if(s!=s+0){o=s==" "?"_":rand()>0.5?tolower(s):toupper(s);A=A o}else{N=N s}}print A N}

Он srand()нужен для того, чтобы каждый раз давать нам разные случайные числа.
Чтобы это работало правильно с многострочным вводом, нам нужно поместить что-то вроде A=N=""перед forциклом.


0

Python 3,5 - 118 байт:

from random import*
lambda y:''.join(choice([q.upper(),q.lower()])for q in sorted(y.replace(' ','_'),key=str.isdigit))

Как вы можете видеть, я в основном использую choiceфункцию случайного модуля для выбора случайной функции (.upper () или .lower ()) для каждой буквы в отсортированной версии данной строки, в которой все цифры идут в конец. Кроме того, каждый пробел заменяется подчеркиванием в отсортированной строке.


0

PHP, 164 158 символов / байт

Это лучше, чем другой PHP-гольф , потому что:

  • Требуются входы
  • Короче

скрипт

<?$a=$b='';foreach(str_split(strtolower($argv[1]))as$c){if($c==' ')$c='_';if(preg_match("/[0-9]/",$c))$a.=$c;else$b.=(rand(0,1)?$c:strtoupper($c));}echo$b.$a;

пример

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

> <> , 73 байта

 i:"@")?v:" ")?v0) ?\rl?!;o01!.<
 v8<    8>00.! <o"_"/
8<>x<%*4/^o+*
 ^c<

Ничего сумасшедшего здесь нет:

  • печатает _при встрече 
  • принимает мод 32 букв, затем случайным образом добавляет 8 * 8 или 12 * 8 перед печатью
  • суммирует число и печатает его после достижения конца ввода

Вы можете попробовать это здесь !


-1

Python 3, 151 байт

import random as r
x=input();s="";n=""
for c in x:
 if c.isdigit():n+=c
 else:s+=c.upper() if r.randint(0,1) else c.lower()
print(s.replace(" ","_")+n)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.