problem 99

Problem 99 - Project Euler

1000 個ある 基数とべき数のペア(ファイルの各行にコンマ区切りで列挙されている)からべき乗数のうち、最大になるものは何番目かという問題です。

基数、べき数ともに大きな数なので、べき乗数で比較せずに対数で比較します。比較に使うだけなので対数の底は dont' care です。

(define (p99)
  (call-with-input-file
    "p99_data.txt"
    (lambda (p)
      (let loop ((tmp '(0 0)) (i 1))
        (let1 line (read-line p)
              (if (eof-object? line)
                (cadr tmp)
                (let1 value (apply (lambda (b e) (* e (log b)))
                                   (map string->number (string-split line #\,)))
                      (loop (if (> (car tmp) value)
                              tmp
                              (list value i))
                            (+ i 1)))))))))

(print (p99))

問題 99 にしては簡単な問題でした。