Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
1

Clojure Медальный зачет на олимпиаде 2014

11.02.2014, 17:32. Показов 1391. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Sochi 2014 Results - в целом неплохое, на первый взгляд, приложение, информирующее о результатах олимпиады. Но если заглянуть в таблицу с медальным зачетом, то Россия там у них почему-то на 9-м месте вместо 6-го. (ниже - скрин программы и результатов гугл-запроса для сравнения). Поможем разработчикам в решении этой вовсе не сложной задачи.
Мой вариант:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
; =================================ПОСТРОЕНИЕ СПИСКА==============================
;                                                                   Добавление новых медалей
(defun ADD-MEDALS (medals country l)
    (cond
        ((null l) (list (cons medals country)))
        ((equal (cdar l) country) (cons (cons medals country) (cdr l)))
        (t (cons (car l) (ADD-MEDALS medals country (cdr l))))))
 
;                                                              Строим список медального зачета
(setq medals (ADD-MEDALS '(1 2 3) 'Russia medals))
(setq medals ...)
 
;                                                                         Получен список:
        
(Printing medals)
((1 0 0) . Switzerland)
((2 0 3) . United-States)
((1 2 3) . Russia)
((3 3 1) . Canada)
((1 0 0) . Poland)
((1 0 1) . France)
((1 2 0) . Austria)
((2 0 0) . Germany)
((2 1 4) . Norway)
((3 2 2) . Netherlands)
 
==> done
 
;(defun PRINTING (l)
;   (cond
;       ((null l) 'done)
;       (t (printsline (car l)) (PRINTING (cdr l)))))
 
; ====================================СОРТИРОВКА==================================
;                                                   Сравнение двух списков медалей
(defun GREATER (l lst)
    (cond
        ((or (null l) (null lst)) nil) 
        ((> (car l) (car lst)) t)
        ((< (car l) (car lst)) nil)
        (t (GREATER (cdr l) (cdr lst)))))
;                                               (GREATER '(1 1 1) '(1 1 1)) ==> nil
;                                               (GREATER '(2 1 1) '(1 1 1)) ==> t
;                                               (GREATER '(1 2 1) '(1 1 1)) ==> t
;                                               (GREATER '(1 1 1) '(1 2 1)) ==> nil
 
;                                                   Один шаг сортировки по медалям
(defun STEPS (l)
    (cond
        ((null (cdr l)) (list (car l)))
        ((GREATER (caar l) (caadr l)) (cons (cadr l) (STEPS (cons (car l) (cddr l)))))
        (t (cons (car l) (STEPS (cdr l))))))
 
;                                                       Сортировка по медалям
(defun SORT (l &optional (lst (STEPS l)))
    (cond
        ((null l) nil)
        (t (cons (last lst) (SORT (cdr l) (STEPS (butlast lst)))))))    
 
;                                                   Упорядочиваем список
(printing (SORT medals))
(((3 3 1) . Canada))
(((3 2 2) . Netherlands))
(((2 1 4) . Norway))
(((2 0 3) . United-States))
(((2 0 0) . Germany))
(((1 2 3) . Russia))
(((1 2 0) . Austria))
(((1 0 1) . France))
(((1 0 0) . Poland))
(((1 0 0) . Switzerland))
 
==> done
Предложите менее громоздкое решение.
Миниатюры
Clojure Медальный зачет на олимпиаде 2014   Clojure Медальный зачет на олимпиаде 2014  
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2014, 17:32
Ответы с готовыми решениями:

Одномерный массив. Зачёт/ не зачёт для студентов
Нужно сделать массив для 20 студентов, из которого можно вывести &quot;зачет/не зачет&quot; по 5 предметам...

Clojure Как полностью удалить пакеты Clojure и Leiningen в убунту
Всем доброе время суток! Подскажите, пожалуйста. как полностью удалить из убунту пакеты clojure и...

Clojure Ошибка при запуске локального сервера на Clojure в IntellijIDEA
Выводится ошибка по строке, которой даже нет. По отдельности все функции компилируются без...

Clojure Почему невозможно настроить intellij idea для работы с clojure? windows
Получается только emacs. Плюсы emacs - интерактивный встроенный туториал. Даже если и с emacs...

10
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
11.02.2014, 19:20 2
Зачем велосипедизм с sort (и как его вообще можно переопределять???), если в стандартный sort можно передать #'greater?
2
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
11.02.2014, 19:29  [ТС] 3
Цитата Сообщение от helter Посмотреть сообщение
Зачем велосипедизм с sort (и как его вообще можно переопределять???), если в стандартный sort можно передать #'greater?
но в HomeLisp нет библиотечной sort.
Lisp
1
(sort '(1 2 3 4 5) #'>)
- это здесь работать не будет.
2
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
11.02.2014, 19:32 4
Ах-ах, малые диалекты...
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
11.02.2014, 19:46 5
Цитата Сообщение от route66 Посмотреть сообщение
но в HomeLisp нет библиотечной sort.
- есть несколько по-чудному названная qsort-b:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(qsort-b '(1 2 3 4 5) #'>)
 
==> (1 2 3 4 5)
 
(qsort-b '(1 2 3 4 5) #'<)
 
==> (5 4 3 2 1)
 
(DEFUN qsort-b (x fkey) 
 (COND ((NULL x) NIL) 
       (T (APPEND (qsort-b (remove-if (FUNCTION (LAMBDA (z) (FUNCALL fkey z (CAR x)))) (CDR x)) fkey)         
                  (LIST (CAR x)) 
                  (qsort-b (remove-if (FUNCTION (LAMBDA (z) (FUNCALL fkey (CAR x) z))) (CDR x)) fkey)))))
3
1050 / 944 / 107
Регистрация: 04.11.2012
Сообщений: 974
Записей в блоге: 3
12.02.2014, 11:24 6
Лучший ответ Сообщение было отмечено route66 как решение

Решение

Накрутил какой-то ерунды, но результат вроде верный.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(defclass Favorite ()
  ((country :initarg :c :accessor country)
   (gold    :initarg :g :initform 0 :accessor gold  )
   (silver  :initarg :s :initform 0 :accessor silver)
   (bronze  :initarg :b :initform 0 :accessor bronze)))
 
(defparameter *enum* (make-array 0 :fill-pointer 0 :adjustable t))
 
(defun Participant (c g s b)
  (vector-push-extend (make-instance 'Favorite :c c :g g :s s :b b) *enum*))
 
(let ((ls '(
      (Switzerland    1 0 0)
      (United-States  2 0 3)
      (Russia         1 2 3)
      (Canada         3 3 1)
      (Poland         1 0 0)
      (France         1 0 1)
      (Austria        1 2 0)
      (Germany        2 0 0)
      (Norway         2 1 4)
      (Netherlands    3 2 2))))
  (dolist (i ls 'Ok)
    (apply #'Participant i)))
 
; Sorting: © by _sg.
(defun sorts (u)
  (do ((k (- (length u) 1) (1- k)))
      ((zerop k))
    (do ((j 0 (1+ j)))
        ((= j k))
      (and (funcall #'= (gold (aref u k)) (gold (aref u j)))
           (> (silver (aref u k)) (silver (aref u j)))
        (rotatef (aref u k) (aref u j)))))
  u)
 
(defun sortb (u)
  (do ((k (- (length u) 1) (1- k)))
      ((zerop k))
    (do ((j 0 (1+ j)))
        ((= j k))
      (and (funcall #'= (gold (aref u k)) (gold (aref u j)))
           (funcall #'= (silver (aref u k)) (silver (aref u j)))
           (> (bronze (aref u k)) (bronze (aref u j)))
        (rotatef (aref u k) (aref u j)))))
  u)
 
(defun Dump (ar)
  (dotimes (i (length ar))
    (let ((en (aref ar i)))
      (format t "~2D). ~15A GOLD: ~3A SILVER: ~3A BRONZE: ~A~%"
               (1+ i) (country en) (gold en) (silver en) (bronze en)))))
 
(defun Prin (en)
  (Dump (sortb (sorts (sort (copy-seq en) #'> :key #'gold)))))
 
> (Prin *enum*)
 1). CANADA          GOLD: 3   SILVER: 3   BRONZE: 1
 2). NETHERLANDS     GOLD: 3   SILVER: 2   BRONZE: 2
 3). NORWAY          GOLD: 2   SILVER: 1   BRONZE: 4
 4). UNITED-STATES   GOLD: 2   SILVER: 0   BRONZE: 3
 5). GERMANY         GOLD: 2   SILVER: 0   BRONZE: 0
 6). RUSSIA          GOLD: 1   SILVER: 2   BRONZE: 3
 7). AUSTRIA         GOLD: 1   SILVER: 2   BRONZE: 0
 8). FRANCE          GOLD: 1   SILVER: 0   BRONZE: 1
 9). SWITZERLAND     GOLD: 1   SILVER: 0   BRONZE: 0
10). POLAND          GOLD: 1   SILVER: 0   BRONZE: 0
Добавлено через 11 часов 6 минут
Даже вот так, хотя тут тоже есть вопросы.
Но базу данных лучше хранить в векторе, чем в списке, определенно.
Кликните здесь для просмотра всего текста
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
(defclass Favorite ()
  ((country :initarg :c :accessor country)
   (gold    :initarg :g :initform 0 :accessor gold  )
   (silver  :initarg :s :initform 0 :accessor silver)
   (bronze  :initarg :b :initform 0 :accessor bronze)))
 
(defparameter *enum*
  (make-array 0 :fill-pointer 0 :adjustable t))
 
(defun Participant (c g s b)
  (vector-push-extend (make-instance 'Favorite :c c :g g :s s :b b) *enum*))
 
; (Participant 'Russia 1 2 3)
 
(let ((ls '(
      (Switzerland    1 0 0)
      (United-States  2 0 3)
      (Russia         1 2 3)
      (Canada         3 3 1)
      (Poland         1 0 0)
      (France         1 0 1)
      (Austria        1 2 0)
      (Germany        2 0 0)
      (Norway         2 1 4)
      (Netherlands    3 2 2))))
  (dolist (i ls 'Ok)
    (apply #'Participant i)))
 
(defun bubble (u &key (key 'sort-s))
  (do ((k (- (length u) 1) (1- k)))
      ((zerop k))
    (do ((j 0 (1+ j)))
        ((= j k))
      (eval (cons key (list u k j)))))
  u)
 
(defmacro sort-s (u k j)
  `(and (= (gold   (aref ,u ,k)) (gold (aref ,u ,j)))
        (> (silver (aref ,u ,k)) (silver (aref ,u ,j)))
     (rotatef (aref ,u ,k) (aref ,u ,j))))
 
(defmacro sort-b (u k j)
  `(and (= (gold   (aref ,u ,k)) (gold (aref ,u ,j)))
        (= (silver (aref ,u ,k)) (silver (aref ,u ,j)))
        (> (bronze (aref ,u ,k)) (bronze (aref ,u ,j)))
     (rotatef (aref ,u ,k) (aref ,u ,j))))
 
(defmacro sort-str (u k j)
  `(and (= (gold   (aref ,u ,k)) (gold (aref ,u ,j)))
        (= (silver (aref ,u ,k)) (silver (aref ,u ,j)))
        (= (bronze (aref ,u ,k)) (bronze (aref ,u ,j)))
        (string-lessp (country (aref ,u ,k)) (country (aref ,u ,j)))
     (rotatef (aref ,u ,k) (aref ,u ,j))))
 
(defun Dump (ar)
  (format t "-----------------------------------~%")
  (format t " N:|  Country:        | G:| S:| B:|~%")
  (format t "-----------------------------------~%")
  (dotimes (i (length ar))
    (let ((en (aref ar i)))
      (format t "~2D.|  ~15A |~2D |~2D |~2D |~%"
        (1+ i) (country en) (gold en) (silver en) (bronze en))
      (format t "-----------------------------------~%"))))
 
; (Dump *enum*)
 
(defun Prin (en)
  (let* ((q (sort (copy-seq en) #'> :key #'gold))
         (s (bubble q :key 'sort-s))
         (b (bubble s :key 'sort-b))
         (k (bubble s :key 'sort-str)))
    (Dump k)))
 
 
> (Prin *enum*)
-----------------------------------
 N:|  Country:        | G:| S:| B:|
-----------------------------------
 1.|  CANADA          | 3 | 3 | 1 |
-----------------------------------
 2.|  NETHERLANDS     | 3 | 2 | 2 |
-----------------------------------
 3.|  NORWAY          | 2 | 1 | 4 |
-----------------------------------
 4.|  UNITED-STATES   | 2 | 0 | 3 |
-----------------------------------
 5.|  GERMANY         | 2 | 0 | 0 |
-----------------------------------
 6.|  RUSSIA          | 1 | 2 | 3 |
-----------------------------------
 7.|  AUSTRIA         | 1 | 2 | 0 |
-----------------------------------
 8.|  FRANCE          | 1 | 0 | 1 |
-----------------------------------
 9.|  POLAND          | 1 | 0 | 0 |
-----------------------------------
10.|  SWITZERLAND     | 1 | 0 | 0 |
-----------------------------------
3
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.02.2014, 16:38 7
Лучший ответ Сообщение было отмечено route66 как решение

Решение

=)
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
INSOMNIA> (loop
             with content = (drakma:http-request
                            "http://www.sochi2014.com/medali"
                            :user-agent :firefox
                            :want-stream t)
             for line = (read-line content () ())
             while line
             for dat = (cl-ppcre:register-groups-bind (co) 
                           ("<a\\shref=\"/komanda-.+\">(.+)</a>" line)
                         co)
             for medals = (if dat
                              (loop repeat 5
                                 for line = (read-line content () ())
                                 for num = (cl-ppcre:register-groups-bind (co) 
                                               ("<td>(\\d+)</td>" line)
                                             co)
                                 if num collect num into fin
                                 finally (return (cons dat fin))))
             if medals collect medals into res
             finally (unwind-protect 
                          (progn
                            (loop repeat 10 for a in res do
                                 (destructuring-bind (a b c d e)
                                     a
                                   (format t "~A: ~d ~d ~d total:~d~%"
                                           a b c d e)))
                            (close content))))
Норвегия: 4 3 4 total:11
Канада: 4 3 2 total:9
Германия: 4 1 0 total:5
Нидерланды: 3 2 3 total:8
Швейцария: 3 0 1 total:4
Соединенные Штаты: 2 1 4 total:7
Россия: 1 3 3 total:7
Австрия: 1 3 0 total:4
Словения: 1 1 2 total:4
Франция: 1 0 2 total:3
NIL
7
1050 / 944 / 107
Регистрация: 04.11.2012
Сообщений: 974
Записей в блоге: 3
19.06.2015, 17:20 8
Собезьянничаем.
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
(ql:quickload '("cl-ppcre" "drakma"))
(defpackage #:baku (:use #:cl #:cl-ppcre #:drakma))
(in-package #:baku)
 
(defun EuropeanGames ()
  (let ((content (drakma:http-request
                    "http://www.baku2015.com/medals/index.html"
                    :want-stream t))
        (rank 0))
    (loop (unless (listen content) (return (close content)))
      (let* ((string (read-line content nil :eof))
             (team (register-groups-bind (team)
                     ("<span class=\"or-team-data\" cns=\"(.+)\">" string)
                     team))
             (gold (register-groups-bind (gold)
                     ("<td class=\"or-md or-gold\">(\\d+)</td>" string)
                     gold))
             (silv (register-groups-bind (silv)
                     ("<td class=\"or-md or-silver\">(\\d+)</td>" string)
                     silv))
             (bron (register-groups-bind (bron)
                     ("<td class=\"or-md or-bronze\">(\\d+)</td>" string)
                     bron))
             (tota (register-groups-bind (tota)
                     ("<div class=\"or-med-bar\">(\\d+)</div>" string)
                     tota))
            );vars let*     
        (if team 
           (format t "~2d). ~18A " (incf rank) team))
        (if tota
           (format t "~3d ~3d ~3d  total:~3d~%" gold silv bron tota))
        ;; zero values after printing.
        (setq team nil gold nil silv nil bron nil tota nil)))
    (values)))
Кликните здесь для просмотра всего текста

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
> (EuropeanGames)
 
 1). Russia              25  11   9  total: 45
 2). Azerbaijan          12   5  12  total: 29
 3). Hungary              7   2   5  total: 14
 4). Belarus              6   3  12  total: 21
 5). Germany              5   6   7  total: 18
 6). Turkey               5   3  13  total: 21
 7). Serbia               5   3   0  total:  8
 8). Great Britain        4   1   4  total:  9
 9). Ukraine              3   6   9  total: 18
10). Spain                3   6   4  total: 13
11). Italy                3   6   2  total: 11
12). Switzerland          3   4   1  total:  8
13). France               2   4   4  total: 10
14). Netherlands          2   4   4  total: 10
15). Portugal             2   4   1  total:  7
16). Poland               1   4   5  total: 10
17). Croatia              1   2   3  total:  6
18). Sweden               1   1   3  total:  5
19). Slovakia             1   1   2  total:  4
20). Belgium              1   1   1  total:  3
21). Lithuania            1   0   0  total:  1
22). Austria              0   4   3  total:  7
23). Georgia              0   3   3  total:  6
24). Israel               0   2   1  total:  3
25). Bulgaria             0   1   3  total:  4
26). Czech Republic       0   1   2  total:  3
27). Rep. of Moldova      0   1   2  total:  3
28). San Marino           0   1   1  total:  2
29). Armenia              0   1   0  total:  1
30). Greece               0   1   0  total:  1
31). Romania              0   1   0  total:  1
32). MKD                  0   0   2  total:  2
33). Denmark              0   0   1  total:  1
34). Estonia              0   0   1  total:  1
35). Latvia               0   0   1  total:  1
36). Montenegro           0   0   1  total:  1
37). Norway               0   0   1  total:  1
5
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
20.06.2015, 09:17 9
Тоже попробовал, когда-то же нужно начинать
код

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(ns alacrity.core
  (:require [clojure.java.io :refer [as-url]]
            [clojure.pprint :refer [print-table]]
            [net.cgrand.enlive-html :refer [html-resource select text]]))
 
(def ^:dynamic *base-url*
  (as-url "http://www.baku2015.com/medals/index.html"))
;; => #'alacrity.core/*base-url*
 
(def result
  (let [content (html-resource *base-url*)]
    (->> (for [m (-> content (select #{[:td.or-rk] [:span.or-team-data]
                                       [:td.or-md] [:div.or-med-bar]}))]
           (if (= (:tag m) :span)
             (get-in m [:attrs :cns])
             (text m)))
         (partition 6)
         (mapv (partial zipmap '[rank country gold silver bronze total])))))
;; => #'alacrity.core/result
 
(print-table result)


вывод
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
| rank |         country | gold | silver | bronze | total |
|------+-----------------+------+--------+--------+-------|
|    1 |          Russia |   27 |     12 |     10 |    49 |
|    2 |      Azerbaijan |   13 |      5 |     12 |    30 |
|    3 |         Hungary |    7 |      2 |      5 |    14 |
|    4 |         Germany |    6 |      7 |      8 |    21 |
|    5 |         Belarus |    6 |      4 |     12 |    22 |
|    6 |          Serbia |    5 |      4 |      0 |     9 |
|    7 |          Turkey |    5 |      3 |     13 |    21 |
|    8 |   Great Britain |    4 |      2 |      4 |    10 |
|    9 |         Ukraine |    3 |      6 |     11 |    20 |
|   10 |           Spain |    3 |      6 |      5 |    14 |
|   11 |           Italy |    3 |      6 |      2 |    11 |
|   12 |          France |    3 |      4 |      4 |    11 |
|   13 |     Switzerland |    3 |      4 |      1 |     8 |
|   14 |     Netherlands |    2 |      4 |      4 |    10 |
|   15 |        Portugal |    2 |      4 |      1 |     7 |
|   16 |          Poland |    1 |      4 |      5 |    10 |
|   17 |         Croatia |    1 |      2 |      5 |     8 |
|   18 |          Sweden |    1 |      1 |      3 |     5 |
|   19 |        Slovakia |    1 |      1 |      2 |     4 |
|   20 |         Belgium |    1 |      1 |      1 |     3 |
|   21 |       Lithuania |    1 |      0 |      0 |     1 |
|   22 |         Austria |    0 |      4 |      3 |     7 |
|   23 |         Georgia |    0 |      3 |      3 |     6 |
|   24 |          Israel |    0 |      2 |      1 |     3 |
|   25 |        Bulgaria |    0 |      1 |      3 |     4 |
|  =26 |  Czech Republic |    0 |      1 |      2 |     3 |
|  =26 | Rep. of Moldova |    0 |      1 |      2 |     3 |
|   28 |      San Marino |    0 |      1 |      1 |     2 |
|  =29 |         Armenia |    0 |      1 |      0 |     1 |
|  =29 |          Greece |    0 |      1 |      0 |     1 |
|  =29 |         Romania |    0 |      1 |      0 |     1 |
|   32 |             MKD |    0 |      0 |      2 |     2 |
|  =33 |         Denmark |    0 |      0 |      1 |     1 |
|  =33 |         Estonia |    0 |      0 |      1 |     1 |
|  =33 |          Latvia |    0 |      0 |      1 |     1 |
|  =33 |      Montenegro |    0 |      0 |      1 |     1 |
|  =33 |          Norway |    0 |      0 |      1 |     1 |
3
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
09.08.2016, 12:45  [ТС] 10
на Scala:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
case class Medals(gold: Int, silver: Int, bronze: Int)
 
val medalsByCountry = Map[String, Medals](
  "Switzerland"   -> Medals(1, 0, 0),
  "United States" -> Medals(2, 0, 3),
  "Russia"        -> Medals(1, 2, 3),
  "Canada"        -> Medals(3, 3, 1),
  "Poland"        -> Medals(1, 0, 0),
  "France"        -> Medals(1, 0, 1),
  "Austria"       -> Medals(1, 2, 0),
  "Germany"       -> Medals(2, 0, 0),
  "Norway"        -> Medals(2, 1, 4),
  "Netherlands"   -> Medals(3, 2, 2)
)
 
val result = medalsByCountry.toSeq.sortBy {
  case (country, medals) => 
    (medals.gold, medals.silver, medals.bronze)
}(Ordering[(Int, Int, Int)].reverse)
output:
Java
1
2
3
4
5
  (for {
    (country, medals) <- result
  } yield {
      s"$country ${" " * (15 - country.length)} | ${medals.gold} | ${medals.silver} | ${medals.bronze} |\n"
    }).mkString
Код
  res0: String =
   Canada           | 3 | 3 | 1 |
   Netherlands      | 3 | 2 | 2 |
   Norway           | 2 | 1 | 4 |
   United States    | 2 | 0 | 3 |
   Germany          | 2 | 0 | 0 |
   Russia           | 1 | 2 | 3 |
   Austria          | 1 | 2 | 0 |
   France           | 1 | 0 | 1 |
   Poland           | 1 | 0 | 0 |
   Switzerland      | 1 | 0 | 0 |
2
smoke853
25.08.2016, 09:21     Clojure Медальный зачет на олимпиаде 2014
  #11

Не по теме:


Раз уж Scala упомянули, как вариант:

Scala

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.smoke853
 
import net.ruippeixotog.scalascraper.browser.JsoupBrowser
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL._
 
object Main {
  def main(args: Array[String]): Unit = {
    val browser = JsoupBrowser()
    val doc = browser.get("http://www.baku2015.com/medals/index.html")
 
    println("rank |     country     | gold | silver | bronze | total")
    println("-----+-----------------+------+--------+--------+------")
    for (el <- doc >> elementList("tbody tr")) {
      val rank = el >> text("td.or-rk")
      val country = el >> attr("cns")("span.or-team-data")
      val (gold :: silver :: bronze :: Nil)  = el >> texts("td.or-md")
      val total = el >> text("div.or-med-bar")
      println(f"$rank%4s | $country%15s | $gold%4s | $silver%6s | $bronze%6s | $total%5s")
    }
  }
}

Вывод

Java
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
44
rank |     country     | gold | silver | bronze | total
-----+-----------------+------+--------+--------+------
   1 |          Russia |   79 |     40 |     45 |   164
   2 |      Azerbaijan |   21 |     15 |     20 |    56
   3 |   Great Britain |   18 |     10 |     19 |    47
   4 |         Germany |   16 |     17 |     33 |    66
   5 |          France |   12 |     13 |     18 |    43
   6 |           Italy |   10 |     26 |     11 |    47
   7 |         Belarus |   10 |     11 |     22 |    43
   8 |         Ukraine |    8 |     14 |     24 |    46
   9 |     Netherlands |    8 |     12 |      9 |    29
  10 |           Spain |    8 |     11 |     11 |    30
  11 |         Hungary |    8 |      4 |      8 |    20
  12 |          Serbia |    8 |      4 |      3 |    15
  13 |     Switzerland |    7 |      4 |      4 |    15
  14 |          Turkey |    6 |      4 |     19 |    29
  15 |         Belgium |    4 |      4 |      3 |    11
  16 |         Denmark |    4 |      3 |      5 |    12
  17 |         Romania |    3 |      5 |      4 |    12
  18 |        Portugal |    3 |      4 |      3 |    10
  19 |          Poland |    2 |      8 |     10 |    20
  20 |         Austria |    2 |      7 |      4 |    13
  21 |         Georgia |    2 |      6 |      8 |    16
  22 |          Israel |    2 |      4 |      6 |    12
  23 |        Slovakia |    2 |      2 |      3 |     7
  24 |       Lithuania |    2 |      1 |      4 |     7
  25 |         Ireland |    2 |      1 |      3 |     6
  26 |         Croatia |    1 |      4 |      6 |    11
  27 |        Bulgaria |    1 |      4 |      5 |    10
  28 |          Greece |    1 |      4 |      4 |     9
  29 |          Sweden |    1 |      3 |      3 |     7
  30 |        Slovenia |    1 |      1 |      3 |     5
  31 |          Latvia |    1 |      0 |      1 |     2
  32 |  Czech Republic |    0 |      2 |      5 |     7
 =33 |         Estonia |    0 |      1 |      2 |     3
 =33 | Rep. of Moldova |    0 |      1 |      2 |     3
  35 |      San Marino |    0 |      1 |      1 |     2
 =36 |         Armenia |    0 |      1 |      0 |     1
 =36 |          Cyprus |    0 |      1 |      0 |     1
 =38 |             MKD |    0 |      0 |      2 |     2
 =38 |          Norway |    0 |      0 |      2 |     2
 =40 |         Finland |    0 |      0 |      1 |     1
 =40 |          Kosovo |    0 |      0 |      1 |     1
 =40 |      Montenegro |    0 |      0 |      1 |     1

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2016, 09:21

Clojure Clojure, lein-droid, Android ламерство
Пытаюсь разбираться с программированием под Андройд на Lisp'е. Сразу скажу -- имею очень...

Clojure Присвоение ввода с клавиатуры переменной в Clojure
Мне нужен код делающий следующее : 1. Присвоить ввод с клавы переменной. 2. &quot;Сложить&quot; её со...

Clojure Clojure. Последовательность создается задом-наперед
Делаю из SICP задание &quot;треугольник Пифагора&quot;. Вот процедура, которая принимает на вход...

Clojure Ввод данных пользователем в Clojure
Как получать данные от пользователя? На такой код ругается: (defn sum (apply +...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru