ARC

オフラインリアルタイムどう書く第四回の参考問題 解答(Arc)

More than 5 years have passed since last update.

ちょっと面白そうな勉強会 ( http://atnd.org/events/32979 ) を見つけたので、
試しに直近の参考問題をArcで解いてみた。
問題はこちら http://qiita.com/items/9c514267214d3917edf2

realtime_doukaku4.arc
(= x 5 n (- (* x x) 1))

(def get-tbl bans
  (let o (map [rem nil `(,(if (< (mod _ x) (- x 1)) (+ _ 1)) ;right                                                                                                                                                 
                         ,(if (< (/ _ x) (- x 1)) (+ _ x)) ; bottom                                                                                                                                                 
                         ,(if (> (mod _ x) 0) (- _ 1)) ;left                                                                                                                                                        
                         ,(if (>= (/ _ x) 1) (- _ x)))] ; about                                                                                                                                                     
              (range 0 n))
    (aif (car bans)
         (each x it (= (o (x 0)) (rem (x 1) (o (x 0)))
                       (o (x 1)) (rem (x 0) (o (x 1)))))) o))

(def count (i h tbl)
  (if (is i n) 1
      (apply + (mappend [if (no (mem _ h)) `(,(count _ (cons i h) tbl))]
                        (tbl i)))))

(def solve (xs)
  (let ban-syms (read (+ "(" xs ")"))
    (let bans (map [map [- (coerce _ 'int) 97]
                        (coerce (coerce _ 'string) 'cons)] ban-syms)
      (count 0 nil (get-tbl bans)))))

以上が算出のコード
(回答を出してる中では最短に近いのではないか。自然に書いてこうなる。)

realtime_doukaku_4_result.arc
(solve "") ;; -> 8512                                                                                                                                                                                               
(solve "af") ;; -> 4256                                                                                                                                                                                             
(solve "xy") ;; -> 4256                                                                                                                                                                                             
(solve "pq qr rs st di in ns sx") ;; -> 184                                                                                                                                                                         
(solve "af pq qr rs st di in ns sx") ;; -> 92                                                                                                                                                                       
(solve "bg ch di ij no st") ;; -> 185                                                                                                                                                                               
(solve "bc af ch di no kp mr ns ot pu rs") ;; -> 16                                                                                                                                                                 
(solve "ab af") ;; -> 0                                                                                                                                                                                             
(solve "ty xy") ;; -> 0                                                                                                                                                                                             
(solve "bg ch ej gh lm lq mr ot rs sx") ;; -> 11                                                                                                                                                                    
(solve "ty ch hi mn kp mr rs sx") ;; -> 18                                                                                                                                                                          
(solve "xy ch hi mn kp mr rs sx") ;; -> 32                                                                                                                                                                          
(solve "ch hi mn kp mr rs sx") ;; -> 50                                                                                                                                                                             
(solve "ab cd uv wx") ;; -> 621                                                                                                                                                                                     
(solve "gh mn st lq qr") ;; -> 685                                                                                                                                                                                  
(solve "fg gl lm mr rs") ;; -> 171 

以上が検証コード
うまく動いている。