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
Respostas:
J (294 - 73,5 = 220,5)
Eu não contei a definição da função (
f=:3 :0
...)
) porque ela pode ser considerada padrão, contando todo o bloco resulta em 304 - 76 = 228 .Testes:
Explicação:
b=.y-.' -.'
: remova qualquer separador do argumento e armazene o resultado emb
.1}.;' '&,&.>_4<\b
: dividab
em grupos de quatro, adicione um espaço na frente de cada grupo, participe dos grupos e remova o espaço principal. Sey
continha um número IBAN válido, esta é sua representação canônica (ou seja, grupos de quatro, separados por espaços, com o último grupo talvez tendo menos de quatro elementos).(
...){'Invalid';
: crie uma matriz com a sequênciaInvalid
como elemento 0 e o número IBAN formatado como elemento 1. Selecione a matriz correta com base na validade do número IBAN:'NO.BEBI.---.JOKWU.MT.'
: uma lista de todos os códigos de país para cada comprimento, separados por pontos+/"1(2{.b)&E.;.2
: agrupe a sequência pelos pontos e veja qual deles contém o código do país (os 2 primeiros elementos deb
).15+1 i.~
: encontre o índice do correspondente e adicione15
para encontrar o comprimento.(#b)=
: verifique com o comprimento real deb
.4|.b
: gireb
para a esquerda 4 (reorganize)k=.3&u:
: encontre o valor ASCII para cada número48-~k-7*64<k
: subtraia 7 de cada letra e subtraia 48 de todos, fornecendo os valores1".'x',~' '-.~":
: formate, remova espaços, adicione um 'x' no final (para o modo de alta precisão, necessário para grandes números) e volte a transformá-lo em número1=97|
: verifique se o número mod 97 é igual a 1.>
: desmarque a sequência resultantefonte
CJam,
151,5141,75 pontosO programa acima tem 189 bytes e se qualifica para o bônus.
Ao custo de mais 26 bytes - para uma pontuação total de 161,25 -, podemos evitar caracteres não imprimíveis:
Você pode testar esta versão no intérprete CJam .
Exemplo de execução
Como funciona
converte a seqüência de caracteres
"…"
em um número inteiro, considerando-o um número de base 256; em seguida, em uma matriz de números inteiros, considerando-o um número de base 27, adiciona o código de caractere de@
cada dígito e lança o caractere no processo.Como resultado, o seguinte código é executado:
fonte
LANG=en_US java -jar cjam-0.6.2.jar iban.cjam<<<GB82WEST12345698765432
saídas Inválido, o que estou fazendo de errado (executando no Windows8.1 e Cygwin)?md5sum iban.cjam
deve imprimir1960c33e31ae5646cd0400826757b3bc
. 2. O código do idioma está instalado corretamente? Você pode verificar executandolocale -a | grep en_US
.fb620d509887f1a7298c3e5ff312401a
).locale -a|grep en_US
saídasen_US
een_US.utf8
LANG=en_US cjam <(LANG=en_US cjam gen.cjam) <<< GB82WEST12345698765432
. Incluí uma versão somente ASCII na minha resposta que deve ser mais fácil de verificar.Bater,
738 519 444 434427Aqui está algo para começar: eu escrevi (e salvei 317 caracteres, principalmente no bit de armazenamento do código do país) enquanto a pergunta estava na sandbox. Deixe-me saber se há algum problema.
A função lê stdin, o que é bastante comum no Bash (a pergunta diz "aceita uma sequência de caracteres alfanuméricos", não requer que isso seja por meio de argumentos).
Retorna 0 se o IBAN for válido e um valor diferente de zero se for inválido.
Um IBAN contendo caracteres que não sejam os delimitadores
. -
eA-Z0-9
é inválidoExplicação
Exemplos
fonte
Python 3 - (483 - 25%) 362
fonte
Perl (356 + 2 * 75% = 268,5)
o código é tão confuso que até o destaque da sintaxe do SE se perde nele :)
Explicação
-n
significa ler stdin linha por linha;-l
adiciona novas linhas para imprimirnecessário para a operação do módulo posteriormente para retornar o valor correto.
remova tudo o que não é \ w do IBAN.
converta o número iban em maiúscula, também salve-o em $ T - será usado para imprimir mais tarde.
defina a variável temporária como 15, ela será usada para criar uma tabela de hash com o código do país para o mapeamento de comprimento iban.
divida a string grande em uma matriz de vírgulas ou códigos de país de duas letras e itere sobre ela. se o elemento começa com uma letra, é um código de país - salve-o no hash com um valor de $ q; caso contrário, uma vírgula significa incrementar $ q. então, NO obterá o valor de 15, BE e BI serão 16, e assim por diante.
corresponde aos dois primeiros caracteres do IBAN (o código do país)
verifique se o IBAN tem o tamanho correto para o código do país, salve o resultado em $ q
mover os quatro primeiros caracteres para o final do IBAN
substitua todas as letras pelos números correspondentes, começando com A = 10
imprima "Inválido" ou o IBAN bonito.
1==$_%97*$q
será igual apenas1
para um IBAN com comprimento e restante correto.fonte
perl
subcontesto "único" você vence ;-) Mesmo que seja confuso, você pode tentar explicar um pouco como no exemplo do bash? Muito por favor ?! Se você explica o seu, eu explico o meu :-) (embora eu possa roubar um de seus truques reais, o país comprará o IBAN primeiro). Felicidades.Perl 6 - 354 caracteres - (não tem certeza do bônus)
Lendo a entrada de
IBANS.txt
onSTDIN
e sorver as regras do arquivoir
(eu deixei as regras do total no caso de serem clichê - o arquivo de regras é 191 caracteres de modo que o total seria de 545.IBANS.txt
é o seguinte:Notas
wc -m ibanvalidate.p6
Saída típica:
Este não é um código Perl6 típico (especialmente as
comb
linhas que um desenvolvedor de Perl amigável e influente mencionou isso de passagem): Eu sou iniciante. Quando o concurso terminar, adicionarei / alterarei e faço as modificações sugeridas pelos Perl6-ers. Obrigado por jogar e ser legal :-)fonte
Perl 6 , 311 bytes, pontuação 233,25
Experimente online!
Não tenho certeza
Explicação
fonte
Python3.x (539 caracteres - 25% = 404,25)
(Para ser dito primeiro: estou um pouco confuso com o que as regras devem contar para você, então contei toda a minha função)
539 caracteres - Incluindo
import
edef IBAN(i):
(as guias no início da linha são contadas de qualquer maneira em python para que não importem)Bônus aplicado conforme estabelecido nas regras.
Código com comentários (ainda não concluído ... Estou cansado demais para escrever a parte restante dos comentários ... farei isso amanhã)
fonte
Perl (535)
Ainda não jogou golfe de verdade - não faço ideia se me qualifico para o bônus ;-) adicionarei algumas explicações do tipo @professorfish.
fonte
JavaScript (Node.js) , 372 bytes * .75 = 279
Experimente online!
Casos de teste emprestados da resposta J de @marinus.
fonte