第7回日本情報オリンピック 予選

schemeで解きなおしてみた。
へたくそなのは勘弁してくれ。
全部解けてないのはごめんなさい

gaucheに依存してる部分もあるので注意
引数の入力ファイル名を渡す

問題1

;;; get円のものを買って1000円だしたときのおつりの枚数
(define (cntpaycin get)
  (define (iter pay blk cnt)
    (if (null? blk)
        cnt
      (let ((t (car blk)))
        (iter (remainder pay t)
              (cdr blk)
              (+ cnt (quotient pay t))))))
  (let ((in 1000)
        (blocks '(500 100 50 10 5 1)))
    (iter (- in get)
          blocks
          0)))

(define (main args)
  (with-input-from-file (cadr args)
    (lambda ()
      (display (cntpaycin (read))))))

問題2

;;; JOI IOIの個数をそれぞれ数える
;;; (joi . ioi) で帰る
(define (cntJOIIOI str)
  (let ((len (string-length str)))
    (define (iter end ioi joi)
      (if (> end len)
          (cons joi ioi)
        (let* ((start (- end 3))
         (sub (substring str start end)))
          (cond
           ((string=? sub "IOI") (iter (+ end 2)
               (+ ioi 1)
               joi))
           ((string=? sub "JOI") (iter (+ end 2)
               ioi
               (+ joi 1)))
           (else (iter (+ end 1)
           ioi
           joi))))))
    (iter 3 0 0)))

(define (main args)
  (with-input-from-file (cadr args)
    (lambda ()
      (let ((t (cntJOIIOI (read-line))))
        (display (car t))
        (newline)
        (display (cdr t))))))

問題3

(use srfi-1)

;;; xとその前を取り除いたものを返す
(define (delfront x lst)
  (if (or (null? lst)
          (<= x (car lst)))
      lst
    (delfront x (cdr lst))))

;;; 本体
(define (game taro hana i)
  (cond
   ((null? taro) (cons (length hana) 0))
   ((null? hana) (cons 0 (length taro)))
   (else
    (let ((j 0)
          (taro2 (delfront i taro)))
      (if (not (null? taro2))
          (set! j (car taro2)))
      (let ((k 0)
            (hana2 (delfront j hana)))
        (if (not (null? hana2))
            (set! k (car hana2)))
        (game (delete j taro)
              (delete k hana)
              k))))))

;;; 入力をすべてリストに
(define (maketaro lst)
  (let ((t (read)))
    (if (eof-object? t)
        lst
      (maketaro (cons t lst)))))

;;; delの内容すべてをsrcから除く
(define (delfromlst src del)
  (if (null? del)
      src
    (delfromlst (delete (car del) src)
                (cdr del))))

(define (seedgame)
  (let* ((n2 (* (read) 2))
         (taro (sort (maketaro '())))
         (t (game taro
                  (delfromlst (iota n2 1) taro)
                  0)))
    (display (car t))
    (newline)
    (display (cdr t))))

(define (main args)
  (with-input-from-file (cadr args) seedgame))