« [linux/ubuntu] feisty に gcc-2.95 をインストールする方法 | トップページ | [book] Windows Server クックブック日本語版も抄訳 »

2007/05/12

[ Python ] fizz-buzz テスト --- 邪悪編 ---

こんな話を紹介された。これすらも書けないなんて信じられない話だ。タイピングをする時間を除けば、10秒かからずに頭に浮かぶだろう。

Fizz-Buzz テストは「1~100 の整数の内 3 の倍数は "Fizz", 5 の倍数は "Buzz", 3 と 5 の公倍数は "FizzBuzz"、それ以外はその整数をそのまま表示するプログラムをつくる」というもの。さらっと書いたのが↓

>>> for integer in integer_list:
	if (integer % 15) == 0:
		print "FizzBuzz"
	elif (integer % 3) == 0:
		print "Fizz"
	elif (integer % 5) == 0:
		print "Buzz"
	else:
		print integer

でも、これじゃ面白くないよね。後でとっても邪悪なコードに仕上げようと思う。

2007.05.09.23:54 追記
10分くらい考えたのが↓のコード

# Write Evil Code?
[cmp((i%15),0)and(cmp((i%3),0)and(cmp((i%5),0)and i or"Buzz")or"Fizz")or"FizzBuzz"for i in range(1,101)]

# ちょっと見やすくすると↓
[cmp( (integer % 15), 0 ) and (cmp( (integer % 3), 0 ) and (cmp( (integer % 5), 0 ) and integer or "Buzz") or "Fizz") or "FizzBuzz" for integer in range(1,101)]

う~ん、100bytes を超えてしまった。残念。考え直してきます。

2007.05.10.1:18 追記
ご飯食べてシャワー浴びている間に「そーいえば cmp() 使う必要ないじゃん」と気付いて書き直し。

# 91bytes
[(i%15==0 or(i%3==0 or(i%5==0 and"Buzz")and"Fizz")and"FizzBuzz")or i for i in range(1,101)]

とはいえまだ冗長性が残っている。他にも方法を思いついたし、書き直しの余地はありそうだ。

2007.05.11.0:26 追記
新しいのを書こうと思ったら、havana がほとんど同じコードを書いていた ( わたしのコードは ["".join(("Fizz"*(i%3<1)+"Buzz"*(i%5<1))or str(i))for i in range(1,101)] というもの )。なら、とにかく邪悪なコードを書いてみようと思って作ってみる↓

# WARNING!: とっても邪悪
[(filter( lambda obj:(type( obj ) != int), fragment )[-1] if filter( lambda obj:(type( obj ) != int), fragment ) else ([[reduce( partial_function, div_rep ) for div_rep in ((3, "Fizz"), (5, "Buzz"), (15, "FizzBuzz"))] for partial_function in [__import__("functools").partial( (lambda integer, divisor, replace: ((integer % divisor == 0) and replace) or integer), integer ) for integer in range( 1, 101 )]].index( fragment ) + 1)) for fragment in [[reduce( partial_function, div_rep ) for div_rep in ((3, "Fizz"), (5, "Buzz"), (15, "FizzBuzz"))] for partial_function in [__import__("functools").partial( (lambda integer, divisor, replace: ((integer % divisor == 0) and replace) or integer), integer ) for integer in range( 1, 101 )]]]

長さ 733bytes の Fizz-Buzz コード( ´・ω・`)b
たぶん Python をつかったコードの中では、現在日本最悪だとおもう。
ほんとは1文字変数に直しても 1000 bytes 以上に挑戦したんだけどだめでした orz
動作は Python2.5 限定です。

2007.05.11.1:26 追記
havana に "".join() いらないジャンと突っ込まれて気づく。

[("Fizz"*(i%3<1)+"Buzz"*(i%5<1))or i for i in range(1,101)]
59 bytes (≧▽≦)b

あと、havana の一番最初に考えたコードは↓でした ( Ruby らしい )
(1..100).each{|i|puts ["Fizz#{s=['Buzz'][i%5]}"][i%3]||s||i}

Reference
どうしてプログラマに・・・プログラムが書けないのか? ( 2007/02/26, 原著: Jeff Atwood, 訳: 青木靖 )

|

« [linux/ubuntu] feisty に gcc-2.95 をインストールする方法 | トップページ | [book] Windows Server クックブック日本語版も抄訳 »

コメント

print"\n".join([(0==i%3)*'Fizz'+(0==i%5)*'Buzz'or str(i)for i in range(1,100)])
内包表記やlambdaの中でprint書けないのがつらいー

投稿: havana | 2007/05/10 02時57分

print"\n".join([(1>i%3)*'Fizz'+(1>i%5)*'Buzz'or str(i)for i in range(1,101)])
2バイト縮んだ&rangeが半開区間なの忘れてた

投稿: hvana | 2007/05/10 03時13分

月並みですが、私も書いてみました。
# -*- coding: utf-8 -*-

def FizzBuzz(chengeList):
chengePare = [(15,'FizzBuzz'), (5,'Buzz'), (3,'Fizz')]
chengePare.sort()
chengePare.reverse()

tmpList = []
for num in chengeList:
for chenge in chengePare:
if num % chenge[0] == 0:
tmpList.append( chenge[1] )
break
else:
tmpList.append(num)

return tmpList

if __name__ == '__main__':
print FizzBuzz( range(1,101) )

投稿: aaa | 2007/05/29 23時46分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/103108/15011188

この記事へのトラックバック一覧です: [ Python ] fizz-buzz テスト --- 邪悪編 ---:

« [linux/ubuntu] feisty に gcc-2.95 をインストールする方法 | トップページ | [book] Windows Server クックブック日本語版も抄訳 »