Kata sandi string

31

Tantangan Anda adalah mengesahkan string! Apa yang dimaksud dengan kata sandi, Anda bertanya?

Ambil string sebagai input. String ini hanya akan berisi huruf besar, huruf kecil, angka, dan spasi.

Anda harus mengganti semua spasi dengan garis bawah dan memindahkan semua angka ke ujung string dengan urutan yang muncul dari kiri ke kanan. Kemudian, untuk setiap huruf dalam string, ubah secara acak menjadi huruf besar atau kecil.

Contoh (huruf karakter harus bervariasi setiap kali):

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

Kode terpendek dalam byte menang!

Siapa pun yang bertanya pada Keamanan Informasi SE apakah ini adalah algoritma hashing yang bagus menang! - Jangan khawatir SE tuan, saya hanya bercanda.

Daniel
sumber
47
Besar. Sekarang Anda telah menerbitkan skema saya.
Segera
8
Itu bahkan bukan algoritma hashing kata sandi ... itu akan dibunuh dengan api pada Keamanan SE XD
Justin
1
Kalau saja ada cara mudah untuk melakukan keacakan di Retina ...
mbomb007
4
Ini bukan hashing algo yang baik karena diacak
CalculatorFeline
6
Saya tergoda untuk menggunakan beberapa jawaban sebagai kata sandi
MickyT

Jawaban:

12

Pyth, 15 byte

s}D`MTrRO2Xzd\_

Demonstrasi

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.
isaacg
sumber
27

Labirin , 76 byte

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

Kolaborasi lain dengan @ MartinBüttner dan di sisi yang lebih gila dari spektrum Labyrinth - untuk pertama kalinya kami memiliki keempat ^>v<dalam satu program. Cobalah online!

Penjelasan

Algoritma umum, yang berjalan dalam satu lingkaran, adalah sebagai berikut:

 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

Untuk menjaga penjelasannya tetap ringkas, inilah kira-kira bagaimana setiap bagian dari program sesuai dengan pseudocode di atas:

masukkan deskripsi gambar di sini

Inilah bagian yang menarik.

Mendapatkan keacakan dalam Labyrinth

Hanya ada satu cara untuk mendapatkan keacakan di Labyrinth, dan itu ketika IP mencoba untuk maju tetapi 1) tidak ada jalan maju atau mundur dan 2) ada jalan yang tersedia kiri dan kanan. Dalam hal ini, IP secara acak memilih antara rute kiri dan kanan.

Ini hanya mungkin menggunakan ^>v<operator, yang membuang ndan menggeser baris / kolom nsebanyak 1. Misalnya, program ( Coba online! )

" 1
""v!@
  2
   !@

output 1 atau 2 secara acak, karena vmenggeser kolom dengan offset 0 (yaitu kolom IP aktif) dengan 1, menghasilkan

"
""1!@
  v
  2!@

IP menghadap ke kanan dan mencoba untuk maju (atas tumpukan adalah nol) tetapi tidak bisa. Itu juga tidak bisa bergerak mundur, sehingga secara acak memilih antara kiri atau kanan.

Trik golf

  • Program dimulai dari karakter pertama dalam urutan pembacaan, yang akan Anda perhatikan sebenarnya adalah langkah 6. Namun, muncul dari tumpukan Labirin kosong menghasilkan 0, sehingga langkah 10 dan 14 terjadi, menggeser nol ke tumpukan tambahan, yang secara efektif no-op.

  • Tumpukan utama secara efektif kosong setelah setiap iterasi, yang memungkinkan kita untuk bermain golf tata letak kode dengan menggunakan >dan <pada nol tersirat di bagian bawah. The >membungkus baris bawah sekitar sehingga bergerak IP dari kanan bawah ke kiri bawah, dan <pergeseran barisan belakang. IP kemudian dengan senang hati bergerak ke atas kolom kiri untuk melanjutkan loop.

  • Digit di pop Labyrinth ndan tekan 10*n + <digit>. Selain itu, karakter diambil modulo 256 sebelum menjadi output. Menyatukan keduanya memungkinkan kita menghasilkan 95 (garis bawah) dengan melakukan `33ke 32 (spasi), yang berhasil karena -3233 % 256 = 95. Meskipun ada cara lain untuk mengubah 32 menjadi 95 ( ;95menjadi yang termudah), bekerja dengan angka negatif di sini memungkinkan kita untuk memadatkan kode sedikit dengan belokan kiri.

Sp3000
sumber
2
Setiap penyerang yang mencoba menggunakan algoritma ini untuk menemukan kata sandi saya pasti akan hilang ...
J_F_B_M
3
Saya hanya akan menggunakan program ini sebagai kata sandi saya
ILikeTacos
7

CJam , 25 byte

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

Cobalah online!

Penjelasan

Terjemahan dari jawaban MATL saya.

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
Luis Mendo
sumber
7

CJam, 23 byte

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

Uji di sini.

Penjelasan

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.
}%
Martin Ender
sumber
7

Python, 107 byte

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

Perbaikan pada lain dua Python menjawab karena:

  • [...,'_'][c<'!']digunakan sebagai ganti s.replace(' ','_'), dan
  • choice(c+c.swapcase()) digunakan sebagai ganti choice([c.upper(),c.lower()])
Sp3000
sumber
Oh, peningkatan yang bagus. Jawaban bagus! +1 dari saya.
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 hanya untuk mengacak kasus karakter ...

Sunting: Menyimpan 13 byte besar berkat @ edc65.

Neil
sumber
Saya terlambat ke pesta lagi. Rendah / upp bagus! Tetapi sisanya bisa lebih sederhana:f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65
@ edc65 Wow. Bahkan hanya dengan menggabungkan penggantian spasi / garis bawah dengan penggantian huruf besar / kecil menghemat dua byte tetapi ini fantastis!
Neil
7

MATL , 27 byte

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

Cobalah online!

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
Luis Mendo
sumber
5

Python 3, 128 122 118 karakter

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

Terima kasih kepada xnor untuk mencukur 6 byte.

DJMcMayhem
sumber
Terlihat lebih pendek untuk mendapatkan angka di bagian akhir dengan menyortir:lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
xnor
@ Terima kasih! Saya benar-benar harus belajar dan mulai menggunakan lambdas ...
DJMcMayhem
5

Perl 6, 77 75 61 byte

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

S/// seperti s/// kecuali itu tidak dimodifikasi $_di tempat

Tombol cepat
sumber
4

Pyth, 17 byte

smrdO2o}N`UT:zd\_

Coba di sini!

Penjelasan

smrdO2o} N`UT: zd \ _ # z = input

            : zd \ _ # ganti spasi dengan garis bawah
      o # Sortir ^ dengan fungsi tombol (N)
       } N`UT # N di "0123456789", berikan 1 untuk angka sehingga mereka disortir ke kanan
 m # memetakan setiap karakter d dari ^
  rdO2 # Konversi d random menjadi huruf besar atau kecil
s # gabung daftar kembali menjadi satu string
Denker
sumber
4

Mathematica, 86 byte

Terima kasih kepada Sp3000 untuk menghemat 1 byte.

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

Ahhh, pemrosesan string Mathematica ... sangat bagus. Ini adalah fungsi tanpa nama yang mengambil dan mengembalikan string.

Karena semua gula sintaksis, urutan bacaannya agak lucu:

Characters@#

Pisahkan string menjadi karakter, jika tidak kita tidak bisa melakukan apa-apa dengannya.

...~SortBy~{DigitQ}

Mengurutkan angka sampai akhir. Dengan membungkus fungsi tes dalam daftar, kami membuat penyortiran stabil.

...&/@...

Memetakan fungsi kiri di atas setiap karakter dalam daftar.

RandomChoice[{ToLowerCase,Capitalize}]

Memilih fungsi penggantian kasus acak untuk karakter saat ini.

...@#...

Terapkan ke karakter saat ini.

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

Mengganti spasi dengan garis bawah.

...<>""

Akhirnya, semua karakter digabungkan kembali menjadi satu string.

Martin Ender
sumber
3

PowerShell, 113 Bytes

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

PowerShell adalah singkatan dari bahasa golf yang mengerikan. Membagi menjadi array char dan mengganti spasi dengan garis bawah. Ambil setiap karakter dan proses. Kumpulkan angka ke dalam variabel $ d untuk output nanti. Setiap karakter lain secara acak dibuat menjadi huruf besar atau kecil dengan memunculkan ekspresi menggunakan 'char'.ToLower()atau 'char'.ToUpper(). Jika ada angka yang dikumpulkan tambahkan mereka di akhir.

Mat
sumber
PowerShell hebat dan melakukan semua hal. : D Anda dapat menyimpan beberapa byte dengan menggunakan $_-in0..9dan -inoperator diperkenalkan di PowerShell v3 bukan regex -match.
AdmBorkBork
3

Julia, 88 87 78 byte

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

Ini adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Pertama-tama kita memecah string input menjadi array karakternya, dan mengurutkan array berdasarkan apakah setiap karakter adalah digit. Ini mempertahankan urutan dalam teks dan digit tetapi mendorong digit sampai akhir. Lalu, untuk setiap karakter dalam array, kami memeriksa apakah itu spasi. Jika demikian, ganti dengan garis bawah, jika tidak pilih secara acak salah satu ucfirstatau lcfirstuntuk diterapkan pada karakter, sehingga mengubahnya menjadi huruf besar atau kecil. Bergabung dengan array menjadi string dan kita selesai!

Coba di sini

Disimpan 9 byte berkat Sp3000!

Alex A.
sumber
2

Perl, 51 48 byte

Termasuk +2 untuk -lp

Jalankan dengan input pada STDIN:

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

passwordify.pl:

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

Faktor, 154 byte

atau 222 dengan mengimpor 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 ;

Saya tidak terlalu pandai bermain golf, dan saya tidak yakin apakah saya mengambil pendekatan terbaik di sini, tetapi saya pikir saya akan mencobanya.

Tombol cepat
sumber
1

Ruby, 84 byte

Fungsi anonim. Menghapus spasi sebelum c.downcasemenyebabkan kesalahan sintaksis untuk beberapa alasan dan saya tidak yakin mengapa.

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

Lua, 125 Bytes

Ketika objek bertemu fungsional, Anda dapat melakukan beberapa hal cantik, bahkan di lua! Saya tidak berpikir saya bisa menurunkan ini, ini sudah sangat berantakan, dan saya sudah senang mengalahkan sebagian besar jawaban python: 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)

Tidak terseret dan penjelasan

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
Katenkyo
sumber
1

Serius, 25 byte

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

Cobalah online!

Penjelasan:

,`'_' (Æ≈"ûù"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
Mego
sumber
1

IPOS - tidak bersaing, 14 byte

S'_RE`N-`dE!k?

Ya, saya menambahkan builtin untuk tantangan ini, tetapi mereka tidak secara khusus ditargetkan pada masalah ini.

Ini bekerja dengan penerjemah versi 0.1 .

Contoh dijalankan

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

Penjelasan

     # Implisit: menempatkan input pada stack (C)
S # Dorong spasi ke tumpukan (B)
'_ # Dorong garis bawah ke tumpukan (A)
R # In C ganti B dengan A -> ganti garis bawah dengan spasi
     # stack hanya berisi string yang diganti (C)
E # Dorong string kosong (B)
`# Mulai perintah literal,
     # stack untuk ini akan diinisialisasi dengan satu karakter (B) nanti
N # Dorong digit 0-9 sebagai string ke tumpukan (A)
- # Hapus setiap karakter dari B yang ada di A
`# Akhiri perintah literal (A)
d # pisahkan C pada B, urutkan bagian yang turun dengan kunci A dan gabungkan kembali pada B.
     # Fungsi kunci A mengubah setiap karakter string menjadi string kosong jika itu adalah digit.
     # Karena char yang dihasilkan tidak mengandung digit, nilai kuncinya adalah panjangnya.
     # Ini memetakan kunci 0 ke digit dan kunci 1 ke bukan digit. Mengurutkan ini secara turun
     # order menggerakkan digit ke kanan dan meninggalkan non-digit sesuai urutan sebelumnya.
E # Dorong string kosong
! k # Dorong perintah k (= swapcase)
? # Terapkan ^ ke setiap karakter secara acak
     # Implisit: Output isi tumpukan
Denker
sumber
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;

Kode Tidak Terkunci:

$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;
Siddharajsinh Zala
sumber
Ini adalah awal yang baik, tetapi Anda bisa bermain golf lebih banyak. Ubah semua variabel menjadi nama 1-char, dan hapus spasi putih tambahan. Ketika Anda melakukan itu, ini akan menjadi golf kelas satu!
NoOneIsHere
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)

Mungkin ada banyak ruang untuk perbaikan di sini yang akan saya kerjakan nanti.

Mego
sumber
0

AWK, 128 Bytes

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

The srand()diperlukan untuk memberikan nomor acak yang berbeda setiap kali berjalan.
Agar ini berfungsi dengan baik dengan input multi-line, kita harus meletakkan sesuatu A=N=""sebelum forloop.

Robert Benson
sumber
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))

Seperti yang Anda lihat, pada dasarnya saya menggunakan fungsi modul acak choiceuntuk memilih fungsi acak (baik .upper () atau .lower ()) untuk setiap huruf dalam versi string yang diurutkan, di mana semua digit menuju ke akhir. Selain itu, setiap ruang diganti dengan garis bawah pada string yang diurutkan.

R. Kap
sumber
0

PHP, 164 158 karakter / byte

Ini lebih baik daripada golf PHP lainnya , karena:

  • Dibutuhkan input
  • Lebih pendek

Naskah

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

Contoh

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337

timmyRS
sumber
0

> <> , 73 byte

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

Tidak ada yang gila di sini, itu:

  • mencetak _saat bertemu 
  • mengambil mod 32 huruf, kemudian secara acak menambahkan 8 * 8 atau 12 * 8 sebelum mencetaknya
  • menumpuk nomor dan mencetaknya setelah ujung input tercapai

Anda bisa mencobanya di sini !

Harun
sumber
-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)
Argenis García
sumber