Il s'agit d'un algorithme très très simple, qui, j'en suis sûr, peut être résolu dans de nombreuses langues différentes. En Espagne, les cartes d'identité (appelées DNI ) se composent de 8 chiffres et d'un caractère de contrôle. Le caractère de contrôle est calculé avec l'algorithme suivant: divisez le nombre par 23, prenez le reste de l'opération et remplacez-le par un caractère selon ce tableau:
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
Si le DNI appartient à une personne étrangère vivant en Espagne, le premier chiffre est changé X
, Y
ou Z
il est appelé NIE . Dans ce cas, les substitutions suivantes sont effectuées avant de calculer le caractère de contrôle:
X Y Z
0 1 2
Il existe de nombreuses calculatrices en ligne qui vous aident à obtenir le caractère de contrôle, mais combien de temps pouvez-vous écrire ce code? Écrivez un algorithme (programme ou fonction) qui reçoit un string
avec le numéro DNI (qui sera toujours composé de 8 caractères alphanumériques) et ne renvoie que le seul caractère de contrôle calculé et rien de plus (une nouvelle ligne de fin est acceptée).
Remarques:
- Le DNI est toujours écrit en majuscules, mais dans votre algorithme, vous pouvez choisir l'entrée et la sortie en majuscules ou en minuscules, soyez juste cohérent.
- Dans la vraie vie, certains NPI émis avant 2008 ont 8 chiffres après la
X
,Y
ouZ
, mais pour les besoins de ce jeu, vous pouvez considérer qu'ils ont 7 chiffres car ils ont de nos jours. - Vous pouvez considérer que la chaîne d'entrée aura toujours 8 caractères, mais s'ils ne sont pas au format "8 chiffres" ni au format "[XYZ] plus 7 chiffres", vous devez renvoyer une erreur (de votre choix) ou simplement jeter une exception.
Cas de test:
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>
C'est du code-golf , alors le code le plus court pour chaque langue peut gagner!
la source
Réponses:
Python 3 , 83 octets
Essayez-le en ligne!
-5 grâce à AlixEinsenhardt (de 99 à 94). -1 merci à JonathanAllan .
la source
str('XYZ'.index(n[0]))
parstr(ord(n[0])-88)
et économiser 5 octets-88
par%4
.Haskell ,
1079392 octetsEssayez-le en ligne!
la source
Pyth,
3534 octetsLe code contient des caractères non imprimables, voici donc un
xxd
vidage hexadécimal réversible .Utilise des caractères minuscules .
Essayez-le en ligne. Suite de tests.
Version imprimable
Explication
cz]1
divise l'entrée à la position 1, par exemple"y0000369"
vers["y", "0000369"]
.>3G
obtient les 3 derniers caractères de l'alphabet,"xyz"
.U3
obtient la plage [0, 3 [ ,[0, 1, 2]
.X
Plansxyz
à[0, 1, 2]
dans le tableau fractionné, par exemple["y", "0000369"]
à[1, "0000369"]
. Cela remplace le premier caractère s'il en est unxyz
, tout en laissant la queue de 7 caractères intacte car aucune chaîne de 7 caractères ne peut être égale à un seul caractère.s
joint le tableau avec la chaîne vide, par exemple[1, "0000369"]
à"10000369"
.s
convertit cette chaîne en entier, par exemple"10000369"
en10000369
. Cela génère une erreur s'il reste des caractères non numériques supplémentaires dans la chaîne.%
…23
Obtient la valeur modulo 23, par ex.10000369
pour15
.C"
…"
Convertit la chaîne binaire de la base 256 en entier (environ 3,06 × 10 26 )..P
…G
Obtient la permutation de l'alphabet avec cet index.@
obtient le caractère correct de la permutation.la source
MATL ,
6259 octetsL'erreur pour une entrée non valide est
A(I): index out of bounds
(compilateur exécuté dans Octave) ouIndex exceeds matrix dimensions
(compilateur fonctionnant dans Matlab).Essayez-le en ligne!
Explication
la source
ES6,
83 8281 octetsEn action!
Uniquement en majuscules, le code d'erreur pour les numéros invalides est
undefined
.Un octet sauvé grâce à Jonathan Allan.
Un autre octet enregistré grâce à Shaggy.
la source
%4
plutôt que-88
.0
decharCodeAt()
trop.Java 8,
154145104 octets-9 octets grâce à @ OliverGrégoire .
-41 octets grâce à @ OliverGrégoire à nouveau, en prenant l'entrée comme un tableau de caractères (
char[]
).Si l'entrée n'est pas valide, elle échouera avec un
java.lang.NumberFormatException
oujava.lang.StringIndexOutOfBoundsException
.Explication:
Essayez-le ici. (Les cas de test non valides sont entourés de try-catch pour ne pas s'arrêter à la première erreur.)
la source
|
dans l'expression régulière. Aussiint t=s.charAt(0)-88
&t<0?t+40:t
vous épargner un octet.'a'
ou'0'
ou une lettre non majuscule et revenir qu'au lieu det/0
et jeter le tout àchar
. Vous économisez 7 octets de cette façon, je suppose. Golfé de cette façon , vous obtenez 145 octets..matches
qu'avec cette expression régulière, btw. Mais je me trompe peut-être.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
pour seulement 94 octets (avecs
un achar[]
): ps[0]<88&s[0]>90
pour 8 octets supplémentaires.PHP , 88 octets
imprime 1 pour une erreur
Essayez-le en ligne!
la source
Gelée , 42 octets
Essayez-le en ligne!
Trop longtemps, Jelly! Dennis est déçu de toi! [citation requise]
la source
q / kdb +, 68 octets
Solution:
Exemples:
Explication:
Si le premier caractère,,
x 0
est dans la chaîne,"XYZ"
alorsa
sera0
,1
ou2
. Si le premier caractère n'est pas dans la chaîne, alors lea
sera3
. Sia
est inférieur à 3, nous commutons le premier caractère pour la chaîne d'un (0
,1
ou2
), sinon nous commutons pour le premier caractère (donc ne faisant rien). Cette chaîne est convertie en un long ("J"$
), qui est alorsmod
«d» avec 23 pour donner le reste. Ce reste est utilisé pour indexer dans la table de recherche.Remarques:
" "
est retourné dans les scénarios d'erreur, cela est dû au fait que le transtypage renvoie une valeur null et que l'indexation dans une chaîne à l'index null est un caractère vide. J'ai pu ajouter 4 octets au début ("!"^
) pour rendre plus évidente qu'une erreur s'était produite:la source
JavaScript (ES6), 121 octets
la source
Japt , 50 octets
Similaire à la plupart des autres approches.
L'entrée et la sortie sont en minuscules, les sorties
undefined
pour une entrée invalide.Testez-le
Testez tous les cas de test valides
la source
Rouille, 206 octets
Je ne pense pas que la rouille soit bien adaptée au golf à code -_-
la source
05AB1E ,
414039 octetsPrend l'entrée en minuscules (pour économiser 1 octet oui )
Essayez-le en ligne!
Imprime l'entrée dans STDERR si elle est mal formée
Explication
la source
Dyalog APL, 95 octets
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Il s'agit d'un opérateur monadique qui accepte une chaîne de caractères comme opérande et renvoie son résultat.
RÉPARE-MOI il ne vérifie pas son entrée. Ce n'est pas bien joué.
Usage:
la source