Escriba una función que, dados los primeros 12 dígitos de un código ISBN-13 , calculará todo el ISBN calculando y agregando un dígito de verificación apropiado.
La entrada de su función es una cadena que contiene los primeros 12 dígitos del ISBN. Su salida es una cadena que contiene los 13 dígitos.
Especificación formal
Escriba una función que, cuando se le da una cadena s que consiste completamente de exactamente 12 dígitos decimales (y no otros caracteres), devuelve una cadena t con las siguientes propiedades:
- t consta de exactamente 13 dígitos decimales (y ningún otro carácter);
- s es un prefijo de t ;
- la suma de todos los dígitos en posiciones impares en t (es decir, el primero, tercero, quinto, etc.), más tres veces la suma de todos los dígitos en posiciones pares en t (es decir, el segundo, cuarto, sexto, etc.), es un múltiplo de 10.
Ejemplo / caso de prueba
Entrada
978030640615
Salida
9780306406157
Condición de victoria
Como un desafío de código de golf , gana la respuesta más corta.
Respuestas:
Golfscript - 25 caracteres
La versión completa del programa solo tiene 19 caracteres
Vuelve aquí para analizarlo más tarde. Mientras tanto, mira mi vieja respuesta no inspirada
Golfscript - 32 caracteres
Similar al cálculo del número de luhn
Análisis para 978030640615
fuente
{
y los últimos tres caracteres;}:f
. Me pregunto si se puede hacer lo mismo para la primera solución ...:f
(sí, sé que las funciones se llamaban comúnmente en ese entonces).Python - 44 caracteres
Python - 53 caracteres
fuente
Haskell - 54 caracteres
Esto requiere soporte para la comprensión de listas paralelas , que es compatible con GHC (con la
-XParallelListComp
bandera) y Hugs (con la-98
bandera).fuente
[1,3]
por[9,7]
y retire el-
cual le ahorra un byte :)APL (27 caracteres)
Estoy usando Dyalog APL como mi intérprete. Aquí hay una explicación rápida, principalmente de derecha a izquierda (dentro de la definición de la función
F←{ ... }
):⍎¨⍵
: Ejecutar / evaluar (⍎
) cada (¨
) carácter dado en el argumento correcto (⍵
).(12⍴1 3)
: Reforma (⍴
) el vector1 3
en un12
vector de elementos (repitiendo para llenar los espacios).+.×
: Tome el producto punto (+.×
) de su argumento izquierdo ((12⍴1 3)
) y su argumento derecho (⍎¨⍵
).10-
: Restar de 10.10|
: Encuentra el resto después de la división por10
.⍕
: Formatee el número (es decir, dé una representación de caracteres).⍵,
: Añadir (,
) nuestro dígito calculado al argumento correcto.fuente
PHP -
868582 caracteresReformatear y explicar:
fuente
Windows PowerShell, 57
fuente
Haskell,
787166 caracteresfuente
Ruby -
7365 caracteresfuente
"\\1"
->'\1'
?f=->s{...}
. Ahorra 6 caracteres. También escriba ens<<(...).to_s
lugar de agregar 48 y useFixnum#chr
.C # (94 caracteres)
Con saltos de línea / espacios en blanco para facilitar la lectura:
Probado en varios ISBN de libros en mi estante, ¡así que sé que está funcionando!
fuente
Python -
91, 89fuente
for
(yin
el tercero) en una comprensión de la lista siempre que el analizador pueda dividirlo (sin usar un nombre de variable). -2 caracteres allí.Perl, 53 caracteres
fuente
C # -
8977 caracteresFormateado para facilitar la lectura:
No multiplicamos por uno o tres, simplemente agregamos todo, además agregamos todos los caracteres pares una vez más, multiplicados por dos.
9992 es lo suficientemente grande como para que la suma de todos los caracteres ASCII sea menor que eso (para que podamos modificar por 10 y asegurarnos de que el resultado sea positivo, no es necesario modificar por 10 dos veces), y no es divisible por cero porque sumamos arriba todos esos 2 * 12 * 48 adicionales (doce dígitos ASCII, pesados por 1 y 3) == 1152, lo que nos permite ahorrar un carácter adicional (en lugar de restar dos veces 48, restamos 0 solo para convertir de char a int, pero en lugar de 990, necesitamos escribir 9992).
Pero, de nuevo, aunque mucho menos hermoso ;-), esta solución de la vieja escuela nos lleva a 80 caracteres (pero esto es casi compatible con C):
fuente
J -
554538p.ej
vieja forma:
fuente
(i.12)(".@{)y
puede ser reemplazado con"."0 y
Ruby - 80 caracteres
fuente
dc, 44 caracteres
Invocar como
lIx
, por ejemplo:fuente
Q, 36 caracteres
fuente
D - 97 caracteres
Formateado de manera más legible:
Sin embargo, la verbosidad del operador de reparto de D definitivamente hace que sea más difícil escribir código obsesivamente corto.
fuente
Java - 161 caracteres :(
fuente
Q (44 caracteres)
fuente
Scala 84
Pruebas:
Resultado:
fuente
C,
8079 caracteresLa función modifica la cadena en su lugar, pero devuelve el puntero de cadena original para satisfacer los requisitos del problema.
Alguna explicación: en lugar de restar 48 (el valor ASCII del dígito
0
) de cada carácter de entrada, el acumuladors
se inicializa de modo que sea un módulo 10 igual a 48 + 3 * 48 + 48 + 3 * 48 ... + 48 + 3 * 48 = 24 * 48 = 1152. El paso10-sum
se puede evitar acumulandos
por sustracción en lugar de sumar. Sin embargo, el operador del módulo%
en C no daría un resultado útil sis
fuera negativo, por lo que en lugar de usars-=
los multiplicadores 3 y 1 se reemplazan por -3 = 7 módulo 10 y -1 = 9 módulo 10, respectivamente.Arnés de prueba:
fuente
Groovy
75, 66 caracteresutilizar:
fuente
APL (25)
fuente
Perl 6 , 29 bytes
Pruébalo en línea!
fuente
Python 2 ,
7876 bytesPruébalo en línea!
Toma una cuerda como argumento.
Explicación:
Usando la notación de corte de python, convierte una cadena en una lista de pares de caracteres. ("978030640615" -> [("9", "7"), ("8", "0"), ("3", "0"), ("6", "4"), ("0 "," 6 "), (" 1 "," 5 ")])
Para esa lista de pares, convierte cada elemento en un entero y devuelve un + 3b.
Suma todos los resultados.
Obtiene el módulo de suma 10, O 10 si el resto es 0. (Esto evita que el último dígito sea 10 en lugar de 0.)
Elimina el resto de 10 para obtener el dígito de verificación.
Convierte el dígito de verificación calculado en una cadena mediante una expresión de retroceso obsoleta.
Devuelve el número original más el dígito de verificación calculado.
Editar:
Ahorró 2 byes al eliminar espacios (¡gracias Jo King !).
fuente
for
yor
APL (Dyalog Unicode) , SBCS de 18 bytes
Función de prefijo tácito anónimo que toma una cadena como argumento. Usando el enfoque de Bubbler .
Pruébalo en línea!
≢
longitud del argumento (12)9 7⍴⍨
remodelar cíclicamente[9,7]
a esa longitud+.×
producto de punto de lo siguiente con eso:⍎¨
`evaluar cada personaje10|
mod-10 de eso,∘⍕
anteponga lo siguiente a la stringificación de eso:⊢
el argumento no modificadofuente
dc , 25 bytes
Pruébalo en línea!
Sé que ya hay una respuesta de CC aquí, pero 25 <44, así que creo que siento 19 bytes de acuerdo. Esto utiliza el hecho de que
8+9^z
es equivalente a cualquiera-3
o-1
mod 10 dependiendo de si z es par o impar. Así que solíaA~
dividir el número en dígitos en la pila, pero a medida que construyo la pila multiplico cada dígito por8+9^z
donde z es el tamaño actual de la pila. Luego los agrego a todos a medida que se despliega la pila de funciones e imprimo el último dígito.fuente
MATLAB - 82 caracteres
fuente
R, 147 caracteres
Uso:
fuente
J, 25
fuente