#ここ2,3日くらいTLがFizzBuzz FizzBuzzうるさかったんでぼ〜っと考えてたんですけど
##!/usr/bin/env gosh
(use gauche.generator)
(use slib)
(require 'format)
(define (main args)
(let ((mod3 (circular-generator #f #f #t))
(mod5 (circular-generator #f #f #f #f #t))
(nums (giota 100 1)))
(do-generator [out (gmap
(^[f b n]
(format #f "~@[Fizz~]~@[Buzz~]~@[~a~]"
f b (if (or f b) #f n)))
mod3 mod5 nums)]
(print out))))
#もっと頭がおかしい感じの書き方ないですかね。
##これ見てちょっとくやしい
#fizzbuzzは単純すぎて凝るポイントがあまりないかなあ。循環構造は前にも使ったことあったけど、くっつけるところで工夫するとしたら…
#(define-method object-apply ((a <string>) (b <string>)) (string-append a b))
(define-method object-apply ((a <string>) (b <number>)) a)
(define-method object-apply ((a <boolean>) b) b)
(define (main args)
(for-each (^[f b n]($ print $ f $ b n))
'#1=(#f #f "Fizz" . #1#)
'#2=(#f #f #f #f "Buzz" . #2#)
(iota 100 1)))
#こういうobject-applyの使い方はグローバルに意味を変えちゃうんで推奨しないけど。
#やはり循環構造使うくらいですかね。
#object-applyの意味を変えてしまうのは捨て身の攻撃な感じがします :-)
#(use gauche.lazy)
(define (++ a b) (if (string? a) (if (number? b) a (string-append a b)) b))
(define (main args)
($ for-each print
$ map (pa$ fold ++) (iota 100 1)
$ lmap list '#1=(_ _ "Fizz" . #1#) '#2=(_ _ _ _ "Buzz" . #2#)))
#こういうオペレータ++を使っとくと、fizzやbuzzに相当するものがいくら増えても畳み込むだけでいい。
#s/使っとくと/作っとくと/
#ぉー
#これかっこいいですね。勉強になります。
#(最近Shiroさんのコードによく $ 出てくるからぼくも使えるようにならんと...)
#Disneyのshort "Paperman" 美しすぎて泣ける。アートと技術の見事な融合。