Код Golf: код 39 штрих-кода
-
25-09-2019 - |
Вопрос
Соревнование
Самый короткий код по количеству символов, чтобы нарисовать представление ASCII кода 39 штрих-кода.
Википедия Статья о Коде 39: http://en.wikipedia.org/wiki/Code_39.
Вход
Вход будет строка юридических символов для кода 39 штрих-кодов. Это означает, что 43 символа действительны: 0
-9
A
-Z
(пространство) и
-.$/+%
. Отказ То *
Персонаж не будет отображаться на входе, так как он используется в качестве символов запуска и остановки.
Выход
Каждый символ, закодированный в коде 39 штрих-кодах, имеет девять элементов, пять баров и четыре пробела. Бары будут представлены с #
Персонажи и пробелы будут представлены с пространственным характером. Три из девяти элементов будут широкими. Узкие элементы будут ширины одним символом, и широкие широкие элементы будут ширины три символа. Межсимажное пространство одного пространства должно быть добавлено между каждым рисунком символов. Шаблон должен быть повторен таким образом, чтобы высота штрих-кода высотой восемь символов.
Символ начала / остановки *
(bwbwwwww) будет представлен так:
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
# # ### ### #
^ ^ ^^ ^ ^ ^ ^^^
| | || | | | |||
narrow bar -+ | || | | | |||
wide space ---+ || | | | |||
narrow bar -----+| | | | |||
narrow space ------+ | | | |||
wide bar --------+ | | |||
narrow space ----------+ | |||
wide bar ------------+ |||
narrow space --------------+||
narrow bar ---------------+|
inter-character space ----------------+
- Персонаж начала и остановки
*
должен будет выводиться в начале и конец штрих-кода. - Никакое тихое пространство не нужно будет включено до или после штрих-кода или после штрих-кода.
- Не нужно будет рассчитана чековая цифра.
- Полный кодирующий ASCII код39 не требуется, просто стандартные 43 символа.
- Ни один текст не должен быть напечатан ниже представления штрихового кода ASCII для идентификации выходного содержимого.
- Персонаж
#
Может быть заменен другим характером более высокой плотности, если хотеть. Используя полный персонаж блока 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!
Другие советы
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>
к закодированным значениям.
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:
Не так много масштабов для того, чтобы делать умные хитрости здесь.
Python 3.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 кодируется в номер Base-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 Chars)
На основе J раствор, воспользоваться "Персонаж #
Может быть заменен другим характером более высокой плотности, если хотеть » правило, определяя плотность как Площадь темных деталей, разделенных на наименьший ограничивающий прямоугольник глифа. :)
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 персонажей
Третий пройти проблему, все еще комната для улучшения. Подсчет персонажа 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
Луа, 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 VW Z _ 0110010010 456 0 Def J NOP T XYZ * 0001110001 7890 Ghij QRST -._ * 0000001111 12 4 7 AB DG KL NQ UV X - 1101001000 -> Паритет
Я предполагаю, что это проблема для другого дня, чтобы посмотреть, можно ли кодировать штрих-коды без таблиц поиска.
Я сделал код для работы с кодом 39 штрих-кодов в встроенных системах. Существует два стиля кодов, которые я думаю о том, как 39 «регулярные» коды и четыре «чудака». Регулярные коды имеют один из десяти паттернов ширины полоса (два ширина три узких), а также один из четырех узоров ширины пространства (один широк три узких). Окудышки имеют пять узких баров и один из четырех узоров ширины полоса (три ширина один узкий). Чтобы сделать штрих-код с компактным кодом, преобразуйте символ в число 0-39 (для нормальных кодов) или 40, 50, 60 или 70 для «чудаков». Затем divmod 10. Верхняя цифра выберет один из восьми моделей ширины пространства; Если верхняя цифра три или меньше, нижняя цифра выберет один из десяти шаблонов ширины полоса. Если верхняя цифра 4-7, все пять баров должны быть узкими.
Код работает очень компактно, используя несколько небольших таблиц поиска. Поскольку таблицы поиска могут быть компактно представлены в виде строк в исходном коде, подходы с более крупными таблицами поиска могут иметь более короткий исходный код (хотя я думаю, что для исходного кода гольф кода должен учитываться в байтах, используя наиболее выгодное кодирование; подход со строкой Одним числовым персонажам, которые приведут три байта для хранения в UTF-8 и два байта для UTF-16, должны либо быть «заряженными» 3 байтами каждого для символов чудак, либо два байта каждого для всех символов, в зависимости от того, что дает меньшую сумму). Подход, который использует выбор символов чудак, которые полностью соответствуют в пределах определенной однобайтовой кодовой страницы, следует заряжать один байт на символ.
спам спам спам спам прекрасный спам