文字列をパスワード化する


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との別のコラボで、ラビリンススペクトルの非常識な側面-初めて、4つのすべて^>v<が1つのプログラムに含まれています。オンラインでお試しください!

説明

ループで実行される一般的なアルゴリズムは次のとおりです。

 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

説明を簡潔にするために、プログラムの各部分が上記の擬似コードにどのように対応するかをおおよそ示します。

ここに画像の説明を入力してください

ここに興味深い部分があります。

ラビリンスでランダム性を取得する

ラビリンスでランダム性を取得する方法は1つしかありません。IPが前方に移動しようとしますが、1)前方にも後方にもパスがなく、2)左右にパスがあります。この場合、IPは左と右のルートをランダムに選択します。

これは、行/列^>v<をポップして1 nずつシフトする演算子を使用する場合にのみ可能nです。たとえば、プログラム(オンラインで試してみてください!

" 1
""v!@
  2
   !@

1または2をランダムに出力します。これはv、オフセット0の列(つまり、IPがオンになっている列)を1だけシフトするためです。

"
""1!@
  v
  2!@

IPは右向きで、前方に移動しようとします(スタックのトップはゼロです)が、できません。また、後方に移動できないため、左または右からランダムに選択します。

ゴルフのコツ

  • プログラムは読み取り順で最初の文字から始まりますが、実際にはステップ6です。ただし、空のLabyrinthスタックからポップすると0が生成されるため、ステップ10と14が発生し、ゼロを補助スタックにシフトします。ノーオペレーション。

  • メインスタックは使用してゴルフにコードレイアウトを私達を許可するすべての反復、後に効果的に空である><下部の暗黙のゼロに。>周りので左下の右下からIP移動し、その下の行をラップ<シフトが行バック。IPは左の列を上に移動してループを続行します。

  • ラビリンスの数字はポップnしてプッシュし10*n + <digit>ます。さらに、charsは出力される前に256を法として取られます。これら2つを組み合わせると`33、32(スペース)を実行して95(アンダースコア)を出力できます-3233 % 256 = 95。32を95に変える他の方法(;95最も簡単な方法)がありますが、ここで負の数を使用すると、左回転でコードを少し圧縮できます。


2
このアルゴリズムを使用してパスワードを見つけようとするすべての攻撃者は、必ず失われます
...-J_F_B_M

3
このプログラムをパスワードとして
-ILikeTacos



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))

他の 2つの 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バイトを大量に保存しました。


またパーティーに遅れました。low / uppは素晴らしいです!しかし、残りはより単純にすることができますf=s=>s.replace(/./g,x=>x>'9'?x[`to${Math.random()<.5?"Low":"Upp"}erCase`]():x>' '?(s+=x,''):'_',s='')+s
。– edc65

@ edc65うわー。スペース/アンダースコアの置換と大文字/小文字の置換を組み合わせただけでも2バイト節約できますが、これは素晴らしいことです!
ニール

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))

6バイトを削るxnorに感謝します。


ソートして最後に数字を取得する方が短く見えます。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をマップします
  rdO2#dランダムを大文字または小文字に変換します
s#リストを結合して1つの文字列に戻す

4

Mathematica、86バイト

1バイトを節約してくれたSp3000に感謝します。

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 PowerShell v3で正規表現の代わりに導入され$_-in0..9-in演算子を使用して、数バイトを節約できます-match
AdmBorkBork

3

ジュリア、88 87 78バイト

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

これは、文字列を受け入れて文字列を返す匿名関数です。呼び出すには、変数に割り当てます。

まず、入力文字列をその文字の配列に分割し、各文字が数字であるかどうかに従って配列をソートします。これにより、テキストと数字の順序は維持されますが、数字は末尾にプッシュされます。次に、配列内の各文字について、それがスペースかどうかを確認します。その場合は、アンダースコアに置き換え、それ以外の場合はランダムのいずれかを選択しucfirstたりlcfirst、文字に適用することにより、それぞれ、それが大文字または小文字に変換します。配列を文字列に結合すれば完了です!

ここで試してみてください

Sp3000のおかげで9バイト節約されました!


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

Lua、125バイト

オブジェクトが機能するようになったら、luaであってもいくつかのきれいなことができます!私はこれをゴルフでダウンできるとは思わない、それはすでに非常に大きな混乱であり、私はすでに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)

非ゴルフと説明

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)
-#Aにあるすべての文字をBから削除します
`#コマンドリテラルの終了(A)
d#BでCを分割し、キーAで降順の部分をソートし、Bで再び結合します。
     #キー関数Aは、文字列が数字の場合、文字列の各文字を空の文字列に変換します。
     #結果の文字には数字が含まれないため、キー値は長さです。
     #これは、キー0を数字に、キー1を数字以外にマップします。これを降順に並べ替える
     #orderは、数字を右に移動し、非数字を以前の順番のままにします。
E#空の文字列をプッシュする
!k#コマンドkをプッシュ(=スワップケース)
?#すべてのキャラクターにランダムに^を適用
     #暗黙:スタックの内容を出力する

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文字の名前に変更し、余分な空白を削除してください。それをするとき、これは一流のゴルフになります!
-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))

ご覧のとおり、私は基本的にrandomモジュールのchoice関数を使用して、指定された文字列のソートされたバージョンの各文字に対してランダム関数(.upper()または.lower()のいずれか)を選択します。終わり。また、ソートされた文字列では、すべてのスペースがアンダースコアに置き換えられます。


0

PHP、164 158文字/バイト

これは、他のPHP golfよりも優れています。

  • 入力を受け取ります
  • 短いです

スクリプト

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

ここでクレイジーなことはありません、それ:

  • _遭遇したときに印刷する 
  • 文字のmod 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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.