Skip to content

Instantly share code, notes, and snippets.

@KentaKudo
Last active July 19, 2017 19:41
Show Gist options
  • Save KentaKudo/9d0d1235464dd4ab1ea62836ed97f7b0 to your computer and use it in GitHub Desktop.
Save KentaKudo/9d0d1235464dd4ab1ea62836ed97f7b0 to your computer and use it in GitHub Desktop.
public struct RotorBox {
...
public mutating func cipher(_ target: Token) -> Token {
defer {
// 関数を抜ける際に回転
rotate()
}
// 入力→rotor0
let input = connect(pure, rotor0)(target)
let r0 = rotor0.forward(input)
// rotor0→rotor1
let _r0 = connect(rotor0, rotor1)(r0)
let r1 = rotor1.forward(_r0)
// rotor1→rotor2
let _r1 = connect(rotor1, rotor2)(r1)
let r2 = rotor2.forward(_r1)
// rotor2→reflector
let _r2 = connect(rotor2, reflector)(r2)
let ref = reflector.forward(_r2)
// reflector→rotor2
let _ref = connect(reflector, rotor2)(ref)
let r2ret = rotor2.backward(_ref)
// rotor2→rotor1
let _r2ret = connect(rotor2, rotor1)(r2ret)
let r1ret = rotor1.backward(_r2ret)
// rotor1→rotor0
let _r1ret = connect(rotor1, rotor0)(r1ret)
let r0ret = rotor0.backward(_r1ret)
// rotor0→出力
let output = connect(rotor0, pure)(r0ret)
return output
}
private mutating func rotate() {
mod1 = (mod1 + 1) % 26
mod2 = (mod2 + 1) % (26 * 26)
rotor0.rotate()
if mod1 == 0 {
rotor1.rotate()
}
if mod2 == 0 {
rotor2.rotate()
}
}
private func connect(_ input: Rotor, _ output: Rotor) -> (Token) -> Token {
let gap = input.position - output.position
return { token in
return token - gap
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment