2 / 2 / 0
Регистрация: 14.04.2017
Сообщений: 7

Clojure Прочитать список CDR-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих

14.04.2017, 20:26. Показов 3703. Ответов 5

Author24 — интернет-сервис помощи студентам
Дана информация о телефонных разговорах сотрудников некоторой компании в виде списка CDR-записей (Call Detail Record). Каждая запись представляет собой строку, содержащую сведения об одном звонке. Формат записи следующий: "Номер-А;Номер-Б;Длительность-разговора". "Номер А" – это номер вызывающего абонента (то есть номер того, кто звонил), "Номер Б" – номер вызываемого абонента (то есть кому звонили), "Длительность-разговора" - длительность разговорного состояния в секундах. Разделитель полей – точка с запятой ';', между полей могут присутствовать пробелы (но не внутри полей). Записи другого формата считать некорректными и игнорировать.

Внутренние номера сотрудников компании – четырехзначные и начинаются с единицы, например, "1101", "1299" и т.д. Внешние номера записаны в соответствии с общим международным телекоммуникационным планом нумерации E.164, то есть начинаются с символа '+', за которым следует не более 15 цифр: код страны и телефонный номер, например "+78129991316" (7 - Россия, 812 - Санкт-Петербург, 999-13-16 – номер) или "+3314562024112" (33 - Франция, 1 - Париж, 45 62 02 41 12 - номер).

Необходимо прочитать список CDR-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих звонков в Германию (код страны 49) и Италию (код страны 39) кого из сотрудников компании (то есть с какого внутреннего номера) была максимальной. В стандартный поток вывода записать внутренний номер сотрудника.

Пример: Дан список CDR-записей ("1101;+79119989911;122" "+49231114563;1102;347" "1101;+420023334521;134" "1102;+49023334521;811" "ERR01:1234;;;0;0" "1101;+390145211212;93" "1101;+49023334521;756"). Длительность всех исходящих звонков абонента 1101 в Германию и Италию больше, чем у абонента 1102. В стандартный поток вывода необходимо записать номер 1101 (без кавычек или иных знаков).

Примечание: Настоящие CDR-записи, которые можно получить от настоящих телефонных станций, несут гораздо больше информации и не содержат приведенных к E.164 номеров, а содержат либо точную последовательность цифр, набранных на аппарате абонента, либо АОН, пришедший из ТФОП.
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2017, 20:26
Ответы с готовыми решениями:

Ввести со стандартного потока ввода числа и поместить их в список
Разработайте программу, которая вводит со стандартного потока ввода числа и помещает их в список так, чтобы элементы его составляли...

Считывание из стандартного потока ввода
Доброго времени суток . Столкнулся вот с такой проблемой . Есть функция , которая считывает со стандартного потока ввода код программы на...

Считывание из стандартного потока ввода
Доброго времени суток, почему в данном коде: #include<iostream> int main(){ int a; char b; std::cin >> a >> b; ...

5
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
37903 / 20969 / 4295
Регистрация: 12.02.2012
Сообщений: 34,497
Записей в блоге: 14
14.04.2017, 20:38
Не слишком рационально, но работает:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(defun clear-1 (lst)
  (mapcar (lambda (x) (remove #\  x)) lst))
  
(defun chk-rec (r)
  (= 2 (- (length r) (length (remove #\; r)))))
 
(defun clear-2 (lst)
  (let ((lst1 (clear-1 lst)))
     (remove-if-not #'chk-rec lst1)))
     
(defun cut-rec (rec)
  (let ((p1 nil)(r1 nil) 
        (p2 nil)(r2 nil)
        (p3 nil)(r3 nil))         
   (setf p1 (position #\; rec))
   (setf r1 (subseq rec 0 p1))
   (setf rec (subseq rec (+ 1 p1)))
   (setf p2 (position #\; rec))
   (setf r2 (subseq rec 0 p2))
   (setf rec (subseq rec (+ 1 p2)))
   (setf p3 (position #\; rec))
   (setf r3 (subseq rec 0 p3))
   (list r1 r2 r3)))
   
(defun add-ring (code tim lst)
  (cond ((null lst) (list (cons code tim)))
        ((= code (caar lst)) (cons (cons code (+ (cdar lst) tim)) (cdr lst)))
        (t (cons (car lst) (add-ring code tim (cdr lst))))))
        
(defun task (lst) 
  (let ((clst (clear-2 (clear-1 lst)))
        (freq nil)
        (r1 nil)
        (r2 nil)
        (cod nil)
        (flst nil))        
     (mapcar #'(lambda (r) 
       (let ((tmp (cut-rec r))) 
             (setf r1 (car tmp))
             (setf r2 (cadr tmp))
             (setf r3 (caddr tmp))
         (when (or (string= "+49" (subseq r2 0 3)) (string= "+39" (subseq r2 0 3))) (setq freq (add-ring (parse-integer r1) (parse-integer r1) freq))))) clst)
         (caar (sort freq #'> :key #'cdr))))
1
2 / 2 / 0
Регистрация: 14.04.2017
Сообщений: 7
14.04.2017, 21:20  [ТС]
Lisp
1
2
3
4
5
6
7
8
9
10
; file: compile-trunk/1492193913617_43058/app.lisp
; in: DEFUN TASK
;     (SETF R3 (CADDR TMP))
; ==>
;   (SETQ R3 (CADDR TMP))
; 
; caught WARNING:
;   undefined variable: R3
; 
; compilation unit finished
такая вот ошибка
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
37903 / 20969 / 4295
Регистрация: 12.02.2012
Сообщений: 34,497
Записей в блоге: 14
15.04.2017, 06:14
Это не ошибка, а неточность. Добавь описание:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun task (lst) 
  (let ((clst (clear-2 (clear-1 lst)))
        (freq nil)
        (r1 nil)
        (r2 nil)
        (r3 nil)  ;; !!!
        (cod nil)
        (flst nil))        
     (mapcar #'(lambda (r) 
       (let ((tmp (cut-rec r))) 
             (setf r1 (car tmp))
             (setf r2 (cadr tmp))
             (setf r3 (caddr tmp))
         (when (or (string= "+49" (subseq r2 0 3)) (string= "+39" (subseq r2 0 3))) 
                  (setq freq (add-ring (parse-integer r1) (parse-integer r1) freq))))) clst)
         (caar (sort freq #'> :key #'cdr))))
0
112 / 112 / 16
Регистрация: 19.08.2013
Сообщений: 298
19.04.2017, 16:05
Catstail, Может я чего-то не понимаю, но в 21 строке нам nil не вернет?

ПС. все правильно второй аргумент nil для subseq будет означать что до конца берем
0
Модератор
Эксперт функциональных языков программирования
3100 / 2249 / 466
Регистрация: 26.03.2015
Сообщений: 8,778
20.04.2017, 17:12
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Clojure:
Lisp
1
2
3
4
5
6
7
8
9
10
(defn task [data codes]
    (let [prefixes (map #(str "+" %) codes)]
        (->> data
            (map #(str/split % #";"))
            (filter (fn [[_ phone _]] (some #(str/starts-with? phone %) prefixes)))
            (group-by (fn [[id _ _]] id))
            seq
            (map (fn [[k v]] [k (reduce (fn [acc [_ _ sec]] (+ acc (Integer/parseInt sec))) 0 v)]))
            (reduce (fn [[k1 v1] [k2 v2]]  (if (> v1 v2) [k1 v1] [k2 v2])) [0 0])
            ((fn [[k v]] k)))))
1 функция принимает коллекцию данных и коллекцию телефонных кодов стран
2 готовим коллекцию префиксов для фильтрации
4 выделяем из CDR-записей данные (номер абонента, телефон и время)
5 оставляем те, в которых телефон начинается с заданных префиксов
6 группируем по номеру абонента
8 вычисляем сумму секунд для каждого абонента
9 находим абонента с максимальной суммой
http://ideone.com/NmOc1y
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2017, 17:12
Помогаю со студенческими работами здесь

Перегрузка стандартного потока ввода
Суть задачи такова - есть перловский скрипт, который обрабатывает данные из файла, получаемые из перегрузки стандартного потока ввода в...

Ввод слова со стандартного потока ввода
Разработайте программу, которая вводит со стандартного потока ввода числа и помещает их в список так, чтобы элементы его составляли...

Как прочитать длинное число из стандартного ввода?
Как прочитать длинное число из стандартного ввода? Не зная его длины заранее.

Способы считывания строк из стандартного потока ввода
Добрый день. Предложите, пожалуйста, какие-нибудь более красивые способы считывания строк. Например, у нас имеется N строк (в каждой...

Заполнить динамический массив из стандартного потока ввода
Тяжкий случай с динамическими массивами. И думаю не у меня одного. Вот пример заполнения массива данными: char *mess; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru