トップ «前の日記(2013-01-20(Sun)) 最新 次の日記(2013-01-22(Tue))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2013-01-21(Mon) 晴れたり曇ったり、所によって寒いかも

集合型で

昨日は某所にて、シェルスクリプトに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や内容が変った場合はあしからず。

index.htmlは ここから。