Este é um algoritmo muito, muito simples, que tenho certeza de que pode ser resolvido em muitas linguagens diferentes. Na Espanha, os cartões de identificação (conhecidos como DNI ) consistem em 8 números e um caractere de controle. O caractere de controle é calculado com o seguinte algoritmo: divida o número por 23, pegue o restante da operação e substitua-o por um caractere de acordo com esta tabela:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E
Se o DNI pertence a uma pessoa estrangeira a viver em Espanha, o primeiro dígito é alterado para X
, Y
ou Z
e é chamado de NIE . Nesse caso, as seguintes substituições são feitas antes de calcular o caractere de controle:
X Y Z
0 1 2
Existem muitas calculadoras on-line que ajudam a obter o caractere de controle, mas qual é a duração do código? Escreva um algoritmo (programa ou função) que receba um string
com o número DNI (que sempre consistirá em 8 caracteres alfanuméricos) e retorne apenas o caractere de controle único calculado e nada mais (uma nova linha à direita é aceita).
Notas:
- O DNI é sempre escrito em letras maiúsculas, mas em seu algoritmo você pode escolher a entrada e a saída em maiúsculas ou minúsculas, apenas seja consistente.
- Na vida real, alguns NIEs emitidos antes de 2008 têm 8 dígitos após o
X
,Y
ouZ
, mas, para os propósitos deste jogo, você pode considerar que eles têm 7 dígitos como têm atualmente. - Você pode considerar que a sequência de entrada sempre terá 8 caracteres, mas se não estiverem no formato "8 dígitos" nem no formato "[XYZ] mais 7 dígitos", será necessário retornar um erro (de sua escolha) ou apenas jogar uma exceção.
Casos de teste:
00000010 -> X (HRM Juan Carlos I's DNI number)
01234567 -> L
98765432 -> M
69696969 -> T
42424242 -> Y
Z5555555 -> W (Z=2)
Y0000369 -> S (Y=1)
A1234567 -> <Error code or exception>
1231XX12 -> <Error code or exception>
Este é o código-golfe , portanto, pode ganhar o código mais curto para cada idioma!
fonte
Respostas:
Python 3 , 83 bytes
Experimente online!
-5 graças a AlixEinsenhardt (de 99 a 94). -1 graças a JonathanAllan .
fonte
str('XYZ'.index(n[0]))
porstr(ord(n[0])-88)
e salvar 5 bytes-88
por%4
.Haskell ,
1079392 bytesExperimente online!
fonte
Pitão,
3534 bytesO código contém alguns caracteres não imprimíveis, então aqui está um
xxd
hexdump reversível .Usos caracteres minúsculos .
Experimente online. Suíte de teste.
Versão imprimível
Explicação
cz]1
divide a entrada na posição 1, por exemplo"y0000369"
para["y", "0000369"]
.>3G
obtém os três últimos caracteres do alfabeto,"xyz"
,.U3
obtém o intervalo [0, 3 [ ,[0, 1, 2]
.X
mapeiaxyz
para[0, 1, 2]
na matriz dividida, por exemplo,["y", "0000369"]
para[1, "0000369"]
. Isso substitui o primeiro caractere, se for um delesxyz
, mantendo intacto o final de 7 caracteres, pois qualquer sequência de 7 caracteres não pode ser igual a um único caractere.s
une a matriz à sequência vazia, por exemplo[1, "0000369"]
para"10000369"
.s
lança essa string para inteiro, por exemplo"10000369"
para10000369
. Isso gera um erro se algum caractere extra de não dígito for deixado na string.%
…23
Obtém o valor módulo 23, por exemplo10000369
para15
.C"
…"
Converte a sequência binária da base 256 em número inteiro (cerca de 3,06 × 10 26 )..P
...G
Obtém a permutação do alfabeto com esse índice.@
obtém o caractere correto da permutação.fonte
MATL ,
6259 bytesO erro para entrada inválida é
A(I): index out of bounds
(compilador em execução no Octave) ouIndex exceeds matrix dimensions
(compilador em execução no Matlab).Experimente online!
Explicação
fonte
ES6,
83 8281 bytesEm ação!
Apenas em maiúsculas, o código de erro para números inválidos é
undefined
.Um byte economizado graças a Jonathan Allan.
Outro byte economizado graças a Shaggy.
fonte
%4
vez de-88
.0
partircharCodeAt()
também.Java 8,
154145104 bytes-9 bytes graças a @ OliverGrégoire .
-41 bytes graças a @ OliverGrégoire novamente, assumindo a entrada como um array de caracteres (
char[]
).Se a entrada for inválida, ela falhará com um
java.lang.NumberFormatException
oujava.lang.StringIndexOutOfBoundsException
.Explicação:
Experimente aqui. (Os casos de teste inválidos são cercados por try-catch, para que não pare no primeiro erro.)
fonte
|
no regex. Tambémint t=s.charAt(0)-88
&t<0?t+40:t
livre você um byte.'a'
ou'0'
não uma letra maiúscula e devolva-a em vez det/0
e convertendo o lote inteiro parachar
. Você economizaria 7 bytes dessa maneira, eu acho. Jogando golfe dessa maneira , você obtém 145 bytes..matches
com esse regex, btw. Mas talvez eu esteja enganado.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
por apenas 94 bytes (coms
achar[]
): p #s[0]<88&s[0]>90
por mais 8 bytes.PHP , 88 bytes
imprime 1 por erro
Experimente online!
fonte
Geléia , 42 bytes
Experimente online!
Muito tempo, Jelly! Dennis está decepcionado com você! [citação necessária]
fonte
q / kdb +, 68 bytes
Solução:
Exemplos:
Explicação:
Se o primeiro caractere,,
x 0
estiver na sequência"XYZ"
,a
será0
,1
ou2
. Se o primeiro caractere não estiver na sequência,a
será3
. Sea
for inferior a 3, trocamos o primeiro caractere para a cadeia de um (0
,1
ou2
), caso contrário, vamos mudar para fora para o primeiro caractere (assim, efetivamente fazendo nada). Essa string é convertida em long ("J"$
), que é entãomod
d com 23 para fornecer o restante. Esse restante é usado para indexar na tabela de pesquisa.Notas:
" "
é retornado nos cenários de erro, isso ocorre porque a conversão retorna um nulo e a indexação em uma sequência no índice nulo é um caractere vazio. Eu poderia adicionar 4 bytes no início ("!"^
) para tornar mais óbvio que ocorreu um erro:fonte
JavaScript (ES6), 121 bytes
fonte
Japt , 50 bytes
Semelhante à maioria das outras abordagens.
Entrada e saída são minúsculas, saídas
undefined
para entrada inválida.Teste
todos os casos de teste válidos
fonte
Ferrugem, 206 bytes
Eu não acho que a ferrugem é adequada para o código de golfe -_-
fonte
05AB1E ,
414039 bytesLeva a entrada em minúsculas (para salvar 1 byte yay )
Experimente online!
Imprime a entrada em STDERR se estiver malformada
Explicação
fonte
Dyalog APL, 95 bytes
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Este é um operador monádico que aceita uma cadeia de caracteres como seu operando e retorna seu resultado.
FIXME não verifica sua entrada. Não é devidamente jogado.
Uso:
fonte