Schemeのコードが、すこぶる醜い。入力数値のリストを作り、先頭から5つ、二番目から5つ、,,,、(リストの要素数-4)番目から5つ、と数値を取って全ての並びを求めている。そうして求めた各リストに対して積を計算し、最大を得た。けれども並びの求め方が、醜い。もっとうまく書けそうだ。
Scheme
(use srfi-1) (define (p008) (define (integer->digit c) (- c (char->integer #\0))) (define (input-digits) (let ((c (read-char))) (cond ((eof-object? c) '()) ((char-numeric? c) (cons (integer->digit (char->integer c)) (input-digits))) (else (input-digits))))) (define (split-list ls) (map (lambda (x) (receive (_ t) (split-at ls x) (take t 5))) (iota (- (length ls) 4)))) (print (apply max (map (lambda (x) (apply * x)) (split-list (input-digits)))))) (p008)
C++
#include <cstdio> #include <cstring> #include <cctype> #include <algorithm> using namespace std; int main() { char c; int xs[5], ma; ma = 0; memset(xs, 0, sizeof(xs)); while ((c = getchar()) != EOF) { if (!isdigit(c)) continue; xs[4] = c-'0'; int p = 1; for (int i = 0; i < 5; i++) p *= xs[i]; ma = max(ma, p); for (int i = 0; i < 4; i++) xs[i] = xs[i+1]; } printf("%d\n", ma); return 0; }