problem 42

Problem 42 - Project Euler

[id:mtsuyugu:20080707:1215444841] で過去に解いた problem 22 とよく似た問題です。
アルファベットに A = 1, B = 2 ... と数を割り当てたものの合計が "SKY" = 19 + 11 + 25 = 55 のように三角数になる単語が与えられたファイルの中にいくつあるかという問題です。

(use gauche.sequence)
(use srfi-13)

(define (p42)
  (define (alpha->integer c)
    (- (char->integer c)
       (char->integer #\A)
       -1))
  (define (word->num word)
    (fold (lambda (x y) (+ y (alpha->integer x))) 0 (string->list word)))
  (define (is-triangle-number? num)
    (integer? (/ (- (sqrt (+ 1 (* 8 num))) 1) 2)))
  (let* ((in (open-input-file "words.txt"))
         (line (read-line in)))
    (close-input-port in)
    (fold (lambda (s y)
            (let1 num (word->num s)
                  (+ y (if (is-triangle-number? num) 1 0))))
          0 (remove string-null? (sort (string-split line #/"?,?"/))))))

(print (p42))