Écrivez une fonction ou un programme qui code une chaîne dans un code- barres au format Code 39 , où chaque caractère est codé en cinq barres séparées par quatre espaces. Soit deux des barres et l'un des espaces sont larges et les autres sont étroits (codes 10 * 4), soit trois des espaces sont larges et aucune des barres n'est (4 codes). Cela donne 44 codes différents, dont l'un est un code réservé qui est utilisé pour désigner le début et la fin de la chaîne codée.
Le défi
L'entrée est une chaîne contenant uniquement des caractères de l'ensemble
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
La sortie est la chaîne codée sous forme de chaîne de code-barres. L'espace étroit et les espaces intercaractères sont un espace unique et un espace large est de trois espaces. La barre étroite est la séquence d'octets UTF-8 pour le caractère Unicode "Bloc complet", █, c'est 0xE2 0x96 0x88
-à- dire que la barre large représente trois séquences / caractères de ce type ( ███
). La liste complète des codes est la suivante:
Spaces
0100 0010 0001 1000 1011 1101 1110 0111
Bars
00000 + / $ %
10001 1 A K U
01001 2 B L V
11000 3 C M W
00101 4 D N X
10100 5 E O Y
01100 6 F P Z
00011 7 G Q -
10010 8 H R .
01010 9 I S space 1=wide
00110 0 J T start/end 0=narrow
Les barres et les espaces sont entrelacés, en commençant par une barre, donc par exemple Q est
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Après avoir codé tous les caractères, la chaîne est délimitée aux deux extrémités avec █ █ ███ ███ █
. L'espace intercaractère, un espace unique, est inséré entre chaque lettre. Votre solution peut générer des espaces de fin et une nouvelle ligne de fin (dans cet ordre).
Exemples
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Les formats d'entrée / sortie standard sont autorisés et les failles standard sont interdites. C'est le code-golf , donc le code le plus court mesuré en octets gagne!
#
personnage, car, par exemple, ce"#"
n'est pas la seule raison pour laquelle il pourrait être utilisé dans une langue.Réponses:
JavaScript (ES6),
225212 octets4 octets enregistrés grâce à @ l4m2
Essayez-le en ligne!
Comment?
Le tableau peut être réorganisé de sorte que le masque binaire 9 bits du caractère soit rapidement déduit de sa ligne et de sa colonne à l'aide de la formule suivante:
avec:
la source
s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='#',C+C+C,' ',' '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[,257,260,5,272,17,20,320,65,68,80][i>>2]|(2<<i%4*2^(i<4)*170))>>k&1|j]))
(221)Rouge ,
452445 octetsEssayez-le en ligne!
J'essaierai de jouer au golf plus loin, mais je n'attends pas grand-chose de cette solution naïve.
la source
Java 10, 455 octets
Essayez-le en ligne.
Explication:
la source
C (gcc) ,
311, 303 octetsEssayez-le en ligne!
-8 grâce au plafond
Utilise la stratégie d'encodage de la réponse d'Arnauld. La liaison TIO comprend un
-w
interrupteur et un passe-partout pour supprimer les avertissements, ceux-ci sont inutiles et ne sont donc pas inclus dans le score.Hormis le schéma de codage expliqué par Arnauld, l'autre astuce ici est de maintenir la
w
variable comme basculant entre 2 et 0 (w=2*!w
). Cela me permet de choisir entre la première et la deuxième chaîneb
. Le premier est un espace, le second est le rectangle rempli.la source
C (gcc) ,
241 239 227 213207 octetsEssayez-le en ligne!
Basé sur l'implémentation de @ LambdaBeta .
Un peu moins golfé:
la source
Charbon de bois , 90 octets
Essayez-le en ligne! Remarque: Espace de fin. Le lien est vers la version détaillée du code. Explication:
Enveloppez la chaîne d'entrée dans
*
s, puis mappez dessus deux fois, pour finalement joindre le résultat avec des espaces. Pour la deuxième carte, il existe alors une carte supplémentaire sur la plage implicite0..4
, où deux sous-chaînes sont concaténées, et ces résultats sont ensuite joints à la constante de chaîne vide prédéfinie.Pour la première carte intérieure, créez une chaîne formée en prenant les chiffres incrémentés, l'alphabet majuscule et les symboles
-. *+/$%
, et recherchez la position du caractère d'entrée mappé. Par exemple,C++
correspondrait à[12, 40, 40]
.La première sous-chaîne représente les espaces avant les barres. Il n'y a rien avant la première barre, mais les autres barres dépendent de la position du caractère d'entrée mappé: s'il est supérieur à 39, alors un seul endroit a un seul espace, tandis que s'il est inférieur à 40, alors un seul endroit en a trois espaces, et la position est également convertie en une colonne en la divisant par 10. Si la colonne et l'indice de boucle diffèrent par 2 (modulo 4), c'est l'endroit impair.
La deuxième sous-chaîne représente les barres. Si la position est supérieure à 39, il y a toujours une barre, sinon la position est recherchée dans un tableau de bits mappés sur des caractères. Par exemple, si la position est 12, celle-ci est indexée de façon circulaire au caractère
'
, qui est100111
en binaire, indiquant des barres larges dans les colonnes 1 et 2. (Le début1
est ignoré, il garantit simplement un nombre de bits cohérent.)la source
Perl 5 , 244 octets
Essayez-le en ligne!
Contient de nombreux caractères non imprimables et des caractères à octets élevés, le lien TIO fournit une
xxd
représentation. J'avais espéré que cela aurait fini par être plus petit, et je pourrais peut-être encore emballer les données de manière plus efficace, donc je vais voir comment je vais. Cela" "," ","█","███"
accumule toutes les permutations de , puis mappe les indices de la liste aux caractères correspondants.la source
Haskell ,
275270 octetsEssayez-le en ligne!
L'opérateur
x!n
qui calcule les chiffres de base x de n, est utilisé deux fois pour décompresser les codes. Les codes sont d'abord compressés sous forme de chaînes binaires avec large = 1 et étroit = 0, sans égard à la couleur, par exempleR↔10000110↔262
. Ces nombres sont ensuite triés et différenciés pour obtenir des nombres dans la plage [3,66], qui sont compressés à l'inverse de l'algorithme de chiffre binaire comme0x117CDBC49F9EEEF11C3A659CACB31236
. Celui-ci ne contient que la moitié des codes, le reste en est l'inverse.Non golfé:
la source