Python 50によるプログラミングへのCS 50の導入の問題セットの解決—一度に一度:問題セット1


ここにオリジナルのブログ記事をお読みください。


コンディショナルズで今週、我々は別の5つの問題を解決するために提示されますProblem Set 1 . 私は始める前に、私は免責事項を思い出させる必要があります:私は完全なソリューションをここで提供していない、それはあなた自身が答えを思い付くときにエキサイティングですacademic honesty ). このシリーズの私の計画は、問題について考えるガイドを提供するだけです.私はまた、問題セットの説明を読んでいると仮定します.そうすれば、私が作る参照と、私がしようとするものはより明確です.

深い考え


インthis problem , 我々は、我々のプログラムのユーザーが生命、宇宙とすべての大きな質問に対する答えを知っているかどうかチェックする必要があるだけです.簡単に.
最後の問題が明らかになったのは、ドキュメントをチェックすることです.たとえあなたが探しているものを見つけるのが困難な場合であっても.その問題を解決することが肝要だ.それはまだこの問題セットで念頭に置いておくものです.
今では、その偉大な質問への答えはよく知られている42 , 我々は、ユーザーが正しい答えを与えることを確認する必要があります-彼らは文字通り、それを書くかどうか42 or forty-two , (or Forty two , など)
ここで主なことは2種類の方法をチェックすることです42 , または文字の文字列.我々が使用することは明らかですinput ユーザからの入力を取得する関数.もう一つのことは、最後の問題セットから覚えている場合はinput ユーザが番号を入力しても文字列を返します.
良い習慣はユーザの入力を掃除することです.例えば、入力がsarcasm case or yelling case , 文字列を小文字にすることは常に良い考えです.それは簡単に行うlower メソッド.また、入力文字列を取り除き、不要な空白がないことを確認できます.
以下のような形式で答えをお願いします.the answer , しかし、ユーザは以下のように入力しました.ThE-ansWer . それをクリアする最初のステップは、すべての小文字を作り、最後にスペースを取り除くことです.
user_input = user_input.lower().strip() 
print(user_input) # the-answer
そしてそれはthe-answer さあ.ハイフンを取り除くなら- ) 同様に、文字列をそのハイフンで分割することができ、結果のリストを再び文字列に結合できます.一歩ずつ続けましょう.
user_input = user_input.split('-')
print(user_input) # ['the', 'answer']
user_input = ' '.join(user_input) 
print(user_input) # the answer
それはすべてあなたがしたいことに依存し、どのように答えを参照してくださいしたいと思います.この問題において複数の形式の書式を回答として受け入れることができるので、ユーザ入力でこれらのメソッドをすべて使用することは意味があります.そして、最後に行うことは、答えが正しいかどうかを確認することですもしそうならばYes ; その他、戻りNo .

連邦貯蓄銀行


これでproblem , 挨拶をチェックします.それがどんな徴候でもあるならばhello その中で、私たちはお金を与えません$0 . 挨拶が始まるならh しかし、我々は出力することができます$20 . そして、これらは私たちの唯一の制約です.他のすべてに我々は非常に寛大であり、出力$100 .
実際には、Pythonは組み込みのメソッドを正確に、適切に名前を付けて条件を実装します.再び、それは我々が相談すべきドキュメントです.
明白であるかもしれないか、初心者にとって明らかでない1つのものは、ストリングがリストまたはタプルのようなシーケンスでもあるということです.それが意味するものは、それらが線形で、注文された項目から成るということです.Aでインデックスを使用するとき、あなたはすでにそれを実現したかもしれませんstr あなたがリストから項目を得るためにインデクシングを使うように、文字にアクセスするタイプ.意味は、時々リストまたは他のどのシーケンスもstr タイプ、およびいくつかの操作は両方に適用可能です.in , 例えば、1つの演算子をリストで使用できます.十分な手がかりのために、私は推測する.文字列が文字で始まるかどうかをチェックするには、それ自体も説明します.また、あなたは興味があるかもしれませんcustom implementation of it .

ファイル拡張子


このone おそらくこれまで私のお気に入りです.フォーマットを組み込むMIME types (または、メディア型)HTTP header , どちらがWeb上で表示されるかを決定します.この問題では、ファイル名の入力を取得し、そのファイルの適切なMIME型を返します.
この問題を解決できる方法がたくさんあります.今回の主なリソース- Pythonドキュメントの他に、もちろん-のリストですcommon MIME types MDNから.起動するには、デフォルトの2つのタイプがあります.text/plain のテキストファイルをtxt ), and application/octet-stream 他のすべてのために.この問題を考慮する他のすべての型については、各型と拡張の条件をハードコーディングする代わりに、以下のようなマッピングを作成できます.
extensions_mapping = {
    'image': ['gif', 'jpg', 'jpeg', 'png'],
    'application': ['pdf', 'zip'],
}
もちろん、ファイル名の拡張子を取得する必要があります.これは異なった方法で行うことができます、我々はドットがどこにあるかのインデックスからストリングをスライスすることができるか、点の後の部分を得るためにそれを分割することができます.また、入力文字列をクリアして、面倒な入力を処理する必要があります.深い考えの前にそれをしたので、我々は一貫性のためにストリングを降ろすことができます.そして、不必要な間隔を取り除くためにそれを切りました.マッピングを使用する場合は、拡張子が型の値(キーになる)かどうかをチェックするだけです.そうであれば、[mime_type]/[extension] . 例えば、ファイル名がcat.png , 我々のプログラムは印刷すべきimage/png .
しかし、1つのキャッチがあります.のためにjpg 拡張モジュールはMIME型ですimage/jpeg , の代わりにimage/jpg . 単純な条件付きで処理できます.
if extension == 'jpg':
    return 'image/jpeg'
(もちろん、関数を使用しない場合は、return文を使用する代わりに文字列を出力するだけです).
そして、それは問題を解決するために必要なすべてです.次の方へ.

インタプリタ


ヒアin this problem , if/elif/otherが本当に輝くならば条件.つのオペランドで単純な算術演算を行う必要があるだけです.出力文字列を浮動小数点数としてフォーマットする必要があります.入力文字列を分割するヒントは、説明に既に与えられています.、5 + 4 , 我々の分裂の結果は['5', '+', '4'] (入力は常に文字列を返します).残っているのは、与えられた演算子を4つの演算子に対してチェックすることです* , / , + , - ) そして、算術演算を行います.float形式は以下のようになります.
x = 6.5418
print(f'{x:.2f}') # 6.54
2の代わりに1つの場所としてフォーマットを行う必要があります.これが条件の連鎖である.

食事時間


このone 一目見ても、以前よりも複雑になっているようです.まず最初に考えるべきことは、3つのオプションしか考慮できないことです7:00 - 8:00breakfast time , 12:00 - 13:00lunch time , そして最後に18:00 - 19:00dinner time . ユーザーに時間を尋ねると、入力は#:## or ##:## . プログラム構造も私たちに与えられますmain 関数と関数convert 関数は、内部で呼び出すことができますmain . どうやって変換できるか考えてみましょう.
指定された時間#:## or ##:## , 我々は時間と分を得る必要があります--それは我々が我々のストリングを分割する必要があることを示します、その分割の結果の最初の項目が時間であるように、2番目のものは分です.
時間は次のように書くことができます07 , 0で始まるかどうかを確認できます.
ユーザ入力が07:30 . それはどういう意味ですか.それは単に7時間半です.時間が60分であるので、我々は分割としてその部分を意味することができます.それで30 / 60 この場合、0.5 . その後、私たちがする必要があるすべての時間と分を追加するにはint 必要ならば.しかし、入力が07:32 , あなたは除算を想像することができます32 / 60 というわけではないでしょう.0.5333333333333333 . 私たちがそのような場合に行うことができる1つのことはround 関数.我々は食事時間のための明確な境界をチェックしているので、我々は全体の操作をラウンドすることができますので、以下のようになります.
round(hour + minutes / 60)
(括弧を囲む必要はありませんminutes / 60 操作の順序が面倒になるので)
その後、残りは簡単です.私たちは、与えられた時間が特定の食事時間の間であるかどうか見るために各々の食事時間をチェックする必要があります.ここでPythonは比較演算子を1行で使いやすくなり、結果として私たちのコードはよりエレガントです.例:
time_total = 7.5

print(7 <= time_total <= 8) # True
我々は、使用する必要はありませんand 演算子.それはかなりきちんとしている.
唯一のことは、各条件の適切な食事時間を返すことです.そして、それはすべてです.チャレンジパーツについてはa.m. and p.m. , あなたはすでに分と分を分割した後、分の部分に別の分割を行うにしたいと思います.チェックすることができますp.m. , そして、もしそうならば、あなたは単に時間変数に12を加えることができます.あなたが既に時間と分の部分に時間を割っていると考えてp.m. 以下のようになります:
if ' ' in minute:
    abbr = minute.split(' ')[1]
    minute = int(minute.split(' ')[0])
    if abbr == 'p.m.':
        hour = int(hour) + 12

print(hour, minute, after) # 19 30 p.m.
For a.m. , 追加の算術演算を行う必要はありません.
そして、それは今週の問題セットのためのすべてです.おそらく、先週より少し挑戦的だったかもしれないが、それでも面白い.来週の問題はどうなるか見てみよう.