Écrivez une fonction qui, compte tenu des 12 premiers chiffres d'un code ISBN-13 , calculera l'ISBN entier en calculant et en ajoutant un chiffre de contrôle approprié.
L'entrée de votre fonction est une chaîne contenant les 12 premiers chiffres de l'ISBN. Sa sortie est une chaîne contenant les 13 chiffres.
Spécification formelle
Écrivez une fonction qui, lorsqu'elle reçoit une chaîne s entièrement composée exactement de 12 chiffres décimaux (et aucun autre caractère), renvoie une chaîne t avec les propriétés suivantes:
- t se compose exactement de 13 chiffres décimaux (et pas d'autres caractères);
- s est un préfixe de t ;
- la somme de tous les chiffres dans les positions impaires en t (c'est-à-dire le premier, le troisième, le cinquième, etc.), plus trois fois la somme de tous les chiffres dans les positions paires en t (c'est-à-dire le deuxième, le quatrième, le sixième, etc.), est un multiple de 10.
Exemple / cas de test
Contribution
978030640615
Sortie
9780306406157
Condition de victoire
En tant que défi de code-golf , la réponse la plus courte l'emporte.
Réponses:
Golfscript - 25 caractères
La version complète du programme ne comporte que 19 caractères
Revenez ici pour une analyse ultérieure. En attendant, consultez ma vieille réponse sans inspiration
Golfscript - 32 caractères
Similaire au calcul du nombre luhn
Analyse pour 978030640615
la source
{
et des trois derniers caractères;}:f
. Je me demande si la même chose peut être faite pour la première solution ...:f
(ouais, je sais que les fonctions étaient couramment nommées à l'époque).Python - 44 caractères
Python - 53 caractères
la source
Haskell - 54 caractères
Cela nécessite la prise en charge des compréhensions de listes parallèles , qui sont prises en charge par GHC (avec l'
-XParallelListComp
indicateur) et Hugs (avec l'-98
indicateur).la source
[1,3]
par[9,7]
et supprimer le-
qui vous fait économiser un octet :)APL (27 caractères)
J'utilise Dyalog APL comme interprète. Voici une explication rapide, principalement de droite à gauche (dans la définition de la fonction,
F←{ ... }
):⍎¨⍵
: Exécute / évalue (⍎
) chaque (¨
) caractère donné dans le bon argument (⍵
).(12⍴1 3)
: Remodeler (⍴
) le vecteur1 3
en un12
vecteur -élément (répéter pour combler les lacunes).+.×
: Prenez le produit scalaire (+.×
) de son argument gauche ((12⍴1 3)
) et son argument droit (⍎¨⍵
).10-
: Soustrayez de 10.10|
: Trouvez le reste après la division par10
.⍕
: Formate le nombre (c.-à-d. Donne une représentation des caractères).⍵,
: Append (,
) notre chiffre calculé à l'argument de droite.la source
PHP -
868582 caractèresReformater et expliquer:
la source
Windows PowerShell, 57
la source
Haskell,
787166 caractèresla source
Rubis -
7365 caractèresla source
"\\1"
->'\1'
?f=->s{...}
. Enregistrez 6 caractères. Écrivez égalements<<(...).to_s
au lieu d'ajouter 48 et utilisezFixnum#chr
.C # (94 caractères)
Avec les sauts de ligne / espaces pour la lisibilité:
Testé sur plusieurs ISBN de livres sur mon étagère, donc je sais que ça marche!
la source
Python -
91, 89la source
for
(etin
et le troisième) dans une compréhension de liste tant qu'il peut être divisé par l'analyseur (sans utiliser de nom de variable). -2 caractères là-bas.Perl, 53 caractères
la source
C # -
8977 caractèresFormaté pour la lisibilité:
Nous ne multiplions pas par un ou trois, nous ajoutons simplement tout, et nous ajoutons une fois de plus tous les caractères pairs, multipliés par deux.
9992 est suffisamment grand pour que la somme de tous les caractères ASCII soit inférieure à celle (afin que nous puissions modifier par 10 et être sûr que le résultat est positif, pas besoin de modifier par 10 deux fois), et n'est pas divisible par zéro car nous ajoutons jusqu'à tous ces 2 * 12 * 48 supplémentaires (douze chiffres ASCII, pesés par 1 et 3) == 1152, ce qui nous permet d'épargner un caractère supplémentaire (au lieu de soustraire deux fois 48, nous soustrayons 0 juste pour convertir de char en int, mais au lieu de 990, nous devons écrire 9992).
Mais là encore, bien que beaucoup moins belle ;-), cette solution à l'ancienne nous amène à 80 caractères (mais c'est presque compatible C):
la source
J -
554538par exemple
ancienne façon:
la source
(i.12)(".@{)y
peut être remplacé par"."0 y
Ruby - 80 caractères
la source
DC, 44 caractères
Appelez comme
lIx
, par exemple:la source
Q, 36 caractères
la source
D - 97 caractères
Format plus lisible:
Cependant, la verbosité de l'opérateur de conversion de D rend plus difficile l'écriture de code obsessionnellement court.
la source
Java - 161 caractères :(
la source
Q (44 caractères)
la source
Scala 84
Essai:
Résultat:
la source
C,
8079 caractèresLa fonction modifie la chaîne en place, mais renvoie le pointeur de chaîne d'origine pour répondre aux exigences du problème.
Quelques explications: au lieu de soustraire 48 (la valeur ASCII du chiffre
0
) de chaque caractère saisi, l'accumulateurs
est initialisé pour qu'il soit modulo 10 égal à 48 + 3 * 48 + 48 + 3 * 48 ... + 48 + 3 * 48 = 24 * 48 = 1152. L'étape10-sum
peut être évitée en accumulants
par soustraction au lieu d'addition. Cependant, l'opérateur du module%
en C ne donnerait pas de résultat utilisable s'ils
était négatif, donc au lieu d'utilisers-=
les multiplicateurs 3 et 1, ils sont remplacés respectivement par -3 = 7 modulo 10 et -1 = 9 modulo 10.Harnais de test:
la source
Groovy
75, 66 caractèresutilisation:
la source
APL (25)
la source
Perl 6 , 29 octets
Essayez-le en ligne!
la source
Python 2 ,
7876 octetsEssayez-le en ligne!
Prend une chaîne comme argument.
Explication:
En utilisant la notation de tranche python, convertit une chaîne en une liste de paires de caractères. ("978030640615" -> [("9", "7"), ("8", "0"), ("3", "0"), ("6", "4"), ("0 "," 6 "), (" 1 "," 5 ")])
Pour cette liste de paires, convertit chaque élément en un entier et renvoie un + 3b.
Résume tous les résultats.
Obtient la somme modulo 10, OU 10 si le reste est 0. (Cela empêche le dernier chiffre d'être 10 au lieu de 0.)
Supprime le reste de 10 pour obtenir le chiffre de contrôle.
Convertit le chiffre de contrôle calculé en une chaîne via une expression de backtick déconseillée.
Renvoie le numéro d'origine plus le chiffre de contrôle calculé.
Modifier:
Sauvé 2 byes en supprimant des espaces (merci Jo King !).
la source
for
etor
APL (Dyalog Unicode) , 18 octets SBCS
Fonction de préfixe tacite anonyme prenant la chaîne comme argument. En utilisant l'approche de Bubbler .
Essayez-le en ligne!
≢
longueur de l'argument (12)9 7⍴⍨
remodeler cycliquement[9,7]
à cette longueur+.×
produit scalaire de ce qui suit avec cela:⍎¨
`évaluer chaque personnage10|
mod-10 de cela,∘⍕
ajouter ce qui suit la stringification de cela:⊢
l'argument non modifiéla source
dc , 25 octets
Essayez-le en ligne!
Je sais qu'il y a déjà une réponse DC ici, mais 25 <44, donc je suppose que je me sens bien à 19 octets. Cela utilise le fait qui
8+9^z
est équivalent à-3
ou-1
mod 10 selon que z est pair ou impair. J'utilise doncA~
pour diviser le nombre en chiffres sur la pile, mais au fur et à mesure que je crée la pile, je multiplie chaque chiffre par8+9^z
où z est la taille de pile actuelle. Je les ajoute ensuite à mesure que la pile de fonctions se déroule et j'imprime le dernier chiffre.la source
MATLAB - 82 caractères
la source
R, 147 caractères
Usage:
la source
J, 25
la source