ASCII metnini braille diline çevir


19

ASCII metnini braille çıktısına çeviren bir program yazın . Gereksinimler:

  • Giriş stdin, komut satırı veya başka bir harici giriş kaynağından gelebilir.
  • Çıktı braille olarak tanınabilir olmalı, çıktı formu size kalmış. Bir örnek oyükseltilmiş bir nokta ve .yükseltilmemiş bir nokta için olabilir. Metin örüntü gösterimi 1-3-4kabul edilemez. Uzun satır sarması gerekli değildir.
  • Minimum bir çözüm için sadece 26 alfabe karakteri ve boşluk gerekir. Çözümünüz tarafından desteklenmeyen tüm giriş karakterleri yok sayılmalıdır.

Puanlama, kaynak koddaki karakter sayısına göre yapılır. Cezalar ve bonuslar:

  • Unicode braille karakterlerini çıktı olarak kullanmak için +50 ceza .
  • Büyük harfleri, sayıları ve noktalama işaretlerini desteklemek için -50 bonus.
  • İngilizce (Grade-2) Braille'den bitişik harfleri ve tek harfli kasılmaları desteklemek için -200 bonus . (Bu, farklı bir sorun olacağından ayrı bir zorluk oluşturacaktır.)

Örnek çağırma ve çıktı (minimal çözüm):

$ 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 .  . .

"yiğit girişimi" tanımlar. Ayrıca, satır sarma gerekli mi?
John Dvorak

@ JanDvorak: Teşekkürler, güncellenmiş soru.
Greg Hewgill

1
@GregHewgill Büyük harf, sayı ve noktalama işareti ekleme bonusunu artırabilir misiniz? Şu anda 26 + 10 + 12 = 48 ekstra karakter, fazla bonus yok (braille verilerini sıkıştırmadıkça)
qwr

1
Karakterler yerine baytları sayabilir ve cezayı kaldırabilirsiniz, maliyet yaklaşık aynıdır (@ DigitalTrauma'nın ilk çözümü 85 bayttır). Edit: Ben sadece APL gibi dilleri cezalandıracağını anladım. Sana kalmış.
nyuszika7h

1
Dostum ... Unicode karakterlerin cezası bunu ilginç kılacak kadar büyük değil. İnsanların braille setini nasıl kodlayacağını görmek istedim.
Almo

Yanıtlar:


6

Python, 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)

Şu anda küçük harfleri ve bazı noktalama işaretlerini destekliyor, ancak hala devam eden bir çalışma.

Misal:

$ 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

Python - 90 75 + 50 = 125

Küçük harfler kullanın.

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

Tek astar (thanksıʇǝɥʇuʎs sayesinde)

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

1
Neden tek astar yapmıyorsun? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 karakter.
Julıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs vay, maxhile unuttum . Teşekkür ederim
qwr

Tüm harf olmayan karakterler için boşluklar koyarak bir karakter kaydedebilirsiniz:for l in input():print((" "*97+"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵")[ord(l)],end="")
xnor

3

C, 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);}}

Bu uygulama, boşluk içeriyorsa, argümanının alıntılanmasını gerektirir:

# braille "hello world"

3

BBC Basic 103 ASCII karakterleri veya 92 jeton

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

Muhtemelen OP'nin istediği gibi değil, bu, küçük harfler için yazı tipini yeniden tanımlar. VDU 23,n,a,b,c,d,e,f,g,hn karakterine sekiz bayttan oluşan 8x8 bitmap atar. Virgül yerine noktalı virgül içeren bir parametrenin izlenmesi, parametrenin iki baytlık küçük bir endian sayısı olarak ele alınmasına neden olur.

Harfleri braille desenleri aaracılığıyla zaşağıdaki bit desene göre, A $ saklanır. Bu, 9 = ikili 1001ve hak vardiyalı maskeler tarafından çıkarılır (standart BBC basic'in kaydırma operatörü olmadığı için 2 ve 4'e bölünme kullanılır.)

 8 1
16 2
32 4

Kod çözülmemiş kod

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

Kullanım örneği

Bu, netlik için ekran modunda 6 yapılır (komut satırı emülatörünü açar açmaz MODE6 yazın.)

Aslında, kodu çalıştırdıktan sonra, Braille alfabesinde küçük harfler (klavye girişi dahil) görünür.

resim açıklamasını buraya girin

Http://bbcbasic.co.uk/bbcwin/bbcwin.html adresindeki emülatör .

Ayrıca bu benzer cevabım da bakın: /codegolf//a/28869/15599


2

Bash + coreutils

Minimum çözüm - yalnızca küçük harf, 83 (33 unicode karakter + 50 ceza):

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

Büyük harfler, sayılar ve noktalama işaretleri, 120 (120 unicode char + 50 penaltı - 50 bonus):

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

Örnek çıktı:

$ 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");

Şimdilik bonus yok.


2
Kod-golf kısa bir açılış etiketi kullanmak için iyi olduğunu düşünüyorum , böylece 4 karakter kaydetmek <?yerine kullanabilirsiniz <?php[SPACE].
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);}

İlk girişim. Bonus yok.


2
Bunu ilew=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)
279'a

1
Bu yaklaşımı hatırlamak zorunda
Matt

1

CJam - 51

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

Http://cjam.aditsu.net/ adresinde deneyin.

Örnek girdi:

braille is strange

Örnek çıktı:

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 

Yalnızca küçük harfleri ve alanı destekler. Diğer karakterler desteklenen karakterlerle eşleştirilir (özellikle küçük harflerle büyük harfler).

Açıklama:

Braille karakterleri, yükseltilmiş nokta için 1 ve yükseltilmemiş nokta için 0, soldan sağa ve yukarıdan aşağıya kullanılarak kodlanır. Bu 6 baz-2 basamak verir; baş harfleri sıyırmaktan kaçınmak için bir 1 eklenir, daha sonra sayı 10 tabanına, sonra karşılık gelen ASCII karakterine dönüştürülür.
Örnek: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Program, her karakteri [[0 1][1 1][1 0]]bir bit çiftleri matrisi elde ederek bit çiftlerinin üçlüsüne dönüştürür . Daha sonra matris aktarılır ve ayırıcılar eklenir (satırlar içindeki boşluklar, satırlar arasındaki yeni satırlar).

qgirişi bir dizeye okur = karakter dizisi
{…}%her karaktere blok uygular
i32%ASCII kodu alır mod 32 (boşluk-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"braille karakterlerini içeren bir dizedir kodlanan daha önce izah
=dize denk düşen kodlanmış braille karakter alır
i2b(7 haneli bir dizi elde etmek), taban 2'ye sonra dönüştürür ASCII kod alır
1>gelen 1 basamak kaldırır
2/(3) çiftler halinde dizi böler
zmatris aktarır
Sf*her satır katılır boşluklar
N*satırlara yeni satırlarla katılır


0

Cı, 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;}

Girdi, dize boşluk içeriyorsa kaçması veya alıntılanması gereken bir komut satırı bağımsız değişkenidir. Desteklenen karakterler küçük harf ve boşluktur. Desteklenmeyen karakterler sessizce kaldırılır.

Düzenleme: Bir koşulu basitleştirerek 5 bayt traş


0

perl, 195 + 2-50 = 147

Bu, unicode'a dayanmadan sermaye, sayı ve noktalama işaretlerini işler (195 bayt + 2 bayt (için -pl) - 50 bonus)

~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

Girinti ile:

~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

Örnek çıktı

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 bayt

Bu daha kısa olurdu, ancak büyük harfleri kontrol etmek acıyor .

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}`)}

DÜZENLE: Beni iki bayt kurtarmak için mbomb007 sayesinde - ne yazık ki, önceki golf biraz her şeyi mahvetti buldum, bu yüzden geri 27 karakter eklemek zorunda kaldı.

DÜZENLE: Aaand ve 12 bayt boşluk hareket ettirerek kaydedildi.

DÜZENLEME: Karakter olarak çıkmanın saçma olduğunu fark etti ve birkaç bayt kurtardı. Ayrıca k = (a, b) => a% b> ~ -b / için k = (a, b) => a% (2 * b)> b-1? 1: 0 değiştirerek birkaç karakter de kaydettim. 2 1: 0.


Belki string.toLowerCasebir değişkene atamak daha kısa olur ?
mbomb007

Sayılar iki harf olmalıdır (örn. 3 = ⠼⠉): sayı öneki (⠼) ve şifreler eşdeğer harfe dönüştürülür (3 = c = ⠉). 1-9-->a-ive0-->j
Adam

Farklı grafikler gördüm - kontrol ettiğimde böyle değildi.
Marcus Dirr

Ve yeni bir Ascii grafiği yerine ASCII Braille kodlamasını kullandığımı fark ettim. Yani bu zaten diskalifiye ediliyor.
Marcus Dirr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.