Passwordify рядок


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
Якби там був
простой

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

Щоб пояснення було компактним, ось приблизно, як кожна частина програми відповідає вищевказаному псевдокоду:

enter image description here

Ось цікаві частини.

Отримання випадковості в Лабіринті

У Лабіринті існує лише один спосіб отримати випадковість, і це коли ІР намагається йти вперед, але 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

Пітон, 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 байт просто для рандомізації випадку символу ...

Редагувати: Збережено величезні 13 байт завдяки @ edc65.


Я знову спізнююсь на вечірку. Низький / 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

Пітон 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

Піт, 17 байт

smrdO2o}N`UT:zd\_

Спробуйте тут!

Пояснення

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

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

4

Математика, 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 розшифровує жахливу мову для гольфу. Розділіть на масив char і замініть пробіли підкресленнями. Візьміть кожен персонаж і обробіть. Зберіть числа в змінну $ 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 байт

Коли об'єкт відповідає функціоналу, ви можете робити якісь гарні речі, навіть у луа! Я не думаю, що я можу це пограти в гольф, це вже безлад, і я вже радий перемогти більшість відповідей пітона: 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 # In 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;

Код без вогню:

$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-char імена та видаліть зайвий пробіл. Коли ви це зробите, це буде першокласний гольф!
NoOneIsHere

0

Пітон 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 символів / байт

This is better than the other PHP golf, because:

  • It takes inputs
  • It's shorter

Script

<?$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;

Example

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

><>, 73 bytes

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

Nothing crazy here, it :

  • prints _ when it encounters  
  • takes the mod 32 of letters, then randomly adds 8*8 or 12*8 before printing them
  • stacks the number and print them once the end of the input is reached

You can try it here !


-1

Python 3, 151 bytes

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.