Substitution - CS50x 2026

解くべき問題

換字式暗号(substitution cipher)では、メッセージの各文字を別の文字に置き換えることで、メッセージを「暗号化」(encrypt、つまり可逆的な方法で隠蔽)します。これを行うには、「鍵」(key)を使用します。この場合、鍵とは、アルファベットの各文字を、暗号化時に対応させる文字に割り当てた(マッピングした)もののことです。メッセージを「復号」(decrypt)するには、受信者が鍵を知っている必要があり、それによって暗号文(一般に ciphertext と呼ばれる)を元のメッセージ(一般に plaintext と呼ばれる)に戻す逆のプロセスを行うことができます。

たとえば、鍵が NQXPOMAFTRHLZGECYJIUWSKDVB という文字列であるとします。この26文字の鍵は、A(アルファベットの1番目の文字)を N(鍵の1番目の文字)に、B(アルファベットの2番目の文字)を Q(鍵の2番目の文字)に変換するといったことを意味します。

すると、HELLO というメッセージは、鍵によって決定されたマッピングに従って各文字を置き換えることで、FOLLE として暗号化されます。

substitution というフォルダ内の substitution.c というファイルに、換字式暗号を使用してメッセージを暗号化できるプログラムを作成してください。ユーザーがプログラムを実行する際に、実行時に提供する秘密のメッセージに使用する鍵を、コマンドライン引数として指定できるようにします。

デモ

仕様

換字式暗号を使用してメッセージを暗号化するプログラム substitution を設計および実装してください。

  • プログラムは、substitution というディレクトリ内の substitution.c というファイルに実装してください。
  • プログラムは、換字に使用する鍵を1つのコマンドライン引数として受け取る必要があります。鍵自体は大文字と小文字を区別しない(case-insensitive)ものとし、鍵の文字が大文字か小文字かによってプログラムの動作が影響を受けるべきではありません。
  • コマンドライン引数なしで、または複数のコマンドライン引数を指定してプログラムが実行された場合、プログラムは任意のエラーメッセージ(printf を使用)を表示し、直ちに main から 1(通常はエラーを意味します)を返す必要があります。
  • 鍵が無効な場合(26文字でない、英字以外の文字が含まれている、または各文字が一度だけ含まれていないなど)、プログラムは任意のエラーメッセージ(printf を使用)を表示し、直ちに main から 1 を返す必要があります。
  • プログラムは plaintext:(改行なし)を出力し、ユーザーに(get_string を使用して)平文(plaintext)の string を入力するように促す必要があります。
  • プログラムは ciphertext:(改行なし)に続けて、平文に対応する暗号文を出力する必要があります。平文の各英字は暗号文の対応する文字に置換され、英字以外の文字はそのまま出力される必要があります。
  • プログラムは大文字と小文字を保持する必要があります。大文字は大文字のまま、小文字は小文字のまま出力してください。
  • 暗号文を出力した後、改行をプリントしてください。その後、プログラムは main から 0 を返して終了する必要があります。

manual.cs50.io に記載されている ctype.h で宣言されている1つ以上の関数が役立つかもしれません。

ウォークスルー

テスト方法

正確性

check50 cs50/problems/2026/x/substitution

debug50 の使い方

debug50 を実行したいですか? make でコードを正常にコンパイルした後、次のように実行できます。

debug50 ./substitution KEY

ここで、KEY はプログラムにコマンドライン引数として与える鍵です。なお、次のように実行すると、

debug50 ./substitution

プログラムは(理想的には!)ユーザーに鍵の入力を促して終了します。

スタイル

style50 substitution.c

提出方法

ターミナルで以下を実行して、表示されるプロンプトに従って回答し、課題を提出してください。

submit50 cs50/problems/2026/x/substitution