26

チャレンジ

Code39バーコードのASCII表現を描画するための文字数による最短のコード。

Code 39に関するウィキペディアの記事:http: //en.wikipedia.org/wiki/Code_39

入力

入力は、Code39バーコードの有効な文字列になります。これは、43文字が有効であることを意味します:0-- 9 AZ スペース)および-.$/+%。文字は*開始文字と停止文字として使用されるため、入力には表示されません。

出力

Code 39バーコードでエンコードされた各文字には、9つの要素、5つのバー、および4つのスペースがあります。バーは#文字で表され、スペースはスペース文字で表されます。9つの要素のうち3つは幅が広くなります。幅の狭い要素は1文字幅になり、幅の広い要素は3文字幅になります。各文字パターンの間に、単一のスペースの文字間スペースを追加する必要があります。バーコードの高さが8文字になるように、パターンを繰り返す必要があります。

開始/停止文字*(bWbwBwBwb)は、次のように表されます。

                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       ^ ^ ^^ ^ ^ ^ ^^^
                       | | || | | | |||
           narrow bar -+ | || | | | |||
           wide space ---+ || | | | |||
           narrow bar -----+| | | | |||
         narrow space ------+ | | | |||
             wide bar --------+ | | |||
         narrow space ----------+ | |||
             wide bar ------------+ |||
         narrow space --------------+||
           narrow bar ---------------+|
inter-character space ----------------+
  • 開始文字と停止文字*は、バーコードの開始と終了時に出力する必要があります。
  • バーコードの前後に静かなスペースを含める必要はありません。
  • チェックディジットを計算する必要はありません。
  • 完全なASCIICode39エンコーディングは必要ありません。標準の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 -121132141166170289295 _ _

デビッドへの帽子オフ

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 249chars)

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)

説明:

code 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(154158chars)

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 -430312302 文字

3番目に問題に取り組みますが、まだ改善の余地があります。による文字数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文字の広いスペースは1つしかないようです$/+%(それぞれに3つのスペースがあります)。40文字は各スロットで10に分割されています。また、同じ40文字に対して2つの幅の広いバーがあります。幅の広いバーは、最後のバーがパリティビットであるバイナリエンコーディングのようです。バーのビットパターンは1、2、3、4、5、6、8、9、10、12であり、2ビットを超える数値が設定されている場合は回避されます。

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ -._ *
1 3 58ACEHKMORUWY。1010100100
 23 6 9 BC FI LM PS VW Z _ 0110010010
   456 0 DEF J NOP T XYZ * 0001110001
      7890 GHIJ QRST -._ * 0000001111
12 4 7 AB DG KL NQUVX-1101001000->パリティ

ルックアップテーブルなしでバーコードをエンコードできるかどうかを確認するのは、別の日の課題だと思います。

于 2010-05-14T22:47:49.420 に答える
0

組み込みシステムでcode39バーコードを処理するためのコードを作成しました。コードには2つのスタイルがあり、39の「通常の」コードと4つの「オッドボール」と私は考えています。通常のコードには、バー幅の10パターンの1つ(幅2つ幅3つ狭い)と、スペース幅の4つのパターンの1つ(幅1つ幅3つ狭い)があります。オッドボールには、5つの細いバーと4つのバー幅のパターンの1つがあります(3つの広いバーと1つの狭いバー)。コンパクトなコードでバーコードをレンダリングするには、文字を0〜39の数字(通常のコードの場合)、または「奇数ボール」の場合は40、50、60、または70に変換します。次にdivmod10。上の桁は、スペース幅の8つのパターンの1つを選択します。上の桁が3以下の場合、下の桁はバー幅の10パターンの1つを選択します。上の桁が4〜7の場合、5本のバーすべてを狭くする必要があります。

コードは、いくつかの小さなルックアップテーブルを使用して非常にコンパクトに機能します。ルックアップテーブルはソースコードで文字列としてコンパクトに表現される可能性があるため、ルックアップテーブルが大きいアプローチでは、ソースコードが短くなる可能性があります(ただし、Code Golfの場合、ソースコードのサイズは、最も適切なコーディングを使用してバイト単位でカウントする必要があります。 UTF-8に格納するのに3バイト、UTF-16に2バイトかかる奇数ボール文字は、奇数ボール文字の場合はそれぞれ3バイト、すべての文字の場合はそれぞれ2バイトのいずれか少ない方の合計で「課金」されます。特定のシングルバイトコードページに完全に収まる奇数ボール文字の選択を使用するアプローチでは、文字ごとに1バイトが課金されます。

于 2010-08-30T14:59:23.390 に答える
-1

スパムスパムスパムスパム素敵なスパム

于 2010-10-29T09:42:59.287 に答える