No dia dos seus avós, a discagem de um número de telefone era feita com um seletor rotativo como este:
Para discar cada dígito, coloque o dedo no orifício correspondente, puxe-o até a parada do dedo e solte-o. Um mecanismo fará com que o mostrador volte à sua posição de repouso, e o telefone desconectará e reconectará um circuito um número especificado de vezes, fazendo cliques audíveis.
A discagem do dígito N requer N desses "pulsos", exceto N = 0, que é dez pulsos.
Os telefones rotários têm a propriedade de que dígitos grandes (8, 9, 0) demoram mais para discar do que dígitos pequenos (1, 2, 3). Essa foi uma consideração importante na elaboração de mapas antigos de códigos de área, e por que a cidade de Nova York, com sua densidade populacional (e linha telefônica) pesada, obteve 212 (apenas 5 pulsos), enquanto que 907 (26 pulsos) foram para o Alasca, pouco habitada. Obviamente, tudo isso se tornou irrelevante quando a discagem por tom se tornou popular.
O desafio
Escreva, no menor número de bytes possível, um programa ou função que tenha como entrada uma sequência (ou sequência de caracteres) contendo um número de telefone e emita seu número de pulsos de discagem rotativa. Estes devem ser contados da seguinte forma:
Dígitos
- Os dígitos 1 a 9 contam como esse número de pulsos.
- O dígito 0 conta como 10 pulsos.
Cartas
Observe que os dígitos de 2 a 9 no mostrador têm letras do alfabeto latino associadas a eles. Originalmente, eles eram destinados a trocas nomeadas , mas foram reapropriados para palavras de telefone e para sistemas de entrada de mensagens de texto.
Você deve ter letras nos seus números de telefone, usando a atribuição E.161 de letras para dígitos:
- A, B, C = 2
- D, E, F = 3
- G, H, I = 4
- J, K, L = 5
- M, N, O = 6
- P, Q, R, S = 7
- T, U, V = 8
- W, X, Y, Z = 9
Você pode assumir que a entrada já foi dobrada em maiúsculas e minúsculas.
Outros personagens
Você deve permitir o uso arbitrário dos caracteres ()+-./
e do espaço como separadores de formatação. Você pode optar por permitir qualquer caractere não alfanumérico para esse fim, se for mais fácil de implementar.
Esses caracteres não contribuem para a contagem de pulsos.
Código de exemplo
Uma tabela e função de pesquisa sem golf no Python:
PULSES = {
'1': 1,
'2': 2, 'A': 2, 'B': 2, 'C': 2,
'3': 3, 'D': 3, 'E': 3, 'F': 3,
'4': 4, 'G': 4, 'H': 4, 'I': 4,
'5': 5, 'J': 5, 'K': 5, 'L': 5,
'6': 6, 'M': 6, 'N': 6, 'O': 6,
'7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
'8': 8, 'T': 8, 'U': 8, 'V': 8,
'9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
'0': 10
}
def pulse_count(phone_num):
return sum(PULSES.get(digit, 0) for digit in phone_num)
Exemplo de entrada e saída
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
*
e #
, que possuem significados especiais em telefones com tom de toque e não podem ser discados em rotativos.
+- ()*#.
), assim como as letras são restritas a maiúsculas. Corrija-me se eu estiver errado.