My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
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
# ----------------------------------------------------------------------------
# Conversor de números romanos para indo-arábicos e vice-versa.
# Uso: zzromanos número
# Ex.: zzromanos 1987 # Retorna: MCMLXXXVII
# zzromanos XLIII # Retorna: 43
#
# Autor: Guilherme Magalhães Gall <gmgall (a) gmail com> twitter: @gmgall
# Desde: 2011-07-19
# Versão: 2
# Licença: GPL
# Requisitos: zzmaiusculas
# ----------------------------------------------------------------------------
zzromanos ()
{
zzzz -h romanos "$1" && return

local arabicos_romanos="\
1000:M
900:CM
500:D
400:CD
100:C
90:XC
50:L
40:XL
10:X
9:IX
5:V
4:IV
1:I"

# Deixa o usuário usar letras maiúsculas ou minúsculas
local entrada=$(echo "$1" | zzmaiusculas)
local saida=""
local indice=1
local comprimento
# Regex que valida um número romano de acordo com
# http://diveintopython.org/unit_testing/stage_5.html
local regex_validacao='^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'

# Se nenhum argumento for passado, mostra lista de algarismos romanos
# e seus correspondentes indo-arábicos
if [ $# -eq 0 ]
then
echo "$arabicos_romanos" |
sed -r '
s/\t([0-9]+):([IVXLCDM]+)/\2\t\1/;
/[IVXLCDM]{2}/d' |
tac

# Se é um número inteiro positivo, transforma para número romano
elif zztool testa_numero "$entrada"
then
while IFS=: read arabico romano
do
while [ "$entrada" -ge "$arabico" ]
do
saida="$saida$romano"
entrada=$((entrada-arabico))
done
done < <(echo "$arabicos_romanos")
echo "$saida"

# Se é uma string que representa um número romano válido,
# converte para indo-arábico
elif echo "$entrada" | egrep "$regex_validacao" > /dev/null
then
saida=0
# Baseado em http://diveintopython.org/unit_testing/stage_4.html
while IFS=: read arabico romano
do
comprimento="${#romano}"
while [ "$(echo "$entrada" | cut -c$indice-$((indice+comprimento-1)))" = "$romano" ]
do
indice=$((indice+comprimento))
saida=$((saida+arabico))
done
done < <(echo "$arabicos_romanos")
echo "$saida"

# Se não é inteiro posivo ou string que representa número romano válido,
# imprime mensagem de uso.
else
zztool uso romanos
fi
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r709 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: aspas ao redor de
variáveis.
r688 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: zzromanos: colocadas aspas
ao redor das variáveis.
r669 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis. Parte
2.
All revisions of this file

File info

Size: 2240 bytes, 86 lines
Powered by Google Project Hosting