[Python] FizzBuzz問題を解こう(最速アルゴリズム編)
会社の教育でFizzBuzz問題を取り上げたら、他の人達がよってたかって
「こう書いたらどう?」
「いや、こう書くでしょ」
みたいな感じで小さなブームになってしまいました。いい感じです。
その中で、全員一致で「これが最速だ」ということになったソースがあるので、参考までに紹介します。
| 固定リンク
| コメント (2)
| トラックバック (0)
会社の教育でFizzBuzz問題を取り上げたら、他の人達がよってたかって
「こう書いたらどう?」
「いや、こう書くでしょ」
みたいな感じで小さなブームになってしまいました。いい感じです。
その中で、全員一致で「これが最速だ」ということになったソースがあるので、参考までに紹介します。
| 固定リンク
| コメント (2)
| トラックバック (0)
派遣でやってきたメンバーのプログラミング能力に疑問を持ったので、来週月曜日にFizzBuzz問題を解いてもらうことにしました。どういう問題かというと、
FizzBuzz問題:
1から100までの数字を出力するプログラムを書け。ただし以下のルールに従うこと。
- 数字が3の倍数のときには数字の代わりに「Fizz」を出力
- 5の倍数のときには「Buzz」を出力
- 3と5の倍数のときには「FizzBuzz」を出力
なプログラムを書いてもらうのです。実行例はこんな感じになります。
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
:
イメージは湧きましたでしょうか。ごく簡単なプログラムですが、解法はたくさんあるのが特徴です。だから「幾つかのアルゴリズムで、複数作ってください」とお願いして、どういう考え方をする人かを見ようかな、と。
でもその前に、自分でも書けるかどうかが心配になったので(オイオイ)、Pythonで書いてみました。
| 固定リンク
| コメント (3)
| トラックバック (0)
行ってきました。
賢い人たちに囲まれて、ついていけなくなりそうな話題に必死に付いていって、へとへとになりましたが、本当に行ってよかった。
井の中の蛙、大海は太平洋でした。
がんばって、太平洋でも泳げるカエルになるぞ!(←カエルのままかよ)
自分なりに今回のキャンプで学んだことをまとめたページを以下に作りました。
もうすぐで完成する状態ではあるものの、公開しますので興味のある方はどうぞ。
http://www23.atwiki.jp/selflearn/pages/43.html
最後に、こんな機会を与えてくれた妻と息子、そしてボクのいない間に孫の面倒を見に来てくれた母に感謝します。
| 固定リンク
| コメント (0)
| トラックバック (0)
妻のMixiから見てみたら、うちのブログの記事がやたらと多く出ていて、しかも何の記事かわかりにくかったので、タイトルにカテゴリを付けるようにしました。
3日連続で松本市にて行われているPython Developers Campに参加中です。今(初日)の時点での感想を一言で言うと、
「楽しい!!すごい!!」
です。頭の良い人たちがハイレベルな説明をし、そしてハイレベルな質疑応答が繰り返される。ものすごい刺激です。金づちで頭を何度も叩かれ続けている感じ。
大切な週末の育児ができなくて妻にはすごい迷惑をかけているけれど、本当に来てよかったです。
たとえば、サイボウズラボに勤務している方と談話していたときに「なぜこのキャンプに参加したんですか?」と聞いたところ、
「自分が常に変わろうという気持ちを持ち続けていたいから、刺激の中に身を置きたいからですよ」
と答えてくれました。こう思う人はいても、それを明言する人はそういません。良い意味で唖然としてしまいました。ボクもこうありたいです。
| 固定リンク
| コメント (2)
| トラックバック (0)
Python色々のメモです。
■do〜while構文を実現する方法
Pythonには「do~while」構文がないので、どうするかというメモ。
while True:
print i
i = i+1
if i >=10:
break
理屈は簡単で、常に真になるループを用意しておいて、ループ終了条件が来たらbreakするだけ。「(do~whileが)ない、どうしよう~」と悩んでいたけれど、全然悩む必要はありませんでした。
あ、でも、正確にいうならdo~whileよりもRubyのuntil構文に近いのかな。
■3項演算子
Python2.5からは3項演算子(Cでいう「(condition)?<true>:<false>;」)が使えるようになっているので、それもメモ。
>>> a=5
>>> b='Positive' if a>0 else 'Negative'
>>> b
'Positive'
>>> a=-1
>>> b='Positive' if a>0 else 'Negative'
>>> b
'Negative'
ふむふむ。
■クラスメソッドの定義方法
Python2.4からはクラスメソッドの定義には「@classmethod」というデコレータをメソッドの前に書いておけばオーケー。ただしこの場合も第一引数にはクラスを表す変数を書いておかないといけない。
>>> class hoge:
... def __init__(self):
... print self, "created"
... @classmethod
... def fuga(x):
... print "fuga:", x
...
>>> hoge.fuga()
fuga: __main__.hoge
>>> hoge().fuga()
<__main__.hoge instance at 0x259eb8> created
fuga: __main__.hoge
>>> a = hoge()
<__main__.hoge instance at 0x259eb8> created
>>> a.fuga()
fuga __main__.hoge
最後の例を見れば分かるように、hogeクラスをインスタンス化した後でもクラスメソッドとして呼ばれていることが分かる。途中のhoge().fuga()はちょっと特殊な呼び方(変数に束縛しないままでインスタンスメソッドを呼ぶ)なので、これは無視していいと思う。
※Pythonのわかんない人には意味不明な文章ですみません。自分の勉強メモなんです。
| 固定リンク
| コメント (0)
| トラックバック (0)
Pythonプログラムって、実はpy2exeを使うとPythonがインストールされていないWindows環境でも実行可能なexeファイルを生成してくれます。これはRubyには無い、Pythonの大きなメリットです。
で、今行っている仕事で、ネットワーク機器の特殊MIBを取得・設定するためのUIがあるといいな、それを開発者みんなが使えるようになるといいな、という背景があって、以下の算段を立てました。
ところが、py2exeで実行ファイル化しようとしたところ、「pySNMPを実行ファイルに含められない」、「実行時もpySNMPの所定のファイルが見つからない」といったエラーが出て進みません。
なんで?ということで"py2exe pysnmp"でググッてみると、こんな記述が。
<RE: Py2exe failing with pysnmp import: msg#00016>
It appears that pysnmp uses dynamic methods to determine (at runtime) the latest version that is installed and py2exe does not run code when building the exe so it can't follow this logic. You could manually specify what modules/packages to include, but the methods pysnmp uses to dynamically load these modules are not compatible with the archives built by py2exe (pysnmp tries to navigate to its folder which in py2exe is an archive and not a folder). pyasn1 (which is required by pysnmp) uses these same techniques - so it appears both would require quite a bit of modification to work with py2exe.
Jimmy
要約すると『無理』なんだってさ。そ、そんな・・・。
先に可能性を調べなかった自分が悪いのは分かっているけど、早く言ってよ、と。
というわけで、今、そのプログラムは僕の環境だけをものすごく便利にしてくれています(泣)。せっかくなので、ていうかくやしいので、 画面キャプチャを(一部隠して)載せておきます。
どうですお客さん、便利な雰囲気が伝わってきませんかコンチキショー。
| 固定リンク
| コメント (1)
| トラックバック (0)
SNMPでIPv6情報にアクセスするプログラム(将来はTkInter&py2exeでアプリ化する予定)、複数のファイルを読み込んで、同じ数字を持つ行のキーワードが異なるかどうかを調査するスクリプト。
前者はpySNMPの使い方に慣れるのに、後者は複数ファイルのそれぞれがエンコーディングが違う(しかも大嫌いなUTF-16が混じっている)のに苦労したけれど、共に何とか形になりました。
pySNMPはSNMPv1-v3のうちどれを使うか、ファイルのエンコーディングは、読み込む時にUnicodeに必ずデコードしておき、その他の処理に使う文字列もすべてUnicodeで書く、というのがポイントでした。
普段の仕事は組込み系なのでC,C++ばかりなので、かなりの頭の体操だったわけで。
・・・うーん、何と言えば分かりやすく伝わるかな。
例えば、
「普段は日本語ばかり喋っているのにスペイン語で話さなければいけない」
という状態。どうだろう、これなら分かってもらえるかな。
辞書を片手に「Mi nombre estoy Katokichi」みたいな間違いを繰り返しながらの1日でした。頭を使いまくって疲れたけれど、やっぱり刺激があるのは楽しいですね。
写真は妻がバレンタインデーに作ってくれたバナナのチョコケーキ。実は砂糖をまったく使っていない、きな粉の甘みでできたヘルシーなチョコケーキ。
これがまた美味しかった!
| 固定リンク
| コメント (0)
| トラックバック (0)
3年ほど前に少し熱中して、でも途中で投げ出していたPythonChallengeというゲームに再挑戦しています。
プログラミング言語であるPythonの、標準(と一部の拡張)ライブラリを使ってクイズを順番に解いていく、というWeb上のお遊びサイトです。とはいえなかなか歯ごたえのある問題が多いので、昔「Pythonの勉強になるかも」と思って挑戦したことがありました。でも、確か7問目でギブアップしてしまった記憶があります。
今はどうだろう?と思って再挑戦したところ、とりあえず9問目までは進めることができました。
・・・うーん、あんまり進展してない?
もうちょっと頑張ってみます。
| 固定リンク
| コメント (0)
| トラックバック (0)
今日はこれまでの無理がたたり、一日中寝込んでしまっていました。
お昼ご飯を食べてこたつに入っていたら、そのまま熟睡。気づいたら真っ暗。
3連休の貴重な1日をほぼ無駄にしてしまった・・・。皆さんはどうお過ごしですか?
えーと、さて。夜は気を取り直して勉強です。
今日は数学の地力を付けよう、という目標を立てていて、虚数の概要を調べていました。
すると「カルダノの公式」という3次方程式の解法が出てきて、その中で立方根が出てきました。で、チラシの裏で数式をいじっていたら「1331^(1/3)」を解くはめになったのですが、これが何なのかよく分からない。
ひょっとしたら小数かもしれないな、なんて思った(思ってしまった。後述)のでコンピュータに計算させようとしたのですが、立方根を計算してくれるライブラリがすぐにありませんでした。
10^3=1000で、さらに12^3=1728、それに下一桁が1ということで、ちょっと考えればすぐに分かったのでしょうが・・・何で気づかなかったんだろう?
探してインストール、というのも面倒だったので、自分で作ってみることにしました。
※誰か適切なライブラリを知っていたら教えてください。
| 固定リンク
| コメント (2)
| トラックバック (0)
「Pythonいろいろ(http://kanaya.aist-nara.ac.jp/Zope/member/nishio/japanese/memo/pythonTips)」というページで、Pythonで文字列の逐次結合とリストに溜めてからの一括結合のどちらが早いか、というベンチマークをしていました。
このテストをRubyでもしてみました。
| 固定リンク
| コメント (0)
| トラックバック (0)
最近のコメント