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