Прочитать список CDR-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих - Lisp
Формулировка задачи:
Дана информация о телефонных разговорах сотрудников некоторой компании в виде списка 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 номеров, а содержат либо точную последовательность цифр, набранных на аппарате абонента, либо АОН, пришедший из ТФОП.
Решение задачи: «Прочитать список CDR-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих»
textual
Листинг программы
(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)))))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д