- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 Ruby,并尝试过 Simple Cipher 挑战。我现在正在研究以下解决方案,并试图进行逆向工程以了解该解决方案背后的思维过程。以下是解决方案的链接。我将详细说明我对每个代码片段的理解。如果他们不正确,你能纠正我吗?谢谢!
https://exercism.io/tracks/ruby/exercises/simple-cipher/solutions/b200c3d9f10e497bbe2ca0d826df2661
class Cipher
ALPHABET = [*'a'..'z']
attr_reader :key
def initialize(key = nil)
@key = key || 100.times.map { ALPHABET.sample }.join
fail ArgumentError, 'invalid chars in key' unless valid?(@key)
end
def encode(text)
a = 'a'.ord
text.chars.zip(@key.chars).map do |char, key|
ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length]
end.join
end
def decode(code)
code.chars.zip(@key.chars).map do |char, key|
ALPHABET[char.ord - key.ord]
end.join
end
private
def valid?(key)
!key.empty? && key !~ /[^a-z]/
end
end
def initialize(key = nil)
@key = key || 100.times.map { ALPHABET.sample }.join
fail ArgumentError, 'invalid chars in key' unless valid?(@key)
end
def encode(text)
a = 'a'.ord
text.chars.zip(@key.chars).map do |char, key|
ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length]
end.join
end
ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length]
部分。ALPHABET[char.ord - key.ord]
?字符 ascii - key ascii 值将提供解密后的纯文本。我不明白它是如何工作的?
def decode(code)
code.chars.zip(@key.chars).map do |char, key|
ALPHABET[char.ord - key.ord]
end.join
end
private
def valid?(key)
!key.empty? && key !~ /[^a-z]/
end
最佳答案
@key = key is if key is matched. ALPHABET is randomized (with .sample method) and joined. Randomised joined alphabets are then iterated 100 times and a new array is returned (with map method).
@key = key
如果
key
不是假的(
nil
或
false
);否则,迭代
100
次并从
ALPHABET
中收集一个随机字符;然后将生成的 100 元素数组连接成一个字符串并将该字符串分配给
@key
.什么都没有返回。
ord method - convert a character to its ASCII value.
a = 'a'.ord
. Why is this character selected? Not z or other characters?
"a"
以 Unicode 开始字母序列(在 ASCII 中也是如此,但
.ord
在这种情况下在 Unicode 上运行),值为
97
.但我们感兴趣的是字符在字母表中的位置,而不是 Unicode。可以这样想:现在是 20:37,你正在听歌剧。演出开始于
19:00
.你听了多久了?你减去
20:37 - 19:00
, 得到答案(1 小时 37 分钟)。同样的,要知道
'c'
是 #2 字符(在英语中我们说是 3rd,但是 Ruby 从 0 开始计数,所以
'a'
是 #0,
'c'
是 #2),你减去
'a'
的位置来自
'c'
的位置:
99 - 97
.你不会减去
23:00
或来自
20:37
的任何其他时间,因为这对于找出你听了多长时间没有任何意义;我们使用
'a'.ord
的原因相同, 而不是
'z'
或其他角色。
.zip method - this method is used to compare original plain text characters and encryption characters.
text.chars
中的每个元素配对来创建一个新数组与
@key.chars
中的对应.没有比较。
I have a trouble understanding this ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length] part. ALPHABET original plain text and encryption key text characters are converted into ASCII values with .ord method. Why a value is subtracted from those values? Why use % operator and ALPHABET.length?
a
见上文.
%
将环绕,结果始终是
ALPHABET
的有效索引.例如,如果
char.ord - a + key.ord - a
恰好超过
ALPHABET
的长度,然后它会环绕到开始。例如,如果您得到
29
在上面的计算中,你通常会得到
nil
对于
ALPHABET[29]
因为没有字母#29;但是
29 % 26
是
3
, 和
ALPHABET[3]
已验证。
Part 3 In this part, decode method, code is used. Code is the secret key shared between two parties (sender and receiver). But why ALPHABET[char.ord - key.ord]? Characters ascii - key ascii value will provide the decrypted plain text. I do not understand how it works?
(char.ord - a) + (key.ord - a)
— 现在我们减去它们:
(char.ord - a) - (key.ord - a)
.做一些数学运算,你会发现这两个
a
在这个减法中会互相抵消,所以
(char.ord - a) - (key.ord - a)
相当于
char.ord - key.ord
.
ALPHABET[-3]
在 Ruby 中的意思是“倒数第三个元素”,因此等价于
ALPHABET[23]
;不需要
%
.
关于ruby - 简单密码 - 来自 Exercism 的 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58907376/
我刚刚开始学习 Javascript,我认为边看视频边编码是掌握语言的最佳方式。我学习了以下 Javascript 主题(简要): - 基本 JS 运算符 - JS 数组 - JS 对象 - If-e
我目前正在学习 Ruby,并尝试过 Simple Cipher 挑战。我现在正在研究以下解决方案,并试图进行逆向工程以了解该解决方案背后的思维过程。以下是解决方案的链接。我将详细说明我对每个代码片段的
对 Exercism 进行“汉明”测试,我正在努力找出我的功能出了什么问题 - 如果有人能提供一些线索,我将不胜感激: 规范 it('small hamming distance in longer
我完全错过了一些东西。我确信这是一件容易的事,但不确定我哪里出错了。 这就是我要运行的测试: var Robot = require("./robot-name"); describe("Robot"
我正在尝试进行 Exercism 中的第一个练习。我按照自述文件说明安装了 Homebrew,然后安装了 CLI。一切顺利。 然后我在命令行中输入下载第一个测试 - Hello World。同样,这工
有人能告诉我我做错了什么吗?测试将“计算”函数视为未定义,我完全不知道为什么。 这是我遇到的错误: Failures: 1) Hamming no difference between identic
我是一名优秀的程序员,十分优秀!