Gauche > Archives > 2012/08/09

2012/08/09 14:59:12 UTCmaru
#
ここ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))))
#
もっと頭がおかしい感じの書き方ないですかね。
#
http://ideone.com/JOdYf
#
これ見てちょっとくやしい
2012/08/09 15:21:14 UTCshiro
#
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の使い方はグローバルに意味を変えちゃうんで推奨しないけど。
2012/08/09 15:25:35 UTCmaru
#
やはり循環構造使うくらいですかね。
#
object-applyの意味を変えてしまうのは捨て身の攻撃な感じがします :-)
2012/08/09 15:27:32 UTCshiro
#
(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/使っとくと/作っとくと/
2012/08/09 15:28:47 UTCmaru
#
ぉー
#
これかっこいいですね。勉強になります。
#
(最近Shiroさんのコードによく $ 出てくるからぼくも使えるようにならんと...)
2012/08/09 18:57:14 UTCshiro
#
Disneyのshort "Paperman" 美しすぎて泣ける。アートと技術の見事な融合。