Skip to content

Instantly share code, notes, and snippets.

@tkych
Created December 4, 2013 11:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkych/7785879 to your computer and use it in GitHub Desktop.
Save tkych/7785879 to your computer and use it in GitHub Desktop.
;;;; 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