Skip to content

Instantly share code, notes, and snippets.

@tkych
Last active December 29, 2015 05:29
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/7622703 to your computer and use it in GitHub Desktop.
Save tkych/7622703 to your computer and use it in GitHub Desktop.
眠れるモンスターを狩る, http://qiita.com/Nabetani/items/0597bd3af481e5834ae1
;;;; Last modified: 2013-11-24 11:41:33 tkych
;;====================================================================
;; Sleeping Monsters
;;====================================================================
;; - [第14回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/0597bd3af481e5834ae1)
;; - [眠れるモンスターを狩る 〜 横へな 2013.9.28](http://nabetani.sakura.ne.jp/hena/ord14linedung/)
;; Name: Need: Get:
;; -------------------------------------------------------------------
;; BuruBuru ( B ): AssaultRapier ( a ): CoiledSpear ( c )
;; DainaRex ( D ): CoiledSpear ( c ): EnchantedRod ( e )
;; FatherConga ( F ): EnchantedRod ( e ): GodAxe ( g )
;; HiruScura ( H ): GodAxe ( g ): IceSword ( i )
;; Javaanos ( J ): IceSword ( i ): KingsLance ( k )
;; LalalaLalala ( L ): KingsLance ( k ): AssaultRapier ( a )
;;--------------------------------------------------------------------
(in-package #:cl-user)
(defpackage #:sleeping-monsters (:use #:cl))
(in-package #:sleeping-monsters)
(defun parse-input (input)
(loop :for c :across input
:if (upper-case-p c)
:collect c :into monsters
:else
:collect c :into weapons
:finally (return (values monsters weapons))))
(defun attack (monster weapon)
(ecase monster
(#\B (when (char= #\a weapon)
(values t #\c)))
(#\D (when (char= #\c weapon)
(values t #\e)))
(#\F (when (char= #\e weapon)
(values t #\g)))
(#\H (when (char= #\g weapon)
(values t #\i)))
(#\J (when (char= #\i weapon)
(values t #\k)))
(#\L (when (char= #\k weapon)
(values t #\a)))))
(defun main (input)
(multiple-value-bind (monsters weapons) (parse-input input)
(loop :while weapons
:with num-defeated := 0
:for w := (pop weapons)
:do (loop :for m :in monsters
:with survivors := '()
:do (multiple-value-bind (defeatedp got-weapon) (attack m w)
(if defeatedp
(progn
(pushnew got-weapon weapons)
(incf num-defeated))
(push m survivors)))
:finally (setf monsters survivors))
:finally (return (princ-to-string num-defeated)))))
;;--------------------------------------------------------------------
;; Tests
;;--------------------------------------------------------------------
(defun =>? (got want)
(assert (string= got want)))
(progn
(=>? (main "gLDLBgBgHDaD") "6")
(=>? (main "DBcDLaLgDBH") "6")
(=>? (main "JJca") "0")
(=>? (main "FJDLBH") "0")
(=>? (main "HJBLFDg") "6")
(=>? (main "HBaDLFJ") "6")
(=>? (main "DJaHLB") "2")
(=>? (main "gDLHJF") "3")
(=>? (main "cJFgLHD") "5")
(=>? (main "FFBJaJJ") "1")
(=>? (main "FJeJFBJ") "2")
(=>? (main "iJFFJJB") "3")
(=>? (main "JBJiLFJF") "5")
(=>? (main "JDiFLFBJJ") "8")
(=>? (main "BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB") "28")
(=>? (main "DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF") "24")
(=>? (main "FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF") "16")
(=>? (main "FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF") "0")
(=>? (main "FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF") "31")
(=>? (main "FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF") "30")
(=>? (main "HBkFFFFHBLH") "3")
(=>? (main "FBHHFFFHLaB") "2")
(=>? (main "LFHFBBcHFHF") "0")
(=>? (main "LFBHFFeFHBH") "7")
(=>? (main "LgFHHHBFBFF") "3")
(=>? (main "FFiFHBHLBFH") "0")
(=>? (main "BFHHFFHBeFLk") "10")
(=>? (main "FHFaBBHFHLFg") "5")
(=>? (main "FFgacaFg") "0")
(=>? (main "JHDaDcBJiiHccBHDBDH") "9")
(=>? (main "FHJJLckFckFJHDFF") "12")
(=>? (main "DeDHJHDFHJBLHDLLDHJLBDD") "22")
(=>? (main "gJLLLJgJgJLJL") "0")
(=>? (main "DaaaDDD") "0")
(=>? (main "HFeJFHiBiiBJeJBBFFB") "9")
(=>? (main "FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB") "32")
(=>? (main "giFLBiBJLLJgHBFJigJJJBLHFLDLL") "23")
(=>? (main "cgkLJcLJJJJgJc") "2")
(=>? (main "LDFHJHcFBDBLJBLFLcFJcDFBL") "22")
(=>? (main "JJHHHkHJkHLJk") "1")
(=>? (main "kHHBBaBgHagHgaHBBB") "11")
(=>? (main "HDBFFDHHHDFLDcHHLFDcJD") "20")
(=>? (main "HFFFHeFFee") "7")
(=>? (main "gLLDHgDLgFL") "1")
(=>? (main "JJJBBaBBHBBHaLBHJ") "7")
(=>? (main "FBFBgJBDBDgF") "0")
(=>? (main "LLLLakakLakLL") "7")
(=>? (main "HeJHeJe") "0")
(=>? (main "LDFLBLLeBLDBBFFBLFBB") "4")
)
;;====================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment