Буквенное шифрование - PullRequest
0 голосов
/ 03 мая 2018

Я очень запутался в этом, поэтому любая помощь будет оценена.

Я пытаюсь принять предложения в качестве входных данных и вернуть выходные данные со всеми буквами через 3 места после заданного значения. Таким образом, «А» превратится в «D», «В» в «Е» и так далее.

Я думаю, что начать с таких значений, как:

Alphabet = ('a'..'z').split('')
function Cyphering
   precypheredLeters = inputSentence.split('')
   precypheredLeters.each do |x|
       if 

После этого куска кода я хочу дать «x» значение индекса (например, если «x» равно букве «C», значение индекса должно быть 3, тогда я могу добавить еще 3 к этому, превращая его в "F".

Также, если мой inputSentence "Ruby Red! @ # $", Как мне вернуть значение для пробелов и символов, если я хочу, чтобы они остались прежними?

И если буква вводится как "Z", я бы хотел, чтобы она перешла с Z => 26 на C => 3, а "Y" превратится в "B".

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Мне больше всего нравятся решения String#tr, но есть еще один способ сделать это:

class Rot
  UPPER = ('A'.ord .. 'Z'.ord).freeze
  LOWER = ('a'.ord .. 'z'.ord).freeze

  attr_reader :n

  def initialize(n=13)
    @n = n
  end

  def cipher(str)
    str.unpack('U*').map do |o|
      if UPPER.cover?(o)
        UPPER.begin + (o - UPPER.begin + n) % UPPER.size
      elsif LOWER.cover?(o)
        LOWER.begin + (o - LOWER.begin + n) % LOWER.size
      else
        o
      end
    end.pack('U*')
  end
end

rot = Rot.new(3)
rot.cipher("Hello, world!") # => Khoor, zruog!

Он работает, разбивая и корректируя кодовые точки, выбранные двумя диапазонами, определенными как константы класса.


Вот переработанная версия решения String#tr @ lacostenycoder:

class Lame
  UPPER = ('A' .. 'Z').to_a.freeze
  LOWER = ('a' .. 'z').to_a.freeze

  attr_reader :to

  def initialize(n=13)
    @to = [LOWER, UPPER].map { |a| a.rotate(n) }.join
  end

  def cipher(str)
    str.tr('a-zA-Z', to)
  end
end

require 'benchmark/ips'

lame = Lame.new
rot = Rot.new
str = 'sphinx of black quartz, judge my vow'.freeze

Benchmark.ips do |x|
  x.report('tr') { lame.cipher(str) }
  x.report('unpack') { rot.cipher(str) }
end

И результаты тестов:

                  tr    475.305k (± 4.5%) i/s -      2.410M in   5.081979s
              unpack     64.604k (± 3.5%) i/s -    323.493k in   5.013385s
0 голосов
/ 03 мая 2018

Кража из комментария Сагар, но это должно работать на вашем примере строки:

def lame_cipher(str)
  str.tr('a-zA-Z', 'd-za-cD-ZA-C')
end

lame_cipher 'Ruby Red !@#$'
#=> "Uxeb Uhg !@\#$"

или

def lame_cipher(str, int)
  cipher = [('a'..'z').to_a,('A'..'Z').to_a].map{|arr| arr.rotate(int) }.join
  str.tr('a-zA-Z', cipher)
end

lame_cipher('Ruby Red !@#$',3)
#=> "Uxeb Uhg !@\#$"

#This one can also decode:
lame_cipher("Uxeb Uhg !@\#$", -3)
#=> "Ruby Red !@\#$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...