кодировщик от 1 до 27 в Ruby - PullRequest
       8

кодировщик от 1 до 27 в Ruby

0 голосов
/ 12 сентября 2018

Существует ли какой-либо формат или стандарт кодирования, который удовлетворяет следующим условиям?

  • A-Z и a-z должны кодироваться как 1-26.
  • Любой другой символ может быть больше 26.

Если нет, как лучше всего выполнить такое преобразование?

Хэш-карта - один из очевидных способов, но моя рубиновая интуиция говорит, что должно быть что-то лучше.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Вот решение, которое отображает строку непосредственно в Array из Integer с;используя тот факт, что "a".ord == 97, "b".ord == 98 и т. д .:

def encode(str)
  str.each_char.map do |char|
    char.match?(/[a-z]/i) ? c.downcase.ord - 96 : 27
  end
end

encode("aAzZ1&")
#=> [1, 1, 26, 26, 27, 27]

Редактировать: Или аналогично, вы можете выполнить String#downcase перед циклом прохождения символов:

def encode(str)
  str.downcase.each_char.map do |char|
    char.match?(/[a-z]/) ? c.ord - 96 : 27
  end
end
0 голосов
/ 12 сентября 2018

Мой вариант, исправляющий класс String.

module MyEncoding
  def encode_char_to_int
    letters = [*"a".."z"]
    return letters.index(self.downcase) + 1 if letters.include? self.downcase 
    return 27 # rand(27..255)
  end

  def my_encode
    self.split("").map(&:encode_char_to_int)#.join("")
  end
end

String.include MyEncoding

"aAzZ1&".my_encode #=> [1, 1, 26, 26, 27, 27]
0 голосов
/ 12 сентября 2018

Hash как subst достаточно хорош с Ruby 2.3, где был реализован Hash#to_proc.

subst =
  [*?a..?z].zip(1..26).to_h.tap do |h|
    h.default_proc = ->(_, _) { 27 }
  end
"aA0".downcase.each_char.map(&subst)
#⇒ [1, 1, 27]

или (кредиты поступают на @engineersmnky):

'a'.upto('z').with_index(1).to_h.tap {|h| h.default = 27 }
...