コードゴルフ:コード39バーコード
-
25-09-2019 - |
質問
の挑戦
最短のコードによる文字数を描くASCII表現したコード39バーコードです。
Wikipedia記コード39: http://en.wikipedia.org/wiki/Code_39
入力
を入力する文字列の法律文字コード39バーコードです。この43文字が有効です: 0
-9
A
-Z
(スペース)
-.$/+%
.の *
文字は表示されませんの入力として使われている開始、停止。
出力
各キャラクター符号化されたコード39バーコード分析の要素は、バーや空間です。バーされると #
文字、空間表現されるので、スペース文字です。三つの要素です。狭い要素となる文字幅の広い要素の三文字です。Aインタースペースのシングルスペースは追加すると文字パターンです。のパターンを繰り返しその高さは、バーコードで文字高い。
開始/停止文字 *
(bWbwBwBwb)で表されるようになります:
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
^ ^ ^^ ^ ^ ^ ^^^
| | || | | | |||
narrow bar -+ | || | | | |||
wide space ---+ || | | | |||
narrow bar -----+| | | | |||
narrow space ------+ | | | |||
wide bar --------+ | | |||
narrow space ----------+ | |||
wide bar ------------+ |||
narrow space --------------+||
narrow bar ---------------+|
inter-character space ----------------+
- の開始-停止文字
*
必要なものを出力する時の始点-終点をとり、バーコードです。 - ない静かな空間に含まれる必要のある、前後のバーコードです。
- チェック桁までの集計を行う必要がある。
- フルアスキーエンコードCode39は必要ないための標準43文字です。
- なテキストのニーズを下記の通り印刷済みのアスキーバーコード表現を出力す。
- 文字
#
に置換することができる他の文字の高密度化されていた。をフルに活用ブロック文字U+2588ようにバーコードを実際にスキャン)する。
テストケース
Input:
ABC
Output:
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # ### # # ### ### ### # # # # # ### ### #
Input:
1/3
Output:
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
# # ### ### # ### # # # ### # # # # # ### ### # # # # # ### ### #
Input:
- $ (minus space dollar)
Output:
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
# # ### ### # # # # ### ### # ### # ### # # # # # # # # ### ### #
コードをカウントを含む入力/出力(全プログラム)
解決
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!
他のヒント
ルビー(1.9) - 121 132 141 166 170 289 < S> 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>
符号化された値である。
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)
アセンブラ
組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:
な範囲のためて巧みな技です。
Python3.1なく、Unicode(213 215 223 240 248 249 chars)
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
→ 3Bw
→ 2bW
→ 1BW
→ 0
の配列をソートなど
20333 Q
21233 N
21323 L
...
の違いに隣接する作品をとっているにもかかわらず、をリストのような [48, 12, 3, …]
.その 35
これらに加えリストの確保のための番号のASCIIます。これにより、 "))&&&,…"
文字列になります。
このコードも取り上優遇対象となるの *
表示されませんの入力なしで不正な文字を含む '
.にCPython repr("ABC") == "'ABC'"
, こう2つの文字です。
のPython 3.1、Unicodeを使用した(154 <デル> 158 デル>文字)
J溶液に基づいて、<デル>グリフの最小境界矩形で割った暗い部分のの領域として密度を定義することにより、ののルール「を望んでいた場合は、文字#
は、より高い密度の別の文字に置き換えることができます」を利用することの。 :)デル>
print((''.join(" #"[int(c)]for d in"%r"%input()for c in bin(2*ord("䝝啕啕啕䑅儑啕䗝啕啕啕䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵"[ord(d)-32]))[2:])+"\n")*8)
パイソン(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
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ので任意のコードゴルフの質問に勝つことを期待していないので、私はここに私自身の課題に答える気を悪くしないでください。また、私は他の人に面白いかもしれないと思った別のエンコーディングを使用していました。
その他の観測
そこにテーブルルックアップを不要にする方法は、直接バーコードのエンコーディングを計算することができるかのようにエンコーディングをよく見た後、それが見えます。しかし、私は計算を構築するために、私の試みは、テーブルよりも多くのコードを取ったことがわかりました。 (これは他の言語の場合でなくてもよい。)
広いバーとスペースがいた場所を示しグループに文字を分割したので、私はいくつかの興味深いパターンを見ました。 (それらは各々が3つのスペースを持っている。)各スロットの10と40個の文字であることスプリット$/+%
のビーイングの例外を除いて、文字の40のために一つだけの広いスペースがあるようです。そして、同じ40文字のための2つの広いバーがあります。広いバーは、最後のバーはパリティビットであることと、バイナリエンコーディングを持っているようです。バーのビットパターンは、数字はもっと後、2ビットが回避される設定した。
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
私はそれがバーコードは、ルックアップテーブルなしでエンコードすることができたかどうかを確認するために、別の日のための課題だと思います。
私は、組み込みシステム上のコード39のバーコードで動作するようにコードをやりました。私は39「通常」のコードと4つの「oddballs」と考えるコード、の2つのスタイルがあります。定期的なコードは、バーの幅の10パターンの1(2ワイド3狭い)、およびスペース幅の4つのパターン(1ワイド3狭い)のいずれかを持っています。 oddballsは5つの細いバー、バー幅の4つのパターンの1(3ワイド幅の狭いもの)を持っています。 、コンパクトなコードとバーコードをレンダリング(通常コードの)番号0-39に文字を変換する、または40、50、60、または「oddballs」70します。その後、10上位桁はスペース幅の8つのパターンのいずれかを選択しますdivmod。上位桁が3以下であれば、下位の桁は、バーの幅の10パターンのいずれかを選択します。上位桁が4-7の場合は、すべての5つのバーが狭くする必要があります。
コードは非常にコンパクトにいくつかの小さなルックアップテーブルを使用して動作します。ルックアップテーブルをコンパクトにソースコード内の文字列として表すことができるので、私はコーディング最も有利なを使用して、バイト単位でカウントする必要があり、コードゴルフのソースコードサイズのためだと思うけれども(短いソースコードを有していてもよく、より大きなルックアップテーブルに近づき、アプローチの文字列でUTF-16のためにUTF-8と2バイトに格納する3つのバイトを取る変わり者文字のいずれかでなければならない)3は変わり者文字の各バイト、または二つの小さな合計をもたらすいずれか、すべての文字の各バイト「荷電」。いくつかの特定の単一バイト・コード・ページ内に完全に収まる変わり者の文字の選択を使用するアプローチは、文字あたり1つのバイトを充電する必要があります。
スパムスパムスパムスパムスパム愛らしい