Letter frequency: Difference between revisions
Content added Content deleted
(→{{header|jq}}: tidy) |
(completely RNRS Scheme with the exception of format, uses native Scheme character representations, more canonical indentation, and an association list instead of a vector) |
||
Line 2,277: | Line 2,277: | ||
=={{header|Scheme}}== |
=={{header|Scheme}}== |
||
Using guile scheme 2.0.11, but the functions that don't use format should work in any implementation. |
|||
=== Imperative version === |
|||
Note that this prints the scheme representations of characters in no particular order. |
|||
{{novice example|scheme}} |
|||
<lang scheme>(use-modules (ice-9 format)) |
|||
For brevity, outputs only lower-case letters. |
|||
⚫ | |||
<lang scheme>#!/usr/local/bin/gosh |
|||
(if |
|||
(eof-object? (peek-char port)) |
|||
table |
|||
(char-freq port (add-char (read-char port) table)))) |
|||
⚫ | |||
(use srfi-1) ;; iota |
|||
(cond |
|||
((null? table) (list (list char 1))) |
|||
((eq? (caar table) char) (cons (list char (+ (cadar table) 1)) (cdr table))) |
|||
(#t (cons (car table) (add-char char (cdr table)))))) |
|||
(define |
(define (format-table table) |
||
(if |
|||
(not (null? table)) |
|||
(begin |
|||
(format #t "~10s~10d~%" (caar table) (cadar table)) |
|||
(format-table (cdr table))))) |
|||
(define ( |
(define (print-freq filename) |
||
( |
(format-table (char-freq (open-input-file filename) '()))) |
||
(show-char-freqs #\a #\z)) |
|||
(print-freq "letter-frequency.scm")</lang> |
|||
⚫ | |||
(let* ((ln (read-line)) |
|||
(at-eof (eof-object? ln))) |
|||
(if (not at-eof) |
|||
(let ((string-chars (string->list ln))) |
|||
(for-each count-char-freq string-chars) |
|||
(count-char-freqs))))) |
|||
Output when reading own source: |
|||
(define (count-char-freq ch) |
|||
⚫ | |||
(if (char-alphabetic? ch) |
|||
⚫ | |||
(let* ((char-num (char->integer (char-downcase ch))) |
|||
#\s 9 |
|||
#\e 51 |
|||
⚫ | |||
⚫ | |||
(define (show-char-freqs first-letter last-letter) |
|||
⚫ | |||
(format #t "Letter Frequency~%") |
|||
#\d 19 |
|||
(let* ((first-num (char->integer first-letter)) |
|||
#\l 30 |
|||
#\space 97 |
|||
(num-count (+ 1 (- last-num first-num))) |
|||
#\i 17 |
|||
#\c 28 |
|||
#\9 1 |
|||
#\f 21 |
|||
⚫ | |||
⚫ | |||
(let ((ch (integer->char let-num)) |
|||
#\a 51 |
|||
#\t 39 |
|||
#\) 48 |
|||
#\newline 25 |
|||
Example output: |
|||
#\n 18 |
|||
#\h 13 |
|||
Letter frequency |
|||
#\q 7 |
|||
#\p 9 |
|||
#\b 20 |
|||
#\j 1 |
|||
#\? 4 |
|||
#\k 1 |
|||
#\1 4 |
|||
#\+ 1 |
|||
#\# 2 |
|||
#\g 1 |
|||
#\" 4 |
|||
#\~ 3 |
|||
#\0 2 |
|||
#\% 1 |
|||
#\' 1 |
|||
#\y 1 |
|||
#\. 1 |
|||
⚫ | |||
s 10210 |
|||
t 12836 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
z 433 |
|||
=={{header|Seed7}}== |
=={{header|Seed7}}== |