fork download
  1. ; exercise 7
  2.  
  3. (define (read-line . port)
  4. (define (eat p c)
  5. (if (and (not (eof-object? (peek-char p)))
  6. (char=? (peek-char p) c))
  7. (read-char p)))
  8. (let ((p (if (null? port) (current-input-port) (car port))))
  9. (let loop ((c (read-char p)) (line '()))
  10. (cond ((eof-object? c) (if (null? line) c (list->string (reverse line))))
  11. ((char=? #\newline c) (eat p #\return) (list->string (reverse line)))
  12. ((char=? #\return c) (eat p #\newline) (list->string (reverse line)))
  13. (else (loop (read-char p) (cons c line)))))))
  14.  
  15. (define (string-split sep str)
  16. (define (f cs xs) (cons (list->string (reverse cs)) xs))
  17. (let loop ((ss (string->list str)) (cs '()) (xs '()))
  18. (cond ((null? ss) (reverse (if (null? cs) xs (f cs xs))))
  19. ((char=? (car ss) sep) (loop (cdr ss) '() (f cs xs)))
  20. (else (loop (cdr ss) (cons (car ss) cs) xs)))))
  21.  
  22. (define (read-input)
  23. (let loop ((line (read-line)) (lines (list)))
  24. (if (eof-object? line) lines
  25. (let* ((fields (string-split #\| line))
  26. (student-number (string->number (car fields)))
  27. (class-name (cadr fields))
  28. (grade (string->number (caddr fields)))
  29. (fields (list student-number class-name grade)))
  30. (loop (read-line) (cons fields lines))))))
  31.  
  32. (define (lt? a b)
  33. (or (string<? (cadr a) (cadr b))
  34. (and (not (string<? (cadr b) (cadr a)))
  35. (< (car a) (car b)))))
  36.  
  37. (define (write-output lines)
  38. (let loop ((lines (sort lines lt?)) (prev ""))
  39. (when (pair? lines)
  40. (when (not (string=? prev (cadar lines)))
  41. (display (cadar lines)) (display #\tab)
  42. (display (caddar lines)) (newline))
  43. (loop (cdr lines) (cadar lines)))))
  44.  
  45. (define (exercise7)
  46. (write-output (read-input)))
  47.  
  48. (exercise7)
Success #stdin #stdout 0.04s 8264KB
stdin
22|Data Structures|45
23|English|52
22|English|51
26|Data Structures|72
23|Data Structures|61
21|English|81
stdout
Data Structures	45
English	81