0votos

Proporción de Ventaja en Haskell

por josejuan hace 3 años

Una alta puntuación puede decir simplemente que el usuario es muy activo y escribe muchas soluciones (luego no es inalcanzable :D). Otro dato que puede ser relevante es la valoración media por solución. En mi caso, mis soluciones (en media) no resultan ser (respecto otros) muy valoradas, lo cual obviamente no quiere decir que sean malas ;P

Calcule la proporción de ventaja entre los 15 primeros miembros de Solveet con mas puntos.

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
{-# LANGUAGE OverloadedStrings #-} 
import Data.Text (Text, unpack) 
import qualified Data.Text.Lazy as LT 
import Network.HTTP 
import Text.HTML.DOM 
import Text.XML 
import Text.XML.Cursor 
import Data.Ratio 
import Control.Monad 
import Text.Printf 
 
-- Descarga y parsea una URL de solveet 
solveetHome :: 𝐒 → IO Document 
solveetHome s = (parseLT ∘ LT.pack) ↥ (simpleHTTP (getRequest $ "http://www.solveet.com" ⧺ s) ↪ getResponseBody) 
 
-- Obtiene el nº de soluciones aportadas por un coder 
coderSolutions :: 𝐒 → IO ℤ 
coderSolutions c = (read ∘ unpack ∘ head ∘ get ∘ fromDocument) ↥ solveetHome c 
  where get r = child r ↪ descendant ↪ element "a" ↪ attributeIs "href" "#solutions" 
              ↪ child ↪ attributeIs "class" "number" ↪ child ↪ content 
 
-- Recupera la lista de "top coders" con sus puntuaciones 
topCoders :: Cursor → [(𝐒, ℤ)] 
topCoders r = 
  let c = child r ↪ descendant ↪ element "li" ↪ child ↪ element "div" ↪ child ↪ element "a" 
      h = c ↪ attribute "href" 
      s = c ↪ child ↪ element "div" ↪ child ↪ content 
  in  zip (unpack ↥ h) ((read ∘ unpack) ↥ s) 
 
-- Presenta un report 
reportCoders :: IO () 
reportCoders = do 
  ss ← (topCoders ∘ fromDocument) ↥ solveetHome "" 
  ns ← ↱(coderSolutions ∘ fst) ss 
  let maxS = maximum (snd ↥ ss) 
  putStrLn "Coder                |           Ratio : ~ratio | Sols. : Average score by solution" 
  putStrLn "===================================================================================" 
  ↰_(zip ns ss) $ 
    λ(n, (c, s)) →  
      let p = s % maxS 
      in  putStrLn $ printf "%-20s | %15s : %0.4f | %5d : %0.1f" 
                            c (show p) (fromRational p :: 𝔻) n (fromRational (s % n) :: 𝔻) 
 
{- 
 
> reportCoders 
Coder                |           Ratio : ~ratio | Sols. : Average score by solution 
=================================================================================== 
/josejuan            |           1 % 1 : 1.0000 |   467 : 4.9 
/Jose_A_Alonso       |      578 % 2303 : 0.2510 |    53 : 10.9 
/jneira              |      424 % 2303 : 0.1841 |    54 : 7.9 
/drabor              |      349 % 2303 : 0.1515 |    92 : 3.8 
/adr                 |      302 % 2303 : 0.1311 |    36 : 8.4 
/adolfo-pa           |      289 % 2303 : 0.1255 |    22 : 13.1 
/JCarlesVilaseca     |      281 % 2303 : 0.1220 |    27 : 10.4 
/jmgomez             |      158 % 2303 : 0.0686 |    30 : 5.3 
/pedro-vk            |      148 % 2303 : 0.0643 |    48 : 3.1 
/mscarceller         |      130 % 2303 : 0.0564 |    31 : 4.2 
/mlcarlosjulio       |      128 % 2303 : 0.0556 |    48 : 2.7 
/daaldera            |      125 % 2303 : 0.0543 |    96 : 1.3 
/josementi           |      120 % 2303 : 0.0521 |    21 : 5.7 
/alberto             |      103 % 2303 : 0.0447 |    12 : 8.6 
/rchavarriat         |      101 % 2303 : 0.0439 |    71 : 1.4 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.