Escreva um programa (o corpo da função é suficiente) que aceite uma sequência de caracteres alfanuméricos e valide-a de acordo com a ISO 13616: 2007. O algoritmo para validação é (fonte: artigo da wikipedia no IBAN http://en.wikipedia.org/wiki/International_Bank_Account_Number ):
Validando o IBAN Um IBAN é validado convertendo-o em um número inteiro e executando uma operação básica do mod-97 (conforme descrito na ISO 7064) nele. Se o IBAN for válido, o restante será igual a 1. O algoritmo de validação do IBAN é o seguinte:
- Verifique se o comprimento total do IBAN está correto de acordo com o país. Caso contrário, o IBAN é inválido. Os comprimentos IBAN corretos podem ser encontrados aqui: http://pastebin.com/kp4eECVk (também pode ser encontrado abaixo), ordenados pelo tamanho do número IBAN. os 2 primeiros caracteres de cada número são o código do país. Todos os outros caracteres (letras minúsculas na pasta da pasta, mas podem ser qualquer caso no IBAN real) atrás dos 2 primeiros podem ter qualquer caractere alfanumérico.
- Mova os quatro caracteres iniciais para o final da string.
- Substitua cada letra da string por dois dígitos, expandindo a string, onde A = 10, B = 11, ..., Z = 35.
- Interprete a sequência como um número inteiro decimal e calcule o restante desse número na divisão por 97
Se o restante for 1, o teste do dígito de verificação é aprovado e o IBAN pode ser válido.
Exemplo (banco fictício do Reino Unido, código de classificação 12-34-56, número da conta 98765432):
- IBAN: GB82 WEST 1234 5698 7654 32 - Rearrange: W E S T12345698765432 G B82 - Convert to integer: 3214282912345698765432161182 - Compute remainder: 3214282912345698765432161182 mod 97 = 1
O algoritmo mais retornará verdadeiro (ou um valor verdadeiro) se o número for válido e falso (ou um valor falso) se o número for inválido de acordo com o algoritmo. Você não precisa verificar se o número realmente existe, apenas se for válido. O algoritmo deve funcionar para cada um dos diferentes números IBAN aprovados mencionados no artigo da Wikipedia acima. O algoritmo deve ser compatível com números com ou sem caracteres separadores entre 2 caracteres alfanuméricos. O caractere separador pode ser pontos, espaços ou traços e um número pode conter diferentes tipos de separadores.
Aplicam-se brechas usuais: sem recursos externos, sem funções ou métodos embutidos.
O tipo de quebra-cabeça é código de golfe. O código mais curto do bytecount vence. O padrão padrão necessário para executar o programa (por exemplo, namespace, classe, declaração de função no OOP) não está incluído no bytecount.
Bônus: se você pode devolver o número IBAN formatado corretamente (de acordo com o formato nacional na wikipedia) em vez de verdadeiro no caso de um número válido, você obtém uma redução de 25% na sua pontuação. Se o número for inválido, você retornará uma sequência literal com o valor "Invalid".
Cópia dos comprimentos de IBAN, caso a pasta seja removida:
Country;Chars;IBAN Fields
Norway;15;NOkk bbbb cccc ccx
Belgium;16;BEkk bbbc cccc ccxx
Burundi;16;BIkk nnnn nnnn nnnn
Denmark;18;DKkk bbbb cccc cccc cc
Faroe Islands;18;FOkk bbbb cccc cccc cx
Finland;18;FIkk bbbb bbcc cccc cx
Greenland;18;GLkk bbbb cccc cccc cc
Netherlands;18;NLkk bbbb cccc cccc cc
Macedonia;19;MKkk bbbc cccc cccc cxx
Slovenia;19;SIkk bbss sccc cccc cxx
Austria;20;ATkk bbbb bccc cccc cccc
Bosnia and Herzegovina;20;BAkk bbbs sscc cccc ccxx
Estonia;20;EEkk bbss cccc cccc cccx
Kazakhstan;20;KZkk bbbc cccc cccc cccc
Lithuania;20;LTkk bbbb bccc cccc cccc
Luxembourg;20;LUkk bbbc cccc cccc cccc
Costa Rica;21;CRkk bbbc cccc cccc cccc c
Croatia;21;HRkk bbbb bbbc cccc cccc c
Latvia;21;LVkk bbbb cccc cccc cccc c
Liechtenstein;21;LIkk bbbb bccc cccc cccc c
Switzerland;21;CHkk bbbb bccc cccc cccc c
Bahrain;22;BHkk bbbb cccc cccc cccc cc
Bulgaria;22;BGkk bbbb ssss ddcc cccc cc
Georgia;22;GEkk bbcc cccc cccc cccc cc
Germany;22;DEkk bbbb bbbb cccc cccc cc
Ireland;22;IEkk aaaa bbbb bbcc cccc cc
Montenegro;22;MEkk bbbc cccc cccc cccc xx
Serbia;22;RSkk bbbc cccc cccc cccc xx
United Kingdom;22;GBkk bbbb ssss sscc cccc cc
Gibraltar;23;GIkk bbbb cccc cccc cccc ccc
Israel;23;ILkk bbbn nncc cccc cccc ccc
United Arab Emirates;23;AEkk bbbc cccc cccc cccc ccc
Andorra;24;ADkk bbbb ssss cccc cccc cccc
Czech Republic;24;CZkk bbbb ssss sscc cccc cccc
Moldova;24;MDkk bbcc cccc cccc cccc cccc
Pakistan;24;PKkk bbbb cccc cccc cccc cccc
Romania;24;ROkk bbbb cccc cccc cccc cccc
Saudi Arabia;24;SAkk bbcc cccc cccc cccc cccc
Slovakia;24;SKkk bbbb ssss sscc cccc cccc
Spain;24;ESkk bbbb gggg xxcc cccc cccc
Sweden;24;SEkk bbbc cccc cccc cccc cccx
Tunisia;24;TNkk bbss sccc cccc cccc cccc
Virgin Islands;24;VGkk bbbb cccc cccc cccc cccc
Algeria;24;DZkk nnnn nnnn nnnn nnnn nnnn
Portugal;25;PTkk bbbb ssss cccc cccc cccx x
Angola;25;AOkk nnnn nnnn nnnn nnnn nnnn n
Cape Verde;25;CVkk nnnn nnnn nnnn nnnn nnnn n
Mozambique;25;MZkk nnnn nnnn nnnn nnnn nnnn n
Iceland;26;ISkk bbbb sscc cccc iiii iiii ii
Turkey;26;TRkk bbbb bxcc cccc cccc cccc cc
Iran;26;IRkk nnnn nnnn nnnn nnnn nnnn nn
France;27;FRkk bbbb bggg ggcc cccc cccc cxx
Greece;27;GRkk bbbs sssc cccc cccc cccc ccc
Italy;27;ITkk xaaa aabb bbbc cccc cccc ccc
Mauritania;27;MRkk bbbb bsss sscc cccc cccc cxx
Monaco;27;MCkk bbbb bsss sscc cccc cccc cxx
San Marino;27;SMkk xaaa aabb bbbc cccc cccc ccc
Burkina Faso;27;BFkk nnnn nnnn nnnn nnnn nnnn nnn
Cameroon;27;CMkk nnnn nnnn nnnn nnnn nnnn nnn
Madagascar;27;MGkk nnnn nnnn nnnn nnnn nnnn nnn
Albania;28;ALkk bbbs sssx cccc cccc cccc cccc
Azerbaijan;28;AZkk bbbb cccc cccc cccc cccc cccc
Cyprus;28;CYkk bbbs ssss cccc cccc cccc cccc
Dominican Republic;28;DOkk bbbb cccc cccc cccc cccc cccc
Guatemala;28;GTkk bbbb cccc cccc cccc cccc cccc
Hungary;28;HUkk bbbs sssk cccc cccc cccc cccx
Lebanon;28;LBkk bbbb cccc cccc cccc cccc cccc
Poland;28;PLkk bbbs sssx cccc cccc cccc cccc
Benin;28;BJkk annn nnnn nnnn nnnn nnnn nnnn
Ivory Coast;28;CIkk annn nnnn nnnn nnnn nnnn nnnn
Mali;28;MLkk annn nnnn nnnn nnnn nnnn nnnn
Senegal;28;SNkk annn nnnn nnnn nnnn nnnn nnnn
Brazil;29;BRkk bbbb bbbb ssss sccc cccc ccct n
Palestinian;29;PSkk bbbb xxxx xxxx xccc cccc cccc c
Qatar;29;QAkk bbbb cccc cccc cccc cccc cccc c
Ukraine;29;UAkk bbbb bbcc cccc cccc cccc cccc c
Jordan;30;JOkk bbbb nnnn cccc cccc cccc cccc cc
Kuwait;30;KWkk bbbb cccc cccc cccc cccc cccc cc
Mauritius;30;MUkk bbbb bbss cccc cccc cccc cccc cc
Malta;31;MTkk bbbb ssss sccc cccc cccc cccc ccc