Перевести текст ASCII на шрифт Брайля


19

Напишите программу, которая переводит текст ASCII в вывод Брайля . Требования:

  • Входные данные могут поступать из стандартного ввода, командной строки или другого внешнего источника ввода.
  • Вывод должен быть распознан как шрифт Брайля, форма вывода зависит от вас. Примером может служить oвыпуклая точка и .невыпуклая точка. Текстовое представление шаблона, например, 1-3-4не приемлемо. Перенос строки не требуется.
  • Для минимального решения требуются только 26 букв алфавита и пробел. Все входные символы, не поддерживаемые вашим решением, должны игнорироваться.

Оценка по количеству символов в исходном коде. Штрафы и бонусы:

  • +50 штрафов за использование символов Брайля Unicode в качестве вывода.
  • -50 бонус за поддержку столиц, цифр и знаков препинания.
  • -200 бонус за поддержку лигатур и однобуквенных сокращений от английского (класс 2) Брайля . (Будет сделать это отдельной проблемой, так как это совсем другая проблема.)

Пример вызова и вывода (минимальное решение):

$ braille Hello world
o .  o .  o .  o .  o .  . .  . o  o .  o .  o .  o o
o o  . o  o .  o .  . o  . .  o o  . o  o o  o .  . o
. .  . .  o .  o .  o .  . .  . o  o .  o .  o .  . .

определить «доблестная попытка». Кроме того, требуется ли перенос строки?
Джон Дворжак

@JanDvorak: Спасибо, обновленный вопрос.
Грег Хьюгилл

1
@GregHewgill Можете ли вы увеличить бонус за добавление прописных, цифр и знаков препинания? В настоящее время это 26 + 10 + 12 = 48 дополнительных символов, не так много бонуса (если вы не
сжимаете

1
Вы можете посчитать байты вместо символов и убрать штраф, стоимость примерно одинакова (первое решение @ DigitalTrauma - 85 байт). Изменить: я только что понял, что будет наказывать языки, такие как APL. Тебе решать.
nyuszika7h

1
Чувак ... штраф за символы Юникода недостаточно велик, чтобы сделать это интересным. Я хотел посмотреть, как люди собираются кодировать набор Брайля.
Almo

Ответы:


6

Питон, 162

l=map((" a c,bif/e d:hjg'k m;lsp o n!rtq%12s. w -u x v   z y"%'').find,raw_input().lower())
for i in 1,4,16:print'  '.join('.o.o    ..oo'[(n&i*3)/i::4]for n in l)

В настоящее время поддерживает строчные буквы и некоторые знаки препинания, но это все еще в стадии разработки.

Пример:

$ python braille.py
Hello, world!
o .  o .  o .  o .  o .  . .  . .  . o  o .  o .  o .  o o  . .
o o  . o  o .  o .  . o  o .  . .  o o  . o  o o  o .  . o  o o
. .  . .  o .  o .  o .  . .  . .  . o  o .  o .  o .  . .  o .

6

Питон - 90 75 + 50 = 125

Используйте строчные буквы.

for l in input():
 a=ord(l)-96
 if a<0:a=0
 print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[a],end="")

Однострочник (спасибо ɐɔıʇǝɥʇuʎs)

for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")

1
Почему бы не сделать его однострочным? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 символов.
ɐɔıʇǝɥʇuʎs

@ Ничего себе, я забыл об этом maxтрюке. Спасибо
qwr

Вы можете сохранить символ, просто поставив пробелы для всех не буквенных символов:for l in input():print((" "*97+"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵")[ord(l)],end="")
xnor

3

С 269

#define C char
#define O*p++=(*t&1)*65+46;*t>>=1;
main(int c,C**v){C b[99]={1,5,3,11,9,7,15,13,6,14},o[99],*q=o,*p=v[1],*t;while(c=*p++)*q++=c=='w'?46:c>='a'&&c<='z'?c-='a'+(c>'w'),b[c%10]|(c>9)*16|(c>19)*32:0;for(c=3;c;c--){p=b;for(t=o;t<q;t++){O;O*p++=32;}puts(b);}}

Эта реализация требует, чтобы ее аргумент, если он содержит пробелы, был заключен в кавычки:

# braille "hello world"

3

BBC Basic 103 символа ASCII или 92 токена

A$="HXIKJY[ZQShxikjy{zqsl|Wmon"FORK=1TO26A=ASC(MID$(A$,K))VDU23,K+96,A AND9;0,A/2AND9;0,A/4AND9;:NEXT

Возможно, не совсем то, что предполагал OP, это переопределяет шрифт для строчных букв. VDU 23,n,a,b,c,d,e,f,g,hназначает растровое изображение 8x8 на символ n, состоящий из восьми байтов. Если после параметра указать точку с запятой вместо запятой, он будет рассматриваться как двухбайтовое число с прямым порядком байтов.

Брайлевские шаблоны для писем aчерез zкоторые хранятся в A $, в соответствии со следующей схемой передачи данных. Это извлекается масками с 9 = двоичным 1001и правыми сдвигами (деление на 2 и 4 используется в качестве стандартного базового BBC не имеет оператора сдвига.)

 8 1
16 2
32 4

Код без правил

A$="HXIKJY[ZQShxikjy{zqsl|Wmon"
FORK=1TO26
  A=ASC(MID$(A$,K))
  VDU23,K+96,A AND9;0,A/2AND9;0,A/4AND9;
NEXT

Пример использования

Это сделано в режиме экрана 6 для ясности (наберите MODE6, как только вы откроете эмулятор командной строки.)

На самом деле, после запуска кода любые буквы в нижнем регистре (включая ввод с клавиатуры) появляются в шрифте Брайля.

введите описание изображения здесь

Эмулятор на http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Смотрите также мой аналогичный ответ: /codegolf//a/28869/15599


2

Bash + coreutils

Минимальное решение - только строчные, 83 (33 символа Юникод + 50 штрафов):

tr a-z ⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺

Столицы, цифры и знаки препинания, 120 (120 символов Юникода + 50 штрафов - 50 бонусов):

a=⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺
sed 's/\([0-9]\)/⠼&/g;s/\([A-Z]\)/⠠&/g'|tr ",;':\-⎖.!“?”()/a-zA-Z1-90" ⠂⠆⠄⠒⠤⠨⠲⠖⠦⠦⠴⠶⠶⠌$a$a$a

Пример вывода:

$ echo {A..Z} {a..z} {0..9} ".,;:" | ./braille.sh 
⠠⠁ ⠠⠃ ⠠⠉ ⠠⠙ ⠠⠑ ⠠⠋ ⠠⠛ ⠠⠓ ⠠⠊ ⠠⠚ ⠠⠅ ⠠⠇ ⠠⠍ ⠠⠝ ⠠⠕ ⠠⠏ ⠠⠟ ⠠⠗ ⠠⠎ ⠠⠞ ⠠⠥ ⠠⠧ ⠠⠭ ⠠⠽ ⠠⠵ ⠠⠺ ⠁ ⠃ ⠉ ⠙ ⠑ ⠋ ⠛ ⠓ ⠊ ⠚ ⠅ ⠇ ⠍ ⠝ ⠕ ⠏ ⠟ ⠗ ⠎ ⠞ ⠥ ⠧ ⠭ ⠽ ⠵ ⠺ ⠼⠚ ⠼⠁ ⠼⠃ ⠼⠉ ⠼⠙ ⠼⠑ ⠼⠋ ⠼⠛ ⠼⠓ ⠼⠊ ⠲⠂⠆⠒
$ 

1

PHP, 331

<?php $d=split("/",gzinflate(base64_decode("NYzBDQBACIM26o3G/r+LRf2QYAOZe4SCLKgU7A9lEWVOzrQVrAiwghWhLKLMyZlawTTGMIYxPg==")));$d[-65]="......";$i=str_split(preg_replace("/[^a-z ]/","",trim(fgets(STDIN))));$o=["","",""];$S="substr";foreach($i as $c){$v=ord($c)-97;for($x=0;$x<3;$x++)$o[$x].=$S($d[$v],$x*2,2)." ";}echo join($o,"\n");

На данный момент бонусов нет.


2
Я думаю, что можно использовать короткий открывающий тег в code-golf , так что вы можете использовать <?вместо того, <?php[SPACE]чтобы сохранять 4 символа.
nyuszika7h

1

JavaScript - 286

w=prompt().split('');for(i=0;i<w.length;i++){z=w[i];o="o",p=".";b=[1,5,3,11,9,7,15,13,6,14];e=[c="",1,3];g=z.charCodeAt(0)-97;if(g>22)g--;f=e[g/10|0];d=b[g%10];if(g==22){d=14;f=2;}c+=d&1?o:p;c+=d&2?o:p;c+="\n";c+=d&4?o:p;c+=d&8?o:p;c+="\n";c+=f&1?o:p;c+=f&2?"o\n":".\n";console.log(c);}

Первая попытка. Нет бонусов.


2
Вы можете уменьшить его до 279 сw=prompt().split("");for(i=0;i<w.length;i++)z=w[i],o="o",p=".",b=[1,5,3,11,9,7,15,13,6,14],e=[c="",1,3],g=z.charCodeAt(0)-97,22<g&&g--,f=e[g/10|0],d=b[g%10],22==g&&(d=14,f=2),c+=d&1?o:p,c+=d&2?o:p,c+="\n",c+=d&4?o:p,c+=d&8?o:p,c+="\n",c+=f&1?o:p,c+=f&2?"o\n":".\n",console.log(c)
WallyWest

1
Придется запомнить этот подход, хороший длинный одиночный оператор для цикла :)
Мэтт

1

CJam - 51

q{i32%"@`hptdx|lX\bjrvfz~nZ^ck]swg"=i2b1>2/}%zSf*N*

Попробуйте это на http://cjam.aditsu.net/

Пример ввода:

braille is strange

Пример вывода:

10 10 10 01 10 10 10 00 01 01 00 01 01 10 10 11 11 10 
10 11 00 10 10 10 01 00 10 10 00 10 11 11 00 01 11 01 
00 10 00 00 10 10 00 00 00 10 00 10 10 10 00 10 00 00 

Он поддерживает только строчные буквы и пробел. Другие символы отображаются на поддерживаемые символы (в частности, заглавные буквы в строчные).

Объяснение:

Символы Брайля кодируются с использованием 1 для выпуклой точки и 0 для невыполненной точки, слева направо и сверху вниз. Это дает 6 цифр основания-2; 1 добавляется перед тем, чтобы избежать удаления начальных нулей, затем число преобразуется в основание 10, а затем в соответствующий символ ASCII.
Пример: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Программа преобразует обратно каждый символ в триплет пар битов (например, [[0 1][1 1][1 0]]), получая матрицу пар битов. Затем матрица транспонируется и добавляются разделители (пробелы в строках, новые строки между строками).

qчитает входные данные в строку = массив символов
{…}%применяет блок к каждому символу
i32%получает код ASCII mod 32 (пробел-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"- строка, содержащая символы Брайля кодируется, как описано выше,
=получает соответствующий закодированный символ Брайля из строки,
i2bполучает код ASCII, затем преобразует в основание 2 (получает массив из 7 цифр),
1>удаляет первую цифру 1,
2/разбивает массив на (3) пары,
zтранспонирует матрицу,
Sf*объединяет каждую строку с пробелы
N*соединяют строки с символами новой строки


0

С 249 244

#define B?111:46
#define P(a,b)printf("%c%c ",a B,b B):
a,i;main(int c,char**v){for(char*p;p=v[1],a<3;puts(""),++a)while(i=*p++)i==32?P(0,0)i/97&122/i?c=(i+=(i==119)*17-97-(i>119))%10,a?a^1?P(i/10%3,i/20)P(c>4|c==1,c/3&&c%3-2)P(c<8,5*c/8%2)0;}

Ввод - это аргумент командной строки, который должен быть экранирован или заключен в кавычки, если строка содержит пробелы. Поддерживаемые символы - строчные буквы и пробел. Неподдерживаемые символы молча удаляются.

Изменить: побрить 5 байтов, упрощая условие


0

perl, 195 + 2-50 = 147

Это обрабатывает капитал, число и пунктуацию, не полагаясь на юникод (195 байтов + 2 байта (для -pl) - 50 бонусов)

~s/([A-Z])/|$1/g,~s/(\d)/#$1/g,tr/1-90/a-ij/;for$i(1,2,4){map{for$j(1,8){$s.=index(" a,b'k;l^cif/msp_e:h*o!r_djg_ntq|_?_-u(v_____x____._)z\"___w_#y",l$
"}$_=$s

С отступом:

~s/([A-Z])/|$1/g,
~s/(\d)/#$1/g,
tr/1-90/a-ij/;
for$i(1,2,4){
  map{
    for$j(1,8){
     $s.=index(" a,b'k;l^cif/msp_e:h*o!r_djg_ntq|_?_-u(v_____x____._)z\"___w_#y",lc($_))&$j*$i?o:_
    }
   $s.=_
  }split//;
  $s.="
"}
$_=$s

Образец вывода

perl -pl brail.pl
Hello, 99!
___o__o__o__o__o_________o__o__o__o____
___oo__o_o__o___o_o______o_o___o_o__oo_
_o_______o__o__o________oo____oo____o__

0

Javascript ES6 - 282 309 297 283 270 - 50 = 232 259 233 220 байт

Это будет короче, но проверка на заглавные буквы больно .

f=_=>{z='toLowerCase';k=(a,b)=>a%b>~-b/2?1:0;t=(a,b)=>k(a,b)+`${k(a,b/2)} `;b=c=d='';for(v of _){v==v[z]()?0:(b+=0,c+=0,v=v[z](d+=1));$=` ,'-";9015283467@./+^_>#i[s!jwt)a*kue:ozb<lvh\\r(c%mxd?nyf$p&g]q=`.search(v);b+=t($,64);c+=t($,16);d+=t($,4)}alert(`${b}
${c}
${d}`)}

РЕДАКТИРОВАТЬ: Спасибо mbomb007 за то, что сэкономил мне два байта - к сожалению, я обнаружил, что немного предыдущих игр в гольф испортило все, поэтому мне пришлось добавить 27 символов обратно.

РЕДАКТИРОВАТЬ: Aa и 12 байтов сохранены путем перемещения пробелов.

РЕДАКТИРОВАТЬ: понял, что было бы глупо выводить в виде символов, и сэкономил немало байтов. Я также сохранил несколько символов, поменяв местами k = (a, b) => a% (2 * b)> b-1? 1: 0 для k = (a, b) => a% b> ~ -b / 2 1: 0.


Может быть, это было бы короче, чтобы присвоить string.toLowerCaseпеременной?
mbomb007

Числа должны состоять из двух букв (например, 3 = ⠼⠉): префикс номера (⠼) и шифры преобразуются в эквивалентные буквы (3 = c = ⠉). 1-9-->a-iи0-->j
Адам

Я видел разные графики - это не тот случай, на котором я проверял.
Маркус Дирр

И я только что понял, что использовал кодировку Брайля ASCII, а не реальную диаграмму Ascii. Так что это все равно дисквалифицировано.
Маркус Дирр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.