Pythonの練習がてらに問題を公開してるサイトを幾つか回っていて、問題を集めて解いてと繰り返しやっていたのがある程度溜まってきたので面白かった問題を載せようと思います。
参考サイト
プログラミングスレまとめ in VIP
大谷大学 Pythonプログラミング:14
第1問目
Hello World![改行]を5回表示させる。
ループ構文(for,while等)を利用して、print等は1回の使用に。
ヒント:パっと思いついたのを書いてみてもいいかもしれない。
第2問目
コマンドラインから入力を受け取って、n回表示するように改造してください。
何回目のHello World!かも表示してみてください。
ヒント:じぶんはforでやりました。
第3問目
FizzBuzz。
1から順番に数を表示する。
その数が3で割り切れるなら”Fizz”、5で割り切れるなら”Buzz”、両方で割り切れるなら”FizzBuzz”と表示する。
ヒント:アルゴリズムが出来上がったら答えは近いと思う。というのもアルゴリズムが出来上がったら意外とさっくりとできた。
第4問目
平方根を求めてみよう。
ヒント:平方根ってなんだったっけ?ってレベルだったけど(笑)。これもアルゴリズムを考えたら・・・ってか、ちゃんと正解になってないけど、まあだいたい合ってるしなあってとこで妥協してしまった問題。リベンジだな。
第5問目
うるう年測定。
ヒント:ウィキペディアでうるう年の概念?を確認して、それをそのままプログラムに直すとすぐできると思う。
余裕がれば関数とか使ってみたりとこれは色々できそう。
たけけんはキャタピラ式になってしまって、ちょっと悲しい。
第6問目
ファイルを読み込んでIPアドレスを抜き出すプログラムを作る。
ヒント:大谷大学の問題をちょっと改変。リンク先にサンプルコードがあるからそれを使おう。あと、たけけんはサーバーからログを持ってきてやってみました。
第7問目
最大公約数を求める。(ユークリッドの互除法を使って)
ヒント:どこかのメニューみたいな問題の書き方になってますね。とりあえずはユークリッドの互除法ってのを調べてアルゴリズムを考えてみるところから。あるところをプリっと付け足してパッとできた感じ。
第8問目
if 分岐を使って何か作ろう。
ヒント:なんでもいいとおもう。考えるんじゃない感じるんだ。みたいな。
答え合わせ
たけけんが作った回答はこんな感じ。
ただ正解は無数にあるし、ワンライナーって1行コマンドを考えたりとかもいいかと。
第1問目:パッと書いたら動いた。
for m in [1,2,3,4,5]: print("Hello World!")
for m in range(5): print("Hello World!")
第2問目:sys.argv を使ってみよう!みたいな問題。
import sys for i in xrange(int(sys.argv[1])): print "Hellow World!", i+1
第3問目:数字があれなんで、逆からいったらすぐだね。
import sys m = 1 for i in xrange(int(sys.argv[1])): if m%15 == 0: print 'FizzBuzz' m += 1 elif m%5 == 0: print 'Buzz' m += 1 elif m%3 == 0: print 'Fizz' m += 1 else: print m m += 1
第4問目:そもそも限りなく近いってもんだし、まあいいよね。
a = input("A no atai? -> ") b = 0.0000001 while a >= b * b: b += 0.0000001 print b
第5問目:うるう年ってそうなんだ!って思った。
toshi = input("nannen? -> ") if 200 == toshi%900 or 600 == toshi%900: print "urudoshi" elif 0 == toshi%100: print "heinen" elif 0 == toshi%4: print "urudoshi" else: print "heinen"
第6問目:色々カスタマイズしたら、ログから調べたりもできそうだし、覚えておいて損はないかも。
#!/usr/bin/python # coding: utf-8 import re, sys re_mail_address = re.compile(r'(?:\d{1,3}\.){3}\d{1,3}') for file_name in sys.argv[1:]: for line in open(file_name, "r"): for m in re_mail_address.finditer(line): print m.group(0)
第7問目:7問目だけど、最初の方にやった問題だから、丁寧に書いてますなあ。
#!/usr/bin/python # coding: utf-8 def keisan(a,b): if a > b: while b != 0: r = a a = b b = r % b return a else: print "AにはBより大きい数字を入れて下さい。" exit() a = input("a ? ") b = input("b ? ") c = keisan(a,b) print a,"と",b,"の最大公約数は",c,"です。"
第8問目:気の赴くままに書いてみた。
#!/usr/bin/python # coding: utf-8 height = raw_input("あなたの身長は、何cmですか?") height = float(height) weight = raw_input("あなたの体重は、何Kgですか?") weight = float(weight) standard_weight = ((height / 100) ** 2) * 22 fat = (weight / standard_weight - 1) * 100 print "標準体重は、", standard_weight, "Kg" print "あなたの体重は、", weight, "Kg" print "肥満度は、", fat, "%です。" inch_height = float( height / 30.48 ) pound_weight = float( weight / 0.454 ) if fat > 10: print "太りすぎです。ダイエットしましょう。" elif fat < -10: print "やせ過ぎです。きちんと栄養をとりましょう。" else: print "あなたは標準体重の許容範囲に入っています。この体重を維持していください。" print "あなたの身長は", inch_height ,"フィートです。" if pound_weight > 200: print "あなたはヘビー級です。", pound_weight ,"ポンド" elif pound_weight > 175: print "あなたはクルーザー級です。", pound_weight ,"ポンド" elif pound_weight > 168: print "あなたはライトヘビー級です。", pound_weight ,"ポンド" elif pound_weight > 160: print "あなたはスーパーミドル級です。", pound_weight ,"ポンド" elif pound_weight > 154: print "あなたはミドル級です。", pound_weight ,"ポンド" elif pound_weight > 147: print "あなたはスーパーウェルター級です。", pound_weight ,"ポンド" elif pound_weight > 140: print "あなたはウェルター級です。", pound_weight ,"ポンド" elif pound_weight > 135: print "あなたはスーパーライト級です。", pound_weight ,"ポンド" elif pound_weight > 130: print "あなたはライト級です。", pound_weight ,"ポンド" elif pound_weight > 126: print "あなたはスーパーフェザー級です", pound_weight ,"ポンド" elif pound_weight > 122: print "あなたはフェザー級です。", pound_weight ,"ポンド" elif pound_weight > 118: print "あなたはスーパーバンタム級です。", pound_weight ,"ポンド" elif pound_weight > 115: print "あなたはバンタム級", pound_weight ,"ポンド" elif pound_weight > 112: print "あなたはスーパーフライ級です。", pound_weight ,"ポンド" elif pound_weight > 108: print "あなたはフライ級です。", pound_weight ,"ポンド"
マラソンでいうとジョギングの準備を初めたところと言ったところだけど、自分のスキル確認というのもあるし、ちょこちょこアップしていけたらなあと思ったりしあすた。どうしてもプログラム書かないといけないって場面に出会ったことがまだないので、今は何とも言えないけどきっと必要になってくる時が来るはずなので、ばちっとやっていこう。