Created
December 4, 2013 11:08
-
-
Save tkych/7785879 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;;; Last modified: 2013-12-04 20:06:16 tkych | |
;;==================================================================== | |
;; バス代 | |
;;==================================================================== | |
;; - [バス代 〜 横へな 2013.4.6](http://nabetani.sakura.ne.jp/hena/ord9busfare/) | |
;; - [第9回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/84255ac417ef25069a3b) | |
;;-------------------------------------------------------------------- | |
;; Package | |
;;-------------------------------------------------------------------- | |
(in-package :cl-user) | |
(eval-when (:compile-toplevel :load-toplevel :execute) | |
(ql:quickload :split-sequence)) | |
(defpackage :bus-fare (:use :cl)) | |
(in-package :bus-fare) | |
;;-------------------------------------------------------------------- | |
;; Main | |
;;-------------------------------------------------------------------- | |
;; input -> fare, people, num-free-children | |
;; "210:Cn,In,Iw,Ap,Iw" -> 210, ((#\C . #\n) (#\I . #\n) (#\I . #\w) (#\I . #\w)), 2 | |
(defun parse (input) | |
(multiple-value-bind (fare colon-pos) (parse-integer input :junk-allowed t) | |
(loop :for s :in (split-sequence:split-sequence #\, input :start (1+ colon-pos)) | |
:for person := (char s 0) | |
:for class := (char s 1) | |
:when (char= person #\A) :count person :into num-adults | |
:unless (char= class #\p) :collect (cons person class) :into people | |
:finally (return (values fare | |
(sort people #'char< :key #'cdr) | |
(* 2 num-adults)))))) | |
(defun half (fare) | |
(* 10 (ceiling (/ fare 2) 10))) | |
(defun main (input) | |
(multiple-value-bind (fare people num-free) (parse input) | |
(let ((result 0)) | |
(loop :for (person . class) :in people | |
:do (ecase person | |
(#\I (if (< 0 num-free) | |
(decf num-free) | |
(ecase class | |
(#\w (incf result (half (half fare)))) | |
(#\n (incf result (half fare)))))) | |
(#\C (ecase class | |
(#\w (incf result (half (half fare)))) | |
(#\n (incf result (half fare))))) | |
(#\A (ecase class | |
(#\w (incf result (half fare))) | |
(#\n (incf result fare)))))) | |
(write-to-string result)))) | |
;;-------------------------------------------------------------------- | |
;; Tests | |
;;-------------------------------------------------------------------- | |
(defun =>? (got want) | |
(assert (string= got want))) | |
(progn | |
(=>? (main "210:Cn,In,Iw,Ap,Iw") "170") | |
(=>? (main "220:Cp,In") "110") | |
(=>? (main "230:Cw,In,Iw") "240") | |
(=>? (main "240:In,An,In") "240") | |
(=>? (main "250:In,In,Aw,In") "260") | |
(=>? (main "260:In,In,In,In,Ap") "260") | |
(=>? (main "270:In,An,In,In,Ip") "410") | |
(=>? (main "280:Aw,In,Iw,In") "210") | |
(=>? (main "200:An") "200") | |
(=>? (main "210:Iw") "60") | |
(=>? (main "220:Ap") "0") | |
(=>? (main "230:Cp") "0") | |
(=>? (main "240:Cw") "60") | |
(=>? (main "250:In") "130") | |
(=>? (main "260:Cn") "130") | |
(=>? (main "270:Ip") "0") | |
(=>? (main "280:Aw") "140") | |
(=>? (main "1480:In,An,In,In,In,Iw,Cp,Cw,In,Aw,In,In,Iw,Cn,Aw,Iw") "5920") | |
(=>? (main "630:Aw,Cw,Iw,An,An") "1740") | |
(=>? (main "340:Cn,Cn,Ip,Ap") "340") | |
(=>? (main "240:Iw,Ap,In,Iw,Aw") "120") | |
(=>? (main "800:Cw,An,Cn,Aw,Ap") "1800") | |
(=>? (main "1210:An,Ip,In,Iw,An,Iw,Iw,An,Iw,Iw") "3630") | |
(=>? (main "530:An,Cw,Cw") "810") | |
(=>? (main "170:Aw,Iw,Ip") "90") | |
(=>? (main "150:In,Ip,Ip,Iw,In,Iw,Iw,In,An,Iw,Aw,Cw,Iw,Cw,An,Cp,Iw") "580") | |
(=>? (main "420:Cn,Cw,Cp") "320") | |
(=>? (main "690:Cw,In,An,Cp,Cn,In") "1220") | |
(=>? (main "590:Iw,Iw,Cn,Iw,Aw,In,In,Ip,Iw,Ip,Aw") "1200") | |
(=>? (main "790:Cw,Cn,Cn") "1000") | |
(=>? (main "1220:In,In,An,An,In,Iw,Iw,In,In,Ip,In,An,Iw") "4590") | |
(=>? (main "570:Cw,Cn,Cp") "440") | |
(=>? (main "310:Cn,Cw,An,An,Iw,Cp,Cw,Cn,Iw") "1100") | |
(=>? (main "910:Aw,In,Iw,Iw,Iw,Iw,Iw,An,Cw,In") "2290") | |
(=>? (main "460:Iw,Cw,Cw,Cn") "590") | |
(=>? (main "240:Iw,Iw,In,Iw,In,In,Cn,In,An") "780") | |
(=>? (main "1240:In,In,In,Ap,In,Cw,Iw,Iw,Iw,Aw,Cw") "2170") | |
(=>? (main "1000:Iw,Ip,In,An,In,In,In,An,In,Iw,In,In,Iw,In,Iw,Iw,Iw,An") "5500") | |
(=>? (main "180:In,Aw,Ip,Iw,In,Aw,In,Iw,Iw,In") "330") | |
(=>? (main "440:In,Ip,Cp,Aw,Iw,In,An") "660") | |
(=>? (main "1270:Ap,In,An,Ip,In,Ip,Ip") "1270") | |
) | |
;;==================================================================== |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment