Сколько слов в А2?

Операционная система, написанная на языке Оберон и проект её перевода на русский язык. Только технические вопросы.
Ответить
БудДен
Сообщения: 854
Зарегистрирован: 07.10.18 14:01

Сколько слов в А2?

Сообщение БудДен » 28.02.20 19:05

Написал программку, чтобы посчитать кол-во слов в A2. Написал на лиспе, т.к. это у меня получается быстрее всего.

Код: Выделить всё

(in-package :cl-user)

(defparameter *результаты* (make-hash-table :test 'equalp))

(defparameter *разделители*
  (format nil "\"\|<>'.:,-;(){}[]^&+*/!~~#$ %=?~A" #\Tab))

(defun разделитель-ли (б)
  (find б *разделители*))

(defun посчитай-слова-в-A2 (шаблон-имён-файлов имя-файла-отчёта)
  (let* ((файлы (directory шаблон-имён-файлов)))
    (dolist (ф файлы)
      (посчитай-в-одном ф))
    (отфильтруй-результаты)
    (выведи-отчёт имя-файла-отчёта)
    (values)))


(defun выкинуть-это-слово-ли (слово)
  (cond
   ((find (elt слово 0) "0123456789")
    t)
   ((= (length слово) 1)
    t)
   ((every (lambda (б) (find б "0123456789")) слово)
    t)
   ((and (find #\0 слово)
         (find #\h слово :test 'equalp)
         (every (lambda (б) (find б "01234567890ABCDEFH")) слово))
    t)
   (t
    nil)))

(defun отфильтруй-результаты ()
  (maphash (lambda (к з)
             (declare (ignore з))
             (when (выкинуть-это-слово-ли к)
               (remhash к *результаты*)))
           *результаты*))


(defun выведи-отчёт (имя-файла-отчёта)
  (with-open-file (в имя-файла-отчёта
                     :direction :output
                     :if-does-not-exist :create
                     :if-exists :supersede)
    (maphash 
     (lambda (к з)
       (print `(,к ,з) в))
     *результаты*)))
 

(defun посчитай-в-одном (имя-файла)
  (with-open-file (ч имя-файла :direction :input)
    (loop
      (let* ((строка (read-line ч nil nil))
             (кнф (null строка)))
        (when кнф (return))
        (let* ((слова
                (split-sequence:split-sequence-if #'разделитель-ли 
                                                  строка
                                                  :remove-empty-subseqs t)))
          (dolist (слово слова)
            (cond ((gethash слово *результаты*)
                   (incf (gethash слово *результаты*)))
                  (t
                   (setf (gethash слово *результаты*) 1)))))))))

(посчитай-слова-в-A2 "c:/ob/jaos/source/*.Mod" "c:/ob/отчёт.текст")


БудДен
Сообщения: 854
Зарегистрирован: 07.10.18 14:01

Re: Сколько слов в А2?

Сообщение БудДен » 28.02.20 19:10

И вот вам результат: https://yadi.sk/d/Z9Y-SNSfoye7Nw

Всего в A2 около 90 тыс различных слов (при этом каждый идентификатор тоже считается словом, даже такой, как
DEV_BROADCAST_HDR или InitForker ).

Аватара пользователя
Лис [Вежливый]
Сообщения: 259
Зарегистрирован: 08.10.18 13:32

Re: Сколько слов в А2?

Сообщение Лис [Вежливый] » 29.02.20 00:20

Такую задачу проще было бы решить через bash-скрипт:
1) найти файлы при помощи find -exec
2) разбить на слова при помощи grep
https://stackoverflow.com/questions/155 ... mmand-line
3) sort
4) uniq
5) wc

MihalNik
Сообщения: 87
Зарегистрирован: 05.11.18 11:02

Re: Сколько слов в А2?

Сообщение MihalNik » 29.02.20 02:47

Лис [Вежливый] писал(а):
29.02.20 00:20
Такую задачу проще было бы решить через bash-скрипт:
1) найти файлы при помощи find -exec
2) разбить на слова при помощи grep
https://stackoverflow.com/questions/155 ... mmand-line
3) sort
4) uniq
5) wc
Человеку, проф. работавшему с делфями, проще всего было взять готовое год назад решение на лазарусе:
http://remdev.org/viewtopic.php?id=313#p3183
Решения на баше представляют низкую капитальную ценность.

Ответить