language-agnostic code-golf barcode rosetta-stone code39

language agnostic - Código de golf: Código 39 Código de barras



language-agnostic code-golf (10)

J, 102 caracteres

8#,:'' #''{~,0,.~#:(3 u:''䝝啕啕啕䑅儑啕啕啕啕䗝䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵''){~32-~a.i.''*''(,,[)

Explicación. Leer de abajo hacia arriba .:

8#,: NB. Copy 8 times '' #''{~ NB. Turn binary 0 and 1 into space and # , NB. Link the array into a list 0,.~ NB. Append a 0 to the end of each row of the array. #: NB. Turn the list of numbers into a binary array where each row is the base-2 representation of the corresponding number (3 u:''䝝啕啕啕䑅儑啕啕啕啕䗝䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵'') NB. Turn this wchar string into a list of ints in range 0-65535. {~ NB. Select numbers from the string-list whose indices are... 32-~ NB. ... 32 less than ... a.i. NB. ... the ascii values of ... ''*''(,,[) NB. ... the input string with a ''*'' on either side!

El reto

El código más corto por número de caracteres para dibujar una representación ASCII de un código de barras Código 39.

Artículo de Wikipedia sobre el Código 39: http://en.wikipedia.org/wiki/Code_39

Entrada

La entrada será una cadena de caracteres legales para los códigos de barras del Código 39. Esto significa que 43 caracteres son válidos: 0 - 9 A - Z (espacio) y -.$/+% . El carácter * no aparecerá en la entrada, ya que se utiliza como los caracteres de inicio y parada.

Salida

Cada carácter codificado en los códigos de barras del Código 39 tiene nueve elementos, cinco barras y cuatro espacios. Las barras se representarán con caracteres # y los espacios se representarán con el carácter de espacio. Tres de los nueve elementos serán anchos. Los elementos estrechos tendrán un ancho de un carácter, y los elementos anchos tendrán un ancho de tres caracteres. Se debe agregar un espacio entre caracteres de un solo espacio entre cada patrón de caracteres. El patrón se debe repetir para que la altura del código de barras tenga ocho caracteres de altura.

El carácter de inicio / parada * (bWbwBwBwb) se representaría así:

# # ### ### # # # ### ### # # # ### ### # # # ### ### # # # ### ### # # # ### ### # # # ### ### # # # ### ### # ^ ^ ^^ ^ ^ ^ ^^^ | | || | | | ||| narrow bar -+ | || | | | ||| wide space ---+ || | | | ||| narrow bar -----+| | | | ||| narrow space ------+ | | | ||| wide bar --------+ | | ||| narrow space ----------+ | ||| wide bar ------------+ ||| narrow space --------------+|| narrow bar ---------------+| inter-character space ----------------+

  • El carácter de inicio y parada * deberá aparecer al principio y al final del código de barras.
  • No será necesario incluir ningún espacio tranquilo antes o después del código de barras.
  • No será necesario calcular ningún dígito de control.
  • No se requiere la codificación completa de ASCII Code39, solo los 43 caracteres estándar.
  • No es necesario imprimir ningún texto debajo de la representación del código de barras ASCII para identificar los contenidos de salida.
  • El carácter # puede ser reemplazado con otro personaje de mayor densidad si se desea. El uso del carácter de bloque completo U + 2588 permitiría que el código de barras se escanee cuando se imprime.

Casos de prueba

Input: ABC Output: # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### # # # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #

Input: 1/3 Output: # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### # # # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #

Input: - $ (minus space dollar) Output: # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### # # # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #

El conteo de códigos incluye entrada / salida (programa completo).


Lua, 318 personajes

z={"1358ACEHKMORUWY.","UVWXYZ-. $/+*","2369BCFILMPSVWZ ","0123456789$/%","0456DEFJNOPTXYZ*","ABCDEFGHIJ$+%","0789GHIJQRST-. *","KLMNOPQRST/+%","1247ABDGKLNQUVX-",""}i="*"..(...).."*"o=""for c in i:gfind(".")do for j=1,10 do o=o..((j%2==0 and" "or"#"):rep(z[j]:find(c,1,true)and 3 or 1))end end for j=1,8 do print(o)end

No espero ganar ninguna pregunta de código de golf con Lua, así que no me siento mal respondiendo a mi propio desafío aquí. También estaba usando una codificación diferente que pensé que podría ser interesante para otros.

Otras observaciones

Después de observar detenidamente la codificación, parece que puede haber una manera de prescindir de la búsqueda en la tabla y calcular la codificación del código de barras directamente. Sin embargo, encontré que mis intentos de construir los cálculos tomaron más código que la tabla. (Esto puede no ser el caso en otros idiomas).

Después de dividir los personajes en grupos que indicaban dónde estaban las barras y los espacios anchos, vi algunos patrones interesantes. Parece que solo hay un espacio amplio para 40 de los caracteres, con $/+% como excepciones (cada uno tiene tres espacios). Los 40 caracteres se dividen con 10 en cada ranura. Y, hay dos barras anchas para los mismos 40 caracteres. Las barras anchas parecen tener una codificación binaria y la última barra es un bit de paridad. Los patrones de bits de la barra son 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 donde se evitan los números que tienen más de 2 bits establecidos.

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-._* 1 3 5 8 A C E H K M O R U W Y . 1010100100 23 6 9 BC F I LM P S VW Z _ 0110010010 456 0 DEF J NOP T XYZ * 0001110001 7890 GHIJ QRST -._* 0000001111 12 4 7 AB D G KL N Q UV X - 1101001000 --> Parity

Supongo que es un desafío para otro día ver si los códigos de barras podrían codificarse sin tablas de búsqueda.


Python (2.6) - 430 312 302 caracteres

En tercer lugar vaya al problema, todavía hay espacio para mejorar. Número de caracteres por wc -m .

#coding:UTF8 k="" for c in"*%s*"%raw_input(): i=" $*.02468BDFHJLNPRTVXZ%+-/13579ACEGIKMOQSUWY".find(c)*2 for j in"%05d%s"%tuple(map(ord,u"ಊҺ௖ூ௄Һ姢ҺЈҺӎϴЈϴӐϲ刦ҺҺ௄ϴ௄Ҽூ划ಊϴಊҺЈϴЈҼІ划ӎϴӎಊϴ௄ϴಌϲІ௖ூ௖ூҼ௖І刦ϴ勮ϲ刨ϲІҼӎҺ划௄勚ூ刔ூϲಌҺಊ划Ј勚І刔ІϲӐҺӎ姢ϴ媪ϲ姤ϲ"[i:i+2])):k+=["#"," ","###"," "][int(j)] k+=" " exec"print k;"*8


Python 3.1, con Unicode (154 158 caracteres)

Basado en la solución J , aprovechando la regla "El carácter # se puede reemplazar con otro personaje de mayor densidad si se desea" , definiendo la densidad como el área de las partes oscuras dividida por el rectángulo delimitado más pequeño del glifo . :)

print((''''.join(" #"[int(c)]for d in"%r"%input()for c in bin(2*ord("䝝啕啕啕䑅儑啕䗝啕啕啕䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵"[ord(d)-32]))[2:])+"/n")*8)


Python 3.1, sin Unicode (213 215 223 240 248 249 caracteres)

o="" for c in"%r"%input(): u="W3YZ56C$EF. 89''0HIJM/OP+%RSTUV12X4ABD-7GKLNQ".find(c);n=sum(b"))&&&,(*&2&&&)),&/8(*&1)<&/V&&&)),&/5);D&/S"[u:])-930+35*u while n:o+="###"[n%2*2:]+" "[n&2:];n>>=2 print((o+"/n")*8)

Explicación:

La secuencia del código 39 se codifica en un número base-4 (más a la izquierda = menos significativo) con:

  • bw → 3
  • Bw → 2
  • bW → 1
  • BW → 0

La secuencia se clasifica, por ejemplo,

20333 Q 21233 N 21323 L ...

Se toma la diferencia de entradas adyacentes, dando una lista como [48, 12, 3, …] . Luego se agrega 35 a esta lista para garantizar que los números caigan en el rango ASCII. Esto da la cadena "))&&&,…" .

Este código también ha tomado ventaja de que el * no aparecerá en la entrada, por lo que podemos reemplazarlo por cualquier carácter no válido, incluido '' . En CPython repr("ABC") == "''ABC''" , así podríamos deshacernos de 2 caracteres.


Python, 304 caracteres

Sin compresión Unicode de lujo. El único truco es reordenar los personajes para maximizar la superposición. Mi primer programa en Python.

b="BWbwbwBwbWBwbwbwBWbwBwbwbWBwbwBwbWbwBwbwBWbwbwBWBwbwbwbWBwBwbwbWbwBwBwbWbwbwBwBWbwbwbwBWBwbWbWbWbwbWbWbWb" s=t="" for x in"*"+raw_input()+"*": i=".NI5VRD9YLH4 OB8XSE2?J6WKG0ZMA7*PC1-TF3UQ????$/+%".find(x)*2 s+=b[i:i+9]+"w" for x in s:t+=["#"," ","###"," "]["bwBW".find(x)] for k in b[-8:]:print(t)


Rubí (1.9) - 121 132 141 166 170 289 295

Felicitaciones a David

puts"*#{$_}* ".tr(" --9*$+%A-Z","䝝䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝䗝䑅䔑儑甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵").gsub(/./){|c|c.ord.to_s(2).tr"01"," #"}*8 echo "ABC" | ruby -ne ''puts"*#{$_}* ".tr(" --9*$+%A-Z","䝝䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝䗝䑅䔑儑甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵").gsub(/./){|c|c.ord.to_s(2).tr"01"," #"}*8''

Solo almacena los 44 caracteres requeridos y usa la función de transliteración de Ruby para mapearlos

<space> <-> to <9> <*> <$> <+> <%> <A> to <Z>

a los valores codificados.


He hecho código para trabajar con códigos de barras de código 39 en sistemas integrados. Hay dos estilos de códigos, que considero que son los 39 códigos "regulares" y los cuatro "bichos extraños". Los códigos regulares tienen uno de los diez patrones de ancho de barra (dos anchos tres estrechos), y uno de cuatro patrones de ancho de espacio (uno ancho tres estrechos). Los bichos extraños tienen cinco barras estrechas y uno de los cuatro patrones de anchos de barra (tres anchos uno angosto). Para representar un código de barras con código compacto, convierta el carácter en un número 0-39 (para códigos normales), o 40, 50, 60 o 70 para "bolas impares". Luego divmod 10. El dígito superior seleccionará uno de los ocho patrones de ancho de espacio; Si el dígito superior es tres o menos, el dígito inferior seleccionará uno de los diez patrones de ancho de barra. Si el dígito superior es 4-7, las cinco barras deben ser estrechas.

El código funciona de forma muy compacta utilizando unas pocas tablas de búsqueda pequeñas. Debido a que las tablas de búsqueda pueden representarse de manera compacta como cadenas en el código fuente, los enfoques con tablas de búsqueda más grandes pueden tener un código fuente más corto (aunque creo que para Code Golf el tamaño del código fuente debe contarse en bytes usando la codificación más favorable; un enfoque con una cadena de los caracteres extraños que tardarían tres bytes en almacenarse en UTF-8 y dos bytes para UTF-16 deberían ser ''cargados'' de 3 bytes cada uno para los caracteres extraños, o dos bytes para cada uno de los caracteres, lo que arroje un total menor. Un enfoque que utiliza una selección de caracteres extraños que se ajustan por completo dentro de alguna página de códigos de un solo byte debe cargarse un byte por carácter.


spam spam spam spam encantador spam


Ensamblador

Se ensambla a 220 bytes.

mov di,ds mov al,42 call a3 mov dh,[80h] mov si,82h a1:lodsb call a3 dec dh jnz a1 mov al,42 call a3 mov ax,2573 stosw mov al,36 stosb mov cl,8 a2:mov dx,ds mov ah,9 int 21h loop a2 a3:sub al,97 cmp al,26 ja a4 sub al,32 a4:mov bx,a6-3 a8:add bx,3 cmp bx,a7 jae ret cmp al,[bx] jne a8 mov bp,[bx+1] a5:rcr bp,1 mov al,36 sbb al,0 and al,35 stosb or bp,bp jnz a5 mov al,32 stosb ret a6:dd 0D05DC5CFh,01DD17517h,05477D275h,0D475C5D3h,01DD55717h,07745D657h,0D85D17D7h,057E05D1Dh dd 0745DE174h,0E35177E2h,0D7E47475h,051DDE551h,0E77715E6h,05DE85C57h,05C75E95Ch,0EB7157EAh dd 077EC715Dh,07175ED45h,0EF45D7EEh,0D5F045DDh,04757F171h,0F3475DF2h,047F44775h,07571F575h dd 0F755C7F6h,047F875D1h,05771F957h,0CD7751CCh,071BF5D47h,05111C35Dh,0CA4511CEh,045C44451h dd 05DD1C944h a7:

No hay mucho margen para hacer trucos inteligentes aquí.