onsdag 2. desember 2015 Julekalender Common Lisp Regex
Utviklerne i Knowit Labs har også laget en julekalender i år. En utviklerkonkurranse i samme stil som jeg gjorde julen 2013. Jeg liker å tro at jeg var en av inspirasjonskildene ;)
Selvfølgelig måtte jeg slenge meg på og løse første oppgave i går. Nå er fristen utløpt, så jeg kan vise frem hvordan jeg løste den. Det var ikke så vanskelig, men siden jeg blant annet fokuserer på Common Lisp i min egen kalender så tenkte jeg at jeg også skulle løse knowits utfordringer i det språket.
Oppgaven presenterte en liste med potensielle "Ruritanianske" personnummer - og man skulle finne ut hvor mange av dem som var gyldige. Et typisk regex-problem.
Her er det jeg skrev for å komme frem til svaret - se på dette som en bonus-teaser i forhold til hva som kommer til å komme av Common Lisp-poster her i desember:
(ql:quickload :drakma)
(ql:quickload :cl-ppcre)
(ql:quickload :split-sequence)
(defun get-id-list ()
(split-sequence:split-sequence-if
(lambda (x) (member x '(#\return #\newline)))
(drakma:http-request "http://pastebin.com/raw.php?i=F8z0JWqa")
:remove-empty-subseqs t))
(defun valid-p (id)
(cl-ppcre:scan "^[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}" id))
(defun main ()
(length (remove-if-not #'valid-p (get-id-list))))
(main)
Dette var første gang jeg hadde fått bruk for å splitte en sekvens i Common Lisp, og jeg måtte google litt for å finne split-sequence. Den viste seg å være en ganske fin utility-funksjon.
Ellers synes jeg løsningen ble fin; drakma gjør det trivielt å laste ned dataene, og cl-ppcre (Portable Perl-compatible regular expressions for Common Lisp) gjør det enkelt å bruke regulære uttrykk. Når jeg tenker meg om kunne jeg nok brukt cl-ppcre til å splitte dataene også, men da hadde jeg jo aldri oppdaget split-sequence.
Om jeg bare hadde brukt cl-ppcre hadde get-id-list
blitt slik:
(defun get-id-list ()
(cl-ppcre:split "\\r\\n"
(drakma:http-request "http://pastebin.com/raw.php?i=F8z0JWqa")))
Jeg anbefaler alle utviklere å delta på knowits julekalender, hvor du blir med i trekningen av valgfri smarttelefon.