【激突】関数型言語 VS オブジェクト指向言語2at TECH
【激突】関数型言語 VS オブジェクト指向言語2 - 暇つぶし2ch172:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 23:20:47.45
ストラウストラップのOOのキモは「抽象データ型にクラスを使うアイデア」。
ref. URLリンク(www2.research.att.com)

ケイのOOのキモは「処理系のみならず、その受け皿であるナンチャッテOS、工程まで
ひっくるめたあらゆることで徹底した動的性」。
ref. URLリンク(metatoys.org)

関数型のキモは「非破壊操作とそれがもたらす参照透明性」。

型推論とかメッセージとかパターンマッチとかはオマケです。偉い人には(ry

173:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 23:31:04.63
>>170
分散したいならデータも共有しないのが基本なので
永続データの共有を推奨するのはおかしいと思う

174:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 23:41:08.58
>>170
あんま最近は追いかけてないから知らないけど、
汎用手続き型+トランザクショナルメモリの研究はもう止めちゃったのかね。
デッドロックのみならず、例外処理もしやすくなるから期待していたんだけど。
トランザクションで思い出したけど、SQLは宣言的言語と言われてたはずだったんだけど、
今どきはストアドプロシージャとかも使うらしいね。

175:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 23:44:18.47
結局欲しいのは副作用の管理

176:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 06:49:32.37
>>161>>163
オブジェクト指向の何を取り入れたの?
Haskellのどの機能がオブジェクト指向由来なのか教えてくれ

177:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 06:55:00.27
OOで見るべきところがあるのはメッセージング(徹底的な動的性)とtraitsのみ
他はゴミ

178:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 07:27:14.51
OCaml のことを言ってるんじゃないのか?

あとジェネリックプログラミングとかは、中途半端に型があるオブジェクト指向系の
言語でやるより、がっちり型のある関数型言語でやったほうがいいし、ST モナド
使えば、本物の「状態のカプセル化」ができる。
関数型ではオブジェクト指向なんてできない、というのは初心者が陥りがちなデマ。

179:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 07:47:00.64
そういや、関数型でOOPLでいう継承ってどんな形になるの?

180:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 08:04:22.67
>>179
継承っぽいやつ>>93
プロトタイプOOっぽいやつ>>25

OCamlは普通にクラスも継承もあるので省略

181:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 08:24:34.70
>>179
OCamlで高階ファンクター
F はモジュール X,Y を引数にして新しいモジュールを返す

module type S = sig end
module type T = sig end

module F (X : S) (Y : T) =
struct
  include X
  include Y
end

182:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 09:21:46.15
やろうと思えばCでもできること
自然に書けるかなんだけどな

183:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 12:05:42.06
不自然なものを自然にしたいという需要は確かにあるね
科学的に有害か無害かは関係なく、自然か不自然かだけで商売になる

184:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 12:30:26.91
ただし自然かどうかはOO信者のさじ加減ひとつで決まります

185:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 13:06:13.85
セマンティクスとしては x の評価を 2 度する、というのは変わらんじゃないのかな。
その評価が状態に対して idempotent かどうかという違いであって。

186:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 13:08:03.10
(誤爆w)

187:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 23:37:56.20
>>183
自分はHaskellのリバース関数が自然だと感じて入門当時は感動したな

reverse [] = []
reverse (x:xs) = reverse xs ++ [x]

もちろん、組込み関数のreverseは速度重視の直感的ではないコードなんだが・・・


188:営利利用に関するLR審議中@詳細は自治スレへ
12/04/11 01:26:37.69
>>187
演算子とコンストラクタの違いが直感的に分からない
英単語だったら先頭が大文字かどうかで分かるんだが

189:営利利用に関するLR審議中@詳細は自治スレへ
12/04/11 03:24:43.28
>>188
コ、コンストラクタ!?
Haskellを例に出した私にレスされましても・・・
クラスの生成時に呼び出すメソッドと演算子に直感的な違いも何も無いと思いますが・・・

Cons演算子のことでしたら、リストという構造に対する演算子だと理解しておけば良いと思います

[1,2,3] = 1:[2.3] = 1:2:[3] = 1:2:3:[]

関数の引数にリストの全部の要素を書きたければ(要素数固定になりますが)書けますよ

sum3 (x:y:z:[]) = x+y+z

(x:xs)の部分の理解はghci上で

let (x:xs) = [1..5]

とかしてxとxsの値を調べると良いです
リストを引数に取る時の表記は、Haskellの中では特別な表記法と言う訳ではないです

+演算子もこう言う書き方は出来ま・・・廃止になったけど、ちょっと前までは出来たんです

dec (n + 1) = n


190:営利利用に関するLR審議中@詳細は自治スレへ
12/04/11 03:47:40.43
>>189
彼には言っても無駄な稀ガス…

191:営利利用に関するLR審議中@詳細は自治スレへ
12/04/11 13:49:19.06
>クラスの生成時に呼び出すメソッドと演算子に直感的な違いも何も無いと思いますが・・・

右辺で使う演算子を左辺に書いてみれば違いが分かるよ
reverse (xs++[x]) = x : reverse xs
実際には xs++[x] というパターンマッチはできない

192:デフォルトの名無しさん
12/04/11 21:29:08.42
ユーザ定義のデータコンストラクタは頭大文字で始まるから
そんな混乱せんだろ
むしろコンストラクタを関数としても使えるのは便利だ
まあリストやタプルのコンストラクタは記号だが、それくらい覚えとけ

193:デフォルトの名無しさん
12/04/11 23:24:51.38
関数型言語ってようするに、
関数がクラスになる。

言ってみればJavaScriptからprototypeがなくなったようなもの。
prototypeがなくなっても効率が悪くなるだけで
オブジェクト指向できるでしょ?

それが関数型言語。

194:デフォルトの名無しさん
12/04/12 00:08:31.03
オブジェクト指向言語ってようするに、
オブジェクトがクロージャになる。

言ってみれば関数型言語から代数データ型やパターンマッチやカリー化が無くなったようなもの。
代数データ型やパターンマッチやカリー化が無いと効率悪いけど
関数型スタイルでプログラミングできるでしょ?

それがオブジェクト指向言語。

195:デフォルトの名無しさん
12/04/12 00:14:31.10
> 代数データ型やパターンマッチやカリー化が無いと効率悪いけど
それはないな。


196:デフォルトの名無しさん
12/04/12 00:22:10.76
>>194
それはチョット違うだろ。
クロージャーはlexical scope内にある変数をバインドして保持している関数オブジェクトで、あくまで関数オブジェクト。
オブジェクト指向のオブジェクトは、主に構造を持ったデータオブジェクト(単純スカラーでも可)またはクラスscopeにメソッドやインスタンス変数を
従属させモジュラレティーを確保する事に加え、インヘリタンス/mixin/treitなどで共有または階層関係を持たせ、データドリブンなインターフェースを提供する。
似たところもあるけれど、分けて考えるべきかと。

197:デフォルトの名無しさん
12/04/12 00:29:40.32
>>196
いや、マジレスされると困るわw

つーか、そこ突っ込むなら>>193の方が違いすぎるだろ
> 関数がクラスになる

198:デフォルトの名無しさん
12/04/12 00:39:23.32
>>197
じゃあ、関数の戻り値がオブジェクト(インスタンス)になる。でいいか?

オブジェクトを作り出すもの = クラス
戻り値を作り出すもの = 関数

言ってることは同じだけどなw

199:デフォルトの名無しさん
12/04/12 00:48:53.41
>>198
カリー化されてんだから関数の戻り値も関数だろ
クラスとインスタンスのような関係はねーよ

それともあれか?関数もオブジェクトだから
関数型言語はオブジェクト指向ってやつか?くだらねえ

200:デフォルトの名無しさん
12/04/12 00:56:44.16
気持ち悪いアナロジーで無理矢理OOに対応付けて
理解しようとしなくても
ドカタの人生で関数型言語を使う機会なんて来ないから
安心しろよ
お前にとって運悪く関数型言語が普及してしまったとしても
その頃にはお前の仕事は無くなってるよ

201:デフォルトの名無しさん
12/04/12 00:57:45.87
>>197
>>193も突っ込もうと思ってたw
JSがらprototype削ったらinfix notationなlispみたいなのになっちゃうから。

202:デフォルトの名無しさん
12/04/12 01:01:03.49
ドカタ以下のトイプログラマー

203:デフォルトの名無しさん
12/04/12 01:05:35.12
オレ>>169>>201だけれど、

関数をOOのオブジェクトとみなすところにはそれ程違和感無かった。
言語によっては、関数オブジェクトにもメタ情報設定してOOのオブジェクトみたいにmethodを従属させたり、他のmethodをmixinさせることもできるものがあるから。
ただしhaskellではないが。

204:デフォルトの名無しさん
12/04/12 01:12:21.32
関数型が自己満足以上のメリットがあると感じたこと無い

205:デフォルトの名無しさん
12/04/12 01:15:35.37
>>203
うそつけ。>>169はオレの書き込みだ。

206:デフォルトの名無しさん
12/04/12 01:17:46.33
>>203
あ、でもやっぱ違うか、勘違い。
クラスは静的な物(ともかぎらないclassすらもオブジェクトという概念の言語もあるけれどちょっとおいて置いて)
オブジェクトの生成はコンストラクタってのが昨今普及している概念だから。

207:デフォルトの名無しさん
12/04/12 01:18:40.06
>>205
こめ、あんか間違えた。えーとどれがオレのレスだったっけw

208:デフォルトの名無しさん
12/04/12 01:19:35.18
ぶっちゃけいうと

関数型は今仕事がない。
将来はあると信じてる。

オブジェクト指向は今仕事がある
将来はなくなって欲しいと、関数型厨は思ってる。
>>200とかそうだなw

209:デフォルトの名無しさん
12/04/12 01:49:53.91
スパコン向けのプログラム書いてる人とかなら関数型を使う機会があるかもだが、
求められるのはプログラミング技術じゃなくて、対象問題の専門知識だわな。
あとは、大学教授が自分の論文に必要な計算をキャンパスのコンピュータを使って並列計算しました的な。

関数型は並列化が容易だから、実行速度が求められる分野に適していそうだが、
手続き型で並列化したほうがもっと速くなるから、結局なんだかなーな。

クラスタを電卓代わりに使う人用かと。

210:デフォルトの名無しさん
12/04/12 02:03:13.63
>>209
本気で並列化に取り組むとその考えかたは変わるよ。
関数型の並列化はタスク?データ?どっちのparallelだと思う。
スパコンは徹底的に性能重視だし。
まいいや2chでマジレスカコワルイオレw

211:デフォルトの名無しさん
12/04/12 02:20:44.68
>>210
関数型で出来ることが手続き型で出来ないってことはないんで。
FPGAとかは別としても、主流のノイマン型は手続き型がネイティブなんで。

212:デフォルトの名無しさん
12/04/12 02:45:31.08
>>211
できるできないまで話を広げればパラダイムなぞ何でもいいんだよ。
性能を徹底的に追及するにはCPUの命令レベル並列化SIMD並列化core間メモリ共有離散並列化ネットワーク分散並列化
徹底的に実効効率(≒GFLOPS)と性能を追求する。
一方の関数型で一部取りざたされる並列化は、並列化のしやすさ=参照透過による並列依存解析の簡便さなどで
まだ止まっている段階であり性能の追求に関してはマッタク解になっていないンジャマイカ?
だからデータパラレルorタスクパラレルか上で訊いてみた。その答えでどのくらい深く考えている椰子かわかるから。
簡便さは無視できず大切なことかもしれないが、それで数値解析がいままでより早くなっていないのであればつかわれなくてもしょうがない。。
安易に並列化に研究成果を求めて逃げるのは愚。

で、FPGAって何の話だ?と小一時間w
もしかしてハード・ソフト両面でずぶの素人さんをオレは相手にしてしまった?
上のクロージャーもしかりだけれど2chでマジレスあまりしたくない。

213:デフォルトの名無しさん
12/04/12 03:06:38.71
あーわかったわかった。
関数型が並列化に向いてるって書き込みに噛み付いてたのか。そりゃ食い違うわ。
でも、参照透過性って並列化以外に上手い生かし方が無いと思うんだが。
遅延評価も言語レベルでサポートが欲しいかと言われると、別にねぇ。

214:デフォルトの名無しさん
12/04/12 03:13:37.82
>>213
参照透過性はプログラムコードの理解しやすさ、バグの入りにくさなどに少なからず貢献あるんじゃマイカ

215:デフォルトの名無しさん
12/04/12 03:20:08.01
でも、副作用のないプログラムが読みやすいのは、手続き型でも同じことだしなぁ。
言語レベルでサポートしていることの意味は、自動化、
つまりは自動遅延評価や自動並列化になるとおもうんよ。

216:デフォルトの名無しさん
12/04/12 03:27:10.53
>>215
副作用を禁止しちゃっても十分ソフトウェアは記述できるという数学的な原理に基づき
そのための仕組みを言語レベルの機能でちゃんとサポートし副作用を低減しようとする意義はあるのでは?

217:デフォルトの名無しさん
12/04/12 03:42:11.67
そんな蓮舫さんみたいなこと言われても。

218:デフォルトの名無しさん
12/04/12 06:22:33.36
副作用のある部分をコードの一部に隔離したとき、
それが他に漏れてないことを静的型検査できるのがメリット

静的型検査なんて要らないし、副作用の有無なんて
コメントにでも書いとけば分かるだろ
というプログラマにはメリット無い(批判する意図はないので注意)

219:デフォルトの名無しさん
12/04/12 06:34:07.76
ただし、>>218は特定の言語(HaskellとかD)のメリットであって
関数型言語のメリットでは無い

220:デフォルトの名無しさん
12/04/12 06:44:16.58
普及してるかどうかで使う言語を決めてる人って
TIOBEとか見て一喜一憂してるの?

URLリンク(www.tiobe.com)

JavaプログラマならJavaの人気が長期的に下がり続けてる
(ついに今月は2位に陥落)の見てショック受けてるの?

幾らでも他と交換可能な木っ端プログラマは大変だね

221:デフォルトの名無しさん
12/04/12 09:49:24.36
中身無いなぁ。
普及率は人気の度合い。なぜ人気があるのか考える必要がある。
誰かさんの思い込みより価値ある。

222:デフォルトの名無しさん
12/04/12 09:50:24.09
>>216
仮にIOを禁止しても、IOと殆ど同じモナドを簡単に作れる
だから禁止していいんだという解釈もあるが、禁止しても無意味だという解釈もある
Haskellが、いずれかの解釈を一方的にサポートすることはない
あくまで中立

223:デフォルトの名無しさん
12/04/12 09:55:43.85
モナドって副作用の定義を限定的にして副作用なくしたと主張してるだけで
ソフトウェア工学上で問題になる事項をすべて解消しているわけではいないと思うんだけど
どう思う?

224:デフォルトの名無しさん
12/04/12 11:16:27.37
問題を定義した本人には、自己解決しましたと主張する権利があると思う

225:デフォルトの名無しさん
12/04/12 16:43:59.37
>>221
全くもってその通り!!
中国語だって世界中で大人気だからな!!

226:デフォルトの名無しさん
12/04/12 16:51:24.45
>>223
現実のコンピュータが副作用必須の設計で、モナドは副作用解決に使えるというだけ。
モナドが副作用解決のために作られた訳じゃない。

227:デフォルトの名無しさん
12/04/12 17:45:50.95
モナドは何のために作られたの?

228:デフォルトの名無しさん
12/04/12 18:33:25.41
人工知能だけに限らず人間の知能にも起こり得るフレーム問題は、ジョン・マッカーシー
らの提案したフレーム問題と区別して一般化フレーム問題と呼ばれている。
ソースはwikipedia

>>223
限定的なフレームを選択しないと、フレーム問題に対処できない

229:デフォルトの名無しさん
12/04/12 19:54:30.42
関数型は問題資源を乱獲してあっという間に死滅させる蛮族の手法

対して従来のやり方は問題を死滅させず適宜再生産もする
農耕・牧畜をおぼえた文明人の手法

230:デフォルトの名無しさん
12/04/12 20:03:40.16
は?

単に生産性が低いものを賞賛してるだけのバカですねw

231:デフォルトの名無しさん
12/04/12 20:11:16.33
OOを使ったプロジェクトは次の二つに分類される

・プロジェクトが成功した場合 => 成功したのはOOのおかげ
・プロジェクトが失敗した場合 => 設計者やプログラマがOOに未熟だった

以上の詭弁により、OOはソフトウェア工学の全ての問題を解決した

232:デフォルトの名無しさん
12/04/12 20:12:09.57
え、関数型って生産性あったんですか。

233:デフォルトの名無しさん
12/04/12 20:15:51.90
どんな被害妄想だよ。成功も失敗も設計者の腕次第だろ。

234:デフォルトの名無しさん
12/04/12 20:41:17.18
解決はするけど生産はしない

235:デフォルトの名無しさん
12/04/12 22:36:25.45
>>232
生産性については職業プログラマの人に比較して貰うとして、少なくとも、rubyで入門書のサンプル以上のものが作れなかった自分が、haskellでは>>41,>>74のコードを書ける様になった

初心者には、rubyよりhaskellの方が自力でコード書ける様になり易いんじゃ無いかと思う



236:デフォルトの名無しさん
12/04/12 23:36:58.60
せめて一ファイル千行ぐらいのものを
数十ファイルからなるアプリを作ってから
書けるようになったといって下さい。

短い関数一つと程度、
あんなの誤差でしかない。

237:デフォルトの名無しさん
12/04/12 23:59:11.36
プログラムが書けるようになったといえる最低ラインは数万行のアプリを作れてから・・か。

238:デフォルトの名無しさん
12/04/13 00:07:17.03
URLリンク(gihyo.jp)
EC-CUBE 4万行らしいよ。

239:デフォルトの名無しさん
12/04/13 00:08:42.48
URLリンク(www.mapee.jp)
Rubyは10万行

240:デフォルトの名無しさん
12/04/13 00:12:30.38
URLリンク(picomu-tech.blogspot.jp)
OpenPNE2 13万行

Linuxは1500万行らしい

URLリンク(www.infoq.com)
解析対象のオープンソースプロジェクトは、コード行数が10万~50万のものが
ほとんど(700万行を超えるプロジェクトが2つ)で、
の合計コード行数は3,744万6,469行、平均コード行数は83万2,000行になった。

241:デフォルトの名無しさん
12/04/13 00:21:31.21
OpenDylanは処理系が80万でIDEが100万stepだったっけ、失念
gccが少し前は30~40万行あった、いまの4.6,47はもっとだろうな

242:デフォルトの名無しさん
12/04/13 00:23:31.62
>>236
書きたいものを書ける様になったら行数関係無い気がするけど・・・
そもそも、私の場合、Rubyではどう書けばいいかすら思い浮かばない
(学習が足りないと言われればそうだけど、どっちも入門書読みかけ状態での知識でしかない)

Haskellは入門書読みかけの状態でも結構色々書けるから、入門者のモチベーション維持にも良いんじゃないかな
(少なくとも、自分のモチベーション維持には良い効果がある)


243:デフォルトの名無しさん
12/04/13 00:27:01.11
書きたいものを書けるのは
プロである以上最低限のことです。

244:デフォルトの名無しさん
12/04/13 00:27:48.64
>>241
間違えた、The compiler includes an IDE (Win32 only, sorry), CORBA, OLE, all in all 850000 lines of code. This is (nearly) all Dylan code.

245:デフォルトの名無しさん
12/04/13 00:33:06.76
>>243
書きたくない物でも金を受けとる以上書き上げるのが…(ry

246:デフォルトの名無しさん
12/04/13 00:36:02.31
>>245
あんたプロや。プログラマー(ry)や。

247:デフォルトの名無しさん
12/04/13 00:38:56.24
>>243
プロじゃないと言うか、プロの卵として就職して半年で諦めたんですが・・・
そんな奴が、Haskellでなら、ちょっとは書ける様になったですよ

それで気付いたのは、やってる事はどの言語も同じなのかもなぁー・・・と
で、関数型言語はそのやってる事は同じ。の部分を気付きやすい言語だな・・・・と

他の言語で何やってるのか分かんなくて挫折した人は、一度、関数型言語に挑戦してみてほしいかも


248:デフォルトの名無しさん
12/04/13 00:46:28.21
>>247
うん。やる気マンマンです。

249:デフォルトの名無しさん
12/04/13 01:27:06.58
>>248
一緒に頑張りまっしい

多分、私はそもそものググルための用語を知らないのが、そもそもの才能の無さな気がする
なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい
(不器用なのは自覚してる)


250:デフォルトの名無しさん
12/04/13 01:30:15.85
そういうセリフは関数型言語を作ってから言って下さい。

作らずに言語を使ってるだけのくせに

251:デフォルトの名無しさん
12/04/13 01:41:31.45
>>249
> なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい

初心者なら当然のことだよ。

俺なんかだと、見ただけで簡単な処理と分かるようなもの、
自分で作れると分かっているものは、作っても時間
を浪費するだけで何の経験値にならないし、自慢にもならない。

でも初心者にとっては、そんなものでも
挑戦する価値がある課題なのだから。
自分で作ったんだって自慢げになるでしょ?

252:デフォルトの名無しさん
12/04/13 06:51:30.77
何万行とかで脅されても気にする事無いよ
ドカタ仕事で書くコードなんてAPI呼び出すだけ、コピペコード満載の
頭悪いコードなんだから

疑うなら適当なコード書く御題出してみ?Javaのコードとか出てこないから

253:252
12/04/13 06:57:36.95
多分、「そんなの意味ない」「もっと規模が大きくないと本当の事は分からない」
とかその手の言い訳を、御題のコードの10倍くらいの長さの文章で
必死に語ってくれるよ
本当は2chのレスに収まる規模のコードも書けないんだけどね

254:デフォルトの名無しさん
12/04/13 07:16:26.24
>>252
じゃあお題。

プログラマーなら「FizzBuzz問題」解けるよな?
スレリンク(prog板:401番)

401 :仕様書無しさん:2012/04/09(月) 23:59:48.08
FizzBuzzクイズ

1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"

となるようなメソッドfizz、buzzは定義可能か?
可能である場合、同様にgizzを追加定義し、
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか?

メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。
オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。

255:デフォルトの名無しさん
12/04/13 07:48:45.37
>>252
ありがとうです
では、仕事があるので明日私は書くと思いますが(飲んで帰るので、今日は無理)

ファイルと検索したい文字列をコマンドから入れて、見つかった行と列のリストを表示すると言うのはどうでしょう?


256:デフォルトの名無しさん
12/04/13 08:18:23.98
全くなんの工夫もないが

$ cat fizzbuzz.hs
import Control.Monad (mapM_)

main = mapM_ (runFizzBuzz . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105]

runFizzBuzz (n, s)
 | s == "" = putStrLn $ show n
 | otherwise = putStrLn $ show s

fizz n
 | n `mod` 3 == 0 = (n, "Fizz")
 | otherwise = (n, "")

buzz (n, s)
 | n `mod` 5 == 0 = (n, showString s "Buzz")
 | otherwise = (n, s)

gizz (n, s)
 | n `mod` 7 == 0 = (n, showString s "Gizz")
 | otherwise = (n, s)

$ runghc fizzbuzz.hs
1
"Fizz"
"Buzz"
"Gizz"
"FizzBuzz"
"FizzGizz"
"BuzzGizz"
"FizzBuzzGizz"

257:デフォルトの名無しさん
12/04/13 08:45:35.77
この場合の顧客がのぞむもの。

map (gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105]
-- [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"]

map (buzz . gizz . fizz) [1, 3, 5, 7, 15, 21, 35, 105]
-- [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "GizzBuzz", "FizzGizzBuzz"]

258:デフォルトの名無しさん
12/04/13 08:54:17.09
整数と文字列が同じリストにフラットに入らなきゃ嫌だという主張?

259:デフォルトの名無しさん
12/04/13 09:05:31.58
struct filter_t{ int e; const char *t; };
struct fizzbuzz_t
{
  int in;  std::string out;
  fizzbuzz_t &operator >>( filter_t &f )
  { if( 0==in%f.e ){ out.append( f.t ); } return *this; }
operator const char *()
{ if( out.length() ) return out.c_str(); static char tmp[50]; itoa( in, tmp, 10 ); return tmp; }
};
fizzbuzz_t operator >>( int i, filter_t &f ){ fizzbuzz_t fb; fb.in = i; fb>>f; return fb; }
filter_t fizz = { 3, "Fizz", };
filter_t buzz = { 5, "Buzz", };
filter_t gizz = { 7, "Gizz", };

int main(){ 105>>fizz>buzz>>gizz>>endfb; return 0; }

260:デフォルトの名無しさん
12/04/13 09:05:55.65
fizz buzz gizz (とその合成)で完結する。
合成順が結果に反映される。
結果は標準出力ではなく関数の戻り値として欲しい。
というのが要件だろう。
関数縛りがなければマクロですぐなんだが。

261:デフォルトの名無しさん
12/04/13 09:09:14.47
ごめんごめん途中で送信してしまった。
読まなくても良いくらいC++でのスタンダードな回答。

struct filter_t{ int e; const char *t; };
struct fizzbuzz_t
{
  int in;  std::string out;
  fizzbuzz_t &operator >>( filter_t &f )
    { if( 0==in%f.e ){ out.append( f.t ); } return *this; }
  operator const char *()
    {  if( out.length() ) return out.c_str();
      static char tmp[50]; itoa( in, tmp, 10 ); return tmp; }
};
fizzbuzz_t operator >>( int i, filter_t &f ){ fizzbuzz_t fb; fb.in = i; fb>>f; return fb; }
filter_t fizz = { 3, "Fizz", };
filter_t buzz = { 5, "Buzz", };
filter_t gizz = { 7, "Gizz", };

int main(){ 105>>fizz>buzz>>gizz; return 0; }

262:デフォルトの名無しさん
12/04/13 09:19:13.99
スタンダードっていうより姑息だな。(←褒め言葉)
とはいえ、関係ない演算子をしれっとまぎれこませちゃったら失格じゃまいか?

263:デフォルトの名無しさん
12/04/13 09:30:20.96
>>260
マクロを使わなくても、型クラスと多値とモナドが賢い言語なら関数でも書けるんじゃね?

264:デフォルトの名無しさん
12/04/13 09:49:06.63
>>257 map でそれをやれ、というのは無理。

それに hoge を追加することを想定して、
map (hoge . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] について考える。

関数合成と map の性質より、
map (f . g) [...] = map f (map g [...]) であるから

map (hoge . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105]
 = map hoge (map (gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105])
= map hoge [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"]

よって hoge が書けない。===== 終 ===== 了 =====

-- という風に論破されちゃうのが嫌な自称上流には嫌われるだろうなぁ、
-- Haskell や形式手法はw

265:デフォルトの名無しさん
12/04/13 10:04:19.47
メソッドの追加は副作用よりも難しい
代入しても型は不変だがメソッドを追加したら型が変わる

266:デフォルトの名無しさん
12/04/13 10:10:13.95
マクロも型クラスも多値もモナドも無いけどSqueak Smalltalkで。

Trait named: #FizzBuzz uses: #() category: 'FizzBuzz-Trait'

FizzBuzz >> fizzBuzzPrep
   self value isString ifFalse: [thisContext sender receiver: self -> ''].

FizzBuzz >> fizzBuzzReturn
   | method nextByte type |
   method := thisContext sender sender method.
   nextByte := thisContext sender sender method at: thisContext sender sender pc.
   type := nextByte // 16.
   ^(type = 13 and: [FizzBuzz selectors includes: (method literalAt: nextByte \\ 16 + 1)])
      ifTrue: [self] ifFalse: [self value ifEmpty: [self key]]

FizzBuzz >> fizz
   self fizzBuzzPrep.
   (self key isDivisibleBy: 3) ifTrue: [self value: self value, 'Fizz'].
   ^self fizzBuzzReturn
FizzBuzz >> buzz
   self fizzBuzzPrep.
   (self key isDivisibleBy: 5) ifTrue: [self value: self value, 'Buzz'].
   ^self fizzBuzzReturn
FizzBuzz >> gizz
   self fizzBuzzPrep.
   (self key isDivisibleBy: 7) ifTrue: [self value: self value, 'Gizz'].
   ^self fizzBuzzReturn

Integer uses: FizzBuzz. Association uses: FizzBuzz.
105 fizz gizz buzz. "=> 'FizzGizzBuzz' "

267:デフォルトの名無しさん
12/04/13 10:18:03.23
>>256 は runFizzBuzz に渡す前までは文字列の蓄積で通してるから、
putStrLn を削るだけでリストになるんじゃね?

268:デフォルトの名無しさん
12/04/13 10:45:33.86
継続使える言語なら書けるんじゃね?

269:デフォルトの名無しさん
12/04/13 11:19:14.13
Scheme使いの登場を待ってるわけ?
てか継続をどう使うことを想定してるの?

270:デフォルトの名無しさん
12/04/13 12:38:39.46
join fs n = case concatMap (\f -> f n) fs of
                        "" -> Left n
                        s -> Right s

fizzT f s n | f n == 0 = s
fizzT _ _ _ | otherwise = ""

fizz = fizzT (`mod` 3) "Fizz"
buzz = fizzT (`mod` 5) "Buzz"
gizz = fizzT (`mod` 7) "Gizz"

main = print $ join [fizz, buzz, gizz] 105

271:デフォルトの名無しさん
12/04/13 12:50:09.96
こっちのほうが join を入れ子に出来て良いかも


import Data.Either

join fs n = case concat $ rights $ map (\f -> f n) fs of
                 "" -> Left n
                 s -> Right s

fizzT f s n | f n == 0 = Right s
fizzT _ _ _ | otherwise = Right ""

fizz = fizzT (`mod` 3) "Fizz"
buzz = fizzT (`mod` 5) "Buzz"
gizz = fizzT (`mod` 7) "Gizz"

main = print $ join [join [fizz, buzz], gizz] 105

272:デフォルトの名無しさん
12/04/13 13:14:50.14
join とか無しで gizz buzz fizz 105 で "FizzBuzzGizz" をさくっと返す方法はないの?

273:デフォルトの名無しさん
12/04/13 13:43:15.17
ここまでruby/python無し
LLに有利っぽいのに


274:デフォルトの名無しさん
12/04/13 13:43:49.58
gizz buzz fizz 105 という式が、ちゃんと型を持っているとする。
また、fizz 105、buzz fizz 105 という式も、同様になんらかの型を持つとする。

すると、

fizz の型は
Int -> a

buzz の型は
(Int -> a) -> Int -> b

gizz の型は
((Int -> a) -> Int -> b) -> (Int -> a) -> Int -> c

というような型でなければならない。無理。というか、どう頑張っても、
先頭に do か何かが要る。

275:デフォルトの名無しさん
12/04/13 13:56:46.55
型システムに制約を受けないパワフルな関数型言語ってのはないもんかね。

276:デフォルトの名無しさん
12/04/13 14:00:17.79
Perlしか読めないから誰かPerlで書いて

277:デフォルトの名無しさん
12/04/13 14:04:41.69
>>275 Erlang ?

278:デフォルトの名無しさん
12/04/13 14:24:54.40
>>273 つーか元出題者が Ruby だとオープンクラスやらなんやら使ってできるぜ、
って言いたいだけで作った問題なのがかなり見え見えなんだが。

279:デフォルトの名無しさん
12/04/13 15:57:16.91
書き込み行数がオーバーするんで適当に圧縮した

module FizzBuzz
SYM_HASH = {} ; def self.add_fizz sym, n ; SYM_HASH[sym] = n ; end
def self.do_it sym, n, prefix ; if m = SYM_HASH[sym]
if n % m == 0
s = sym.to_s ; s.capitalize!
if prefix.kind_of? String then s[0, 0] = prefix end
s.fizzbuzzval = n ; s
else prefix end else nil end
end
end

class Integer ; def method_missing sym
if it = FizzBuzz.do_it(sym, self, self) then it else super end
end end
class String ; attr_writer :fizzbuzzval ; def method_missing sym
if it = FizzBuzz.do_it(sym, @fizzbuzzval, self) then it else super end
end end

FizzBuzz.add_fizz :fizz, 3
FizzBuzz.add_fizz :buzz, 5
FizzBuzz.add_fizz :gizz, 7

p [1, 3, 5, 7, 15, 21, 35, 105].map{|n|n.fizz.buzz.gizz}

280:デフォルトの名無しさん
12/04/13 16:17:23.17
>>276 突貫工事だけれど…

package FizzBuzzGizz;
sub new {
  my ($c, $n) = @_;
  bless {n => $n, s => ''}, $c
}
sub fizz {my $t = shift; $t->{s} .= 'Fizz' if 0 == $t->{n} % 3; $t}
sub buzz {my $t = shift; $t->{s} .= 'Buzz' if 0 == $t->{n} % 5; $t}
sub gizz {my $t = shift; $t->{s} .= 'Gizz' if 0 == $t->{n} % 7; $t}
sub result {my $t = shift; $t->{s} ? $t->{s} : $t->{n}}
1;

package main;

do {
  my $fbg = new FizzBuzzGizz($_);
  print "$_:" . FizzBuzzGizz::result($fbg->fizz->buzz->gizz) . "\n"
  # あるいは print "$_:" . $fbg->fizz->buzz->gizz->result . "\n"
  } for qw{1 3 5 7 15 21 35 105};

$ perl p_fizzBuzzGizz.pl
1:1
3:Fizz
5:Buzz
7:Gizz
15:FizzBuzz
21:FizzGizz
35:BuzzGizz
105:FizzBuzzGizz

281:デフォルトの名無しさん
12/04/13 16:22:11.22
>>280
objectのmethodが返す値はまたobjectだけれど、
printで評価すると判定結果文字列を返すには、
こんな書き方くらいしかないのかな…?
多値のリスト返しでやってみようと思ったけれどうまい方法が思いつかなかったぜよ

282:デフォルトの名無しさん
12/04/13 17:12:42.66
>>281
package FizzBuzzGizz;
sub new {
  my ($c, $n) = @_;
  bless \"$n."
}
sub fizz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 3 ? \"${_}Fizz": $t }}
sub buzz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 5 ? \"${_}Buzz": $t }}
sub gizz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 7 ? \"${_}Gizz": $t }}
1;

package main;

do {
  my $fbg = new FizzBuzzGizz($_);
  print ${$fbg->fizz->buzz->gizz} . "\n"
} for qw{1 3 5 7 15 21 35 105};

283:デフォルトの名無しさん
12/04/13 17:29:05.85
>>272
何縛りのゲームなのかわからんけど、関数合成演算子でも駄目かね?


import Data.Either
import Prelude hiding ((.))

(.) f g n = case concat $ rights [f n, g n] of
                 [] -> Left n
                 s -> Right s

fizzT f s n | f n == 0 = Right s
fizzT _ _ _ | otherwise = Right []

fizz = fizzT (`mod` 3) "Fizz"
buzz = fizzT (`mod` 5) "Buzz"
gizz = fizzT (`mod` 7) "Gizz"

main = print $ fizz.buzz.gizz $ 105

284:デフォルトの名無しさん
12/04/13 17:30:10.61
>>282
package FizzBuzzGizz;
sub new {
  my ($c, $n) = @_;
  bless \"$n."
}
sub comm { my ($t, $r, $s) = @_; $$t =~ /(^\d+)/;
                0 == $1 % $r ? \"${_}$s": $t }
sub fizz {bless comm((shift), 3, 'Fizz')}
sub buzz {bless comm((shift), 5, 'Buzz')}
sub gizz {bless comm((shift), 7, 'Gizz')}
1;

package main;
for (qw(1 3 5 7 15 21 35 105)) {
  print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n"
}

285:デフォルトの名無しさん
12/04/13 17:31:15.65
Ruby のカオスな部分を前面に押し出して書いてみた

class String
  attr_accessor :srcint
private
  def f(n,s); (@srcint % n == 0) ? (self << s) : (self); end
end
class Integer
private
  def f(n,s); (self % n == 0) ? (s.srcint = self; s) : (self); end
end
class Object
  def fizz; f(3,'Fizz'); end
  def buzz; f(5,'Buzz'); end
  def gizz; f(7,'Gizz'); end
end
p [1,3,5,7,15,21,35,105].map{|n| n.fizz.buzz.gizz }
# => [1, "Fizz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"]
p [1,3,5,7,15,21,35,105].map{|n| n.fizz.gizz.buzz }
# => [1, "Fizz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "GizzBuzz", "FizzGizzBuzz"]

286:デフォルトの名無しさん
12/04/13 17:33:52.32
>>284 ${_}$s←バグ
package FizzBuzzGizz;
sub new {
  my ($c, $n) = @_;
  bless \"$n."
}
sub comm { my ($t, $r, $s) = @_;
                0 == $$t % $r ? \"$${t}$s": $t }
sub fizz {bless comm((shift), 3, 'Fizz')}
sub buzz {bless comm((shift), 5, 'Buzz')}
sub gizz {bless comm((shift), 7, 'Gizz')}
1;

package main;
for (qw(1 3 5 7 15 21 35 105)) {
  print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n"
}

287:デフォルトの名無しさん
12/04/13 17:45:43.30
>>286 オッチャン、どうせ書くならこうやろ
package FizzBuzzGizz;
sub new { my ($c, $n) = @_;
              bless \"$n." }
sub com { my ($t, $m, $s) = @_;
              bless 0 == $$t % $m ? \($$t.$s): $t }
sub fizz {com(shift, 3, 'Fizz')}
sub buzz {com(shift, 5, 'Buzz')}
sub gizz {com(shift, 7, 'Gizz')}
1;

package main;
for (qw(1 3 5 7 15 21 35 105)) {
  print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n"
}

大差ないか…

288:デフォルトの名無しさん
12/04/13 17:54:12.60
new FizzBuzzGizz($_) している時点でダメだろ。

289:デフォルトの名無しさん
12/04/13 17:58:22.56
>>288
え?なぜ?

290:デフォルトの名無しさん
12/04/13 18:10:15.39
関係ないオブジェクトにもfizz buzz gizzが継承されてしまう気持ち悪さを除けば、
ちゃんと書けているのは今のところRubyだけって感じか。
文字列オブジェクトにインスタンス変数(状態)を持たせられるのが強みだなぁ。
Smalltalkのはやってることが「独立した関数(メソッド)」と呼ぶにはどーよという内容だから失格。
関数型は型システムの制約でこういう仕様の関数モドキは書けないっていうことでFA?

291:デフォルトの名無しさん
12/04/13 18:22:32.06
>>290
でも実際のところ、こんな書き方したくないけどね
実際にやるなら、何らかのコンテナにラップしてからmapして
それが終わったら、文字列や数値として取り出すと思う
原文がいきなり数値に対してメソッド呼んでるから、容赦なく組み込みクラスを弄ったが…

292:デフォルトの名無しさん
12/04/13 18:30:51.94
JSならやれそうじゃね?

293:デフォルトの名無しさん
12/04/13 18:33:45.54
>>291
まあクイズだからね。言語機能をどう使って無茶な要件をクリアするかのパズルみたいなもん。

294:デフォルトの名無しさん
12/04/13 18:35:01.97
>>292
まずコード出せ。話はそれからだ。

295:デフォルトの名無しさん
12/04/13 18:57:18.70
数値がobjectとしてmethodを持たない言語ではどうするかってお題だったのかよ…

296:デフォルトの名無しさん
12/04/13 19:00:25.49
>>290 自分の足を自分で撃ちたいなら、それに向いた言語ある、という話、でFA

297:デフォルトの名無しさん
12/04/13 19:35:12.73
>>290
RubyはメソッドチェインOKなのに
関数型言語はfizz(buzz(gizz))しか認めないんだろ?
そりゃ静的型じゃ無理っつーか制限する意味が分からん
後からgizz等を追加できる拡張性あるコードを
書けないならともかく、そうでもないしな

298:デフォルトの名無しさん
12/04/13 19:40:42.95
>文字列オブジェクトにインスタンス変数(状態)を持たせられるのが強みだなぁ。

-- String "has-a" Integer
data HasA = HasA String Integer
instance Show HasA where show (HasA s n) = if s == "" then show n else show s
fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") n
buzz (HasA s n) = HasA (s ++ if mod n 5 == 0 then "Buzz" else "") n
gizz (HasA s n) = HasA (s ++ if mod n 7 == 0 then "Gizz" else "") n
main = print $ map (gizz . buzz . fizz . HasA "") [1,3,5,7,15,21,35,105]

299:デフォルトの名無しさん
12/04/13 19:47:44.31
>>298
似たようなコード書いてたら先に張られてた
個人的には hasA = HasA "" を定義しておくのが好み

それはともかく、.演算子使ってるからケチ付けられると思うぜ多分w

300:デフォルトの名無しさん
12/04/13 19:56:22.62
>>294 おまえはどれかのコード書いたの?

301:デフォルトの名無しさん
12/04/13 20:00:44.98
ここまでJava無し

302:デフォルトの名無しさん
12/04/13 20:30:30.61
JavaScriptできた。俺の使ってるブラウザ以外で動くかどうかはわからん。

var def_fizz = function (name, m) {
var fun = function () {
var tp = typeof this.valueOf();
var n = (tp === 'number') ? this : this.fizzbuzzval
if (n % m === 0) {
var s = name.charAt(0).toUpperCase() + name.slice(1);
if (tp === 'string') {
s = this + s;
}
s = new String(s);
s.fizzbuzzval = n;
return s;
} else {
return this;
}
} ;
Number.prototype[name] = fun;
String.prototype[name] = fun;
} ;
def_fizz('fizz', 3);
def_fizz('buzz', 5);
for (var i = 1; i <= 30; ++i) {
document.writeln(i.fizz().buzz());
}

303:デフォルトの名無しさん
12/04/13 20:36:17.98
>>301
スレリンク(tech板:190番)

‥‥ごめんなさい。

304:デフォルトの名無しさん
12/04/13 22:09:50.27
あるいはこうかな?
スレリンク(tech板:191番)

305:デフォルトの名無しさん
12/04/13 22:25:54.85
newはダメらしい…>>288

306: ◆QZaw55cn4c
12/04/13 22:40:22.27
>>305
ΟΓΖ

基本データ型のリテラル単独でクラスのインスタンスになり得ない言語である以上、new しないことにははじまらない‥‥。

307:デフォルトの名無しさん
12/04/13 22:42:51.66
>>306
newを隠蔽すればいいだけ

308:デフォルトの名無しさん
12/04/13 23:24:10.63
いやいや。基本データ型がオブジェクトでなかったり
組み込みクラスにメソッドを追加できない言語では
普通に関数で実装すればいいと思うよ。gizz( buzz( fizz( n ) ) )みたいに。

309:デフォルトの名無しさん
12/04/14 00:02:15.95
>>308
それが一番シンプルだと思う。
速度も早いだろうしね。

310:デフォルトの名無しさん
12/04/14 00:25:40.80
>>309
それがね、gizz() buzz() fizz()の三関数をどれも特別扱いせず、
いずれの戻り値もいずれの引数となり得る柔軟さを備える仕様にし、かつ
print gizz( buzz( fizz( n ) ) )で
1
"Fizz"
"Buzz"
"Gizz"
"FizzBuzz"
"FizzGizz"
"BuzzGizz"
"FizzBuzzGizz"
という出力を得るのは、以外とマンドくさいのよ。
gizz()だけは文字列を返すなどそれぞれの関数のIFを個別に制約すれば子供の使いなみに楽。
つかこういう要求仕様でnewは使うなとか制限もうけること自体が仕様策定の段階でミスなんだろ。

311:デフォルトの名無しさん
12/04/14 00:32:11.23
その意外と面倒くさいところをどう回避するかがこのクイズの味噌なんだが。(´・ω・`)

312:デフォルトの名無しさん
12/04/14 00:51:08.06
>>299
> .演算子使ってるからケチ付けられると思うぜ多分w

志村! HasA! HasA!

313:デフォルトの名無しさん
12/04/14 01:11:55.03
>>311
そしたら、こうだな。

sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz
    if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

print "$_: " . gizz(buzz(fizz($_))) . "\n"
  for qw(1 3 5 7 15 21 35 105);

実効例:
$ perl p_FizzBuzzGizzAret.pl
1: 1
3: Fizz
5: Buzz
7: Gizz
15: FizzBuzz
21: FizzGizz
35: BuzzGizz
105: FizzBuzzGizz

perlのscalar context/list contextを巧みに?利用してるんで、
それを知らない人には分かりにくいかもしれず、申し訳ないんだか…

※もうちょっと考えて出題して欲しいな、言っちゃ悪いがこういった仕様策定ミスをcodeでカバーすることに何の意味が…

314:デフォルトの名無しさん
12/04/14 01:16:27.94
perlのscalar context/list contextの説明。

関数の引数にフラグを一個追加したもの

つまり、
foo(value, false) ・・・ スカラ呼び出し
foo(value, true) ・・・ リスト呼び出し


foo(value, flag)関数の説明

flagがfalseの場合、スカラタイプの値を返します。
flagがturの場合、リストタイプの値を返します。


まあ、こんなもん。

315:デフォルトの名無しさん
12/04/14 01:24:45.45
>>314
志村、ここ、ここ。

  my ($mod, $zz, $num, $str) = @_;
               ↑

  $str ? ($num, $str) : $num

sub xxx {com(3, 'Fizz', @_)}
              ↑

print "$_: " . gizz(buzz(fizz($_))) . "\n"

print "$_: " , gizz(buzz(fizz($_))) , "\n"
の動作の違い

なんか、中途半端に知っている人が出てきたな…
寝るか…。ノシ


316:デフォルトの名無しさん
12/04/14 01:45:08.21
核の部分はこれだけか
sub com {
 my ($mod, $zz, $num, $str) = @_;
 $str .= $zz if 0 == $num % $mod;
 $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}


317:デフォルトの名無しさん
12/04/14 02:13:05.47
Perlは良く知らないのだが、
print が ($num, $str) の $num を都合よく読み捨ててくれるのは何故?
print fizz(3) の出力は、3Fizz になりそうに思うんだが。よーわからん。

318:デフォルトの名無しさん
12/04/14 02:16:18.43
>>317
そゆ話は質問スレ
スレリンク(tech板)

319:デフォルトの名無しさん
12/04/14 02:40:58.54
>>317
結局 Perl のはこのクイズの要求には到達できてなくて(関数単体では完結できていない)、
出力時の文字列との結合でごまかしているってカラクリ。map とかすればズルが露呈する。

320:デフォルトの名無しさん
12/04/14 02:52:04.92
>>319
ズルはしてないよ。返戻contextの何番目を数値、何番目を文字列とし後続を省略時はundefとなる
利用しているだけでこういうやり方は使うときは使う。
でも、こういうズレたクイズはもういいよ。
関数型言語、オブジェクト指向言語の比較としてこの題材がどういう意味を持っているの?
これ単に>>297とか排除して特定の機能を持った言語を有利に導きたかっただったんじゃない?

321:デフォルトの名無しさん
12/04/14 03:04:43.03
じゃあ、map版です。

use 5.12.0;
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz ;if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map{say "$_: " . gizz(buzz(fizz($_)))} qw(1 3 5 7 15 21 35 105);

322:デフォルトの名無しさん
12/04/14 03:07:01.05
>>321
しくったorz、ifの前の;が余計だった。

use 5.12.0;
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map {say "$_: " . gizz(buzz(fizz($_)))} qw(1 3 5 7 15 21 35 105);

323:デフォルトの名無しさん
12/04/14 03:07:30.38
そっちじゃなくて、print時の文字列連結による$numの読み飛ばしの件についてでしょ。
print "$_: " , gizz(buzz(fizz($_))) , "\n"
だと 3: 3Fizz とかなる。

324:デフォルトの名無しさん
12/04/14 03:14:00.28
>>323
「gizz,buzz,fizzの三関数をscalar contexで評価すると判定文字列が得られ
 list contextで評価すると数値と判定文字列のリストが得られる関数である
 ただし数値が3,5,7の倍数でない場合は返戻リストの第二要素の判定文字列は
 undef(文字列として評価すると空文字列)」
という仕様の関数として書いている。

のだよ。code嫁よ。

325:デフォルトの名無しさん
12/04/14 03:17:44.46
>>297の主張もじっさい意味不明なんだけど。。。
メソッドチェーンっていうのは関数の入れ子の呼び出し gizz(buzz(fizz(n))) と実質同じだろ?
組み込みの関数合成関数の使用を禁じている訳ではないのだから、要求通り関数で完結できてさえいれば
それらを合成しようがぜんぜん問題ないし、型システムのモデルが足を引っ張っている以外、
なにが不利なのかさっぱり分からん。Perl のズル同様で、関数で完結できてないくせに
合成関数のオーバーロードでつじつまを合わせようとするからなんだかなーとなる。

326:デフォルトの名無しさん
12/04/14 03:19:31.46
>>322
"$_: " . ってのを無しでやっみてくんない?

327:デフォルトの名無しさん
12/04/14 03:21:01.17
>>325
ずれてないよ。
値と評価文字列をlistdで返戻する。
scalarで評価するかlistで評価するかで
返戻を両方参照するか、そのうちの判定文字列だけを印字出力などのために使うか
選択しているだけだよ。

328:デフォルトの名無しさん
12/04/14 03:25:52.86
>>326
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map {print gizz(buzz(fizz($_))) . "n"} qw(1 3 5 7 15 21 35 105);

329:デフォルトの名無しさん
12/04/14 03:27:01.29
ニヤニヤ

330:デフォルトの名無しさん
12/04/14 03:27:10.20
Perlは醜いラクダどころか白鳥だったのか
他の言語の立場がないな

331:デフォルトの名無しさん
12/04/14 03:27:54.81
>>328
しくった。

"n" → "\n"

332:デフォルトの名無しさん
12/04/14 03:38:24.58
天然?

333:デフォルトの名無しさん
12/04/14 03:41:23.69
いや、コピペミスw

334:デフォルトの名無しさん
12/04/14 03:43:40.92
多数値の返り値の、主値かそれ以外か、を使う手があるわけか

335:デフォルトの名無しさん
12/04/14 03:43:48.91
>scalarで評価するかlistで評価するか

そんなの認めるんなら、C++だと型キャストのオーバーロードがあるから楽勝じゃねーか。
operator const char*();
operator const int();
こんなんすりゃ良いんだろ?
ちなみに当たり前にオーバーロードがあるから、Fizz(3)とFizz(FizzBuzzObj)との区別もつくし。
C++ですら出来るんなら、この話もう終わりになっちまうじゃねーか。

336:デフォルトの名無しさん
12/04/14 03:45:12.07
しかし、ruby以外はズル、という結論にしたくて必死らしいが、
むしろrubyやJavaScriptがチートだろw

リフレクション使いまくってるしw

337:デフォルトの名無しさん
12/04/14 03:46:02.04
>>335
書け書け。だれもC++をけなしてないぞw
後出しじゃんは、なしね。

338:デフォルトの名無しさん
12/04/14 03:59:30.30
>>337
すでに >>261 に書いた。

339:デフォルトの名無しさん
12/04/14 04:40:06.83
C++の>>261がありなら
Haskellの>>283もありだよな
ていうか、>>325がズルと言ってるの理由がさっぱり分からん
演算子オーバーロードのある言語でそれ使って何が悪いの?

別にmapもできるぜ?
main = print $ map (fizz.buzz.gizz) [1,3,5,7,15,21,35,105]

340:339
12/04/14 05:12:10.70
まあいいや、関数合成のオーバーロードは無しで
>>312の言う通りHasAも隠蔽すれば良いんだな?

data HasA = HasA String Integer deriving Eq

instance Show HasA where
  show (HasA s n) = if s == "" then show n else s

instance Num HasA where
  (+) (HasA r m) (HasA s n) = HasA (r ++ s) (m + n)
  (-) (HasA r m) (HasA s n) = HasA "" (m - n)
  (*) (HasA r m) (HasA s n) = HasA "" (m * n)
  negate (HasA s n) = HasA s (-n)
  abs (HasA s n) = HasA s (abs n)
  fromInteger n = HasA "" n
  signum (HasA s n) = HasA s (signum n)

fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") n
buzz (HasA s n) = HasA (s ++ if mod n 5 == 0 then "Buzz" else "") n
gizz (HasA s n) = HasA (s ++ if mod n 7 == 0 then "Gizz" else "") n

main = print $ map (gizz . buzz . fizz) [1,3,5,7,15,21,35,105]

341:デフォルトの名無しさん
12/04/14 05:12:11.99
F#で演算子オーバーロードなし。

let threadLocal = new System.Threading.ThreadLocal<_>()

let makeFizzBuzz name condition (x : obj) =
    match x with
    | :? int as number ->
        threadLocal.Value <- number
        if condition number then box name else box number
    | :? string as names ->
        box (if condition threadLocal.Value then names + name else names)
    | _ -> failwith "ロジックエラー"

let fizz = makeFizzBuzz "Fizz" (fun x -> x % 3 = 0)
let buzz = makeFizzBuzz "Buzz" (fun x -> x % 5 = 0)
let gizz = makeFizzBuzz "Gizz" (fun x -> x % 7 = 0)

> [1; 3; 5; 7; 15; 21; 35; 105] |> List.map (fun x -> gizz(buzz(fizz x)));;
val it : obj list =
  [1; "Fizz"; "Buzz"; "Gizz"; "FizzBuzz"; "FizzGizz"; "BuzzGizz"; "FizzBuzzGizz"]

342:デフォルトの名無しさん
12/04/14 05:26:59.93
さーて、また関数型言語が不利になるルールが追加されるよー

343:デフォルトの名無しさん
12/04/14 05:45:13.46
次は関数型言語使いがお題を出したらいいんじゃないか
Rubyじゃこんなの書けないだろ的なのを
スレタイの趣旨にも沿ってる

344:デフォルトの名無しさん
12/04/14 05:58:16.50
それ以前に「使える言語機能を恣意的に制限する」アホを
排除しておかないと比較にも議論にもなんねーんだよ

345:デフォルトの名無しさん
12/04/14 05:59:25.03
じゃあ、型的に間違ってるプログラムをコンパイルエラーにしてください、という問題はどうだろうか。

fizzbuzzのscheme多値版ね。マクロ使っちゃっちゃったけど。

(define-syntax fizz (syntax-rules () ((_ arg) (receive it arg (fuzzbuzz it "Fizz" 3)))))
(define-syntax buzz (syntax-rules () ((_ arg) (receive it arg (fuzzbuzz it "Buzz" 5)))))
(define fuzzbuzz
(lambda (arg name m)
(let* ((is-num (null? (cdr arg))) (s (if is-num "" (car arg))) (a (if is-num (car arg) (cadr arg))))
(if (= 0 (mod a m)) (values (string-append s name) a) (if is-num a (values s a))))))
(define main (lambda (_) (letrec ((loop (lambda (n) (if (<= n 30)
(begin (print (buzz (fizz n))) (loop (+ n 1))))))) (loop 1))))

346:デフォルトの名無しさん
12/04/14 06:40:24.02
ループ禁止で再帰だけで書いてください、とかでも良いな
末尾再帰最適化の無い実装じゃスタックオーバーフロー

347:デフォルトの名無しさん
12/04/14 06:51:51.42
>>325
組み込みクラスを弄るのはOK
組み込み演算子を弄るのはNG

何故?

348:デフォルトの名無しさん
12/04/14 10:00:34.73
初学者といっても
1.プログラミングを学ぶことが目的
2.作りたいものがあって、その手段としてプログラミングが必要
で違う。

1なら関数型言語は良い選択
2ならオブジェクト指向言語やLLの方が早い

こういうスレの喧嘩は
1の人の多くは、プログラミングを座学として勉強しただけで実は何も作れない
2の人の多くは、作りたいものが動けばいいというだけでプログラミングに対する向上心がない

という現実を反映しているだけ。

349:デフォルトの名無しさん
12/04/14 10:10:56.56
そしてモマエは
3向上心のカタマリのオレ様にケンカうってんのかーーー
カワネーゾ

350:デフォルトの名無しさん
12/04/14 10:28:07.46
>>343
いまは人工的に作ったお題の信用がなくなってるんだよ
そこでまた中立でない人間がお題を出しても、紙屑のように無視されるんじゃないの

351:デフォルトの名無しさん
12/04/14 10:47:19.60
>>306
QZってこんなスレまで見てるんだな

352:デフォルトの名無しさん
12/04/14 11:03:19.87
>>350
>>290>>325のような上から目線で変なルール押し付けてくるウザいヤツが
居なければ、言語ごとのアプローチの違いが見れて
遊びとしては面白いんだがなぁ
しかもウザいのに限って口だけでプログラム書けないんだ

あ、もしかして>>290>>325がこのスレに書いたコード在る?だったら謝るけど

353:デフォルトの名無しさん
12/04/14 11:31:51.96
すまんけどちょっと確認させてください。これまで出てきた関数型言語の回答で、
関数合成演算子(あるいは関数)を定義が必須な場合でも、関数 fizz だけ用いた
fizz 1 や fizz 3 はちゃんと組み込み型の数値や文字列である 1 や "Fizz" を返せるのでしょうか?
これって一応要件だと思うんですよね。C++ の回答についても同様です。
Ruby や JS 、Smalltalk の回答はすべてこれが出来ているみたいなんだけど。

354:デフォルトの名無しさん
12/04/14 11:49:35.83
C++は型キャストをカスタマイズできるからそれで対応したら良いと思う。
FizzBuzzオブジェクトから文字列型と数値型へのキャストをそれぞれ用意すればよし。

355:デフォルトの名無しさん
12/04/14 12:28:02.63
>>352
今でも十分おもしろいと思うよ。せっそうのない動的言語(OOといえばOOだけど、
ストラウストラップの抽象データ型OOでなくて、ケイの動的OO寄りの考え方)では
可能だけど、理論的にきっちりした関数型言語では実現不可な境界がはっきりしてきてて。
出来ないと分かっていることを出来ないときちんと理由付きで示せる勇気も見れるし。
他方で、動的言語でもすんなりできるとは限らないから各言語での工夫の仕方も興味深い。

356:デフォルトの名無しさん
12/04/14 12:29:01.02
>>353
>>341だけど、関数fizz, buzz, gizzをそれぞれ単独で使用した場合をテスト。
> [fizz; buzz; gizz] |> List.map(fun f -> [1; 3; 5; 7] |> List.map f);;
val it : obj list list =
[[1; "Fizz"; 5; 7]; [1; 3; "Buzz"; 7]; [1; 3; 5; "Gizz"]]

357:デフォルトの名無しさん
12/04/14 13:02:32.74
あ、すいません。F#さんを見落としていました。
F#以外の関数型言語の回答で、ですね!
わざわざの検証、いたみいります。

358:デフォルトの名無しさん
12/04/14 14:04:34.17
スレッドローカルに状態を保持するのはいいアイデアですね。

359:デフォルトの名無しさん
12/04/14 14:10:22.10
いいアイデアですねw

360:デフォルトの名無しさん
12/04/14 14:42:43.34
>>353
>>340だけどテストしてみた

*Main> [map f [1,3,5,7] | f <- [fizz, buzz, gizz]]
[[1,Fizz,5,7],[1,3,Buzz,7],[1,3,5,Gizz]]

361:デフォルトの名無しさん
12/04/14 14:50:32.97
>>353
ついでに>>283もテスト
正しく動かなかったので修正

fizzT f s = (\x -> Left x) . fizzT'
  where
    fizzT' n | f n == 0 = Right s
    fizzT' _ | otherwise = Right []

これで >>360と同じコードが動いた

362:361
12/04/14 15:07:31.88
面白かったのは>>283>>360を試して動かなかったとき
ちゃんとコンパイル時に型エラーになったこと
Haskellの型システムやるじゃん、みたいな

363:デフォルトの名無しさん
12/04/14 15:54:35.13
ねえねえ、1 から 3 までの fizz n の戻り値に対して、文字列なら全大文字化、整数なら 10 倍にして
map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて
問題なく実行できるかどうか試しみててよ! クイズの要件をみたしていればできるよね!
もちろんいうまでもなく追加定義や修正は無しだよ。Ruby や F# のはもちろんできるよ!


364:340
12/04/14 16:01:06.17
>>360
fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") (10 * n)

365:340
12/04/14 16:02:40.14
あ、ごめん>>363だった
それはさておき、後だしでルール追加するの本当に好きだね

366:デフォルトの名無しさん
12/04/14 16:06:40.84
>>363
じゃあ、組み込みクラスをグローバルに汚染するのも禁止しようぜ
classbox等で一部に制限できるならアリ

367:デフォルトの名無しさん
12/04/14 16:07:57.17
というか、ここのHaskellerはどうしてこうも要求仕様を読み取れないくせに
あまつさえ勝手な解釈で適当なコード書いてドヤ顔なの? バカなの? 死ぬの?

368:デフォルトの名無しさん
12/04/14 16:11:06.66
>>367
誰もお前の頭の中なんて知らないし興味ないんだから
言わないと分からないっつーの
ここはお前の要求仕様を満たす場じゃねーし
馬鹿はお前

あと、まさかコードも書かずに議論参加してたとか無いよな
書いたコードのレス示せよ
俺は>>340書いたぞ

369:デフォルトの名無しさん
12/04/14 16:16:29.12
(defmacro defun-fizz-buzz (name divisor)
`(defmacro ,name (form)
`(multiple-value-bind (int str) ,form
(values int
(if (= (mod int ,',divisor) 0)
(concatenate 'string str (string ',',name))
str)))))

(defun-fizz-buzz fizz 3)
(defun-fizz-buzz buzz 5)
(defun-fizz-buzz gizz 7)

370:デフォルトの名無しさん
12/04/14 16:21:51.37
>>367
> ドヤ顔なの?バカなの? 死ぬの?
w
いまどき、こんな台詞をわざわざ書くやつがいるんだww

371:デフォルトの名無しさん
12/04/14 16:23:54.35
勘違いしたふりして頓珍漢なコード出してきて、
言語や自分の発想の限界とかクリティカルなところはなんとか避けようとしているんだよ。
仕様を取り違えてるよってやんわりチェック方法をしめすと、
ルールを増やすな、後出しだ、仕様が欠陥だってなんやかやクレームつけて
相手が根負けして要求仕様のほうが変わるのを粘り強くじっと待つ戦略なんだ。
ある意味、賢いよ。

372:デフォルトの名無しさん
12/04/14 16:26:54.36
お題提出者の解答ってもう出てるの?

373:デフォルトの名無しさん
12/04/14 16:29:32.45
>>363
> map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて

Haskellは静的型付けだから数と文字列を同じリストには入れられないんだ
そんなことも知らずに議論してたんじゃないよね?

374:デフォルトの名無しさん
12/04/14 16:32:03.01
>>371

>>368
> あと、まさかコードも書かずに議論参加してたとか無いよな
> 書いたコードのレス示せよ

って書いてるのに示さないってことは、まさか本当にコード書いてなかったの?

375:デフォルトの名無しさん
12/04/14 16:33:37.46
まさかの口だけ野郎説浮上www

376:デフォルトの名無しさん
12/04/14 16:44:57.11
>>363は問題が頓珍漢だけど(静的型で [1, 2, "Fizz"] はねーよw)
最大限エスパーして書いてみた

>>283はこんな感じ

conv (Left n) = Left $ 10 * n
conv (Right s) = Right $ map toUpper s
main = do
  print $ map conv [Left 1, Left 2, Right "Fizz"]
  print $ map conv $ map fizz [1,2,3]

>>340はこんな感じ

conv (HasA s n) = HasA (map toUpper s) (10 * n)
main = do
  print $ map conv [1, 2, "Fizz" `HasA` 3]
  print $ map conv $ map fizz [1,2,3]

377:デフォルトの名無しさん
12/04/14 17:03:29.49
>> xs = (1..3).map{ |n| n.fizz }
=> [1, 2, "Fizz"]
>> xs.map{ |x| case x when Integer then x*10 when String then x.upcase end }
=> [10, 20, "FIZZ"]
>> ys = [1, 2, "Fizz"]
=> [1, 2, "Fizz"]
>> ys.map{ |x| case x when Integer then x*10 when String then x.upcase end }
=> [10, 20, "FIZZ"]

378:デフォルトの名無しさん
12/04/14 17:45:03.77
◆QZaw55cn4c が出てきて有耶無耶になってるけど
「Javaドカタはコード書けない」説はまだ有効

379:デフォルトの名無しさん
12/04/14 17:57:01.51
◆QZaw55cn4c はドカタではないとでも

380:デフォルトの名無しさん
12/04/14 18:26:18.94
Haskellでコード書くだけで天才になれた気がした15の夜

381:デフォルトの名無しさん
12/04/14 18:49:30.59
敵はハスケラだけと思ってるところがウケるw
どんな言語使いから見ても口だけ野郎は最底辺のゴミだぞwww

382:デフォルトの名無しさん
12/04/14 18:52:07.05
おまえもなw

383:デフォルトの名無しさん
12/04/14 19:54:38.00
コード書けないドカタは「なでしこ」使えば良いんじゃないか?
運が良ければ日本語で書いた戯れ言が
実行されるかもしれないぞ

384:デフォルトの名無しさん
12/04/14 21:39:02.30
>>383
お前は詳しそうだな、その言語。
興味持って使ってみたのか?w

385:デフォルトの名無しさん
12/04/15 10:22:56.77
まだPythonは出てなかったので


class F(object):
    def __init__(self, f):
        self.fs = f if hasattr(f, '__iter__') else [f]
    def __call__(self, x):
        if isinstance(x, int):
            s = ''.join(f(x) for f in self.fs if isinstance(f(x), str))
            return x if s == '' else s
        else:
            return F(self.fs + [x])

fizz = F(lambda x: 'Fizz' if x % 3 == 0 else '')
buzz = F(lambda x: 'Buzz' if x % 5 == 0 else '')
gizz = F(lambda x: 'Gizz' if x % 7 == 0 else '')

print [fizz(buzz)(gizz)(x) for x in [1,3,5,7,15,21,35,105]]

386:デフォルトの名無しさん
12/04/15 10:31:36.36
F#、さすがだな。

387:デフォルトの名無しさん
12/04/15 10:48:20.05
>>385
可能なら、
gizz(buzz(fizz(105))) is "FizzBuzzGizz" となるようなヤツをお願いします。

388:デフォルトの名無しさん
12/04/15 10:55:31.60
>>387
理由を聞いても良い?
Pythonでは>>385のほうがデコレータでも使えて良いんだけど……

@fizz
@buzz
def bizz(x):
    if x % 11 == 0: return 'Bizz'
    else: ''

389:デフォルトの名無しさん
12/04/15 11:03:37.43
静的型言語にIntを返したりStringを返したりする関数って縛りがそもそも無理

390:デフォルトの名無しさん
12/04/15 11:07:14.65
>>388
>>254

391:デフォルトの名無しさん
12/04/15 11:08:32.55
PerlとかSchemeの、多値をうまく使ったのが一番エレガントかな。

RubyとかJSは、同じようなコードをStringとNumberの両方に生やすとか、
見事に汚い解だw

392:デフォルトの名無しさん
12/04/15 11:13:32.41
関数を返す関数(カリー化されてりゃ普通)にケチがつくとか
スゲーなこのスレ

393:デフォルトの名無しさん
12/04/15 11:16:23.31
>>390
ちゃんと「など」って書いてるぞー

> オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。

それとも高階関数は関数じゃないんですかー

394:デフォルトの名無しさん
12/04/15 11:20:37.25
>>389
それだけじゃない。
継続の状態如何で関数に振る舞いを変えさせるとか
関数型には無理な事ばかり要求している。
悪意に満ちたクイズだ。

395:デフォルトの名無しさん
12/04/15 11:23:20.66
>>394
素直に考えれば、オープンクラスのある言語が良いという
意見に持っていきたい問題だからね

でも出てきた解はRubyが一番汚いという

396:デフォルトの名無しさん
12/04/15 11:25:11.88
>>389
型クラスとかってこういう時には使えないの?

397:デフォルトの名無しさん
12/04/15 11:30:40.55
要求による。

問題の「#=> "FizzBuzz"」が意味しているものが、REPLでそのように表示されるもの、
という意味なら、Show型クラスでいいんだけど、String型([Char]型)を要求してるなら無理。

398:デフォルトの名無しさん
12/04/15 11:32:07.68
静的型 vs 動的型スレ向きの問題だよね

399:デフォルトの名無しさん
12/04/15 11:52:01.47
>>391
いやあ俺は>>341のF#(er)が一番エレガントだと思うぞ。
無茶な要求仕様も黙ってすべて満たしつつ、簡潔できれいなコード出してきてるし。

400:デフォルトの名無しさん
12/04/15 11:57:38.79
>>399
ThreadLocalが一番エレガントって
どういうセンスしてんだよ

401:デフォルトの名無しさん
12/04/15 12:04:48.59
#include <stdio.h>
#include <string.h>
int v,w,t;char buf[4<<10];void*fizz(void*n){if(!t&&!v){v=(int)n;t=!t;}
if(!(v%3))goto a;else if(!(w&0x7))goto b;else goto c;a:{size_t
(*f)(char*restrict,const char*restrict,size_t);f=(w&0x7)?strlcat
:strlcpy;w|=0x1;f(buf,"Fizz",4<<10);}goto c;b:{char b[2<<8];;;;;;;;;;;
snprintf(b,2<<8,"%d",v);strlcpy(buf,b,2<<8);}goto c;c:return buf;}void
*buzz(void*n){if(!t&&!v){v=(int)n;t=!t;}if(!(v%5))goto a;else
if(!(w&0x7))goto b;else goto c;a:{size_t/**/(*f)(char*restrict,const
char*restrict,size_t);f=(w&0x7)?strlcat:strlcpy;w|=0x2;f(buf,"Buzz",
4<<10);}goto c;b:{char b[2<<8];snprintf(b,2<<8,"%d",v);strlcpy(buf,b,
2<<8);}goto c;c:return buf;}void*gizz(void*n){if(!t&&!v){v=(int)n;t=!t;}
if(!(v%7))goto a;else if(!(w&0x7))goto b;else goto c;a:{size_t (*f)
(char*restrict,const char*restrict,size_t);f=(w&0x7)?strlcat:strlcpy;
w|=0x1;f(buf,"Gizz",4<<10);}goto c;b:{char b[2<<8];;;snprintf(b,2<<8,
"%d",v);strlcpy(buf,b,2<<8);}goto c;c:return buf;}int main(void){printf
("%s\n",gizz(buzz(fizz(105))));}

402:デフォルトの名無しさん
12/04/15 12:22:36.47
>>368
>あと、まさかコードも書かずに議論参加してたとか無いよな

>>395
>でも出てきた解はRubyが一番汚いという

このスレの特徴まとめ

403:デフォルトの名無しさん
12/04/15 12:34:01.13
>>399
グローバル変数ではまずいと考えてThreadLocalにしたみたいに見える
まずいという認識がありながら、それを上に報告しないのはおかしい
結局、要求に対する不平不満は正直に言えばいいんだよ

404:デフォルトの名無しさん
12/04/15 12:52:12.22
コード書けないドカタとプログラマでは綺麗さの認識が違う

405:デフォルトの名無しさん
12/04/15 13:06:57.34
そうだね
お前のコードかけないドカタって概念がおかしいけどねw

406:デフォルトの名無しさん
12/04/15 13:29:07.47
>>405
あれ?まだこのスレに居たの?
派遣仕事で使い慣れたJavaを使って良いから
早くエレガントな解を出してくださいよwww

407:デフォルトの名無しさん
12/04/15 13:32:57.13
くやしいんだねw

408:デフォルトの名無しさん
12/04/15 13:55:54.00
仕事しろ。言語の勉強はするだけ無駄。

求められているのは動くアプリだ。

409:デフォルトの名無しさん
12/04/15 14:23:06.70
そもそも関数としての体をなしてないのだから、
副作用を使わずにこのクイズは解けない。
よって純粋な関数型パラダイムでは対応不可。終了。

410:デフォルトの名無しさん
12/04/15 14:32:35.61
Scalaならいろいろ駆使して書けそうだけどな

411:デフォルトの名無しさん
12/04/15 14:38:59.15
>>393
この場合の「など」は、関数呼び出しにもいろいろありますよね、
buzz(fizz(3)) 、 (buzz (fizz 3)) 、buzz fizz 3 など―とかの「など」だと思われ。

412:デフォルトの名無しさん
12/04/15 15:23:11.97
関数じゃないものを
関数型言語で作るには
どうしたらいいのだろうか?

413:デフォルトの名無しさん
12/04/15 15:27:19.67
>>409
副作用なしに解いたSchemeさんが涙目です

414:デフォルトの名無しさん
12/04/15 15:35:03.47
>>411
三つ目が>>385だね(カリー化されてれば)
それとも見た目だけの問題?

415:デフォルトの名無しさん
12/04/15 16:42:00.03
F#でThreadLocal等の副作用もないバージョン。

type MainBuilder() =
    member this.Return x =
        x |> List.map (function
        | _, Some names -> box names
        | number, None -> box number)
let main = MainBuilder()

let makeFizzBuzz name condition (x : obj) =
    match x with
    | :? int as number -> number, if condition number then Some name else None
    | _ ->
        let number, names = x :?> int * string option
        number, if condition number then (defaultArg names "") + name |> Some else names

// fizz, buzz, gizzの定義は>>341と同じなので省略

> main { return [1; 3; 5; 7; 15; 21; 35; 105] |> List.map (fun x -> gizz(buzz(fizz x))) };;
val it : obj list =
  [1; "Fizz"; "Buzz"; "Gizz"; "FizzBuzz"; "FizzGizz"; "BuzzGizz"; "FizzBuzzGizz"]

416:デフォルトの名無しさん
12/04/15 17:46:44.23
新ルール「カリー化禁止」

417:デフォルトの名無しさん
12/04/15 17:53:43.12
>>415
mainがダウト、なんじゃないか?

418:デフォルトの名無しさん
12/04/15 18:08:11.82
>>417
main { return ... } 部分をただのコードブロックとみせかけて
実は戻り値を変換しているという作戦だったのに、バレたか。

419:デフォルトの名無しさん
12/04/15 18:31:37.86
Smalltalkが流行らないように関数型メインは流行らないよ

420:デフォルトの名無しさん
12/04/15 18:34:04.58
ついに「流行らない」以外に縋るものがなくなっちゃったか

421:デフォルトの名無しさん
12/04/15 18:34:51.92
副作用ありとは言え、唯一まともな解出しててF#△だったのに
この期に及んで汚ないチートとかなにこのものすごい残尿感。

422:デフォルトの名無しさん
12/04/15 18:40:05.54
.NET発表時のHaskell.NETはどこに行ったんだよ?

423:デフォルトの名無しさん
12/04/15 18:43:46.95
マクロ使っていいならそもそも多値なんぞ使わんでも楽勝だろ。

424:デフォルトの名無しさん
12/04/15 18:47:39.47
FizzBuzzって流行ってるけど何が面白いの?

425:デフォルトの名無しさん
12/04/15 18:52:45.85
低能はFizzBuzzすら書けないという事実が面白い

426:デフォルトの名無しさん
12/04/15 18:53:02.18
>>423 具体的にドーゾ

427:デフォルトの名無しさん
12/04/15 19:04:47.51
オープンクラスとか副作用有り等の
汚いコードだけが「合格」www

勝手に判定してる(コード書けない)バカのセンスが露呈してますな

428:デフォルトの名無しさん
12/04/15 19:05:21.22
>>423
perl書いたのオレなんだけれどもさ、その通りなんだよな…

429:デフォルトの名無しさん
12/04/15 19:08:10.88
C#とかも関数型言語のエッセンスを取り入れるけど
すげえ無理矢理くさくて笑えるw
関数型がオブジェクト指向を取り入れるのはもっと自然なのに

オブジェクト指向っていうかC系列はもう駄目なんだと思う

430:デフォルトの名無しさん
12/04/15 19:18:55.29
守らなければならない資産がたくさんあるからな
そりゃ無理やりくさくもなるさ

431:デフォルトの名無しさん
12/04/15 19:28:01.70
後付で入れなきゃならなくなる時点で失敗だったはずなんだけどなぁ。
最近のC#の機能なんてC#以前から概念として存在してたはずなのに。
必要ないという当初の目論見は外れてるわけだ。

というか、資産っていうのはC風の構文そのものなんだよね・・・
C風じゃないとヤダヤダいう人が多すぎてD言語とかいちいち作られてる気がする。

C++、Java、C#、D言語
このへんは全て老害でしょ。

432:デフォルトの名無しさん
12/04/15 19:30:26.05
C#、D言語は設計に一貫した思想がないからアホっぽくなるのは仕方ない。

433:デフォルトの名無しさん
12/04/15 19:41:07.47
fizz 1 -- "1"
fizz 3 -- "Fizz"
buzz 5 -- "Buzz"
buzz fizz 15 -- "FizzBuzz"
だったらHaskellでも解ける?

434:デフォルトの名無しさん
12/04/15 19:45:23.42
可変長引数とかさーー

435:デフォルトの名無しさん
12/04/15 19:50:00.84
>>431
C系列でまともなのはCだけ

436:デフォルトの名無しさん
12/04/15 19:50:26.06
>>433
型の不整合が生じるから無理

437:デフォルトの名無しさん
12/04/15 19:52:02.10
>>432
C#はどんどんダメな方向に向かってる気はするわー。

438:デフォルトの名無しさん
12/04/15 20:01:50.15
Javascriptは結構好きなのよん > C系文法族

439:デフォルトの名無しさん
12/04/15 20:11:47.98
>>406
>>303-304

440:デフォルトの名無しさん
12/04/15 20:19:32.18
>>431
後付で入れてもらったのがScala、Clojure、F#でしょ
なんで後付を悪く言うのかな

441:デフォルトの名無しさん
12/04/15 20:41:24.35
C#は言語設計に一貫性がなく節操のないところが最大の魅力
偉い人にはそれがわからんのです

442:デフォルトの名無しさん
12/04/15 21:08:30.57
>>440
アホか
それらは最初から関数型言語として作られてるでしょ。
関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
なんで今更関数型の要素を入れようとするんだよ。

443:デフォルトの名無しさん
12/04/15 21:16:51.80
>>439
オーバーライドした toString() を println() に暗黙に呼ばせるとかいう
使い古されたチートをキメ顔で出してこられても…。
new myInteger(3).fizz() が "Fizz" を返せるとか少しは挑戦しようよ。

444:デフォルトの名無しさん
12/04/15 21:17:08.32
「.Netファミリーに関数型言語入ったからC#でも使えるようにすっか!」
くらいのノリだろ。たぶん
dynamic型導入したときもそんな感じだったし

445:デフォルトの名無しさん
12/04/15 21:18:37.55
いやC#の場合は「C#で~が出来ないと言わせない」という一貫した姿勢があると思う。
もともとJavaへの嫉妬から始まった言語だし。

446:デフォルトの名無しさん
12/04/15 21:21:52.66
>>442
手続き型言語がまずあって、
そこへOOの機能を取り入れた。
こんどはさらに関数型の機能も取り入れようとしているだけ。

447:デフォルトの名無しさん
12/04/15 21:40:30.50
C#厨ってVB.NETをVB厨のための言語って馬鹿にしてたけど
C#だってCっぽくないとヤダヤダっていう老害のために
無理矢理作ってるんだから全然人のこといえねーわ。
ラムダとかそんなに良いんならなんで最初から関数型言語使わないんだよw

448:デフォルトの名無しさん
12/04/15 21:46:15.09
>>442
> 関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
> なんで今更関数型の要素を入れようとするんだよ。

オブジェクト指向最高はそうかもしれないが、
関数型は糞なんて言ってないだろ。

現実世界における物質(オブジェクト)に対応づけやすい
自然な発想に基づくオブジェクト指向。
そこに便利な関数型を取り入れただけ。

りんごの方程式とは何か?を考えれば
オブジェクト指向と関数型の関係がわかるだろう。

449:デフォルトの名無しさん
12/04/15 21:48:54.81
C#作った奴らはvoidを型と思っていなかった。
だから、C#じゃクロージャ作るのに引数や戻り値にvoidがあると作れないw
やるには予めデリゲートを定義しなきゃならん。
クロージャを使うのを考えさせられる。
ありえん。手軽さが全然ない。

F#はローカル変数(厳密には違うが)を定義するのもクロージャを定義するのも同じ手間しかかからない。
クロージャをバンバン使っていけるのでクロージャの応用もどんどん閃ける。
F#やった方がC#が上手くなるという現実。
C#はやればやるほど馬鹿になる言語。

450:デフォルトの名無しさん
12/04/15 21:50:04.90
速度やメモリ・言語ごとの風習で最適かどうかは変わるのだろうけれど、
関数型でOOPをするときは、返り値として変更したオブジェクトを返すより、新たなオブジェクトを返したほうが関数型ぽいのかね?

451: ◆QZaw55cn4c
12/04/15 21:51:05.55
>>447
F#のことも思い出してあげてください

452:デフォルトの名無しさん
12/04/15 21:59:08.45
関数型言語でWindowsアプリを開発したいっつー需要がどれだけあるかだな

453:デフォルトの名無しさん
12/04/15 22:00:17.15
>>442
どちらが糞でどちらが最高かなんて、問い詰められても答えなくていいと思うんだが
沈黙が正解って小学生でも知ってる奴は知ってるだろ

454:デフォルトの名無しさん
12/04/15 22:54:52.02
>>443
>>443
がんばってみたんですが、糸口がみえてきません。もしよろしければアドバイスをいただけないでしょうか。

>new myInteger(3).fizz() が "Fizz" を返せる

① これは、「メソッド fizz() が副作用として "Fizz" を出力する」ということですか?
この場合、fizz(), buzz(), gizz() を通過してきて 3 でも 5 でも 7 でもわりきれなかった場合に元の数字を出力する、ということが不可能だと思います。
>>303 では妥協して endl() というメソッドを準備してこの処理を行うしかありませんでした。

② それとも「メソッド fizz() の返り値が String("fizz") であるべき」ということですか?
String にメソッド fizz() を追加したいのであれば、 String から新しいクラスmyString を継承して、そこにメソッドを定義するということだろうと思いますが、
(new myString(3).fizz() が myString("Fizz") を返す)
②-1 java.lang.String は final。
②-2 メソッド fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない。多値を返したいのですが >>304 で精一杯。
>>304 の toString()#Object をオーバーライドする、ってこういうときには普通にすることだと思っていたんですが、何かまずい問題でもあるのでしょうか?

455:デフォルトの名無しさん
12/04/15 23:40:26.22
トイプログラムしか書かない奴は言語なんて何でもいいだろw

456:デフォルトの名無しさん
12/04/15 23:47:29.56
>>443
>>303 の方針でがんばってみました。gizz() は最後に置かなければならない、と決めうちすることにしました。
スレリンク(tech板:194番)

457:デフォルトの名無しさん
12/04/15 23:49:17.32
苦しいねぇ

458:デフォルトの名無しさん
12/04/15 23:50:41.61
>>454
> fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない

その一見回避不可能な問題を解決する方法を考えるのがこのクイズがクイズたるゆえんです。
言語によっては型システムの制約によりどうやっても実現できないこともあります。

459:デフォルトの名無しさん
12/04/16 00:02:21.18
>>450
関数型に限らず、GCのあるOOPLだと
属性変更をせずに新規オブジェクトをサクサク作るやり方も結構使うね

460:デフォルトの名無しさん
12/04/16 00:45:51.08
>>454
>>341の方法(元の数値をどこかにメモしておいて適宜参照)はJavaでも使えます。

461:デフォルトの名無しさん
12/04/16 01:11:55.59
>>458
OOとPFの言語比較としてこのようなクイズを出したのは、
どのような観点からこれら両者のパラダイムの優劣を比較しようとしたのか
聞きたい

462:デフォルトの名無しさん
12/04/16 01:13:44.79
もうこのお題はcloseでいいんじゃないの?
このクイズではせっかくの労力を生産的でないことに費やしている

463:デフォルトの名無しさん
12/04/16 01:30:58.12
>>462
クイズなんかそんなもんだろ。しょせん暇つぶし。
つーか、こんな程度のクイズ解くのに「労力」なんか大仰なもん必要か?

464:デフォルトの名無しさん
12/04/16 01:38:59.77
このクイズのくだらなさはかなり問題。

465:デフォルトの名無しさん
12/04/16 01:48:07.75
くやしいのうw

466:デフォルトの名無しさん
12/04/16 02:07:04.82
全然くやしくないぜよ。perlでobjectのnew版も多値版もさらりと書いた。
tieとマクロ使ったのも書こうと思ったけれど手間がもったいなくなってやめた。
パラダイム比較としてもうすこし書く値打ちのあるテーマ出せよ、
このクイズじゃ再帰は使いどころないし
javaのnewだめ静的型システムダメ
何を有利に誘導したいんだか
せめて前スレのpermutationレベルのテーマを出題の下限レベルとしてクレヨ

467:466
12/04/16 02:18:35.03
大体fizz buzzってのが下らないんだよ
プログラムプロムナード、ナノピコ教室、Cマガ課題、オイラー4、AIアルゴリズム、OR最適化、
パーサ、マッチング、グラフ問題あたりの
小問題で再帰・高階/部分適用、遅延・カーリー化vsOOの比較できる題材が妥当かもな
step数は2chの1レスに収まるくらいの小問題でいいからサ

468:466
12/04/16 02:26:58.99
最悪、基本アルゴリズムの再実装でもいいや
たとえばqsortはperlやhaskellでpivotを適当に選択して再帰した短いコードと
pivot選択くどくど頑張ったCやjavaの長いコード比較してファンクショナルの再帰はマンセーみたいな
サイトがあちこちにあるだろ、
あのレベルでも今回のFizzBuzzGizzよりましだろ

469:466
12/04/16 02:35:35.13
あと、言い出しっぺの法則はナシだぞw


470:466
12/04/16 02:44:04.67
つか、OOとPFの単純比較って何か意味あるのか?
どのみち記述する言語の特徴または弱点、癖の比較レベルの議論に落ちがちな稀ガス
ズット前スレでヨンだが、意味論的にはOOとPFは相容れない物らしい
しかし生々しい実装レベルではいまんとこ清濁併せ呑んで実現するし
まあいいや寝るか。ノシ

471:デフォルトの名無しさん
12/04/16 02:46:25.77
多値使うアイデアはイケてたはずなのに、仕上げの文字列との結合やprintとの併用で
ズル呼ばわりされるわ、Rubyの>>377の挙動も再現できなかったしで散々だったしね。

472:デフォルトの名無しさん
12/04/16 02:53:06.66
なぜかC++で挑み続ける俺。
これ以上C++では無理かも。0xだと知らんが。

template< int e, unsigned t >
struct fizzbuzz
{
  int in; std::string out;
  fizzbuzz( int i ):in( i ){ init(); }
  template< int e2, unsigned t2 >
  fizzbuzz( const fizzbuzz< e2, t2 > &r )
    :in( r.in ),out( r.out ){ init(); }
  void init(){ if( in%e ) return;
    unsigned tmp=t; out.append( (char*)&tmp, 4 ); }
  operator const char *(){ return out.c_str(); }
  operator int(){ return in; }
};
typedef fizzbuzz< 3, 'zziF' > fizz;
typedef fizzbuzz< 5, 'zzuB' > buzz;
typedef fizzbuzz< 7, 'zziG' > gizz;

int main()
{
  int     i = (gizz)(buzz)(fizz)1;
  std::string t = (gizz)(buzz)(fizz)15;
  std::string u = (gizz)(buzz)(fizz)105;
  std::string v = gizz((buzz(fizz(105)))); //こうも書けるね
  return 0;
}

473:466
12/04/16 02:54:29.65
>>471
あれはね最初に書いたnewはだめって言われて仕方なくの面はあるのよ

$scalar = 関数(関数

と明示的にscalarで主値だけを受けとるように明示するのがホントは作法なんだ。

Rubyの>>377に関しては読んでなかったから挙動の再現にそもそも着手してないよ。
rubyは文法がかなりカオスになって来ちゃって残念だね

474:466
12/04/16 02:59:22.51
fizzbuzzgizzはいいんだどうでも。
それより前スレのpermutaion perl版はwebなど参照せず一から考えて書いて
オレなりに結構な自信作だったのに
なんの反応もなかったことの方が寂しかったな

475:デフォルトの名無しさん
12/04/16 03:19:21.92
何このスレ

476:デフォルトの名無しさん
12/04/16 06:20:08.75
ruby無双をしたかった奴が、もっとエレガントな解を他言語で出されて、
涙目でdisるスレです

477:デフォルトの名無しさん
12/04/16 06:53:26.91
Rubyと違う解法が出る度に
必死に難癖付けてて笑ったわww

478:デフォルトの名無しさん
12/04/16 08:13:17.85
頭が固くて馬鹿だから
数や文字列に状態持たせる以外の方法が
理解できないんだろう

479:デフォルトの名無しさん
12/04/16 08:32:48.03
頭が固くて馬鹿だから
数や文字列に状態持たせる方法が
許容できないんだろう

480:デフォルトの名無しさん
12/04/16 08:38:53.99
世の中は状態がある世界なのにねw

481:デフォルトの名無しさん
12/04/16 08:50:48.96
じゃあFixnumのインスタンスに特異メソッド定義してみろRuby厨

482:デフォルトの名無しさん
12/04/16 09:44:46.42
元ネタのCLのEQLスペシャライザならそういうことできたよな。

Haskellとかでコンストラクタ無しで1以外の引数をとるとコンパイル時に
型エラーになる関数って定義できたっけ?

483:デフォルトの名無しさん
12/04/16 10:00:08.87
template< int n > void func(){int i="";}
template<> void func<1>(){}
・・・
func<2>();//エラー

484:デフォルトの名無しさん
12/04/16 12:34:04.90
> cat FooTH.hs
{-# LANGUAGE TemplateHaskell #-}
module FooTH where
import Language.Haskell.TH
foo 1 = [| 1 |]
foo _ = error ""

> cat Main.hs
{-# LANGUAGE TemplateHaskell #-}
import FooTH
main = print $(foo 1) -- foo 2 に変えるとコンパイルエラー

485:デフォルトの名無しさん
12/04/16 12:50:08.98
>>474
あれ覚えてるよ、実は感心してた
ていうか、このスレでPerlの評価が結構変わったよ(もちろん高い方へ)

でも、読み易さ優先で書いてあれとは
Perl使いとは分かり合えないな...と思ったけどw

486:デフォルトの名無しさん
12/04/16 20:25:48.62
>>479
許容はしてるだろう
エレガントさから程遠いと言ってるだけで

487:デフォルトの名無しさん
12/04/16 22:19:41.52
俺の基準における
エレガントってやつかw

488:285
12/04/17 00:46:48.85
正直、あの問題は無いと思うよ
問題があれだし書き捨てだからやったが、実際には絶対にやりたくないな

489:デフォルトの名無しさん
12/04/17 00:47:44.00
>>487
FizzBuzzすら書けない口だけ野郎の基準よりマシだろwww
お前はこのスレでは最底辺のカスなんだから敬語使えw

490:デフォルトの名無しさん
12/04/17 00:53:04.36
>>481
ぶっちゃけ>>479のバカが理解できたのが
たまたまRubyのコードだっただけでRuby厨ですらねーと思うぜ
むしろバカにクソコード褒められてRuby可哀想ってなもんだ

491:デフォルトの名無しさん
12/04/17 00:59:54.74
あの問題出したのぶっちゃけPython使いだと思う(陰謀説)

492:466
12/04/17 01:35:17.45
>>491
アレは学部・卒研レベルの課題をここに投げたのかなーと
オレは感じた。(真相はシラネ)
もしかしてオレ様はボクちゃんに利用されたのかなとww

493:デフォルトの名無しさん
12/04/17 10:56:11.26
F#のスレッドローカル(有り体にはグローバル変数)と同様の方法でSqueak Smalltalkの解。
オープンクラスは使わずにブロック(無名関数)で。

| fb fizz buzz gizz |
fb := [:x :cond :str |
   | p n |
   p := Processor activeProcess.
   (x isKindOf: Integer)
      ifTrue: [p instVarNamed: #env put: (n := x). x := '']
      ifFalse: [n := p instVarNamed: #env].
   (cond value: n) ifTrue: [x, str] ifFalse: [x ifEmpty: [n]]].

fizz := [:x | fb value: x value: [:n | n isDivisibleBy: 3] value: 'Fizz' ].
buzz := [:x | fb value: x value: [:n | n isDivisibleBy: 5] value: 'Buzz'].
gizz := [:x | fb value: x value: [:n | n isDivisibleBy: 7] value: 'Gizz'].

self assert: (fizz value: 1) = 1.
self assert: (fizz value: 3) = 'Fizz'.
self assert: (buzz value: (fizz value: 1)) = 1.
self assert: (buzz value: (fizz value: 3)) = 'Fizz'.
self assert: (buzz value: (fizz value: 5)) = 'Buzz'.
self assert: (buzz value: (fizz value: 15)) = 'FizzBuzz'.
self assert: (gizz value: (buzz value: (fizz value: 105))) = 'FizzBuzzGizz'.
self assert: (buzz value: (gizz value: (fizz value: 105))) = 'FizzGizzBuzz'.

494:デフォルトの名無しさん
12/04/17 12:02:41.83
>>493
Pythonも同じ方針のやつ

import threading
fbdata = threading.local()

def fb(x, cnd, msg):
if isinstance(x, int):
fbdata.m = n = x
s = ""
else:
n = fbdata.m
s = x
if cnd(n):
return s + msg
elif s <> "":
return s
else:
return n

def fizz(n): return fb(n, lambda n: n%3==0, "Fizz")
def buzz(n): return fb(n, lambda n: n%5==0, "Buzz")
def gizz(n): return fb(n, lambda n: n%7==0, "Gizz")

assert fizz(1) == 1
assert fizz(3) == "Fizz"
assert buzz(fizz(1)) == 1
assert buzz(fizz(3)) == "Fizz"
assert buzz(fizz(5)) == "Buzz"
assert buzz(fizz(15)) == "FizzBuzz"
assert gizz(buzz(fizz(105))) == "FizzBuzzGizz"
assert buzz(gizz(fizz(105))) == "FizzGizzBuzz"


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch