Escriba una función o programa que codifique una cadena en un código de barras de formato Código 39 , donde cada carácter se codifica como cinco barras separadas por cuatro espacios. O dos de las barras y uno de los espacios son anchos y otros son estrechos (códigos 10 * 4), o tres de los espacios son anchos y ninguna de las barras son (4 códigos). Esto proporciona 44 códigos diferentes, de los cuales uno es un código reservado que se utiliza para denotar el inicio y el final de la cadena codificada.
El reto
La entrada es una cadena que contiene solo caracteres del conjunto
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
La salida es la cadena codificada como una cadena de código de barras. La brecha estrecha y las brechas entre caracteres son un espacio único y una brecha ancha es tres espacios. La barra estrecha es la secuencia de bytes UTF-8 para el carácter Unicode "Bloque completo", █, es decir, 0xE2 0x96 0x88
y la barra ancha tiene tres secuencias / caracteres de bytes ( ███
). La lista completa de códigos es:
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
Las barras y los espacios están intercalados, comenzando en una barra, por ejemplo, Q es
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Después de codificar todos los caracteres, la cadena se delimita en ambos extremos con █ █ ███ ███ █
. El espacio entre caracteres, un solo espacio, se inserta entre cada letra. Su solución puede generar espacios finales y una nueva línea final (en ese orden).
Ejemplos
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Los formatos de entrada / salida estándar están permitidos y las lagunas estándar están prohibidas. Este es el código de golf , por lo que gana el código más corto medido en bytes.
#
personaje, ya que, por ejemplo,"#"
no es la única razón por la que podría usarse en un idioma.Respuestas:
JavaScript (ES6),
225212 bytesGuardado 4 bytes gracias a @ l4m2
Pruébalo en línea!
¿Cómo?
La tabla se puede reorganizar de modo que la máscara binaria de 9 bits del personaje se deduzca rápidamente de su fila y columna utilizando la siguiente fórmula:
con:
fuente
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)Rojo ,
452445 bytesPruébalo en línea!
Intentaré jugar más al golf, pero no espero mucho de esta ingenua solución.
fuente
Java 10, 455 bytes
Pruébalo en línea.
Explicación:
fuente
C (gcc) ,
311, 303 bytesPruébalo en línea!
-8 gracias a ceilingcat
Utiliza la estrategia de codificación de la respuesta de Arnauld. El enlace TIO incluye un
-w
interruptor y una placa repetitiva para eliminar las advertencias, que son innecesarias y, por lo tanto, no están incluidas en el puntaje.Aparte del esquema de codificación explicado por Arnauld, el otro truco aquí es mantener la
w
variable como alternar entre 2 y 0 (w=2*!w
). Esto me permite elegir entre la primera y la segunda secuenciab
. El primero es un espacio, el segundo es el rectángulo lleno.fuente
C (gcc) ,
241 239 227 213207 bytesPruébalo en línea!
Basado en la implementación de @ LambdaBeta .
Ligeramente menos golfizado:
fuente
Carbón , 90 bytes
Pruébalo en línea! Nota: espacio final. El enlace es a la versión detallada del código. Explicación:
Envuelva la cadena de entrada en
*
s y luego mapee sobre ella dos veces, finalmente uniendo el resultado con espacios. Para el segundo mapa, hay un mapa adicional sobre el rango implícito0..4
, donde se concatenan dos subcadenas, y esos resultados se unen con la constante de cadena vacía predefinida.Para el primer mapa interno, cree una cadena formada tomando los dígitos incrementados, el alfabeto en mayúscula y los símbolos
-. *+/$%
, y busque la posición del carácter de entrada mapeado. Por ejemplo,C++
se asignaría a[12, 40, 40]
.La primera subcadena representa los espacios antes de las barras. No hay nada antes de la primera barra, pero las otras barras dependen de la posición del carácter de entrada asignado: si tiene más de 39, entonces solo un lugar tiene un solo espacio, mientras que si tiene menos de 40, solo un lugar tiene tres espacios, y la posición también se convierte en una columna dividiéndola por 10. Si la columna y el índice del bucle difieren entre 2 (módulo 4), entonces ese es el lugar extraño.
La segunda subcadena representa las barras. Si la posición es superior a 39, siempre hay una barra; de lo contrario, la posición se busca en una matriz de bits asignados a caracteres. Por ejemplo, si la posición es 12, entonces eso se indexa circularmente al carácter
'
, que está100111
en binario, lo que indica barras anchas en las columnas 1 y 2. (El inicio1
se ignora, simplemente garantiza un recuento de bits constante).fuente
Perl 5 , 244 bytes
Pruébalo en línea!
Contiene muchos caracteres no imprimibles y de alto byte, el enlace TIO proporciona una
xxd
representación. Esperaba que esto hubiera terminado más pequeño, y todavía podría empaquetar los datos de una manera más eficiente, así que veré cómo me va. Esto acumula todas las permutaciones de" "," ","█","███"
y luego asigna las indicaciones de la lista a los caracteres correspondientes.fuente
Haskell ,
275270 bytesPruébalo en línea!
El operador
x!n
que calcula los dígitos de la base x de n, se usa dos veces para descomprimir los códigos. Los códigos se comprimen primero como cadenas binarias con ancho = 1 y estrecho = 0, sin importar el color, por ejemploR↔10000110↔262
. Estos números se ordenan y diferencian para obtener números en el rango [3,66], que se comprimen con el inverso del algoritmo de dígitos binarios como0x117CDBC49F9EEEF11C3A659CACB31236
. Esto contiene solo la mitad de los códigos, el resto son inversos de estos.Sin golf:
fuente