Este es un algoritmo muy muy simple, que estoy seguro se puede resolver en muchos idiomas diferentes. En España, las tarjetas de identificación (conocidas como DNI ) constan de 8 números y un carácter de control. El carácter de control se calcula con el siguiente algoritmo: divida el número entre 23, tome el resto de la operación y reemplácelo con un carácter de acuerdo con esta tabla:
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 el DNI pertenece a una persona extranjera que vive en España, el primer dígito se cambia a X
, Y
o Z
y se llama NIE . En este caso, se realizan las siguientes sustituciones antes de calcular el carácter de control:
X Y Z
0 1 2
Hay muchas calculadoras en línea que lo ayudan a obtener el carácter de control, pero, ¿qué tan corto puede escribir ese código? Escriba un algoritmo (programa o función) que reciba un string
con el número DNI (que siempre constará de 8 caracteres alfanuméricos) y devuelva solo el carácter de control único calculado y nada más (se acepta una nueva línea final).
Notas:
- El DNI siempre se escribe en mayúsculas, pero en su algoritmo puede elegir que la entrada y la salida sean mayúsculas o minúsculas, solo sea coherente.
- En la vida real, algunos NIE emitidos antes de 2008 tienen 8 dígitos después del
X
,Y
oZ
, pero para los propósitos de este juego, puedes considerar que tienen 7 dígitos como lo tienen hoy en día. - Puede considerar que la cadena de entrada siempre tendrá 8 caracteres, pero si no están en el formato "8 dígitos" ni en el formato "[XYZ] más 7 dígitos", debe devolver un error (de su elección) o simplemente lanzar una excepción.
Casos de prueba:
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 es el código de golf , ¡así que puede ganar el código más corto para cada idioma!
fuente
Respuestas:
Python 3 , 83 bytes
Pruébalo en línea!
-5 gracias a AlixEinsenhardt (de 99 a 94). -1 gracias a JonathanAllan .
fuente
str('XYZ'.index(n[0]))
porstr(ord(n[0])-88)
y guardar 5 bytes-88
con%4
.Haskell ,
1079392 bytesPruébalo en línea!
fuente
Pyth,
3534 bytesEl código contiene algunos caracteres no imprimibles, por lo que aquí hay un
xxd
hexdump reversible .Utiliza caracteres en minúscula .
Pruébalo en línea. Banco de pruebas.
Versión imprimible
Explicación
cz]1
divide la entrada en la posición 1, por ejemplo,"y0000369"
a["y", "0000369"]
.>3G
obtiene los 3 últimos caracteres del alfabeto,"xyz"
.U3
obtiene el rango [0, 3 [ ,[0, 1, 2]
.X
asignaxyz
a[0, 1, 2]
en la matriz dividida, por ejemplo,["y", "0000369"]
a[1, "0000369"]
. Esto reemplaza el primer carácter si es uno de ellosxyz
, sin tocar la cola de 7 caracteres, ya que cualquier cadena de 7 caracteres no puede ser igual a un solo carácter.s
une la matriz con la cadena vacía, por ejemplo,[1, "0000369"]
a"10000369"
.s
convierte esta cadena a entero, por ejemplo,"10000369"
a10000369
. Esto arroja un error si quedan caracteres adicionales que no sean dígitos en la cadena.%
...23
obtiene el valor del módulo 23, por ejemplo,10000369
a15
.C"
…"
Convierte la cadena binaria de base 256 a entero (aproximadamente 3.06 × 10 26 )..P
...G
obtiene la permutación del alfabeto con ese índice.@
obtiene el carácter correcto de la permutación.fuente
MATL ,
6259 bytesEl error para una entrada no válida es
A(I): index out of bounds
(el compilador se ejecuta en Octave) oIndex exceeds matrix dimensions
(el compilador se ejecuta en Matlab).Pruébalo en línea!
Explicación
fuente
ES6,
83 8281 bytes¡En acción!
Solo en mayúsculas, el código de error para números no válidos es
undefined
.Un byte guardado gracias a Jonathan Allan.
Otro byte guardado gracias a Shaggy.
fuente
%4
lugar de-88
.0
decharCodeAt()
también.Java 8,
154145104 bytes-9 bytes gracias a @ OliverGrégoire .
-41 bytes gracias a @ OliverGrégoire nuevamente, tomando la entrada como una matriz de caracteres (
char[]
).Si la entrada no es válida, fallará con un
java.lang.NumberFormatException
ojava.lang.StringIndexOutOfBoundsException
.Explicación:
Pruébalo aquí (Los casos de prueba no válidos están rodeados por try-catch para que no se detenga en el primer error).
fuente
|
en la expresión regular. Ademásint t=s.charAt(0)-88
yt<0?t+40:t
ahorrarte un byte.'a'
o'0'
no una letra mayúscula, y devuélvala en lugar det/0
y eche todo el lote achar
. Supongo que ahorraría 7 bytes de esta manera. Golfizado de esta manera , obtienes 145 bytes..matches
con esta expresión regular, por cierto. Pero tal vez estoy equivocado.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
por solo 94 bytes (cons
ser achar[]
): ps[0]<88&s[0]>90
para 8 bytes más.PHP , 88 bytes
imprime 1 por un error
Pruébalo en línea!
fuente
Jalea , 42 bytes
Pruébalo en línea!
Demasiado tiempo, Jelly! ¡Dennis está decepcionado de ti! [cita requerida]
fuente
q / kdb +, 68 bytes
Solución:
Ejemplos:
Explicación:
Si el primer carácter,,
x 0
está en la cadena,"XYZ"
entoncesa
será0
,1
o2
. Si el primer carácter no está en la cadena, entoncesa
lo estará3
. Sia
es menor que 3, cambiamos el primer carácter por la cadena de un (0
,1
o2
), de lo contrario, cambiamos por el primer carácter (por lo tanto, no hacemos nada). Esta cadena se convierte en un largo ("J"$
), que luego semod
'd con 23 para dar el resto. Este resto se utiliza para indexar en la tabla de búsqueda.Notas:
" "
se devuelve en los escenarios de error, esto se debe a que la conversión devuelve un valor nulo, y la indexación en una cadena en el índice nulo es un carácter vacío. Podría agregar 4 bytes al principio ("!"^
) para que sea más obvio que se ha producido un error:fuente
JavaScript (ES6), 121 bytes
fuente
Japt , 50 bytes
Similar a la mayoría de los otros enfoques.
La entrada y salida es minúscula, salidas
undefined
para entrada no válida.Pruébelo
Pruebe todos los casos de prueba válidos
fuente
Óxido, 206 bytes
No creo que el óxido sea adecuado para golf de código -_-
fuente
05AB1E ,
414039 bytesToma la entrada en minúsculas (para guardar 1 byte yay )
Pruébalo en línea!
Imprime la entrada a STDERR si está mal formada
Explicación
fuente
Dyalog APL, 95 bytes
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Este es un operador monádico que acepta una cadena de caracteres como su operando y devuelve su resultado.
FIXME no verifica su entrada. No está bien golfizado.
Uso:
fuente