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


19

Напишіть програму, яка переводить текст ASCII на вивід шрифтом Брайля . Вимоги:

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

Оцінка балів здійснюється за кількістю символів у вихідному коді. Штрафи та бонуси:

Зразок виклику та виведення (мінімальне рішення):

$ 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 зайвих символів, не надто бонус (якщо ви не стискаєте дані брайля)
qwr

1
Ви можете порахувати байти замість символів і зняти штраф, вартість приблизно однакова (@ перше рішення DigitalTrauma - 85 байт). Редагувати: Я щойно зрозумів, що це скаже такі мови, як APL. Тобі вирішувати.
nyuszika7h

1
Людина ... штраф за символи Unicode недостатньо великий, щоб зробити це цікавим. Я хотів подивитися, як люди збираються кодувати набір Брайля.
Алмо

Відповіді:


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="")

Одноколісний (завдяки toıʇǝɥʇ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

@ ɐɔıʇǝɥʇuʎs вау, я забув про maxхитрість. Дякую
qwr

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

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

Можливо, не зовсім те, що планувала ОП, це переосмислює шрифт для малих символів. 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 символи unicode + 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
Я думаю, що добре використовувати короткий тег відкриття в коді-гольф , тому ви можете використовувати <?замість того, <?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 цифр; a 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

перл, 195 + 2-50 = 147

Це обробляє величини, цифри та пунктуацію, не покладаючись на unicode (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}`)}

EDIT: Завдяки mbomb007 врятував мені два байти - на жаль, я виявив, що трохи попереднього гольфу все зруйнувало, тому мені довелося знову додати 27 символів.

EDIT: Aaі 12 байтів, збережених переміщенням пробілів.

EDIT: Зрозуміло, що це нерозумно, щоб виводити як символи, і врятувало досить багато байтів. Я також зберегла кілька символів, замінивши 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 Braille, а не фактичну діаграму Ascii. Тож це все одно дискваліфікується.
Маркус Дірр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.