Programeer opdrachtenOpdracht : opdr2b_DirkGerrits.txt

Terug naar de inzendingen
Opdracht 2b,Dirk Gerrits
29-Jan-2005
 Opmerkingen:
 
  * In het gegeven voorbeeld werd "In" veranderd in "Ni" en niet in "nI". Ik heb dus aangenomen dat in de omgekeerde woorden het hoofdlettergebruik moet worden overgenomen. Als dat niet nodig is had ik de functie reverse-preserving-capitalization kunnen weglaten wat 10 regels code zou hebben gescheeld.
 
  * Ik heb aangenomen dat de whitespace tussen woorden intact moet worden gehouden, dus dat:
  Code:
  "foo bar" moet worden omgevormd tot "oof rab" en niet tot "oof rab"
 
  Het zou echter maar 1 regel schelen om dit aan te passen.
 
  * Mijn functie palindromep vergelijkt precies genoeg karakters om te bepalen of een string een palindroom is. Als efficiŽncy geen aandachtspunt is kan er ook een one-liner van worden gemaakt die een string met zijn omgekeerde vergelijkt. Echter, dat scheelt maar 2 regels.
 
  * De functienamen zijn zodanig duidelijk dat de docstrings eigenlijk overbodig zijn. Ik heb me echter aangeleerd elke functie een docstring te geven, en in dit geval zou het toch maar 5 regels uitsparen.
 1 
****palindromes.lisp*****
  
 2;;;; Copyright (c) 2005, Dirk H.P. Gerrits 
 3;;;;
 4;;;; Permission is hereby granted, free of charge, to any person obtaining a
 5;;;; copy of this software and associated documentation files (the "Software"),
 6;;;; to deal in the Software without restriction, including without limitation
 7;;;; the rights to use, copy, modify, merge, publish, distribute, sublicense,
 8;;;; and/or sell copies of the Software, and to permit persons to whom the
 9;;;; Software is furnished to do so, subject to the following conditions:
 10;;;;
 11;;;; The above copyright notice and this permission notice shall be included in
 12;;;; all copies or substantial portions of the Software.
 13;;;;
 14;;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15;;;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16;;;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 17;;;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 18;;;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 19;;;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 20;;;; DEALINGS IN THE SOFTWARE.
 21;;;;
 22;;;; Summary
 23;;;;----------------------------------------------------------------------------
 24;;;; This program transforms the words in a string as described in Pascal Schiks's
 25;;;; programming assignment 2b:
 26;;;; - palindromes have their first and last character capitalized
 27;;;; - other words are reversed, with their capitalization reversed
 28;;;; - the order of the words in the string remains unchanged
 29;;;;
 30;;;; Usage:
 31;;;;----------------------------------------------------------------------------
 32;;;; Just load this file into your favorite Common Lisp implementation.  With
 33;;;; CLISP (http://clisp.cons.org/) this can be done from the command-line as
 34;;;; follows:
 35;;;;
 36;;;; $ clisp palindromes.lisp
 37;;;;
 38;;;; When the file is loaded, the transformation of the default string is shown.
 39;;;;
 40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 41
 42(defun reverse-preserving-capitalization (string)
 43  "Return the reverse of STRING but with the same capitalization of the unreversed STRING."
 44  (map 'string
 45       #'(lambda (reverse-char original-char)
 46           (cond ((upper-case-p original-char) (char-upcase reverse-char))
 47                 ((lower-case-p original-char) (char-downcase reverse-char))
 48                 (t reverse-char)))
 49       (reverse string)
 50       string))
 51
 52(defun capitalize-first-and-last (string)
 53  "Return STRING with its first and last character uppercased."
 54  (string-upcase (string-upcase string :end 1) :start (- (length string) 1)))
 55
 56(defun palindromep (string)
 57  "Returns whether STRING is a palindrome."
 58  (loop for i upfrom 0 below (truncate (length string) 2)
 59        for j downfrom (- (length string) 1)
 60        always (char= (schar string i) (schar string j))))
 61
 62(defun map-string-words (function string)
 63  "Return STRING with all its words replaced by applications of FUNCTION to the words."
 64  (flet ((whitespacep (char)
 65           (member char (list #\space #\tab #\newline))))
 66    (with-output-to-string (result)
 67      (loop with word-end = 0 and word-start = 0 do
 68        (setq word-start (or (position-if-not #'whitespacep string :start word-end)
 69                             (loop-finish)))
 70        (write-string string result
 71                      :start word-end :end word-start)
 72        (setq word-end (or (position-if #'whitespacep string :start word-start)
 73                           (length string)))
 74        (write-string (funcall function (subseq string word-start word-end))
 75                      result)))))
 76                      
 77(defun reverse-words-and-capitalize-palindromes (string)
 78  "Reverse all words in STRING, capitalizing the first and last character of palindromes."
 79  (map-string-words #'(lambda (word)
 80                        (if (palindromep word)
 81                            (capitalize-first-and-last word)
 82                            (reverse-preserving-capitalization word)))
 83                    string))
 84
 85(princ (reverse-words-and-capitalize-palindromes
 86        "In deze programeer opdracht lepel staan naast gewone nepapen woorden ook een paar topspot palindromen meeneem droogoord"))
 
 
Mijn commentaar
 
 Dirk heeft opdracht 2a ook gemaakt,
 opdracht 2b zal daarom enkel ter voledigheid hier getoont worden