質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Python

    6884questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

シーザー暗号を解く関数を作りたい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 224

cipher

score 6

シーザー暗号は指定された文字数だけ文字をシフトする(今回の場合はアルファベット)暗号です。その暗号を第1引数に文字列、第2引数にシフトする数を渡して暗号を解く関数を作りたいです。
教えていただければ嬉しいです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/06/05 10:38

    どこまでコードを書きましたか? できているところまでで良いので、cipherさんのコードを質問に追加してください。

    キャンセル

  • 退会済みユーザー

    2018/06/05 13:36

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+5

そのおっしゃっていることをそのままコードに書けばいいだけ、のはなしです。
で、なにがわからないのでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

答えだけ。

from string import ascii_letters as chars
nchars = len(chars)
encrypt = lambda source, shift: ''.join(
    c in chars and chars[(chars.index(c) + shift) % nchars] or c
    for c in source)
print(encrypt('Hello, world!', 100))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

それなりに見た目がわかりやすいことを重視して書いてみました。要所にはコメントも入れてあるので、理解できると思います。

char_ui_dict = {c:i 
                for i, c in
                enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZ")}
char_li_dict = {c:i 
                for i, c in
                enumerate("abcdefghijklmnopqrstuvwxyz")}
char_iu_dict = {v:k 
                for k,v in char_ui_dict.items()}
char_il_dict = {v:k 
                for k,v in char_li_dict.items()}

"""
print(char_ui_dict)
print(char_li_dict)
print(char_iu_dict)
print(char_il_dict)
=>
{'F': 5, 'G': 6, 'D': 3, 'V': 21, 'C': 2, 'U': 20, 'A': 0, 'O': 14, 'W': 22, 'Z': 25, 'S': 18, 'R': 17, 'X': 23, 'J': 9, 'M': 12, 'I': 8, 'Y': 24, 'P': 15, 'N': 13, 'T': 19, 'L': 11, 'K': 10, 'Q': 16, 'B': 1, 'H': 7, 'E': 4}
{'d': 3, 'l': 11, 'p': 15, 'm': 12, 'b': 1, 'z': 25, 'u': 20, 'c': 2, 'i': 8, 'j': 9, 'y': 24, 'q': 16, 'h': 7, 'w': 22, 'o': 14, 'n': 13, 'x': 23, 'k': 10, 'g': 6, 't': 19, 'f': 5, 'a': 0, 'v': 21, 'r': 17, 's': 18, 'e': 4}
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q', 17: 'R', 18: 'S', 19: 'T', 20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z'}
"""

alpha_n = 26

def cshift(c, shift_n):
    if c in char_ui_dict:
        code = char_ui_dict[c] + shift_n
        return char_iu_dict[code%alpha_n]  # 1%26 => 1, 2%26 => 2, 28%26 => 2, -3%26 => 23
    elif c in char_li_dict:
        code = char_li_dict[c] + shift_n
        return char_il_dict[code%alpha_n] 
    else:
        return c

def caesar(string, shift_n):
    return "".join([cshift(c, shift_n) for c in string])  # "".join(["h", "o", "g", "e"]) => "hoge"

def code(string, shift_n):
    return caesar(string, shift_n)

def decode(string, shift_n):
    return caesar(string, -shift_n)

print(code("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 3))
print(decode(code("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 3), 3))
""" =>
DEFGHIJKLMNOPQRSTUVWXYZABCdefghijklmnopqrstuvwxyzabc
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/05 13:40

    そして書いている間に解決・・・

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6884questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。