Mật khẩu hóa chuỗi


31

Thách thức của bạn là mật khẩu chuỗi! Mật khẩu là gì, bạn yêu cầu?

Lấy một chuỗi làm đầu vào. Chuỗi này sẽ chỉ chứa các chữ cái viết hoa, chữ thường, chữ số và dấu cách.

Bạn phải thay thế tất cả các khoảng trắng bằng dấu gạch dưới và di chuyển tất cả các số đến cuối chuỗi theo thứ tự chúng xuất hiện từ trái sang phải. Sau đó, với mỗi chữ cái trong chuỗi, thay đổi ngẫu nhiên thành chữ hoa hoặc chữ thường.

Ví dụ (trường hợp ký tự nên thay đổi mỗi lần):

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

Mã ngắn nhất trong byte thắng!

Bất cứ ai hỏi về Bảo mật thông tin SE nếu đây là một thuật toán băm tốt sẽ thắng! - Đừng lo lắng về các lớp phủ SE, tôi chỉ đùa thôi.


47
Tuyệt quá. Bây giờ bạn đã xuất bản chương trình của tôi. Quay lại ngay, thay đổi tất cả mật khẩu của tôi ...
Geobits

8
Nó thậm chí không phải là một thuật toán băm mật khẩu ... nó sẽ bị giết bằng lửa trên Security SE XD
Justin

1
Nếu chỉ có một cách dễ dàng để làm ngẫu nhiên ở Retina ...
mbomb007

4
Đây không phải là một thuật toán băm tốt vì nó ngẫu nhiên
Máy

6
Tôi muốn sử dụng một số câu trả lời làm mật khẩu
MickyT

Câu trả lời:


12

Bình thường, 15 byte

s}D`MTrRO2Xzd\_

Trình diễn

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

Mê cung , 76 byte

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

Một bản collab khác với @ MartinBüttner và ở khía cạnh điên rồ hơn của phổ Labyrinth - lần đầu tiên chúng ta có tất cả bốn ^>v<trong một chương trình. Hãy thử trực tuyến!

Giải trình

Thuật toán chung, chạy trong một vòng lặp, như sau:

 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

Để giữ cho lời giải thích nhỏ gọn, đây là cách mỗi phần của chương trình tương ứng với mã giả ở trên:

nhập mô tả hình ảnh ở đây

Dưới đây là những phần thú vị.

Bắt ngẫu nhiên trong Labyrinth

Chỉ có một cách duy nhất để có được sự ngẫu nhiên trong Mê cung, và đó là khi IP cố gắng đi tiếp nhưng 1) không có đường dẫn nào cũng không có đường lùi và 2) có đường đi bên trái và phải. Trong trường hợp này, IP chọn ngẫu nhiên giữa các tuyến trái và phải.

Điều này chỉ có thể sử dụng các ^>v<toán tử, bật nvà dịch chuyển hàng / cột nđi 1. Ví dụ: chương trình ( Dùng thử trực tuyến! )

" 1
""v!@
  2
   !@

xuất ngẫu nhiên 1 hoặc 2, vì vcột dịch chuyển cột có offset 0 (tức là cột IP được bật) bằng 1, mang lại

"
""1!@
  v
  2!@

IP hướng về phía bên phải và cố gắng đi tiếp (đỉnh ngăn xếp là 0) nhưng không thể. Nó cũng không thể di chuyển lùi, vì vậy nó chọn ngẫu nhiên giữa trái hoặc phải.

Thủ thuật đánh gôn

  • Chương trình bắt đầu từ char đầu tiên theo thứ tự đọc, mà bạn sẽ nhận thấy thực sự là bước 6. Tuy nhiên, xuất hiện từ ngăn xếp Labyrinth trống rỗng mang lại 0, do đó, các bước 10 và 14 xảy ra, chuyển số 0 sang ngăn xếp phụ, rất hiệu quả một không-op.

  • Ngăn xếp chính có hiệu quả trống sau mỗi lần lặp, điều này cho phép chúng ta đánh golf cách bố trí mã bằng cách sử dụng ><trên các số 0 ẩn ở phía dưới. Hàng >kết thúc hàng dưới cùng xung quanh để IP di chuyển từ dưới cùng bên phải sang dưới cùng bên trái và <dịch chuyển hàng trở lại. IP sau đó vui vẻ di chuyển lên cột bên trái để tiếp tục vòng lặp.

  • Chữ số trong Labyrinth pop nvà đẩy 10*n + <digit>. Ngoài ra, ký tự được lấy modulo 256 trước khi xuất ra. Đặt hai cái này lại với nhau cho phép chúng ta xuất 95 (gạch dưới) bằng cách thực hiện `33đến 32 (dấu cách), hoạt động vì -3233 % 256 = 95. Mặc dù có nhiều cách khác để biến 32 thành 95 ( ;95dễ nhất), làm việc với số âm ở đây cho phép chúng tôi nén mã một chút với các rẽ trái.


2
Mọi kẻ tấn công cố gắng sử dụng thuật toán này để tìm mật khẩu của tôi chắc chắn sẽ bị mất ...
J_F_B_M

3
Tôi sẽ chỉ sử dụng chương trình này làm mật khẩu của mình
ILikeTacos


7

CJam , 25 byte

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

Hãy thử trực tuyến!

Giải trình

Bản dịch câu trả lời MATL của tôi.

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 byte

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

Kiểm tra nó ở đây.

Giải trình

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 byte

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

Một cải tiến trên khác hai Python trả lời bởi vì:

  • [...,'_'][c<'!']được sử dụng thay cho s.replace(' ','_'), và
  • choice(c+c.swapcase()) được sử dụng thay vì choice([c.upper(),c.lower()])

Oh, cải tiến tốt đẹp. Câu trả lời chính xác! +1 từ tôi.
DJMcMayhem

7

JavaScript (ES6), 114 101 byte

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

47 byte chỉ để ngẫu nhiên hóa trường hợp của một ký tự ...

Chỉnh sửa: Đã lưu 13 byte lớn nhờ @ edc65.


Tôi lại trễ bữa tiệc. Thấp / upp là tuyệt vời! Nhưng phần còn lại có thể đơn giản hơn:f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65

@ edc65 Wow. Thậm chí chỉ cần kết hợp thay thế không gian / gạch dưới với thay thế chữ hoa / chữ thường cũng tiết kiệm được hai byte nhưng điều này thật tuyệt vời!
Neil

7

MATL , 27 byte

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

Hãy thử trực tuyến!

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 ký tự

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

Cảm ơn xnor đã cạo sạch 6 byte.


Có vẻ ngắn hơn để có được các số ở cuối bằng cách sắp xếp:lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
xnor

@xnor Cảm ơn! Tôi thực sự nên học và bắt đầu sử dụng lambdas ...
DJMcMayhem

5

Perl 6, 77 75 61 byte

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

S///giống như s///ngoại trừ nó không sửa đổi $_tại chỗ


4

Bình thường, 17 byte

smrdO2o}N`UT:zd\_

Hãy thử nó ở đây!

Giải trình

smrdO2o} N`UT: zd \ _ # z = đầu vào

            : zd \ _ # thay thế khoảng trắng bằng dấu gạch dưới
      o # Sắp xếp ^ với chức năng chính (N)
       } N`UT # N trong "0123456789", cung cấp 1 cho các số để chúng được sắp xếp ở bên phải
 m # ánh xạ mọi ký tự d của ^
  rdO2 # Chuyển đổi các randoms sang chữ hoa hoặc chữ thường
s # tham gia danh sách trở lại thành một chuỗi

4

Toán học, 86 byte

Cảm ơn Sp3000 vì đã tiết kiệm 1 byte.

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

Ahhh, xử lý chuỗi Mathicala ... không phải là nó đáng yêu. Đây là một hàm không tên lấy và trả về một chuỗi.

Do tất cả các cú pháp cú pháp, thứ tự đọc là một chút buồn cười:

Characters@#

Chia chuỗi thành các ký tự, nếu không chúng ta thực sự không thể làm gì với nó.

...~SortBy~{DigitQ}

Sắp xếp các chữ số đến cuối. Bằng cách gói chức năng kiểm tra trong một danh sách, chúng tôi làm cho việc sắp xếp ổn định.

...&/@...

Bản đồ chức năng bên trái qua từng nhân vật trong danh sách.

RandomChoice[{ToLowerCase,Capitalize}]

Chọn một chức năng thay đổi trường hợp ngẫu nhiên cho nhân vật hiện tại.

...@#...

Áp dụng nó cho nhân vật hiện tại.

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

Thay thế không gian bằng dấu gạch dưới.

...<>""

Cuối cùng kết hợp tất cả các ký tự lại với nhau thành một chuỗi.


3

PowerShell, 113 byte

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

PowerShell là viết tắt của ngôn ngữ chơi golf khủng khiếp. Chia thành mảng char và thay thế khoảng trắng bằng dấu gạch dưới. Lấy từng nhân vật và quá trình. Thu thập số vào biến $ d cho đầu ra sau này. Mỗi ký tự khác được tạo ngẫu nhiên thành chữ hoa hoặc chữ thường bằng cách gọi một biểu thức bằng cách sử dụng 'char'.ToLower()hoặc 'char'.ToUpper(). Nếu bất kỳ chữ số nào được thu thập, nối chúng vào cuối.


PowerShell là tuyệt vời và làm tất cả mọi thứ. : D Bạn có thể lưu một vài byte bằng cách sử dụng $_-in0..9-intoán tử được giới thiệu trong PowerShell v3 thay vì regex -match.
admBorkBork

3

Julia, 88 87 78 byte

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

Đây là một hàm ẩn danh chấp nhận một chuỗi và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Đầu tiên chúng ta chia chuỗi đầu vào thành một mảng các ký tự của nó và sắp xếp mảng theo liệu mỗi ký tự có phải là một chữ số hay không. Điều này duy trì trật tự trong văn bản và chữ số nhưng đẩy chữ số đến cuối. Sau đó, đối với mỗi ký tự trong mảng, chúng tôi kiểm tra xem đó có phải là khoảng trắng không. Nếu vậy, thay thế bằng dấu gạch dưới, nếu không, chọn ngẫu nhiên một ucfirsthoặc lcfirstđể áp dụng cho ký tự, từ đó chuyển đổi nó thành chữ hoa hoặc chữ thường, tương ứng. Tham gia mảng thành một chuỗi và chúng ta đã hoàn thành!

Hãy thử nó ở đây

Đã lưu 9 byte nhờ Sp3000!


2

Perl, 51 48 byte

Bao gồm +2 cho -lp

Chạy với đầu vào trên STDIN:

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

passwordify.pl:

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

1

Yếu tố, 154 byte

hoặc 222 với nhập khẩu 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 ;

Tôi không quá giỏi trong việc chơi golf, và tôi không chắc liệu mình có tiếp cận tốt nhất ở đây không, nhưng nghĩ rằng tôi sẽ thử


1

Ruby, 84 byte

Chức năng ẩn danh. Xóa khoảng trắng trước khi c.downcasegây ra lỗi cú pháp vì một số lý do và tôi không chắc tại sao.

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

1

Lua, 125 byte

Khi đối tượng đáp ứng chức năng, bạn có thể làm một số điều đẹp, ngay cả trong lua! Tôi không nghĩ rằng tôi có thể đánh gôn này, nó đã là một mớ hỗn độn khá lớn và tôi đã rất vui khi đánh bại hầu hết các câu trả lời của con trăn: 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)

Ungolfed và giải thích

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

Nghiêm túc, 25 byte

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

Hãy thử trực tuyến!

Giải trình:

,`'_' (Æ≈"ûù"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 - không cạnh tranh, 14 byte

S'_RE`N-`dE!k?

Có, tôi đã thêm các nội dung cho thử thách này, nhưng chúng không được nhắm mục tiêu đặc biệt cho vấn đề này.

Điều này hoạt động với phiên bản 0.1 của trình thông dịch .

Chạy ví dụ

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

Giải trình

     # Ngụ ý: đặt đầu vào trên ngăn xếp (C)
S # Đẩy một khoảng trắng vào ngăn xếp (B)
'_ # Đẩy một dấu gạch dưới vào ngăn xếp (A)
R # Trong C thay thế B bằng A -> thay thế dấu gạch dưới bằng dấu cách
     # ngăn xếp chỉ chứa chuỗi thay thế (C)
E # Đẩy một chuỗi trống (B)
`# Bắt đầu một lệnh theo nghĩa đen,
     # ngăn xếp này sẽ được khởi tạo với một ký tự (B) sau
N # Đẩy các chữ số 0-9 dưới dạng chuỗi vào ngăn xếp (A)
- # Xóa mọi ký tự khỏi B trong A
`# Kết thúc lệnh bằng chữ (A)
d # split C trên B, sắp xếp các phần giảm dần bằng phím A và nối lại trên B.
     # Hàm khóa A biến đổi từng ký tự của chuỗi thành một chuỗi trống nếu đó là một chữ số.
     # Vì char kết quả không chứa chữ số, nên giá trị chính của nó là độ dài.
     # Điều này ánh xạ khóa 0 thành chữ số và khóa 1 thành không chữ số. Sắp xếp thứ này theo chiều giảm dần
     # order di chuyển các chữ số sang phải và để lại các chữ số không theo thứ tự trước đó.
E # Đẩy một chuỗi trống
! k # Đẩy lệnh k (= hoán đổi)
? # Áp dụng ^ cho mọi nhân vật một cách ngẫu nhiên
     # Ngụ ý: Nội dung ngăn xếp đầu ra

1

PHP, 368 byte

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

Mã bị hủy bỏ:

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

Đây là một khởi đầu tuyệt vời, nhưng bạn có thể chơi golf này nhiều hơn nữa. Vui lòng thay đổi tất cả các biến thành tên 1-char và xóa khoảng trắng thừa. Khi bạn làm điều đó, đây sẽ là một sân golf hạng nhất!
NoOneIsĐây là

0

Python 2, 179 byte

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)

Có lẽ có rất nhiều chỗ để cải thiện ở đây mà tôi sẽ làm việc sau này.


0

AWK, 128 byte

{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}

Điều srand()cần thiết là cung cấp cho chúng tôi các số ngẫu nhiên khác nhau mỗi lần nó chạy.
Để điều này hoạt động chính xác với đầu vào nhiều dòng, chúng ta cần đặt một cái gì đó giống như A=N=""trước forvòng lặp.


0

Python 3,5 - 118 byte:

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

Như bạn có thể thấy, về cơ bản, tôi đang sử dụng choicehàm của mô-đun ngẫu nhiên để chọn một hàm ngẫu nhiên (.upper () hoặc .lower ()) cho mỗi chữ cái trong phiên bản được sắp xếp của chuỗi đã cho, trong đó tất cả các chữ số đi đến kết thúc. Ngoài ra, mọi không gian được thay thế bằng dấu gạch dưới trong chuỗi đã sắp xếp.


0

PHP, 164 158 ký tự / byte

Điều này tốt hơn so với các golf PHP khác , bởi vì:

  • Nó có đầu vào
  • Nó ngắn hơn

Kịch bản

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

Thí dụ

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

> <> , 73 byte

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

Không có gì điên rồ ở đây, nó:

  • in _khi nó gặp 
  • lấy mod 32 chữ cái, sau đó thêm ngẫu nhiên 8 * 8 hoặc 12 * 8 trước khi in chúng
  • xếp chồng số và in chúng sau khi kết thúc đầu vào

Bạn có thể thử nó ở đây !


-1

Python 3, 151 byte

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.