Übersetzen Sie ASCII-Text in Blindenschrift


19

Schreiben Sie ein Programm, das ASCII-Text in eine Braillezeile übersetzt . Bedarf:

  • Die Eingabe kann von stdin, der Befehlszeile oder einer anderen externen Eingabequelle stammen.
  • Die Ausgabe sollte als Blindenschrift erkennbar sein, die Form der Ausgabe liegt bei Ihnen. Ein Beispiel wäre ofür einen erhöhten Punkt und .für einen nicht erhöhten Punkt. Eine Textmusterdarstellung 1-3-4ist beispielsweise nicht akzeptabel. Ein langer Zeilenumbruch ist nicht erforderlich.
  • Für eine minimale Lösung sind nur die 26 Buchstaben und Leerzeichen erforderlich. Alle Eingabezeichen, die von Ihrer Lösung nicht unterstützt werden, sollten ignoriert werden.

Die Bewertung erfolgt nach Anzahl der Zeichen im Quellcode. Strafen und Boni sind:

  • +50 Strafe für die Verwendung von Unicode-Braillezeichen als Ausgabe.
  • -50 Bonus für die Unterstützung von Großbuchstaben, Ziffern und Satzzeichen.
  • -200 Bonus für die Unterstützung von Ligaturen und Ein-Buchstaben-Kontraktionen aus englischer (Grad-2) Braille . (Wird dies zu einer separaten Herausforderung machen, da es ein ganz anderes Problem ist.)

Beispielaufruf und Ausgabe (minimale Lösung):

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

definiere "tapferer Versuch". Ist auch ein Zeilenumbruch erforderlich?
John Dvorak

@ JanDvorak: Danke, aktualisierte Frage.
Greg Hewgill

1
@GregHewgill Können Sie den Bonus für die Einbeziehung von Großbuchstaben, Ziffern und Satzzeichen erhöhen? Derzeit sind das 26 + 10 + 12 = 48 zusätzliche Zeichen, kein großer Bonus (es sei denn, Sie komprimieren die Braille-Daten)
qwr

1
Sie könnten Bytes anstelle von Zeichen zählen und die Strafe entfernen, die Kosten sind ungefähr gleich (@DigitalTraumas erste Lösung ist 85 Bytes). Edit: Ich habe gerade festgestellt, dass Sprachen wie APL bestraft würden. Es liegt an dir.
Nyuszika7h

1
Mann ... die Strafe für Unicode-Zeichen ist nicht groß genug, um dies interessant zu machen. Ich wollte sehen, wie die Leute die Braillezeile kodieren würden.
Almo

Antworten:


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)

Unterstützt derzeit Kleinbuchstaben und Zeichensetzung, ist aber noch in Arbeit.

Beispiel:

$ 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

Verwenden Sie Kleinbuchstaben.

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

Einzeiler (danke an ɐɔıɐɔuʎs)

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

1
Warum nicht einen Einzeiler daraus machen? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 Zeichen.
ɐɔıʇǝɥʇuʎs

@ ɐɔıɐɔuʇǝɥʇs wow, ich habe den maxTrick vergessen . Vielen Dank
qwr

Sie können ein Zeichen speichern, indem Sie nur Leerzeichen für alle Zeichen for l in input():print((" "*97+"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵")[ord(l)],end="")
einfügen, die

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

Diese Implementierung erfordert, dass sein Argument, falls es Leerzeichen enthält, in Anführungszeichen gesetzt wird:

# braille "hello world"

3

BBC Basic 103 ASCII-Zeichen oder 92 Token

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

Möglicherweise nicht ganz das, was das OP beabsichtigt hat. Dadurch wird die Schriftart für die Kleinbuchstaben neu definiert. VDU 23,n,a,b,c,d,e,f,g,hWeist dem Zeichen n eine 8x8-Bitmap zu, die aus acht Bytes besteht. Wenn Sie einem Parameter mit einem Semikolon anstelle eines Kommas folgen, wird er als Zwei-Byte-Little-Endian-Zahl behandelt.

Die Braillemuster für Buchstaben abis zwerden gemäß dem folgenden Bitmuster in A $ gespeichert. Dies wird durch Masken mit 9 = binär 1001und Rechteschiebungen extrahiert (Division durch 2 und 4 wird verwendet, da BBC Basic standardmäßig keinen Schichtoperator hat.)

 8 1
16 2
32 4

Ungolfed Code

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

Anwendungsbeispiel

Dies geschieht aus Gründen der Übersichtlichkeit im Bildschirmmodus 6 (geben Sie MODE6 ein, sobald Sie den Befehlszeilenemulator öffnen.)

Tatsächlich werden nach dem Ausführen des Codes alle Kleinbuchstaben (einschließlich Tastatureingaben) in Blindenschrift angezeigt.

Bildbeschreibung hier eingeben

Emulator unter http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Siehe auch meine ähnliche Antwort: /codegolf//a/28869/15599


2

Bash + Coreutils

Minimale Lösung - nur Kleinbuchstaben, 83 (33 Unicode-Zeichen + 50 Strafpunkte):

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

Großbuchstaben, Ziffern und Interpunktion, 120 (120 Unicode-Zeichen + 50 Strafpunkte - 50 Bonuspunkte):

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

Beispielausgabe:

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

Noch keine Boni.


2
Ich denke, es ist in Ordnung, ein kurzes Eröffnungs-Tag in Code-Golf zu verwenden , sodass Sie 4 Zeichen speichern können, <?anstatt sie <?php[SPACE]zu verwenden.
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);}

Erster Versuch. Keine Prämien.


2
Sie können es mitw=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
Muss mich an diesen Ansatz erinnern, schöne lange einzelne Anweisung für Schleife :)
Matt

1

CJam - 51

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

Versuchen Sie es unter http://cjam.aditsu.net/

Beispiel Eingabe:

braille is strange

Beispielausgabe:

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 

Es werden nur Kleinbuchstaben und Leerzeichen unterstützt. Andere Zeichen werden unterstützten Zeichen zugeordnet (insbesondere Groß- und Kleinbuchstaben).

Erläuterung:

Braillezeichen werden mit 1 für einen erhöhten Punkt und 0 für einen nicht erhöhten Punkt von links nach rechts und von oben nach unten codiert. Dies ergibt 6 Base-2-Ziffern; Eine 1 wird vorangestellt, um führende Nullen nicht zu entfernen. Anschließend wird die Zahl in die Basis 10 und anschließend in das entsprechende ASCII-Zeichen konvertiert.
Beispiel: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Das Programm konvertiert jedes Zeichen zurück in das Triplett von Bitpaaren (wie z. B. [[0 1][1 1][1 0]]), um eine Matrix von Bitpaaren zu erhalten. Die Matrix wird dann transponiert und Separatoren hinzugefügt (Leerzeichen in Zeilen, Zeilenumbrüche zwischen Zeilen).

qLiest die Eingabe in einen String = Array von Zeichen
{…}%wendet der Block auf jedes Zeichen an,
i32%erhält den ASCII-Code. Mod 32 (Leerzeichen-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"ist ein String, der die Braillezeichen enthält codiert wie zuvor erklärt
=erhält das entsprechende codierte Braillezeichen aus der Zeichenkette
i2bden ASCII-Code und konvertiert dann zur Basis 2 (wobei ein Array mit 7 Ziffern erhalten wird)
1>entfernt die führende 1 Ziffer
2/teilt das Array in (3) Paare
ztransponiert die Matrix,
Sf*mit der jede Zeile verbunden wird Leerzeichen
N*verbinden die Zeilen mit Zeilenumbrüchen


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;}

Die Eingabe ist ein Befehlszeilenargument, das in Anführungszeichen gesetzt werden muss, wenn die Zeichenfolge Leerzeichen enthält. Unterstützte Zeichen sind Kleinbuchstaben und Leerzeichen. Nicht unterstützte Zeichen werden stillschweigend gelöscht.

Bearbeiten: 5 Bytes durch Vereinfachung einer Bedingung rasiert


0

Perl, 195 + 2-50 = 147

Dies behandelt Groß- und Kleinschreibung, Zahl und Zeichensetzung, ohne sich auf Unicode zu verlassen (195 Bytes + 2 Bytes (für -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

Mit Einrückung:

~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

Beispielausgabe

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 Bytes

Dies wäre kürzer, aber das Überprüfen auf Großbuchstaben tut weh .

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: Vielen Dank an mbomb007, der mir zwei Bytes gespart hat. Leider stellte ich fest, dass ein bisschen früheres Golfen alles ruiniert hatte und ich musste 27 Zeichen hinzufügen.

BEARBEITEN: Aaand 12 Bytes durch Verschieben der Leerzeichen gespeichert.

BEARBEITEN: Es wurde erkannt, dass es albern war, als Zeichen auszugeben, und einige Bytes gespart. Ich habe auch ein paar Zeichen gespeichert, indem ich k = (a, b) => a% (2 * b)> b-1? 1: 0 für k = (a, b) => a% b> ~ -b / getauscht habe. 2: 1.


Vielleicht wäre es kürzer, string.toLowerCaseeine Variable zuzuweisen ?
mbomb007

Zahlen sollten aus zwei Buchstaben bestehen (z. B. 3 = ⠼⠉): Das Zahlenpräfix (⠼) und die Ziffern werden in den entsprechenden Buchstaben umgewandelt (3 = c = ⠉). 1-9-->a-iund0-->j
Adam

Ich habe verschiedene Karten gesehen - das war bei der von mir überprüften nicht der Fall.
Marcus Dirr

Und mir ist gerade aufgefallen, dass ich die ASCII-Braille-Kodierung anstelle eines tatsächlichen ASCII-Diagramms verwendet habe. Das ist also sowieso disqualifiziert.
Marcus Dirr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.