僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
昨日は某所にて、シェルスクリプトにseq(1)と
paste(1)を使った(除算も剰余も用いない)
fizzbuzz を見た。
前は Smalltalk でやってみたが、 今度はPythonによるfizzbuzz。
from __future__ import print_function fizz = { x for x in range(3,100,3) } buzz = { x for x in range(5,101,5) } for x in range(1,101): if x in fizz: print("fizz", end='') if x in buzz: print("buzz", end='') if not x in fizz and not x in buzz: print(x, end='') print('')
"fizzbuzz"の処理を入れていた方が、やはり素直でいいかも。
少なくとも一行目のまじないは要らなくなる(end=''は3.x)し。
と書いて気づいた。集合型の内包表記っていつからあったっけ。
この方式では、集合が大きくなると当然破綻する。
破綻しないように途中に fizz.remove(x)などを
仕込むことを考えたが、最初に集合を作っているので
無意味だ。
Smalltalkで書いた方法なら、試す価値ありそう。
もっともその前に、去年何を覚えたつもりだったのか、それを
思い出さねば。
最終値を101にしないと、最後(100)が"buzz"にならない箇所があった。
訂正。
これも除算、剰余を使ってない例。
python2.7.3 と3.2.3で確認。
all = [x for x in range(1,101)] for x in range(1,7): if x*15 in all: all[x*15-1] = 'fizzbuzz' for x in range(1,34): if x*3 in all: all[x*3-1] = 'fizz' for x in range(1,21): if x*5 in all: all[x*5-1] = 'buzz' for y in all: print(y)
for ループは一回だけにしたかったが、それだと x*15 を例に取れば、1から100までしかないのに 1500まで比較することになり、100回の計算の うち94回は無駄になるはず。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。