Web Developer's Struggle Memories

日々の業務から思ったこと、学んだことを書き連ねていきます。

アルゴリズム問題「パスワードジェネレータ」を作れ

ルール

  • 8文字固定
  • 半角英字(大文字, 小文字を1文字ずつ), 半角数字, 記号を必ずすべて含む

※重複文字が含まれるのは許容する

プログラム

const STRINGS = 'abcdefghijklmnopqrstuvwxyz'
const NUMBERS = '0123456789'
const SYMBOLS = '!"#$%&-^¥@;:/<>+*{}[]|~='
const LEN = 8

let result = ''
let seed = STRINGS + STRINGS.toUpperCase() + NUMBERS + SYMBOLS

// generate password
const generate = () => {
  // initialize
  result = ''
  for (let i = 0; i < LEN; i++) {
    result += seed[Math.floor(Math.random() * seed.length)]
  }
}

// format check
const is_correct_format = (pass) => {
  return pass.match(/^(?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[0-9]+)(?=.*[!"#$%&\-^¥\\@;:\/<>\+\*{}\[\]\|~=]).*$/)
}

do {
  generate()
} while (!is_correct_format(result))

console.log(result)

いや〜, もっとスマートな書き方あると思う!