-
Notifications
You must be signed in to change notification settings - Fork 40
/
3377.poti
32 lines (27 loc) · 973 Bytes
/
3377.poti
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
quantidade(s: Texto, c: Caractere) = s.selecione(_ == c).tamanho
inclinacao(s: Texto) = quantidade(s, 'U') / quantidade(s, 'R')
tipo Area
area: Real
x, y: Inteiro
fim
area(alfa: Real) = (x, y: Inteiro) => # reta = alfa * x
se alfa * (x - 1) >= y ou alfa * x <= y então
abs(alfa * (x - 0.5) - y)
senão # a reta cruza a linha do caminho
xr = (y / alfa - x) / 2
xr * (y - alfa * x) + (xr + 0.5) * (y - alfa * (x - 1))
fim
calc_area(d: (Inteiro, Inteiro) => Real) =
(a: Area, c: Caractere) => se c == 'R'
entao Area(a.area + d(a.x + 1, a.y), a.x + 1, a.y )
senão Area(a.area , a.x , a.y + 1)
fim
# programa principal
inicio = Area(0.0, 0, 0)
var entrada, t := leia_texto, 1
enquanto entrada <> "S" faça
a = area(inclinacao(entrada))
area_total = entrada.injete(inicio)(calc_area(a)).area
escreva "{t}. {area_total formato "%.3f"}"
entrada, t := leia_texto, t + 1
fim