ふるつき

私は素直に思ったことを書いてるけど、上から目線だって言われる

ARC001A センター採点

 いつまで続くかわからないけどARCのA問題を解いてきたい。

 精進と指摘を受けることが目的です。

chiwawa-star.hatenablog.com

 これに触発されたので。すごいなぁ。

 ということでARC001Aです。解くのに一時間半以上かかったのは秘密。

A: センター採点 - AtCoder Regular Contest 001 | AtCoder

問題の言ってること

N個(1 <= N <= 100)の数値c_i( 1 <= c_i <= 4)が与えられるので、1-4の数値のうち最もたくさん出てきた値の数と最も出てきてない値の数を答えよ。

回答

 (define (count-impl n ls)
  (let ((i (- n 1)))
    (list-set! ls i (+ (list-ref ls i) 1))
    ls))
(define (count nums ls)
  (if (null? nums)
      ls
      (let ((ls2 (count-impl (car nums) ls)))
    (count (cdr nums) ls2))))
 
(define (solve)
  (define (sortf x y)
    (< x y))
  (read-line)
  (let* ((l (map char->digit (string->list (read-line))))
     (ts (count l (make-list 4 0)))
     (sorted (sort ts sortf)))
    (display (list-ref sorted 3))
    (display " ")
    (display (car sorted))
    (display "\n")))
 
(solve)

 schemeでアプローチしてみました。(0 0 0 0)っていうリストを作って、c_i - 1 を添え字としてカウントアップしてます。回数を出力すればいいのでsortして頭とお尻を出力してます。

 list-set! を使ってるのと count のインタフェースが気に食わない感じですね……。