challenge LL Golf Hole 3 - 13日の金曜日を数え上げる

今日から2013年12月31日までの、13日の金曜日とその総数を表示してください。

余力のあるものはこのプログラムを短くしてみたり、短くしてみたり、短くしてください。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env ruby
require 'date'

from = DateTime.now
to = DateTime.parse("2013-12-31")

friday = (from..to).inject(0) do |friday, date|
    if date.mday == 13 and date.wday == 5 then
        puts date.strftime('%Y-%m-%d')
        friday + 1
    else
        friday
    end
end

puts friday

Posted feedbacks - Scheme

素直な枝刈りとして毎月の13日だけを調べています。

;; Eager comprehension の終点が exclusive なのでハマったのは秘密。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(use srfi-1)
(use srfi-19)
(use srfi-42)

(let ((ds (filter (compose (cut = <> 5) date-week-day)
                  (drop (list-ec (: y 2008 2014) (: m 1 13)
                                 (make-date 0 0 0 0 13 m y 0))
                        7))))
  (for-each (compose print (cut date->string <> "~1")) ds)
  (print (length ds)))

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#)))))))))

178B。秒 -> <time> -> <date>が辛い。
1
(use srfi-19)(do([o()(if(#/i\D+13/(date->string #0=(time-utc->date(make-time'time-utc 0 t))))`(,#0#,@o)o)][t(ref(current-time)'second)(+ t 864e2)])((> t 14e8)(print(length o)o)))

Index

Feed

Other

Link

Pathtraq

loading...