Creating a unique password generator using Ruby
Tags: ruby, beginners
Published: 2020-06-18 13:56:09

#Alright
So how do we go about creating a password generator? It's actually quite simple. I'm going to demonstrate multiple ways that we can do this using Ruby.

#Method #1
```Ruby
alpha =
"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz?/\\ |}{[]!@# $%^&*()1234567890_-+=<>,.`~'':;".split(//)
#sorry about the super long line!
passwrd = ""
passwrdlen =  gets.chomp.to_i
while passwrdlen > 0
  passwrd += alpha.sample
  passwrdlen -= 1
end
puts passwrd
```
>Uhh....

###Okay let's break this down. 
We defined `alpha` as a list containing string characters(metachar, nums, etc.). Then we define `passwrd` as an empty string. We get the users input on the passwrd length and assign it to `passwrdlen`. Inside our while loop we use the sample method in ruby to add a random character to `passwrd` and subtract 1 from `passwrdlen`. Finally, we loop this process until `passwrdlen` is equal to 0, then we print passwrd to the console.

#Method #2
Now we can expand on the previous method to create a better version. So here it is:
```Ruby
alpha = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz?/\\ |}{[]!@# $%^&*()1234567890_-+=<>,.`~'':;".split(//)
passwrd = ""
puts "What word keyword/theme do you want the password to have?:"
theme = gets.chomp
puts "How long do you want the passwrd to be?(Must be longer than the theme.):"
passwrdlen = gets.chomp.to_i
if passwrdlen > theme.length
  passwrdlen -= theme.length
  passwrd += theme
  while passwrdlen > 0
    passwrd += alpha.sample
    passwrdlen -= 1
  end
  puts passwrd
else
  puts "Can't use the theme since password length is shorter than the theme."
end
```

>Hmm... how does this work again?

###Again, lets break it down
![](https://sd.keepcalms.com/i/keep-calm-and-break-it-down-20.png)
There are a few minor but wonderful changes. Now the program asks for a word that you'd like in you password. If we're being honest no one can remember a password that is truly random. Then the program does it's usual thing, except there's an if/else statement that determines whether you followed the rule stated above, 'Must be longer than the theme', if not then you don't get a password, and ruby puts 'Can't use the theme since password length is shorter than the theme'. If you did then you'll get your password with the word you chose and random characters behind it.

>This is great an all but the code is super long an messy, for a task that's so simple. Can it get shorter?

#Yes it can! Aye, Aye Captain!!! 🏴‍☠️
Here's a shorter version of the same code:
```Ruby
alpha, passwrd = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz?/\\ |}{[]!@# $%^&*()1234567890_-+=<>,.`~'':;".split(//), ""
puts "What word keyword/theme do you want the password to have?:"
theme = gets.chomp
puts "How long do you want the passwrd to be?(Must be longer than the theme.):"
passwrdlen = gets.chomp.to_i
passwrdlen > theme.length ? (passwrdlen -= theme.length; passwrd += theme; passwrdlen.times {passwrd += alpha.sample}; puts passwrd) : (puts "Can't use the theme since password length is shorter than the theme.")
```
The logic is mostly the same, I used the times method to make looping the process faster, and a ternary to make the boolean logic remain.

Write how you would have done it in the comments, in a different language or in Ruby as well.