Comment detail

LL Golf Hole 3 - 13日の金曜日を数え上げる (Nested Flatten)

Lispといえば AI (Artificial Intelligence) ですが、今回はコンピュータの前にいる NI (Natural Intelligence) を使って解いてみました。ただ、信頼性がいまいち低いため、一部コンピュータにより補助を行い、精度を高めています。

実行例:

% gosh countup13fri.scm
(... 略 ...)


   December 2013
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

この月に13日の金曜日は含まれますか?
含まれる場合は y, 疲れたときは g, それ以外のときはリターンキーを押してください:
y
2009/2/13
2009/3/13
2009/11/13
2010/8/13
2011/5/13
2012/1/13
2012/4/13
2012/7/13
2013/9/13
2013/12/13
==> 10

※実行には外部コマンドの cal が必要です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env gosh

(use gauche.process)

(let* ((now (sys-localtime (sys-time)))
       (lst '()))
  (do ((y #0=(+ 1900 (ref now 'year)) (+ y 1)))
      ((<= 2014 y)
       (dolist (elem (reverse lst))
         (apply format #t "~d/~d/13~%" elem))
       (format #t "==> ~d~%" (length lst)))
    (do ((m 0 (+ m 1)))
        ((<= 12 m))
      (unless (and (= #0# y)
                   (or (< m #1=(ref now 'mon))
                       (and (= #1# m) (< 13 (ref now 'mday)))))
        (let ((l (process-output->string-list `(cal ,(+ m 1) ,y))))
          (let loop ((ans (find #/8  9 10 11 12 13 14/ l)))
            (for-each print l)
            (print "この月に13日の金曜日は含まれますか?\n含まれる場合は y, 疲れたときは g, それ以外のときはリターンキーを押してください: ")
            (case (string->symbol (read-line))
              ((y Y) (if ans
                         (push! lst (list y (+ m 1)))
                         #2=(begin
                              (print "\n*** 本当ですか? もう一度よく確認してみてください ***\n")
                              (loop ans))))
              ((g G) (error "out of patience, aborting ..."))
              (else
               (when ans
                 #2#)))))))))

Index

Feed

Other

Link

Pathtraq

loading...