結果

問題 No.18 うーさー暗号
ユーザー LeonardoneLeonardone
提出日時 2015-10-13 01:30:12
言語 Ruby
(3.3.0)
結果
AC  
実行時間 83 ms / 5,000 ms
コード長 1,929 bytes
コンパイル時間 51 ms
コンパイル使用メモリ 11,300 KB
実行使用メモリ 15,452 KB
最終ジャッジ日時 2023-09-21 11:54:43
合計ジャッジ時間 1,863 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 80 ms
15,044 KB
testcase_01 AC 83 ms
15,052 KB
testcase_02 AC 77 ms
15,192 KB
testcase_03 AC 81 ms
15,416 KB
testcase_04 AC 79 ms
15,452 KB
testcase_05 AC 78 ms
15,268 KB
testcase_06 AC 78 ms
15,324 KB
testcase_07 AC 77 ms
15,412 KB
testcase_08 AC 78 ms
15,224 KB
testcase_09 AC 78 ms
15,292 KB
testcase_10 AC 76 ms
15,304 KB
testcase_11 AC 76 ms
15,296 KB
testcase_12 AC 77 ms
15,444 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

#! ruby
# yukicoder My Practice
# author: Leonardone @ NEETSDKASU

S = gets.chomp

# 頭を整理するためメモ

# 暗号化した文字列を復号化する処理

# アルファベットは26文字
# 暗号化は(1文字目の文字位置を0、2文字目の文字位置を1…とすると)
# 文字位置を i として
# AからZをAを0番目、Zを25番目としたアルファベット番号と定義して
# 文字列のi番目の文字のアルファベット番号 original_alpha[i] は
# original_alpha[i] = Ord(original_text[i]) - Ord('A')
# アルファベット番号をずらす量 move = i + 1 として
# ここから暗号化したアルファベット番号 cipher_alpha[i]を求めると
# cipher_alpha[i] = (original_alpha[i] + move) % 26
# これを文字に戻すと暗号ができる
# cipher_text[i] = Char(cipher_alpha[i] + Ord('A'))

# 復号化は
# 暗号化されたアルファベット番号の抽出
# cipher_alpha[i] = Ord(cipher_text[i]) - Ord('A')
# 復号するアルファベット番号は
# original_alpha[i] = (cipher_alpha[i] - move) % 26
# このままだと括弧の中が負になってしまうケースがある
# アルファベット番号は0~25を繰り返すmod 26なので
# ()の中に26の倍数をいくら足しても結果に変わりはないはずである
# ()の中が負にならないような十分な大きさの26の倍数を加えてやればよい
# すなわち plus26x = Ceil(move / 26) * 26 である
# これを元に式を書き直すと
# original_alpha[i] = (cipher_alpha[i] - move + plus26x) % 26
# あとはこれを文字に戻す
# original_text[i] = Char(original_alpha[i] + Ord('A'))

original_text = ""

S.size.times do |i|
	move = i + 1
	cipher_alpha = S[i].ord - 'A'.ord
	plus26x = (move.to_f / 26.0).ceil * 26
	original_alpha = (cipher_alpha - move + plus26x) % 26
	original_text += (original_alpha + 'A'.ord).chr
end

puts original_text
0