Dizeyi passwordify


31

Buradaki zorluk, dizgiyi geçmek için! Geçiş kaçağı nedir?

Giriş olarak bir dize atın. Bu dize yalnızca büyük harf, küçük harf, rakam ve boşluk içerecektir.

Tüm boşlukları alt çizgi ile değiştirmeli ve tüm sayıları soldan sağa göründüğü sırada dizenin sonuna taşımalısınız. Sonra, dizedeki her harf için, rasgele büyük veya küçük harf olarak değiştirin.

Örnekler (karakter büyüklüğü her seferinde değişmeli):

Input
Hello world
Output
HElLo_wORld

Input
pa55 w0rd
Output
pA_Wrd550

Input
14 35
Output
_1435

Input
0971
Output
0971

Input
[space]
Output
_

Bayt cinsinden en kısa kod kazanır!

Bilgi Güvenliği SE'yi kim sorarsa, bu iyi bir karma algoritma kazanırsa kazanır - SE endişelenmeyin, sadece şaka yapıyorum.


47
Harika. Şimdi programımı yayınladın. Hemen geri dönün, tüm şifrelerimi değiştiriyorum ...
Geobits 29:16

8
Bir şifre çözme algoritması bile yok ... Security SE XD'de ateşle öldürülür
Justin

1
Keşke
Retina'da

4
Bu iyi bir karma algo değil çünkü rastgele
CalculatorFeline

6
Cevapların bazılarını şifre olarak kullanmaya
başlıyorum

Yanıtlar:


12

Pyth, 15 bayt

s}D`MTrRO2Xzd\_

gösteri

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

Labirent , 76 bayt

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

@ MartinBüttner ve Labirent spektrumunun daha çılgınca yüzlerinde başka bir kolaj - ilk defa dört ^>v<programın hepsinde bir tane var . Çevrimiçi deneyin!

açıklama

Bir döngüde çalışan genel algoritma aşağıdaki gibidir:

 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

Açıklamayı küçük tutmak için, kabaca programın her bir bölümünün yukarıdaki sözde koduna nasıl karşılık geldiği:

görüntü tanımını buraya girin

İşte ilginç kısımlar.

Labirentte rastgele olma

Labirent'te rastlantısallık elde etmenin tek bir yolu var ve bu IP'nin ileriye doğru gitmeye çalıştığı zaman ama 1) ne ileriye ne de geriye doğru bir yol var ve 2) sola ve sağa uygun yollar var. Bu durumda IP, rastgele sol ve sağ yollar arasında seçim yapar.

Bu yalnızca satır / sütunu 1 ile ^>v<açan nve kaydıran operatörleri kullanarak mümkündür. nÖrneğin, program ( Çevrimiçi deneyin! )

" 1
""v!@
  2
   !@

1 veya 2 çıktısını rasgele çıkarır, çünkü vsütunu ofset 0 ile değiştirir (yani IP'nin açık olduğu sütun), 1

"
""1!@
  v
  2!@

IP sağa dönük ve ileriye doğru gitmeye çalışır (yığının üstü sıfırdır) ancak yapamaz. Ayrıca geriye doğru hareket edemez, bu yüzden rastgele sola veya sağa seçer.

Golf hileci

  • Program, ilk sıradan başlar ve aslında 6. adım olduğunu fark edersiniz. Ancak, boş bir Labirent yığınından atlamak, 0 verir; bu nedenle, adım 10 ve 14 gerçekleşir ve sıfır olan yardımcı yığına geçer. hayır op.

  • Her bir yinelemeden sonra ana yığın etkili bir şekilde boştur, bu da kod düzenini en alttaki gizli sıfırları kullanarak >ve kullanarak <kodlamamızı sağlar. >Etrafında çok alt sola sağ alt IP hareket eder ve bu alt satır sarar <kaymalar satır geri. IP daha sonra döngüye devam etmek için soldaki sütunu mutlu bir şekilde taşır.

  • Labirent'teki rakamlar açılır nve basılır 10*n + <digit>. Ayrıca, çıkışlardan önce chars modulo 256 alınır. Bu ikisini bir araya getirmek, bize `33, çünkü çalışan 32'ye (boşluk) kadar 95 (alt çizgi) çıktı vermemizi sağlar -3233 % 256 = 95. 32'yi 95'e çevirmenin ( ;95en kolay olan) başka yolları olsa da, burada negatif bir sayıyla çalışmak, kodu biraz sola döndürerek sıkıştırmamızı sağlar.


2
Şifremi bulmak için bu algoritmayı kullanmaya çalışan her saldırgan kaybolacağından emin ...
J_F_B_M

3
Ben sadece bu programı şifrem olarak
ILikeTacos


7

CJam , 25 bayt

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

Çevrimiçi deneyin!

açıklama

MATL cevabımın çevirisi.

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 bayt

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

Burada test et.

açıklama

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 bayt

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

Diğer iki Python cevabında bir gelişme çünkü:

  • [...,'_'][c<'!']yerine kullanılır s.replace(' ','_')ve
  • choice(c+c.swapcase()) yerine kullanılır choice([c.upper(),c.lower()])

Oh, güzel gelişmeler. Mükemmel cevap! Benden +1.
DJMcMayhem

7

JavaScript (ES6), 114 101 bayt

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

47 bayt sadece bir karakter örneğini rastgele ...

Düzenleme: @ edc65 sayesinde büyük 13 bayt kaydedildi.


Yine partiye geç kaldım. Düşük / upp harika! Ancak gerisi daha basit olabilir:f=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
edc65 21:30,

@ edc65 Vay. Sadece boşluk / alt çizgi değişimini büyük / küçük harf değişimi ile birleştirmek bile iki bayttan tasarruf sağlar, ancak bu harika!
Neil

7

MATL , 27 bayt

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

Çevrimiçi deneyin!

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 karakter

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

6 bayt tıraş için xnor sayesinde.


lambda x:''.join(choice([i.upper(),i.lower()])for i in sorted(x.replace(' ','_'),key=str.isnumeric))
Sıralayarak

@xnor Teşekkürler! Gerçekten öğrenmem ve
lambda

5

Perl 6, 77 75 61 bayt

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

S///gibi s///o değiştirmez dışında $_bir yerde


4

Pyth, 17 bayt

smrdO2o}N`UT:zd\_

Burada dene!

açıklama

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

            : zd \ _ # boşlukları alt çizgi ile değiştirir
      o # Anahtar işleviyle Sırala ^ (N)
       } "0123456789" içindeki N`UT # N, sağa doğru sıralanmaları için sayılar için 1 verir
 m # ^ nin her karakterinin haritasını çıkar
  rdO2 # d rasgele küçük veya büyük harfe dönüştürme
s # bir liste halinde tekrar listeye katılın

4

Mathematica, 86 bayt

1 byte tasarruf için Sp3000 teşekkürler.

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

Ahhh, string işleme Mathematica ... güzel değil mi. Bu bir dize alan ve döndüren adsız bir işlevdir.

Tüm sözdizimsel şeker nedeniyle, okuma sırası biraz komik:

Characters@#

Dizeyi karakterlere ayırın, aksi halde onunla gerçekten hiçbir şey yapamayız.

...~SortBy~{DigitQ}

Rakamları sonuna kadar sıralar. Test işlevini bir listeye sararak, sıralamayı kararlı hale getiririz.

...&/@...

Sol taraftaki işlevi listedeki her karakterin üzerinde eşler.

RandomChoice[{ToLowerCase,Capitalize}]

Mevcut karakter için rastgele bir durum değiştirme fonksiyonu seçer.

...@#...

Geçerli karaktere uygular.

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

Boşlukları alt çizgi ile değiştirir.

...<>""

Sonunda tüm karakterleri tekrar bir dizgeye birleştirir.


3

PowerShell, 113 Bayt

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

PowerShell, korkunç golf dili demektir. Char dizisine bölün ve alt çizgi ile boşlukları değiştirin. Her karakteri ve işlemi al. Rakamları daha sonra çıktı almak için $ d değişkenine toplayın. Her bir diğer karakter rasgele kullanıldığı bir ifade çağırarak büyük veya küçük haline getirmek 'char'.ToLower()veya 'char'.ToUpper(). Herhangi bir rakam toplanmışsa, sonuna onları ekleyin.


PowerShell harika ve her şeyi yapıyor. : D Bir kaç kullanarak bayt kaydedebilir $_-in0..9ve -inPowerShell tanıtılan operatör yerine regex arasında v3 -match.
AdmBorkBork

3

Julia, 88 87 78 bayt

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

Bu bir dizgeyi kabul eden ve bir dize döndüren isimsiz bir işlevdir. Aramak için değişkene atayın.

Öncelikle giriş dizesini karakter dizisine böldükten sonra diziyi her karakterin rakam olup olmadığına göre sıralarız. Bu, metin ve rakamlardaki sırayı korur, ancak rakamları sonuna kadar iter. Ardından, dizideki her karakter için boşluk olup olmadığını kontrol ederiz. Eğer öyleyse, alt çizgi ile değiştirin, aksi takdirde rasgele bir karakter seçin ucfirstveya lcfirstkaraktere uygulamak, böylece sırasıyla büyük veya küçük harfe dönüştürün. Diziye bir dizgeye katılın ve işimiz bitti!

Burada dene

Sp3000 sayesinde 9 bayt kurtarıldı!


2

Perl, 51 48 bayt

İçin +2 içerir -lp

STDIN'deki giriş ile çalıştırın:

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

passwordify.pl:

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

1

Faktör, 154 bayt

veya 222 içe aktarma ile 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 ;

Golf faktörü konusunda pek iyi değilim ve buradaki en iyi yaklaşımı benim yapıp yapmadığımdan emin değilim,


1

Ruby, 84 bayt

Anonim işlev Önce boşluğun kaldırılması, c.downcasebazı nedenlerden dolayı bir sözdizimi hatasına neden olur ve neden olduğundan emin değilim.

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

1

Lua, 125 Bayt

Nesne işlevselle karşılaştığında, bazı şeyleri bile yapabilirsin! Bunu golf oynayabileceğimi sanmıyorum, zaten oldukça büyük bir karmaşa, ve piton cevaplarının çoğunu yenmekten çok mutluyum: 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 ve açıklamalar

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

Cidden, 25 bayt

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

Çevrimiçi deneyin!

Açıklama:

,`'_' (Æ≈"ûù"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 - rakipsiz, 14 bayt

S'_RE`N-`dE!k?

Evet, bu zorluk için yerleşikler ekledim, ancak bunlar özellikle bu sorunu hedeflemiyor.

Bu , tercümanın 0.1 versiyonuyla çalışır .

Örnek çalışma

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

açıklama

     # Kapalı: Yığının (C) girişini yerleştirin
S # Yığına bir boşluk itin (B)
'_ # Yığına bir alt çizgi it (A)
R # C yerine B ile A -> alt çizgi boşluk bırak
     # yığın şimdi yalnızca değiştirilen dizeyi (C) içeriyor
Boş bir dize itmek (B)
`# Komut değişmez
     # bunun için yığın daha sonra tek bir karakterle (B) başlatılır
N # 0-9 arasındaki rakamları dizeye dizge olarak it (A)
- # A'daki B harfinden her karakteri sil
`# End komut değişmez (A)
d # B'yi B'ye bölün, A tuşuyla inen parçaları sıralayın ve B'ye geri dönün.
     # A işlevi, bir basamaksa dizenin her karakterini boş bir dizeye dönüştürür.
     # Sonuçta ortaya çıkan karakter bir rakam içermediğinden, anahtar değer uzunluktur.
     # Bu, 0 tuşunu rakamlara ve 1 tuşunu rakam olmayanlara eşleştirir. Bunu azalan olarak sıralama
     # order, rakamları sağa taşır ve rakamları daha önce oldukları sırayla bırakır.
Boş bir dize itmek
! k # k (= swapcase) komutuna basın
? # Her karaktere rastgele ^ uygulayın
     # Kapalı: Çıktı yığını içeriği

1

PHP, 368 bayt

$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 Kodu:

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

Bu harika bir başlangıç, ama daha çok golf oynayabilirsin. Lütfen tüm değişkenleri 1 karakterli adlarla değiştirin ve fazladan boşluk bırakın. Bunu yaptığınızda, bu birinci sınıf bir golf olacak!
NoOneIsHere

0

Python 2,179 bayt

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)

Muhtemelen burada daha sonra çalışacağım iyileştirme için çok yer var.


0

AWK, 128 Bayt

{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()Farklı rastgele numaraları bize o her çalıştığında vermek için gereklidir.
Bunun çok satırlı girişle düzgün çalışması A=N=""için fordöngüden önceki gibi bir şey koymamız gerekir .


0

Python 3,5 - 118 bayt:

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

Gördüğünüz gibi, temelde rastgele modülün choiceişlevini kullanıyorum , dizgenin sıralanmış sürümünde her harf için rastgele bir işlev (.upper () veya .lower ())) kullanıyorum. son. Ayrıca, her boşluk sıralanmış dizgede bir alt çizgi ile değiştirilir.


0

PHP, 164 158 karakter / bayt

Bu diğer PHP golfünden daha iyidir , çünkü:

  • Girişleri alır
  • Daha kısa

Senaryo

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

Örnek

php password.php 'thats some 1337 shit'

ThATs_Some__sHiT1337


0

> <> , 73 bayt

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

Burada delice bir şey yok, o:

  • _karşılaştığında yazdırır 
  • Harflerin modunu 32 alır, sonra yazdırmadan önce rastgele 8 * 8 veya 12 * 8 ekler.
  • numarayı istifler ve girişin sonuna gelindiğinde bunları yazdırın

Burada deneyebilirsiniz !


-1

Python 3, 151 bayt

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.