1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
MESSAGES = {
  example: 'ASVDZC', # BILBO
  windmill: 'JEIYQWN-BC-EHDKA',
  well: 'XOV-PKXZVK-UEVKA-GQR',
  fence: 'PHCDN-LHFZH-CE-WDRQE',
  gate: 'XRD-BRPITWAFP',
  village_cart: 'E-LDLPNK-OZ-KHZN',
  village: 'HJJLIDEB-XAANQKCJB',
  signpost: 'LJL-PH-EDJMC-ZKHE',
  cave: 'CORKZBH-NRBNP-BZ',
  mt_doom: 'LBCWT-BDXZHU-IYH-FNQNAR-PWRML',
}

ALPHABET = (?A..?Z).to_a

def decode_char(key_char, rune)
  alphabet = ALPHABET
  i = 0
  while alphabet[0] != key_char
    i += 1
    alphabet = alphabet.rotate
  end
  alphabet[rune.bytes[0]-65]
end

def decode(key_phrase, message)
  decoded = message.split(//).map do |char|
    next char unless char =~ /[A-Z]/
    key_phrase = key_phrase.rotate
    decode_char(key_phrase[-1], char)
  end
  decoded.join
end

key_phrase = ARGV.join.upcase.split(//)

MESSAGES.each do |key, message|
  puts "#{key}: #{decode(key_phrase, message)}"
end