Robert Smith avatar Robert Smith committed 8601ece

Add string compression exercise.

Comments (0)

Files changed (1)

miscellaneous_exercises/compress-spaces.lisp

+;;;; compress-spaces.lisp
+;;;; Copyright (c) 2013 Robert Smith
+
+(defun compress (s &key (max-length 2)
+                        (char-to-compress #\Space))
+  "Compress all runs of CHAR-TO-COMPRESS to sequences of at most
+length MAX-LENGTH."
+  (let ((current-write 0)
+        (run-length    0))
+    (dotimes (current-read (length s) (subseq s 0 current-write))
+      (let ((current-char (char s current-read)))
+        (if (char= current-char char-to-compress)
+            (unless (> (incf run-length) max-length)
+              (setf (char s current-write) current-char)
+              (incf current-write))
+            (progn
+              (setf run-length 0)
+              (setf (char s current-write) current-char)
+              (incf current-write)))))))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.