CheckiO Python 初級ピックアップ問題 ( 1 ) (シーザー暗号、ローマ数字変換器、日付と時間変換器)

Checkio

CheckiOというプログラミング問題集サイトの練習問題で頭の体操。

CheckiOとは

CheckiOは無料で使用できるプログラミング学習サイトで初級から上級まで多数のプログラミング問題が収録されている。使用言語はPythonとJavascriptで、自分は主にPythonの問題を解いている。

CheckiOのサイトでの説明はこう:

Coding games for beginners and advanced programmers where you can improve your coding skills by solving engaging challenges and fun task using Python and JavaScript.

(日本語意訳)
プログラミング初心者から上級者まで広く学べるコーディングゲーム。使用言語はPythonとJavascript。プログラミング難題や楽しい問題でコーディングスキルアップ!

プログラミングのミニクイズが出題されて、クイズを解決できるように実際のコードを書いて実行してエラーが出なかったら正解、ポイントやバッジが溜まってレベルが上がっていく。こんな感じ↓

モチベーションを保つためのファンシーな機能はないが、問題自体が解くのが楽しいのと、正解後は別の熟練者が書いたコードを見て学習できるのでここでの学習自体が続けるモチベーションになる。

コード自体は合っていても問題の内容をカバーしきれなかった場合のエラーは、自分が想定していなかったケースがテストされた結果のエラーが返ってくるので新しく気づきと学びがあったりする。

今まで解いた問題の中から初級者レベルだとどんな問題があるか3つ紹介したい。

第一問 シーザー暗号 Caesar Cipher (encryptor)

問題と考え方

This mission is the part of the set. Another one – Caesar cipher decriptor.

Your mission is to encrypt a secret message (text only, without special chars like “!”, “&”, “?” etc.) using Caesar cipher where each letter of input text is replaced by another that stands at a fixed distance. For example (“a b c”, 3) == “d e f”

Input: A secret message as a string (lowercase letters only and white spaces)

Output: The same string, but encrypted

「シーザー暗号」のことを聞いたことがある人はたくさんいると思う。今では陳腐であるが人類史初の暗号と言われる暗号化方法で、アルファベットの予め決めていた回数分「横にずらした場合の」アルファベットで文章を記述する、という暗号という概念が生まれた頃の初期暗号化方法。

例えば、「予め3回右にずらす」と決めておいて “I love you” という文章をシーザー暗号化すると、”l oryh brx” になる。ここでいう「3回ずらす」というのはアルファベット”abcdefghijklmnopqrstuvwxyz”の中で “a” を記入したい場合は右に3つずらした “d” を “a” の代わりに書くことになる。

シーザー暗号はその暗号化コンセプトを知っていてa-zのずらしを総当たり行うと解読可能であるので不完全な暗号化であるが、そのコンセプトとコーディングを学ぶ上ではためになる。

プログラムではこの「文章 (= “I love you”)」「何回 (= 3)」は入力内容になり、「暗号化された文章 (=”l oryh brx“)」が出力結果になる。

なので、プログラムを書く上での考え方は文章と回数を引数で渡し、予めアルファベットを定義しておく。暗号化された文章を格納する空箱を作っておき、入力された文章の中に大文字が含まれる可能性もあるので、小文字に統一。文章中にスペースがある場合、スペースを空箱に入れ、入力された文章を一文字ずつずらし、そのずらした文字を空箱に順に格納していく (入力した文章を一文字ずつ定義したアルファベットと照らし合わせ、アルファベットと一致したときそのアルファベットが何番目のアルファベットかを確認し、その”番目”の数と入力したずらす回数を足し、アルファベット全体数で割った上で新しい”番目”のアルファベットを格納する)、という実行をするコードを書けば良い。

問題はこちらから:

Caesar Cipher (encryptor)

自分の回答プログラム

知っておくべき文法:

  • for loop
  • list()
  • lower()
  • enumerate()

第二問 ローマ数字変換器 Roman Numerals

問題と考え方

Roman numerals come from the ancient Roman numbering system. They are based on specific letters of the alphabet which are combined to signify the sum (or, in some cases, the difference) of their values. The first ten Roman numerals are:

I, II, III, IV, V, VI, VII, VIII, IX, and X.

The Roman numeral system is decimal based but not directly positional and does not include a zero. Roman numerals are based on combinations of these seven symbols:

Numeral Value
I 1 (unus)
V 5 (quinque)
X 10 (decem)
L 50 (quinquaginta)
C 100 (centum)
D 500 (quingenti)
M 1,000 (mille)

More additional information about roman numerals can be found on the Wikipedia article.

For this task, you should return a roman numeral using the specified integer value ranging from 1 to 3999.

Input: A number as an integer.

Output: The Roman numeral as a string.

「数字」が入力内容で、「その数字に対応するローマ数字」が出力内容とするプログラムを書け、ということ。例えば「11」を入力内容とすると「XI」が結果として出力されるというもの。

考え方としては、どの数字がどのローマ数字に対応するかを定義し、入力された数字が定義したローマ数字に対応する数字より大きい場合、その数字に対応するローマ数字を出力結果を格納する空箱に順に入れていく、というもの。

問題はこちらから:

Roman Numerals

自分の回答プログラム

知っておくべき文法:

  • for loop
  • while loop
  • list

第三問 日付と時間変換器 Date and Time Converter

問題と考え方

Computer date and time format consists only of numbers, for example: 21.05.2018 16:30
Humans prefer to see something like this: 21 May 2018 year, 16 hours 30 minutes
Your task is simple – convert the input date and time from computer format into a “human” format.

Input: Date and time as a string

Output: The same date and time, but in a more readable format

「特定のフォーマットの日時表記を別の日時表記に自動変換するプログラムを書け」というもの。例えば「 “21.05.2018 16:30” 」という入力があった場合「’21 May 2018 year 16 hours 30 minutes’」という出力が返ってくる、というもの。

自分なりのではあるがプログラムを書く上での考えたのは、入力された日時表記を年月日時分としてリストに分解し、年月日と時分それぞれの変数に格納、その変数中の数字でどれが年、月、日、時、分を表すかを指定するために変数を改めて作成。

その後、月と時間のフォーマットを定義。そのフォーマットと変数内の数字を照らし合わせてフォーマットに合った表記に変えていく、という感じにした。

問題はこちらから:

Date and time converter

自分の回答プログラム

知っておくべき文法:

  • list
  • split()
  • for loop
  • if 文

ごりごり書いてこんな感じ。熟練者は1-2行で済ませられる問題でもある。公教育でのプログラミング学習は「プログラミング」ではないと聞くが、こういう初級レベルの問題をパズルみたいに考え方から考えていく授業や課題だと自頭良くなるプログラミング学習になるんじゃないかなと思う。

 

Facebook features:

コメント

タイトルとURLをコピーしました