26

挑战

按字符计数绘制 Code 39 条形码的 ASCII 表示的最短代码。

关于 Code 39 的维基百科文章: http ://en.wikipedia.org/wiki/Code_39

输入

对于 Code 39 条码,输入将是一串合法字符。这意味着 43 个字符是有效的:0- 9 A- Z (空格)和-.$/+%. 该*字符不会出现在输入中,因为它用作开始和停止字符。

输出

Code 39 条码中编码的每个字符都有九个元素、五个条形和四个空格。条将用#字符表示,空格将用空格字符表示。九个元素中的三个将是宽的。窄元素是一个字符宽,宽元素是三个字符宽。应在每个字符模式之间添加单个空格的字符间空格。应重复该模式,以使条形码的高度为八个字符高。

开始/停止字符*(bWbwBwBwb) 将表示如下:

                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       ^ ^ ^^ ^ ^ ^ ^^^
                       | | || | | | |||
           narrow bar -+ | || | | | |||
           wide space ---+ || | | | |||
           narrow bar -----+| | | | |||
         narrow space ------+ | | | |||
             wide bar --------+ | | |||
         narrow space ----------+ | |||
             wide bar ------------+ |||
         narrow space --------------+||
           narrow bar ---------------+|
inter-character space ----------------+
  • 开始和结束字符*需要在条码的开始和结束处输出。
  • 条形码之前或之后不需要包含安静空间。
  • 不需要计算校验位。
  • 不需要完整的 ASCII Code39 编码,只需标准的 43 个字符。
  • 无需在 ASCII 条形码表示下方打印任何文本来识别输出内容。
  • 如果需要,该字符#可以替换为另一个更高密度的字符。使用完整的块字符 U+2588,将允许条形码在打印时实际扫描。

测试用例

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

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

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

代码计数包括输入/​​输出(完整程序)。

4

10 回答 10

25

J,102 个字符

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

解释。从下往上阅读:

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!
于 2010-05-11T00:31:40.073 回答
8

红宝石 (1.9) - 121 132 141 166 170 289 295

向大卫脱帽致敬

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'

只存储需要的 44 个字符,并使用 Ruby 的音译函数来映射这些

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

到编码值。

于 2010-05-11T05:18:40.787 回答
7

Python,304 个字符

没有花哨的 Unicode 压缩。唯一的技巧是重新排序字符以最大化重叠。我的第一个 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)
于 2010-05-11T01:36:56.860 回答
6

汇编器

汇编为 220 字节。

    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:

在这里做聪明把戏的空间不大。

于 2010-05-12T14:14:04.197 回答
5

Python 3.1,没有 Unicode (213215 223 240 248 249字符)

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)

解释:

代码 39 序列被编码为一个以 4 为基数的数字(最左边 = 最不重要),其中:

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

然后对序列进行排序,例如

20333   Q
21233   N
21323   L
...

取相邻条目的差异,给出一个类似的列表[48, 12, 3, …]。然后35将其添加到此列表中以确保数字落在 ASCII 范围内。这给出了"))&&&,…"字符串。

此代码还利用了*不会出现在输入中的优势,因此我们可以将其替换为任何无效字符,包括'. 在 CPythonrepr("ABC") == "'ABC'"中,我们可以去掉 2 个字符。

于 2010-05-11T20:48:45.703 回答
3

Python 3.1,带有 Unicode(154158字符)

基于J 解利用#如果需要,可以用另一个更高密度的字符替换字符”规则,通过将密度定义为暗部分的面积除以字形的最小边界矩形。:)

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

Python (2.6) -- 430 312 302 个字符

第三个问题,还有改进的余地。字符计数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
于 2010-05-10T22:59:47.240 回答
1

Lua,318 个字符

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

我不希望用 Lua 赢得任何代码高尔夫问题,所以在这里回答我自己的挑战我感觉不错。它还使用了我认为其他人可能会感兴趣的不同编码。

其他意见

仔细观察编码后,似乎有一种方法可以省去查表,直接计算条码的编码。但是,我发现我尝试构建计算所用的代码比表格多。(在其他语言中可能不是这种情况。)

将字符分组以指示宽条和空格的位置后,我看到了一些有趣的模式。似乎只有一个宽的空格可以容纳 40 个字符,但有$/+%例外(它们每个都有三个空格。) 40 个字符被拆分为每个插槽中的 10 个字符。而且,对于相同的 40 个字符,有两个宽条。宽条似乎具有二进制编码,最后一个条是奇偶校验位。条形图的位模式为 1、2、3、4、5、6、8、9、10、12,其中避免了设置超过 2 位的数字。

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-._*
1 3 5 8 ACEHKMORUWY 。1010100100
 23 6 9 BC FI LM PS 大众 Z _ 0110010010
   456 0 DEF J NOP T XYZ * 0001110001
      7890 GHIJ QRST -._* 0000001111
12 4 7 AB DG KL NQ UV X - 1101001000 --> 奇偶校验

我想,看看条形码是否可以在没有查找表的情况下进行编码,这将是另一天的挑战。

于 2010-05-14T22:47:49.420 回答
0

我已经编写了代码来处理嵌入式系统上的代码 39 条码。代码有两种样式,我认为是 39 个“常规”代码和四个“奇数”代码。常规代码具有十种条宽模式之一(二宽三窄)和四种空间宽度模式之一(一宽三窄)。奇数球有五个窄条和四种条宽模式之一(三宽一窄)。要使用紧凑代码呈现条形码,请将字符转换为数字 0-39(对于普通代码),或 40、50、60 或 70 用于“oddballs”。然后 divmod 10。高位将选择八种空间宽度模式中的一种;如果高位为 3 或更少,则低位将选择十种条形宽度模式中的一种。如果上位数字是 4-7,则所有五个条都应该是窄的。

该代码使用一些小型查找表非常紧凑。因为查找表可以在源代码中紧凑地表示为字符串,具有较大查找表的方法可能具有较短的源代码(尽管我认为对于 Code Golf 源代码大小应该使用最有利的编码以字节为单位计算;具有字符串的方法在 UTF-8 中存储三个字节而在 UTF-16 中存储两个字节的奇数字符应该为奇数字符每个“收费”3 个字节,或者所有字符每个两个字节,以产生较小的总数为准)。使用完全适合某些特定单字节代码页的奇怪字符选择的方法应该对每个字符收费一个字节。

于 2010-08-30T14:59:23.390 回答
-1

垃圾邮件 垃圾邮件 垃圾邮件 可爱的垃圾邮件

于 2010-10-29T09:42:59.287 回答