Skip to content

Instantly share code, notes, and snippets.

@tkych
Created November 28, 2013 11:47
Show Gist options
  • Save tkych/7690660 to your computer and use it in GitHub Desktop.
Save tkych/7690660 to your computer and use it in GitHub Desktop.
;;;; Last modified: 2013-11-28 20:46:00 tkych
;;====================================================================
;; Rotate Bitmap
;;====================================================================
;; - [第2回 オフラインリアルタイムどう書くの参考問題](http://qiita.com/Nabetani/items/9d80de41903775296ca6)
;;--------------------------------------------------------------------
(in-package :cl-user)
(defpackage :rotate-bitmap (:use :cl))
(in-package :rotate-bitmap)
;;--------------------------------------------------------------------
;; Main
;;--------------------------------------------------------------------
#| DEV Note
size = 3
0 1 2 6 3 0
3 4 5 -> 7 4 1
6 7 8 8 5 2
i = 0, 1, 2, 3, 4, 5, 6, 7, 8
->
a = 6, 3, 0, 7, 4, 1, 8, 5, 2
a(i) = size*(size-1) + (i / size) - size*(i mod size)
(defun a (i size)
(multiple-value-bind (q r) (floor i size)
(+ (* size (1- size))
q
(* -1 size r))))
(defun all-terms (size)
(loop :for i :from 0 :below (* size size) :collect (a i size)))
(all-terms 3) => (6 3 0 7 4 1 8 5 2)
(all-terms 4) => (12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3)
|#
;; input -> size, data, nbits
;; "3:5b8" -> 3, #b010110111000, 12
(defun parse (input)
(let ((data-start (1+ (position #\: input))))
(values (parse-integer input :junk-allowed t)
(parse-integer input :start data-start :radix 16)
(* 4 (- (length input) data-start)))))
(defun main (input)
(multiple-value-bind (size data nbits) (parse input)
(let ((result 0))
(loop :for i :from 0 :below (* size size)
:with init := (* size (1- size))
:for a := (multiple-value-bind (q r) (floor i size)
(+ init q (* -1 size r)))
:do (setf (ldb (byte 1 (- nbits 1 i)) result)
(ldb (byte 1 (- nbits 1 a)) data)))
(format nil "~D:~(~@?~)"
size (format nil "~~~D,'0X" (/ nbits 4)) result))))
;;--------------------------------------------------------------------
;; Tests
;;--------------------------------------------------------------------
(defun =>? (got expected)
(assert (string= got expected)))
(progn
(=>? (main "3:5b8") "3:de0")
(=>? (main "1:8") "1:8")
(=>? (main "2:8") "2:4")
(=>? (main "2:4") "2:1")
(=>? (main "2:1") "2:2")
(=>? (main "3:5d0") "3:5d0")
(=>? (main "4:1234") "4:0865")
(=>? (main "5:22a2a20") "5:22a2a20")
(=>? (main "5:1234567") "5:25b0540")
(=>? (main "6:123456789") "6:09cc196a6")
(=>? (main "7:123456789abcd") "7:f1a206734b258")
(=>? (main "7:fffffffffffff") "7:ffffffffffff8")
(=>? (main "7:fdfbf7efdfbf0") "7:ffffffffffc00")
(=>? (main "8:123456789abcdef1") "8:f0ccaaff78665580")
(=>? (main "9:112233445566778899aab") "9:b23da9011d22daf005d40")
)
;;====================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment