Dans Salesforce CRM , chaque objet possède un ID alphanumérique à 15 caractères, qui respecte la casse. Si quelqu'un est curieux, c'est en fait le numéro de base 62 . Cependant, les outils utilisés pour la migration et l'intégration des données peuvent ou non prendre en charge la sensibilité à la casse. Pour surmonter cela, les identifiants peuvent être convertis en toute sécurité en identifiants alphanumériques insensibles à la casse de 18 caractères. Dans ce processus, une somme de contrôle alphanumérique à 3 caractères est ajoutée à l'ID. L'algorithme de conversion est:
Exemple :
a0RE000000IJmcN
Divisez l'ID en trois morceaux de 5 caractères.
a0RE0 00000 IJmcN
Inversez chaque morceau.
0ER0a 00000 NcmJI
Remplacez chaque caractère de chaque bloc par
1
s'il est en majuscule ou par0
sinon.01100 00000 10011
Pour chaque nombre binaire à 5 chiffres
i
, obtenez le caractère à la positioni
dans la concaténation de l'alphabet majuscule et des chiffres 0-5 (ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
).00000 -> A, 00001 -> B, 00010 -> C, ..., 11010 -> Z, 11011 -> 0, ..., 11111 -> 5`
Rendement:
M A T
Ajoutez ces caractères, la somme de contrôle, à l'ID d'origine.
Sortie :
a0RE000000IJmcNMAT
Écrire un programme ou une fonction qui prend en entrée une chaîne alphanumérique (ASCII) de 15 caractères et renvoie un ID de 18 caractères.
La validation des entrées est hors de portée de cette question. Les programmes peuvent retourner n'importe quelle valeur ou planter sur une entrée non valide.
S'il vous plaît, ne pas utiliser les fonctionnalités de Salesforce langues propretiary qui rendent ce défi trivial (comme la formule CASESAFEID()
, la conversion Id
à String
Apex et c).
Cas de test
a01M00000062mPg -> a01M00000062mPgIAI
001M000000qfPyS -> 001M000000qfPySIAU
a0FE000000D6r3F -> a0FE000000D6r3FMAR
0F9E000000092w2 -> 0F9E000000092w2KAA
aaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaAAA
AbCdEfGhIjKlMnO -> AbCdEfGhIjKlMnOVKV
aBcDEfgHIJKLMNO -> aBcDEfgHIJKLMNO025
public class X{public X(Id i){System.debug((String)i);}}
. Fonctionne uniquement avec des ID Salesforce valides.Réponses:
Rubis, 97 octets
Celui-ci a des trucs vraiment sympas.
Mon instinct d'origine pour diviser la chaîne en groupes de 5 caractères était
each_slice
:Il s'avère que c'est trop long par rapport à une simple expression régulière (
x.chars.each_slice(5)
vs.x.scan(/.{5}/)
). Cela semble évident avec le recul, mais je n'y ai jamais vraiment pensé ... peut-être que je peux optimiser certaines de mes anciennes réponses Ruby ici.La chose dont je suis le plus fier dans cette réponse, cependant, est ce morceau de code:
Très bien, voici donc quelques informations pour les non-rubis. Ruby sépare complètement les booléens (
TrueClass
,FalseClass
) des entiers / nombres (Numeric
) - ce qui signifie qu'il n'y a pas non plus de conversion automatique de vrai à 1 et faux à 0. C'est ennuyeux en jouant au golf (mais c'est une bonne chose ... à toutes autres fins).L'approche naïve pour vérifier si un seul caractère est en majuscule (et renvoyer 1 ou 0) est
Nous pouvons descendre un peu plus loin (encore une fois, avec une expression régulière):
Mais j'ai vraiment commencé à réfléchir. Hmm ...
=~
retourne l'index d'une correspondance (donc, pour notre seul caractère, toujours0
s'il y a correspondance) ounil
en cas de non-correspondance, une valeur falsifiée (tout le reste saufFalseClass
est vrai en Ruby). L'||
opérateur prend son premier opérande s'il est vrai, et son deuxième opérande sinon. Par conséquent, nous pouvons jouer au golf jusqu'àD'accord, regardons ce qui se passe ici. Si
y
est une lettre majuscule, elle ne correspondra pas[^A-Z]
, donc la partie regex reviendranil
.nil || 1
est1
, donc les lettres majuscules deviennent1
. Siy
est autre chose qu'une lettre majuscule, la partie regex retournera0
(car il y a une correspondance à l'index0
), et comme0
c'est vrai, l'0 || 1
est0
.... et seulement après avoir écrit tout cela, je me rends compte que c'est en fait la même longueur que
y=~/[A-Z]/?1:0
. Haha, eh bien.la source
Pyth,
2322 octets1 octet enregistré par FryAmTheEggman .
Essayez-le en ligne. Suite de tests.
C'est peut-être la première fois que j'utilise l'
p
instruction de rint pour jouer au golf.Explication
la source
MATL , 24 octets
Utilise la version actuelle (9.1.0) du langage / compilateur.
Exemples
Explication
la source
JavaScript (ES6), 108
Tester
la source
CJam, 27 octets
Exécutez tous les cas de test.
Une implémentation assez simple de la spécification. La partie la plus intéressante est la conversion en caractères dans la somme de contrôle. Nous ajoutons 17 au résultat de chaque morceau. Prenez ce modulo 43 et ajoutez le résultat de cela au personnage
'0
.la source
Japt, 46 octets
Pas trop content de la longueur, mais je ne trouve pas de moyen de jouer au golf. Essayez-le en ligne!
la source
JavaScript (ES6),
137132 octets4 octets enregistrés grâce à @ ՊՓԼՃՐՊՃՈԲՍԼ !
Explication
Ce défi n'est pas du tout adapté à JavaScript. Il n'y a pas de moyen rapide d'inverser une chaîne et il semble que le moyen le plus court de convertir le nombre en caractère soit de coder en dur chaque caractère possible.
Si les chiffres de la somme de contrôle pouvaient être en minuscules, cela pourrait être fait en 124 octets comme ceci:
Tester
Afficher l'extrait de code
la source
parseInt([...n].reverse().join``,2)
pourrait être changé en+`0b${[...n].reverse().join``}`
..replace(/.{5}/g,n=>/*stuff*/)
.MATLAB,
10098 octetsUne chaîne sera demandée en entrée et la sortie sera affichée à l'écran.
Explication
J'utilise probablement l'approche la plus simple ici:
Maintenant en dessous de 100 octets grâce à Luis Mendo!
la source
e=['A':'Z',48:53]
PHP,
186181 octetsUnglofed
J'ai commencé par penser que je pouvais le rendre beaucoup plus court que cela, mais j'ai manqué d'idées pour le raccourcir.
la source
Python 2, 97 octets
la source
PowerShell, 162 octets
OK, beaucoup de trucs sympas se passent dans celui-ci. Je vais commencer par la deuxième ligne.
Nous prenons l'entrée sous forme de chaîne via
$args[0]
et la configurons$a
pour une utilisation ultérieure. Ceci est encapsulé dans()
donc il est exécuté et le résultat est retourné (c'est-à-dire$a
) afin que nous puissions immédiatement le concaténer en chaîne avec les résultats de trois appels de fonction(f ...)
. Chaque appel de fonction passe en argument la chaîne d'entrée indexée en morceaux dans l'ordre inverse comme un tableau de caractères - ce qui signifie, pour l'exemple d'entrée,$a[4..0]
sera égal@('0','E','R','0','a')
à chaque entrée en tant que caractère, pas une chaîne.Passons maintenant à la fonction, où se trouve la vraie viande du programme. Nous prenons en compte
$f
, mais elles ne sont utilisées que vers la fin, alors concentrons-nous d'abord là-dessus. Puisqu'il est passé en tant que tableau de caractères (grâce à notre indexation précédente), nous pouvons immédiatement le diriger dans une boucle avec$f|%{...}
. À l'intérieur de la boucle, nous prenons chaque caractère et effectuons une correspondance regex sensible à la casse avec-cmatch
laquelle se traduira par vrai / faux s'il est en majuscule / sinon. Nous convertissons cela en un entier avec l'encapsulation+()
, puis ce tableau de 1 et de 0 est-join
édité pour former une chaîne. Cela est ensuite passé en tant que premier paramètre dans l'[convert]::ToInt32()
appel .NET pour changer le binaire (base2
) en décimal. Nous utilisons ce nombre décimal résultant pour indexer dans une chaîne (-join(...)[...]
). La chaîne est d'abord formulée comme une plage(65..90)
qui est convertie en un tableau de caractères,(0..5)
(c'est-à-dire que la chaîne est"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
). Tout cela consiste à renvoyer le caractère approprié de la chaîne.la source
Jolf, 30 octets
Enfin, un probablement encore jolfable! Essayez-le ici!
la source
Python 3,
201174138octetsUn grand merci à Trang Oul pour avoir souligné une déclaration de fonction qui n'avait plus besoin d'exister. Et les opérateurs ternaires Python. Et une sortie incorrecte. Donnez-lui juste les votes positifs.
la source
z()
une fois, vous pouvez remplacer son appel et économiser 25 octets. En outre, votre code attribue incorrectement[
au lieu de0
.if else
par cette construction et la seconde par un opérateur ternaire.J, 36 octets
Usage:
Essayez-le en ligne ici.
la source
C,
120118 octetsFonctionne pour toute entrée dont la longueur est un multiple de 5 :)
Non golfé
la source
{}
j;main(n,v,s)char**v,*s;{for(printf(s=v[1]);*s;s+=5,putchar(n+65-n/442))for(n=0,j=5;j--;n=n*2+isupper(s[j]));}
n/26*17
expression, donc le remplacement par 442 n'est pas une option. Pour autant que!!isupper
, cette fonction ne renvoie pas 1 pour vrai sur mon système, elle renvoie 256. Le!!
est un moyen rapide de la convertir en valeur de retour 0/1, quoi qu'il arrive. YMMV.C #, 171 octets
Je ne suis pas vraiment bien formé au golf C #, mais voici un coup.
la source
char.IsUpper(t)
peut être remplacé part>=65&t<=90
(&
sur bool en C # est essentiellement un golf plus&&
court sans court-circuit).447
est plus court que26*17
. Vous n'avez pas besoin de faire une séparationSelect
: vous pouvez inclure le ternaire directement dans leSum
. Envisagez de remplacer toutes ces utilisations deSubstring
par une boucle basée surTake
, par exemplefor(int i=0;i<3;i++)s.Skip(i*5).Take(5)
. Pour référence future,u!=""
serait plus court queu.Length>0
(mais ce n'est plus nécessaire si vous utilisezTake
).n/26*17
n'est pas équivalente àn/442
, mais à part cela, merci pour les suggestions. Comme indiqué, je ne suis pas très expérimenté dans le golf en C # donc ce sont toutes des choses formidables pour moi à considérer à l'avenir.C # 334
Si demandé, je vais inverser mon code pour qu'il soit lisible et le publier.
la source
Python 3, 87 octets
la source