Introduction:
Un BSN néerlandais (BurgerServiceNummer) est valide lorsqu'il respecte les règles suivantes:
- Il ne contient que des chiffres.
- La longueur doit être de 8 ou 9 de long.
- Lorsque les chiffres sont indexés comme à
A
traversI
, le résultat de la somme suivante:9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI
(NOTEz le -1 au lieu de 1!) Doit être divisible par 11 et ne doit pas être 0.
Défi:
Entrée: chaîne ou tableau de caractères représentant le BSN.
Sortie: un résultat vrai ou faux si l'entrée est un BSN valide.
Règles du défi:
- Le format d'entrée doit être une chaîne ou un tableau de caractères. Vous n'êtes pas autorisé à utiliser un int-tableau de chiffres ou un nombre (éventuellement octal). (Vous êtes cependant autorisé à le convertir vous-même en un tableau de chiffres int, mais pas directement en argument.)
- Malgré la restriction de l'entrée ci-dessus, vous pouvez supposer que tous les cas de test contiendront un ou plusieurs chiffres (
[0-9]+
) - En ce qui concerne le BSN de longueur 8 au lieu de 9, Wikipedia néerlandais déclare ce qui suit: " Pour le test à onze et pour d'autres utilisations pratiques, un zéro de tête est ajouté pour faire le nombre de longueur 9. " ( source )
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si nécessaire.
Cas de test:
// Truthy test cases:
111222333
123456782
232262536
010464554
10464554
44016773
// Falsey test cases:
000000000
192837465
247594057
88888888
73
3112223342
000000012
code-golf
string
arithmetic
decision-problem
Kevin Cruijssen
la source
la source
A
de la formule donnée?A
de la formule (ou ajoute essentiellement un interligne0
pour lui donner une longueur de 9, ce qui donne le même résultat que l'omissionA
).Réponses:
05AB1E ,
2321 octetsEssayez-le en ligne! ou comme suite de tests
Explication
la source
DgL
versā
et0Ê
versĀ
. Essayez-le en ligne.JavaScript (ES6) 57
Entrez comme un tableau de caractères.
reduceRight
sauve la journée!Tester
la source
reduceRight
réponse!map()
, juste pour réaliser que votre réponse est en fait longue de 57 octets :-)R,
8667 octetsEdit: Merci à Jarko Dubbeldam d'avoir suggéré le produit scalaire!
Lit l'entrée de stdin et stocke comme un tableau / vecteur de caractères. Convertissez ensuite en numérique, multipliez avec le vecteur
9...2,-1
et vérifiez toutes les conditions.la source
x
en vecteur.if(l<9)x=c(0,x);s=sum(as.double(x)*c(9:2,-1))
peut être transformé ens=sum(as.double(x)*c(l:2,-1))
. De plus, la somme du produit par paire de deux vecteurs est la même que leur multiplication par points%*%
.JavaScript (ES6),
61605958 octetsPrend un tableau de caractères en entrée. Renvoie
false
/true
.Cas de test
Afficher l'extrait de code
la source
C,
1121019698104 octetsMerci à @MartinEnder pour avoir économisé
53 octetstout en corrigeant mon code!Renvoie 0 si non valide, 1 si valide. Essayez-le en ligne!
la source
61
même s'il n'est pas de bonne longueur.R,
957993 octetsFonction sans nom qui prend une chaîne en argument. Au début, je dépassais l'exigence d'avoir une chaîne en entrée au lieu d'un nombre, mais c'est bien, car cela économise quelques octets lors de la conversion.
Je ne sais pas comment interpréter le tableau de caractères, mais si cela signifie que vous pouvez utiliser un vecteur de chiffres
"1" "2" "3" "4" etc
en chaîne comme entrée, il devient même un peu plus court:Divise x en un vecteur numérique, puis ajoute un 0 si la longueur est 8, puis calcule le produit scalaire du vecteur y et
c(9,8,7,6,5,4,3,2,-1)
. Teste si le résultat est à la fois différent de zéro et divisible par 11.16 octets enregistrés grâce à la logique de @Enigma, ajoutant implicitement le 0 à la création du vecteur
c(length(x):2,-1)
.J'ai oublié d'ajouter un chèque pour la longueur 8/9, donc +14 octets :(
la source
Perl, 58 octets (52 + 6)
Courir avec
Entrée transmise
STDIN
:Usage
Sorties
1
pour la valeur véridique,0
ou rien pour les valeurs de falsey.la source
$r+=$_*(-1,2..9)[$i++]for reverse@F
. De plus,-F -pe
(et les entrées fournies sans leecho -n
retour à la ligne final, avec par exemple) sont suffisantes (à moins que votre Perl ne soit trop vieux, auquel cas vous en aurez besoin-a
(mais sur les Perls récents, cela est sous-entendu par-F
). Enfin, votre code faisait 70 octets de long , pas 52;)C ++ 14,
107106 octets-1 octet pour
int
au lieu deauto
dans pour la boucle.Comme lambda sans nom retournant via le paramètre de référence. Nécessite une entrée
std::string
ou un conteneur de caractères, commevector<char>
.Non golfé et utilisation:
la source
Befunge, 72 octets
Essayez-le en ligne!
Explication
la source
MATL, 36 octets
Ce n'est pas le programme MATL le plus long que j'ai jamais écrit , mais j'aime la façon dont
if
/ leselse
déclarations deviennent très longues très rapidement dans les langues de golf. Je pense que cette solution n'est peut-être pas optimale dans MATL, mais pour l'instant je ne peux pas l'optimiser davantage. Je pense utiliser le double 0 quelque part, et peut-être réduire let
partout partout.Essayez-le en ligne! Explication:
la source
!U
au lieu de48-
[a2:9]*
entraîne une multiplication non élémentaire, donc une autre!
serait nécessaire pour compenser le gain initial.MATL , 26 octets
Le résultat est un vecteur de colonne non vide, qui est vrai si toutes ses entrées ne sont pas nulles .
Essayez-le en ligne!
Ou vérifiez tous les cas de test avec chaque résultat sur une ligne différente.
Explication
Cela teste les trois conditions dans l'ordre suivant:
Considérez l'entrée
'8925'
pour l'explication.;
est le séparateur de lignes pour les matrices.la source
?
serait probablement plus efficace, mais je n'ai pas pu comprendre comment raccourcir la longueur 8 ou 9. Vous êtesGn8-tg=
très intelligent.!
?G
pousse un vecteur colonne et j'ai besoin de le transposer pour faire la répétition avecg*
Haskell,
116112102 octetsg
compte la somme utilisée dans le onze-proef deh
, tout en vérifiantf
également la longueur correcte et que le onze-proef n'est pas 0. Surtout les contrôles def
prennent beaucoup d'octets.EDIT: économisé 10 octets grâce à Lynn et
div
arrondi.la source
f x=div(length x)2==4&&g x>0&&h x
?Gelée , 21 octets
TryItOnline! ou exécutez tous les cas de test
Les valeurs de retour véridiques sont non nulles (et sont, en fait, le multiple de 11 somme).
Comment?
la source
Python 2, 102 octets
la source
Python 2, 96 octets
Prend une chaîne en entrée. La fonction ajoute un
'0'
au début de la chaîne, qu'elle en ait besoin ou non, et utilise les indices négatifs de Python pour ajouter des éléments, en commençant par la fin de la chaîne et en travaillant de l'avant vers l'avant.Le
-1xI
est géré séparément, à l'aide d'un deuxième appel àint()
. Je ne pouvais pas comprendre comment éviter cela sans coûter plus d'octets que ce que j'avais économisé.def g(s):u=7<len(s)<10and sum(x*int(('0'+s)[-x])for x in range(10))-2*int(s[-1]);print(u%11<1)*u
fonctionnerait tout aussi bien, car il ajouterait des1
tempss[-1]
mais le soustrait ensuite deux fois, et il ajouterait également des0
temps (quelque chose) qui, bien sûr, n'affecteraient pas la somme.la source
Brain-Flak , 345 octets
Comprend +3 pour
-a
Truthy vaut 1, Falsy a un 0 en haut de la pile.
Essayez-le en ligne!
Je suis presque sûr qu'il existe un moyen plus court de faire la multiplication en boucle, mais je ne l'ai pas encore trouvée.
la source
PowerShell v2 +, 96 octets
OK, je l'admets, cela ressemble à un gâchis complet. Et ça l'est un peu. Mais, restez avec moi et nous passerons au travers.
Nous prenons l'entrée
$n
(sous la forme d'unchar
tableau) et la définissons$i
égale à8
moins une valeur booléenne pour savoir s'il y a 8 éléments$n
. Autrement dit, s'il y a 8 éléments, alors$i
serait le cas7
.La section suivante combine le calcul avec notre sortie. Travaillant de l'intérieur, nous parcourons
$n
avec$n|%{...}
. Chaque itération, nous utilisons un pseudo-ternaire pour arriver à l'un des deux résultats - soit-"$_"
ou(($i+1)*+"$_")
. L'indice est basé sur le fait de l'$i
être0
ou non (c'est-à-dire que nous avons atteint le-1xI
cas de l'équation de défi), qui est post-décrémenté pour le prochain tour. Ceux-ci sont tous rassemblés en parens et édités-join
avec+
. Par exemple, avec une entrée111222333
à ce stade, nous aurions9+8+7+12+10+8+9+6+-3
. Il est acheminé versiex
(abréviation deInvoke-Expression
et similaire àeval
) avant d'être stocké dans$b
. Nous prenons ensuite cela%11
et effectuons un booléen-pas!(...)
à ce sujet (c'est-à-dire que si elle est divisible par 11, cette partie l'est$true
). C'est couplé avec-and$b
pour s'assurer que ce$b
n'est pas zéro. Ce résultat booléen est laissé sur le pipeline et la sortie est implicite.Exemples
la source
PHP
139128 octetsImpossible de faire en sorte que la CLI répète simplement le vrai ou le faux. J'ai dû faire comme ça. Des idées?
128 octets: mis "vrai" et "faux" à 1 et 0.
la source
C #,
120115 octetsCela boucle à travers le
char[]
qu'il reçoit en entrée et retourne vrai ou faux:Violon: https://dotnetfiddle.net/3Kaxrt
Je suis sûr que je peux gratter quelques octets, surtout dans le désordre
return
. Toutes les idées sont les bienvenues!Edit: sauvé 5 octets grâce à Kevin. Je ne savais pas que je pouvais utiliser à la
&
place&&
!la source
r>0&&r%11==0&&l<10&&l>7
peut être joué au golfr>0&r%11<1&l<10&l>7
(&&
vers&
etr%11==0
versr%11<1
). Et-'0'
peut être joué au golf-48
.PHP,
868584838279 octetsRemarque: utilise PHP 7.1 pour les indices de chaîne négatifs.
Courez comme ceci:
Version pour PHP <7.1 (+10 octets)
Explication
Tweaks
"0"
un octet enregistré10000000
n'est pas valide, pas besoin de comparer avecgreater than or equals
,greater than
suffit, enregistrer un octet-R
pour rendre$argn
disponiblela source
Java 8,
11598 octetsJe suis surpris que personne n'ait encore posté de réponse Java, alors en voici une.
Explication:
Essayez-le ici.
la source
Clojure, 114 octets
Eh bien, c'est quelque chose,
-
soustrait le reste des arguments du premier afin de gérer le cas spécial du poids-1
. Cette fonction renvoienil
des entrées de longueur non valide, mais sur lesif
clauses, elles fonctionnent de la même manière quefalse
.(#{8 9}(count v))
renvoienil
si la longueur dev
n'est pas 8 ou 9.Cas de test:
la source
Perl 5 , 63 + 2 (
-F
) = 65 octetsEssayez-le en ligne!
la source
Stax , 23 octets
Exécutez et déboguez en ligne!
Explication
Utilise la version décompressée pour expliquer.
la source