LL Golf Hole 3 - 13日の金曜日を数え上げる
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)))
|


takano32
#6985()
[
Ruby
]
Rating4/8=0.50
今日から2013年12月31日までの、13日の金曜日とその総数を表示してください。
余力のあるものはこのプログラムを短くしてみたり、短くしてみたり、短くしてください。
※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。
see: DateTime - Rubyリファレンスマニュアル
Rating4/8=0.50-0+
[ reply ]