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;
}
0 件のコメント:
コメントを投稿