Подтвердить что ты не робот

Code Golf: код 39 Bar Code

Задача

Самый короткий код по количеству символов для рисования ASCII-представления штрих-кода кода 39.

Статья в Википедии о коде 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:
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 

Количество кодов включает ввод/вывод (полная программа).

4b9b3361

Ответ 1

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!

Ответ 2

Ruby (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>

к закодированным значениям.

Ответ 3

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)

Ответ 4

Ассемблер

Объединяет до 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:

Здесь не так много возможностей для совершения хитроумных трюков.

Ответ 5

Python 3.1, без Юникода (213 215 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. Это дает строку "))&&&,…".

Этот код также получил преимущество * не появится на входе, поэтому мы можем заменить его на любой недопустимый символ, включая '. В CPython repr("ABC") == "'ABC'", поэтому мы могли бы избавиться от двух символов.

Ответ 6

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)

Ответ 7

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

Ответ 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, поэтому я не чувствую себя плохо, отвечая на свой собственный вызов здесь. Он также использовал другую кодировку, которая, как мне показалось, может быть интересной для других.

Другие наблюдения

Посмотрев внимательно на кодировку, кажется, что может быть способ отказаться от поиска таблицы и вычислить кодировку штрих-кода напрямую. Тем не менее, я обнаружил, что мои попытки построить вычисления заняли больше кода, чем таблица. (Это может быть не так на других языках.)

Разделив символы на группы, указывающие, где были широкие полосы и пробелы, я увидел несколько интересных паттернов. Кажется, что существует только одно широкое пространство для 40 символов, причем $/+% является исключением (каждое из них имеет три пробела). 40 символов разделены на 10 в каждом слоте. И есть две широкие полосы для тех же 40 символов. У широких полосок, по-видимому, есть двоичное кодирование, при этом последний бар является битом четности. Битовые диаграммы штрихов составляют 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, где числа, содержащие более 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

Я думаю, что еще один день - это вызов для проверки того, можно ли закодировать штрих-коды без справочных таблиц.

Ответ 9

Я сделал код для работы со штрих-кодами кода 39 на встроенных системах. Есть два стиля кодов, которые я считаю как 39 "обычных" кодов и четырех "чудаков". Обычные коды имеют один из десяти шаблонов ширины бара (два широких три узких) и один из четырех вариантов ширины пространства (один широкий три узких). У чудаков пять узких баров и один из четырех рисунков ширины бара (три широких узких). Чтобы сделать штрих-код с компактным кодом, преобразуйте символ в число 0-39 (для нормальных кодов) или 40, 50, 60 или 70 для "странных". Затем divmod 10. Верхняя цифра выберет один из восьми шаблонов ширины пространства; если верхняя цифра составляет три или меньше, нижняя цифра будет выбирать один из десяти шаблонов ширины бара. Если верхняя цифра 4-7, все пять полос должны быть узкими.

Код работает очень компактно, используя несколько небольших таблиц поиска. Поскольку таблицы поиска могут быть компактно представлены в виде строк в исходном коде, подходы с большими таблицами поиска могут иметь более короткий исходный код (хотя я думаю, что размер исходного кода Code Golf должен учитываться в байтах с использованием наиболее благоприятного кодирования: подход с строкой нечетные символы, которые будут занимать три байта для хранения в UTF-8, а два байта для UTF-16 должны либо "заряжаться" 3 байтами для символов с нечетным символом, либо по два байта для всех символов, в зависимости от того, какая из них дает меньшую сумму). Подход, который использует выбор нечетных символов, которые полностью помещаются на какую-то конкретную однобайтную кодовую страницу, должен быть заряжен по одному байту на символ.

Ответ 10

спам спам спам спам прекрасный спам