トップ «前の日記(2007-06-04) 最新 次の日記(2007-06-08)» 編集

Route 477



2007-06-05

[scheme] FizzBuzz一般化 (2)

動くまでに28分、リファクタリングに10分くらい。

「=」が数値の比較であることを忘れててだいぶはまった。(どの関数のエラーメッセージなのかも出してくれると嬉しいなぁ。)

[D:\proj]d:\prog\Gauche\bin\gosh ./fizzbuzzx.scm 1 100 3 Fizz 5 Buzz
*** ERROR: real number required: #f
Stack Trace:
_______________________________________

回答はこんな感じで。

(use util.list) ;slices
(use srfi-1)    ;iota

(define (fizzbuzz from to mapping) ;mapping -> '((3 . "Fizz") (5 . "Buzz") ..)
  (define (integer->fizzbuzz i)
    (let1 mapped (map (lambda (pair) 
                        (let ((n   (car pair))
                              (str (cdr pair)))
                          (if (= (modulo i n) 0) str "")))
                      mapping)
          (if (every (cut string=? <> "") mapped)
            (number->string i)
            (apply string-append mapped))))

  (map integer->fizzbuzz (iota to from)))

(define (main args)
  (cond 
    ((< (length args) 2) 
     (print "usage: fizzbuzz.scm 1 100 3 Fizz 5 Buzz ..."))
    (else
      (let ((from    (string->number (cadr args)))
            (to      (string->number (caddr args)))
            (mapping (map (lambda (ls)
                            (cons (string->number (car ls)) (cadr ls)))
                          (slices (cdddr args) 2))))
        (for-each print (fizzbuzz from to mapping))))))

[ruby] Re:もんだい

immutableなはずのFixnumを無理やり変更せよ (or 変更されたように見せかけろ)、という問題。

変数名をiに限定すれば1行で書けますね(笑)。ってのでは駄目だろうな。うーん、どうやるんだろ。Bindingをどうにかするのかな。

pppを思い出したんだけど、pppはシンボルが引数なんで参考にならず。