Прочитать список 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-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих - Lisp»

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)))))

15   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ