Pregunta

El reto

El código más corto por el recuento 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 Código 39 códigos de barras. Este medio de 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 el Código 39 códigos de barras tienen nueve elementos, cinco barras y cuatro espacios. Bares estarán representados con personajes #, y los espacios estarán representados con el carácter de espacio. Tres de los nueve elementos serán de ancho. Los elementos estrechos serán un carácter de ancho, y los elementos de ancho será de tres caracteres anchos. Un espacio entre caracteres de un solo espacio debe añadirse entre cada patrón de caracteres. El patrón debe repetirse de manera que la altura del código de barras es de ocho caracteres alto.

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 arranque y la parada carácter * tendrá que ser emitida en el inicio y al final del código de barras.
  • tendrá que ser incluida antes o después del código de barras No hay espacio tranquilo.
  • tendrá que ser calculada Sin dígito de control.
  • No se requiere
  • completa ASCII Código 39 de codificación, sólo los caracteres estándar 43.
  • No hay necesidad de texto que se imprimirá debajo de la representación ASCII de código de barras para identificar el contenido de salida.
  • El # personaje puede ser sustituido por otro carácter de mayor densidad si se desea. Utilizando el carácter de bloque completo U + 2588, permitiría que el código de barras de exploración en realidad cuando se imprima.

Los casos de prueba

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

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

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

Código recuento incluye de entrada salida (programa completo) /.

¿Fue útil?

Solución

J, 102 caracteres

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

Explicación. Leer desde la parte inferior 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!

Otros consejos

Ruby (1,9) - 121 132 141 166 170 289 < s> 295

Sombreros-off 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'

Sólo almacena los 44 caracteres necesarios y utiliza la función de transliteración de Ruby para mapear estos

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

a los valores codificados.

Python, 304 caracteres

Sin suposición de compresión Unicode. Sólo truco consiste en cambiar el orden de los caracteres para maximizar el solapamiento. 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)

ensamblador

monta 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 ingeniosos aquí.

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 de código 39 se codifica en un número de base-4 (más a la izquierda = menos significativo) con:

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

La secuencia se ordena, por ejemplo.

20333   Q
21233   N
21323   L
...

La diferencia de entradas adyacentes se toman, dando una lista como [48, 12, 3, …]. A continuación, se añade a esta lista 35 para asegurar los números están en el rango ASCII. Esto le da a la cadena "))&&&,…".

Este código también ha tomado favorecidos de la * no aparecerán en la entrada, por lo que puede sustituirlo por cualquier carácter no válido, incluyendo '. En CPython repr("ABC") == "'ABC'", para que pudiéramos deshacernos de 2 caracteres.

Python 3.1, con Unicode (154 158 caracteres)

Basado en la J solución , aprovechando el "la # carácter puede ser reemplazado con otro personaje de mayor densidad, si quería" regla general, mediante la definición de la densidad como de las partes oscuras dividido por el rectángulo delimitador 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 (2,6) - 430 312 302 caracteres

En tercer lugar ir en el problema, todavía margen de mejora. Recuento 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

Lua, 318 caracteres

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 alguna pregunta código de golf con Lua, así que no me siento mal responder a mi propio desafío aquí. También se utiliza una codificación diferente pensé que podría ser interesante para otros.

Otras observaciones

Después de mirar de cerca a la codificación, parece que puede haber una manera de prescindir de tabla de consulta, y calcular la codificación del código de barras directamente. Sin embargo, he encontrado que mis intentos de construir los cálculos tomaron más código que la mesa. (Esto puede no ser el caso en otros idiomas.)

Después de haber dividido los personajes en grupos que indicaban dónde estaban las barras anchas y espacios, vi algunos patrones interesantes. Parece que sólo hay un amplio espacio para 40 de los personajes, siendo $/+% excepciones (cada uno tiene tres espacios.) El 40 caracteres que se divide con 10 en cada ranura. Y, hay dos barras anchas para los mismos 40 caracteres. Las barras anchas parecen tener una codificación binaria con la última barra de ser un bit de paridad. patrones de bits de la Barra de ser 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, donde los números que tienen más después fijar ser evitados 2 bits.

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

Creo que es un reto para otro día para ver si los códigos de barras pueden ser codificados y sin tablas de consulta.

he hecho código para trabajar con código 39 códigos de barras en sistemas embebidos. Hay dos estilos de códigos, que creo que los códigos de 39 "regulares" y los cuatro "bichos raros". Los códigos regulares tienen uno de los diez patrones de anchos de las barras (dos de ancho tres estrecha), y uno de los cuatro patrones de anchuras de espacio (una amplia tres estrecha). Los excéntricos tienen cinco barras estrechas y uno de los cuatro patrones de anchuras de barras (tres de ancho uno estrecha). Para hacer que un código de barras con el código compacto, convertir al personaje en un número 0-39 (para códigos normales), o de 40, 50, 60, o 70 para "bichos raros". Entonces DIVMOD 10. El dígito superior seleccionará uno de los ocho patrones de anchuras espaciales; si el dígito superior es de tres o menos el dígito inferior seleccionará uno de los patrones de diez de anchos de las barras. Si el dígito superior es 4-7, las cinco barras deben ser estrechas.

El código funciona de forma muy compacta usando unas pequeñas tablas de búsqueda. Debido a que las tablas de búsqueda pueden ser compacta representados como cadenas en código fuente, los enfoques con tablas de búsqueda más grandes pueden tener el código fuente más corto (aunque creo que para debe ser contado en bytes utilizando los más de codificación favorables Código Golf Tamaño de código fuente, un enfoque con una serie de excéntricos personajes que tomaría tres bytes para almacenar en UTF-8 y dos bytes para UTF-16 o bien debe ser 'cargado' 3 bytes cada uno para excéntricos personajes, o dos bytes cada uno para todos los caracteres, lo que da un total más pequeño). Un enfoque que utiliza una selección de personajes excéntricos que se ajustan en su totalidad dentro de alguna página en particular código de un solo byte se debe cargar un byte por carácter.

Spam Spam Spam Spam preciosa correo no deseado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top