Skip to content

Instantly share code, notes, and snippets.

@tkych
Created December 24, 2013 11:38
Show Gist options
  • Save tkych/8112089 to your computer and use it in GitHub Desktop.
Save tkych/8112089 to your computer and use it in GitHub Desktop.
;;;; Last modified: 2013-12-24 20:37:43 tkych
;;====================================================================
;; 道なりの亀
;;====================================================================
;; - [道なりの亀 〜 横へな 2013.7.6 参考問題](http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/)
;; - [第12回オフラインリアルタイムどう書くの参考問題](http://qiita.com/Nabetani/items/1de39df381dfeee305ab)
;;--------------------------------------------------------------------
;; Package
;;--------------------------------------------------------------------
(in-package :cl-user)
(defpackage :turtle (:use :cl))
(in-package :turtle)
;;--------------------------------------------------------------------
;; Main
;;--------------------------------------------------------------------
(defparameter *map*
"
?????????????
?ABCDEFGHIJK?
?LMNOPQRSTUV?
?WXYZabcdefg?
?hij?????765?
?klm? ?432?
?nop? ?10z?
?qrs? ?yxw?
?tuv? ?vut?
?wxy? ?srq?
?z01? ?pon?
?234? ?mlk?
?567?????jih?
?gfedcbaZYXW?
?VUTSRQPONML?
?KJIHGFEDCBA?
?????????????
")
(defun coord->pos (x y) ; (+ 1 x (* 14 y))
(+ #.(length "
")
x
(* #.(length "?ABCDEFGHIJK?
")
y)))
(defun get-tile (x y) (char *map* (coord->pos x y)))
(defun main (input)
(with-output-to-string (s)
(princ (get-tile 1 1) s) ;for #\A as init
(loop :with dir := 0
:with x := 1
:with y := 1
:for c :across input
:do (case c
(#\L (decf dir 90))
(#\R (incf dir 90))
(t (dotimes (_ (digit-char-p c 16))
(ecase (mod dir 360)
(0 (incf x))
(90 (incf y))
(180 (decf x))
(270 (decf y)))
(let ((tile (get-tile x y)))
(princ tile s)
(when (char= #\? tile)
(LOOP-FINISH)))))))))
;;--------------------------------------------------------------------
;; Tests
;;--------------------------------------------------------------------
(defun =>? (got expected)
(assert (string= got expected)))
(progn
(=>? (main "2RcL3LL22") "ABCNYjmpsvy147edcbcdef")
(=>? (main "L3R4L5RR5R3L5") "A?")
(=>? (main "2ReLLe") "ABCNYjmpsvy147eTITe741yvspmjYNC")
(=>? (main "1ReRRe") "ABMXilorux036fUJUf630xuroliXMB")
(=>? (main "ReRRe") "ALWhknqtwz25gVKVg52zwtqnkhWLA")
(=>? (main "f") "ABCDEFGHIJK?")
(=>? (main "Rf") "ALWhknqtwz25gVK?")
(=>? (main "1Rf") "ABMXilorux036fUJ?")
(=>? (main "2Rf") "ABCNYjmpsvy147eTI?")
(=>? (main "aR1RaL1LaR1R2L1L2") "ABCDEFGHIJKVUTSRQPONMLWXYZabcdefg567432")
(=>? (main "2R1R2L1L2R1R2L1L2R1R2L1L2R1R2L1L2") "ABCNMLWXYjihklmponqrsvutwxy")
(=>? (main "2R4R2L4L2R4R2L4L2R4R2L4L2") "ABCNYjmlknqtwxy147efgVK?")
(=>? (main "R1L2R4R2L4L2R4R2L4L2R4R2L4L2") "ALMNYjmponqtwz0147eTUVK?")
(=>? (main "R2L2R4R2L4L2R4R2L4L2R4R2L4L2") "ALWXYjmpsrqtwz2347eTIJK?")
(=>? (main "R3L2R4R2L4L2R4R2L4L2R4R2L4L2") "ALWhijmpsvutwz2567eTI?")
(=>? (main "R5L2L5L1LaR1L4L5") "ALWhknopmjYNCBMXilorux0325gVKJIHGF")
(=>? (main "1R2L4L2R4R2L4L2R4") "ABMXYZabQFGHIJUfg?")
(=>? (main "2R2L4L2R4R2L4L2R4") "ABCNYZabcRGHIJKVg?")
(=>? (main "3R2L4L2R4R2L4L2R4") "ABCDOZabcdSHIJK?")
(=>? (main "4R2L4L2R4R2L4L2R4") "ABCDEPabcdeTIJK?")
(=>? (main "5R2L4L2R4R2L4L2R4") "ABCDEFQbcdefUJK?")
(=>? (main "LLL1RRR1LLL1RRR2R1") "ALMXYZ?")
(=>? (main "R3RRR3") "ALWhij?")
(=>? (main "1LLL4RRR1LR1RL1") "ABMXilm?")
(=>? (main "R2L1R2L1R3R4") "ALWXilmpsvut?")
(=>? (main "7R4f47LLLc6R9L") "ABCDEFGHSd?")
(=>? (main "5RR868L8448LL4R6") "ABCDEFEDCBA?")
(=>? (main "42Rd1RLLa7L5") "ABCDEFGRc?")
(=>? (main "RRLL6RLR1L5d12LaLRRL529L") "ABCDEFGRSTUV?")
(=>? (main "RLR7L6LL1LRRRcRL52R") "ALWhknqtuv?")
(=>? (main "1RLR8RLR1R437L99636R") "ABMXiloruxwtqnkhWLA?")
(=>? (main "LLL2L3La9Le5LRR") "ALWXYZOD?")
(=>? (main "R1LcRR491") "ALMNOPQRSTUV?")
(=>? (main "R8L1R1R512L8RLLReRf") "ALWhknqtwx0z?")
(=>? (main "1RcL8f1L29a5") "ABMXilorux036fedcbaZYXW?")
(=>? (main "R822LeL46LL39LL") "ALWhknqtwz25gfedcbaZYXW?")
(=>? (main "9R3L5LRRLb5R3L7cLLLR4L") "ABCDEFGHIJUf65?")
(=>? (main "7LLRRR2R3R69Lf76eR2L") "ABCDEFGHSdcbaPE?")
(=>? (main "8RRRLL3Le") "ABCDEFGHITe765?")
(=>? (main "8R5RLL6LbL4LL5bL") "ABCDEFGHITe7410z?")
(=>? (main "6LR2R1LR5LRLRL484L63") "ABCDEFGHITe741yxw?")
)
;;====================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment