適切なパスワードを生成する


8

物語

多くのパスワードを覚えておく必要があり、複数のWebサイトで同じパスワードを使用したくないので、ルールを思い付きましたが、ルールは透過的ではないので、次のようにします。

  • のような長い単語や概念について考えてくださいbreadpudding。
  • 最初の文字をログインしているサイトに置き換えます。ログインしている場合google、単語はになりgreadpuddingます。
  • 最初の文字を大文字にします。
  • 2番目の文字を@記号に変更します。
  • パスワードが非子音で始まる場合は、特定の番号(など1234)を追加します。それ以外の場合は、別の番号を追加します(など4321)。

たった今、あなたは適切なパスワードを持っています。

このプロセスは骨が折れるので、以下に基づいてこれを生成するプログラムが必要です。

問題

与えられた入力:

  • a :最初の単語。これは文字列で常に小文字であり、3文字より長いことが保証されています。
  • b :ログインしているサイト。これは文字列であり、常に小文字であり、空でないことが保証されています。
  • c :非子音の数。先行ゼロがある場合がある正の整数です。
  • d :子音の数。これは、先行ゼロがある可能性がある正の整数です。

上記の基準に基づいて文字列を出力します。

テストケース

入力 a="volvo", b="gmail", c=5555, d="0001"

G@lvo0001

入力 a="sherlock", b="9gag", c=31415926535, d=3

9@erlock31415926535

入力 a="flourishing", b="+google", c=11111, d=2222

+@ourishing11111

ルール

  • y 子音です。
  • を決定するcかd整数である場合は、そのように解析して、先行ゼロを無視できます(0091として扱われます91)。
  • 末尾の空白と改行は許可されます。
  • 結果をSTDOUTに出力するか、関数で結果を返します。
  • aおよびで使用できる文字bは[a-z0-9!@#$%^&*()_+=-]です。
  • 4つの入力を一貫した順序で受け入れることができます。

これはです。バイト単位の最短コードが優先されます。



@LeakyNunはい私は同意しますが、許可された文字セットの量も同様に難しくなります。したがって、パスワードボックスで小文字しか許可されていない場合は、ブルートフォース攻撃の難しさが大幅に軽減されます。
— LiefdeWen 2017年

はい、指定された長さでより多くの種類の文字(数字、大文字、記号)を含めると、セキュリティが向上しますが、指数関数的にはなりません。長いすべて小文字のパスワードは、短い混合文字タイプのパスワードよりもはるかに強力です。zxcvbnによると、「4321breadpudding」(10 ^ 9)は<1sで高速ハッシュとして保存され、「4321G @ eadpudding」(10 ^ 11)は8sで壊れ、「おばあちゃんは素晴らしいパンプディングを作る」(10 ^ 24)が数世紀で壊れた、「おばあちゃん、おいしいパンプリンを作ろう!」(10 ^ 27)数世紀で壊れた。パスワードの難易度を桁違いに計算することを忘れないでください。その場合、2はそれほど多くありません。
— vee_ess

3
「G @ annyは、ブレッドプディング1234が壊れるまでどれだけ時間がかかるか」まあ、今では1秒未満:-Pので、すべてのcrackz0rdリスト上だ
— オリヴィエ・グレゴワール

1
@LeakyNunそのxkcdコミックのフレーバーテキストを読みましたか?
— 2017年

回答:


2

ゼリー、17 バイト

Ḣ©Œu;”@o;⁶⁵®eØC¤?

完全なプログラムは、順番に引数を取ってb、a、c、d。

オンラインでお試しください!

どうやって?

メインリンクは、ダイアディックであり、撮影b及びaプログラム入力が次にあり、b、a、c、及びd(6番目のコマンドライン引数を介して、3)ので、cおよびdのようなアクセスされます。

Ḣ©Œu;”@o;⁶⁵®eØC¤?  Main link: b, a           e.g. "gmail", "volvo" (c="5555" and d="0001")
Ḣ                  head b                         'g'
 ©                 copy to register and yield     'g'
  Œu               convert to uppercase           "G"
     ”@            literal '@' character          '@'
    ;              concatenate                    "G@"
       o           logical or with a (vectorises) "G@lvo"
                ?  if:
               ¤     nilad followed by link(s) as a nilad:
           ®           recall value from register  'g'
             ØC        yield consonants            "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
            e          exists in?                  1
         ⁶         ...then: 6th arg = 4th in = d   "0001" 
          ⁵        ...else: 5th arg = 3rd in = c   "5555"
        ;          concatenate                     "G@lvo0001"
                   implicit print

3

Python 3、69バイト

lambda a,b,*c:b[0].upper()+"@"+a[2:]+c[b[0]in"bcdfghjklmnpqrstvwxyz"]

オンラインでお試しください!


b[0]not in"aeiou"代わりに使用しないのはなぜですか?
— officialaimm

3
@officialaimmは、なんらかの神々の理由9で非子音としてカウントされるためです。
— Leaky Nun 2017年

ええ、問題のルールは数字について明確に何も述べていません...
— officialaimm

2
3バイトを節約します(注:z可能な最大文字数):('a'<b[0])*b[0]not in"eiou"
— Jonathan Allan

2

05AB1E、22 20 18バイト

н©u'@I¦¦žN®åiI\}IJ

入力は b,a,c,d

オンラインでお試しください!

説明(古い)

¦                     # remove the first char of a
 s                    # swap b to the top of the stack
  н©                  # push the head of b and store a copy in register
    uì                # convert the head to upper case and prepend to a
      U               # store in variable X
       žN®åi          # if the head of b is a consonant
            \}        # discard c
              X«      # concatenate X with c or d
                '@1ǝ  # insert an "@" at character position 1

0èнまだTIOにプルされていないため、リンクで使用されます。


2

JavaScript ES6、87バイト

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:c)

デモ


これを投稿しようとしていました。つまり、文字通り、これは文字ごとです。Bummer、lol
— Hankrecords 2017年

@Hankrecordsへへ、私たちはそれを改善できるかもしれません
— Weedoze

以来{|}~有効な文字ではありません、あなたは置き換えることができる/[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:cと/[ -_aeiou]/.test(b[0])?c:dマイナスのため、13バイト
— PunPun1000

2

C、441 286 139バイト

#define o(c)*a[1]==0xc
int main(int b,char** a){printf("%c@%s%s",*a[1],a[2]+2,(*a[1]>97&*a[1]<128)
&!(o(65)|o(69)|o(6F)|o(75))?a[4]:a[3]);}

1
erm ... argv[1][0]='c'|argv[1][0]='c'|...where c = consonant の21セットの代わりに、!(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')スコアを264 減らすだけでこれを簡単に減らすことができます!
— Baldrickk 2017年

いいえ、他にも言及されているように、数字やその他の文字を使用できます
— Blue

@muddyfishそれからあなたはそれを作ります(argv[0][1]>='a'&argv[0][1]<='z'&!(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o‌​'|argv[1][0]='u'))。マージンよりさらに短い。しかし、このコードをゴルフする方法はたくさんあるので、どこから始めればいいのかわかりません...:s
— OlivierGrégoire2017年

私はアイディアにオープンです:)これはゴルフへの私の最初の試みです
— ウラスキャン

さて、あなたは元気です!マクロを使用する代わりに変数を使用するなど、まだ改善できると確信していますが、そうです、あなたは右足から始めています!:)あなたはおそらくこれらのゴルフのヒントをうまく利用することができます!
— OlivierGrégoire2017年

2

R、105103バイト

pryr::f({m=substr(b,0,1);paste0(toupper(m),'@',substring(a,3),'if'(grepl("[b-df-hj-np-tv-z]",m),d,c))})

匿名関数。に評価する

function (a, b, c, d) 
{
    m = substr(b, 0, 1)                      #first letter of website
    paste0(toupper(m),                       #concatenate that letter, capitalized,
           "@",                              #an '@',     
           substring(a, 3),                  #the rest of the long string,
           if(                               #and
           grepl("[b-df-hj-np-tv-z]", m)),   #if the first letter is a consonant,
           d                                 #the consonant string/num,
           else c)                           #else the other one
}

これはTIOにあるものです。私は彼らがひどいので、正規表現のゴルフを手伝ってください。

ジュゼッペから2バイト節約。

オンラインでお試しください!


使用可能!grepl('[aeiouy]',m)
— ジュゼッペ

1
またはより良い、grepl('[aeiouy]',m)そして単にスワップcとd。
— ジュゼッペ

93バイト を使用すると、or を使用する代わりに"if"、if構文がより簡潔になります。また、変数に保存し、すぐに大文字にしてバイトを保存しました。elseifelsesubstringm
— ジュゼッペ

1
私は2つの問題にあなたの機能とRANを実行してみました:pryr作るしようとしているsubstring引数を、grepl子音と同じではない「母音ではない」だけが見つかります。"if"事は、私は、それを指摘して感謝を逃しました。
— BLT 2017年

実際にはテストしていませんでした。私はそれが気に入らないと気づきpryr::fませんでした。Kevin Cruijissenの回答の正規表現「[az && [^ aeiouy]]」を使用できますか?
— ジュゼッペ

2

Retina、80 75バイト

^..(.*)¶(.).*
$2@$1
^([ -_aeiou].*)¶(.*)¶.*
$1$2
(.*)¶.*¶(.*)
$1$2
T`l`L`^.

オンラインでお試しください!

ここで新しい言語を試して、質問で指定された順序で入力を受け取ります

説明:

^..(.*)¶(.).*
$2@$1

2番目の単語の最初の文字、@記号、3番目の文字以降の最初の単語である単語を作成します。

^([ -_aeiou].*)¶(.*)¶.*
$1$2

単語が非子音で始まる場合は、最初の数字を追加します

(.*)¶.*¶(.*)
$1$2

まだ3行残っている場合(最後のステップで置換がないため、子音で始まります)、2番目の数値を追加します

T`l`L`^.

最初の文字を大文字にする


1

QBIC、81バイト

G=ucase$(_s;,1|)+@@`+_s;,3,_lC||~instr(@bcdfghjklmnpqrstvwxyz`,_sC,1|)|?G+;\?G+;

説明

Parameters are Website(A$), base word(C$), consonant-number(E$), and nonsonant-number(F$)
G=                           SET G$ to
 ucase$(      )              the upper-case version of (also works for '9gag', '+google')
        _s;,1|                  the first char of the website A$ read from cmd line
 +@@`                        plus a literal @ (B$)
 +_s;,3,_lC||                plus all characters from base word C$ from 3rd char onwards
~instr(                      IF the second arg to INSTR is in the first
 @bcdfghjklmnpqrstvwxyz`,      with all consonants in the first arg
 _sC,1|                        and the first char of the base word C$ in the second
 )
|?G+;                        THEN print G$ plus the consonant addition
\?G+;                        ELSE print G$ plus the other addition

最後の2行は同じように見えますが、インタープリターはそれぞれの動作をわずかに変更していることに注意してください。命令を検出する;たびに;、新しい変数が作成されます(この場合、varsÈ$ andF $ `はすべてを読み取った後の最初の変数ですその他のリテラルとコマンドライン引数)を使用して、まだ割り当てられていない最初のコマンドラインパラメータをその変数に割り当てます。


1

JavaScript(ES6)、76バイト

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[aeiou\d_\W]/.test(b[0])?c:d)

これをWeedozeのソリューションの改善策として提案として追加したのですが、私はほとんど潜んでいるのでコメントできないようです


1

C#、111バイト

(a,b,c,d)=>Char.ToUpper(b[0])+"@"+a.Substring(2)+(b.IndexOfAny("bcdfghjklmnpqrstvwxyz".ToCharArray()==0)?d:c);

子音のチェックは、string型に直接正規表現機能がないため、特にコストがかかります。


1

F#、157バイト

let f(a:string)(b:string)c d=System.Char.ToUpper(b.[0]).ToString()+"@"+a.[2..]+(if((Seq.except['e';'i';'o';'u']['b'..'z'])|>Seq.contains b.[0])then d else c)

F#はまだ私にとって非常に新しいので、これにはおそらくより良いアプローチがあるでしょう。


1

Java 8、112 99 92 87バイト

(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)

パラメーターbを秒ではなく最後にすることで-13バイト。@OlivierGrégoireの おかげで-7
バイトを削除することで-1バイト(およびパラメーターは再び正しい順序になります)@ PunPun1000の おかげで-5バイトy

説明:

ここで試してください。

(a,b,c,d)->                     // Method with 4 String parameters and String return-type
  b.toUpperCase().charAt(0)     //  First character of B capitalized
  +"@"                          //  + literal "@"
  +a.substring(2)               //  + A excluding first two characters
  +(b.matches("[ -_aeiou].*")?  //  If B starts with a consonant:
    d                           //   + D
   :                            //  Else:
    c)                          //   + C
                                // End of method (implicit / lambda with single return)

1
yは子音なのでy、正規表現で1バイトをドロップできます。
— LiefdeWen 2017年

2
(a,b,c,d)->より短いですa->b->c->d->。カレーは2つのパラメーターに対してのみ役立ちます。3の場合、カレーはカレーなしと同じです。4以上の場合、カレーはこれより短くなりません。
— OlivierGrégoire2017年

1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)長さは92バイトです。また、それは(最初は私を混同している:-()適切な順序でパラメータを使用しています。
— オリヴィエ・グレゴワール

1
@OlivierGrégoireありがとう。2回目は、4つのパラメーターを使用したカレーに関してその間違いを犯しました。そして、最初にtoUpperCase()、.charAt(0)実際には、より短くなっています。(そして、異なる順序はを許可すること(b=...)でした。それがfinal/ である必要があるため、カリー化の最後のパラメーターでない場合は不可能finalです。)
— Kevin Cruijssen

1
以来{|}~有効な文字ではありません、あなたは使用することができ[ -_aeiou]、非子音とスワップ用dとc5バイトのマイナスのために
— PunPun1000


0

Bash 4、76バイト

g(){
a=${2:0:1}
c=$4
[[ "aeiou[0-9]" =~ .*$a.* ]]&&c=$3
p="${a^}@${1:2}$c"
}

Bash 4で動作します。

g volvo gmail 5555 0001; echo $p
g sherlock 9gag 31415926535 3; echo $p
g flourishing +google 11111 2222; echo $p


0

JavaScript(ES6)、69バイト

(a,b,c,d)=>e=a[0].toUpperCase()+"@"+a.slice(2)+/[AEIOU]/.test(e)?c:d

かなりシンプルで、おそらくゴルフができる

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.