Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@tkych
Created November 30, 2013 10:46
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/7717594 to your computer and use it in GitHub Desktop.
Save tkych/7717594 to your computer and use it in GitHub Desktop.
;;;; Last modified: 2013-11-30 19:45:43 tkych
;;====================================================================
;; Y字路巡り
;;====================================================================
;; - [Y字路巡り 〜 横へな 2012.9.7](http://nabetani.sakura.ne.jp/hena/ord3ynode/)
;; - [第3回オフラインリアルタイムどう書くの問題]
;;--------------------------------------------------------------------
(in-package :cl-user)
(defpackage :y-path (:use :cl))
(in-package :y-path)
;;--------------------------------------------------------------------
;; Main
;;--------------------------------------------------------------------
(defparameter *state-alist*
'((#\A #\D #\C #\B #\D #\C) ; (curr . clockwise-next-list)
(#\B #\A #\C #\E #\A #\C)
(#\C #\B #\A #\F #\B #\A)
(#\D #\E #\F #\A #\E #\F)
(#\E #\D #\B #\F #\D #\B)
(#\F #\C #\D #\E #\C #\D)))
(defun get-next (curr prev dir)
(ecase dir
(#\r (third (member prev (assoc curr *state-alist*))))
(#\l (second (member prev (assoc curr *state-alist*))))
(#\b prev)))
;; more readable, but more variables
;; (defun main (input)
;; (with-output-to-string (s)
;; (loop :for dir :across input
;; :for prev := #\B :then curr
;; :for curr := #\A :then next
;; :for next := (get-next curr prev dir)
;; :do (princ curr s)
;; ;; for DBG
;; ;; (format t "~%prev:~A curr:~A dir:~A next:~A"
;; ;; prev curr dir next)
;; :finally (princ next s))))
;; less readable, but less variables
(defun main (input)
(with-output-to-string (s)
(princ #\A s)
(loop :for dir :across input
:for next := (get-next #\A #\B dir) :then (get-next next curr dir)
:and curr := #\A :then next
:do (princ next s)
;; for DBG
;; (format t "~%curr:~A dir:~A next:~A" curr dir next)
)))
;;--------------------------------------------------------------------
;; Tests
;;--------------------------------------------------------------------
(defun =>? (got expected)
(assert (string= got expected)))
(progn
(=>? (main "b") "AB")
(=>? (main "l") "AD")
(=>? (main "r") "AC")
(=>? (main "bbb") "ABAB")
(=>? (main "rrr") "ACBA")
(=>? (main "blll") "ABCAB")
(=>? (main "llll") "ADEBA")
(=>? (main "rbrl") "ACADE")
(=>? (main "brrrr") "ABEDAB")
(=>? (main "llrrr") "ADEFDE")
(=>? (main "lrlll") "ADFEDF")
(=>? (main "lrrrr") "ADFCAD")
(=>? (main "rllll") "ACFDAC")
(=>? (main "blrrrr") "ABCFEBC")
(=>? (main "brllll") "ABEFCBE")
(=>? (main "bbrllrrr") "ABACFDEFD")
(=>? (main "rrrrblll") "ACBACABCA")
(=>? (main "llrlrrbrb") "ADEFCADABA")
(=>? (main "rrrbrllrr") "ACBABEFCAD")
(=>? (main "llrllblrll") "ADEFCBCADEB")
(=>? (main "lrrlllrbrl") "ADFCBEFDFCB")
(=>? (main "lllrbrrlbrl") "ADEBCBACFCAB")
(=>? (main "rrrrrrlrbrl") "ACBACBADFDEB")
(=>? (main "lbrbbrbrbbrr") "ADABABEBCBCFE")
(=>? (main "rrrrlbrblllr") "ACBACFCACFDAB")
(=>? (main "lbbrblrlrlbll") "ADADFDABCFDFED")
(=>? (main "rrbbrlrlrblrl") "ACBCBADFEBEFDA")
(=>? (main "blrllblbrrrrll") "ABCFDADEDABEDFE")
(=>? (main "blrllrlbllrrbr") "ABCFDABCBEFDEDA")
(=>? (main "lbrbbrllllrblrr") "ADABABEFCBEDEBCF")
(=>? (main "rrrrbllrlrbrbrr") "ACBACABCFDEDADFC")
)
;;====================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment