2020年1月17日金曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 2(型)、LESSON 11(チャレンジ: ヴィジュネル暗号)の練習問題1の解答を求めてみる。

コード

package main

import (
 "fmt"
 "strings"
)

func main() {
 cipherText := "CSOITEUIWUIZNSROCNKFD"
 keyword := "GOOLANG"

 fmt.Println("strings.Repeat関数を使った版")

 fmt.Println("rangeを使った版")
 message := ""
 keywords := strings.Repeat(keyword, len(cipherText)/len(keyword)+1)
 for i, c := range cipherText {
  t := byte(c) - (keywords[i] - 'A')
  if t < 'A' {
   t += 26
  }
  message += string(t)
 }
 fmt.Println(message)

 fmt.Println("rangeを使わない版")
 message = ""
 for i := 0; i < len(cipherText); i++ {
  t := cipherText[i] - (keywords[i] - 'A')
  if t < 'A' {
   t += 26
  }
  message += string(t)
 }
 fmt.Println(message)

 fmt.Println("strings.Repeat関数を使わない版")
 fmt.Println("rangeを使った版")
 message = ""
 for i, c := range cipherText {
  j := i % len(keyword)
  t := byte(c) - (keyword[j] - 'A')
  if t < 'A' {
   t += 26
  }
  message += string(t)
 }
 fmt.Println(message)

 fmt.Println("rangeを使わない版")
 message = ""
 for i := 0; i < len(cipherText); i++ {
  j := i % len(keyword)
  t := cipherText[i] - (keyword[j] - 'A')
  if t < 'A' {
   t += 26
  }
  message += string(t)
 }
 fmt.Println(message)
}

入出力結果(Zsh、PowerShell、Terminal)

% go run ./decipher.go
strings.Repeat関数を使った版
rangeを使った版
WEAXTROCIGXZAMLAOCKSX
rangeを使わない版
WEAXTROCIGXZAMLAOCKSX
strings.Repeat関数を使わない版
rangeを使った版
WEAXTROCIGXZAMLAOCKSX
rangeを使わない版
WEAXTROCIGXZAMLAOCKSX
%

0 コメント:

コメントを投稿