Schreiben Sie alle möglichen Braillezeichen

13

Mir ist heute Morgen ein interessantes Rätsel aufgefallen, als ich auf die Aufzugsknöpfe sah.

Sie müssen eine Liste aller Braillemuster erstellen, die in ein 2x3-Raster passen. Verwenden Sie einen Hash# , um eine Erhebung zu kennzeichnen, und einen Bindestrich -, um eine flache Fläche zu kennzeichnen.

Erwartete Ausgabebeispiele:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Regeln:

  • Ihr Programm muss jedes Muster durch mindestens ein Zeichen oder eine Zeile trennen.
  • Die Muster können in beliebiger Reihenfolge erzeugt werden.
  • Es sollten alle Muster erstellt werden, unabhängig davon, was das Braille-Alphabet tatsächlich verwendet. Das vollständig leere Muster ist optional.
  • Es sollten nur eindeutige Reliefmuster generiert werden. Die folgenden Muster werden als gleichwertig angesehen, da sich die Unebenheiten in einer identischen Anordnung befinden. Verwenden Sie in diesen Fällen das Muster, das der linken oberen Ecke am nächsten liegt (dh die erste Option in diesem Beispiel).
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Bonuspunkte , wenn Sie können es für jeden funktioniert x von y Größe Raster. ( BEARBEITEN: Innerhalb angemessener Grenzen. Bis zu 4x4 reicht für den Proof of Concept.)

Beim Lesen des Wiki-Artikels scheint es 45 Muster zu geben (einschließlich des Leerzeichens), die den Regeln dieses Puzzles entsprechen.

Hand-E-Food
quelle
Es zählt nicht ganz, aber es ist sehr nah. Für xx- yGitter generieren Sie die ersten 2^(xy)Zahlen und filtern diejenigen heraus, die gegen 2^x - 1oder auf 0 maskieren (2^(xy+1) - 1)/(2^y - 1).
Peter Taylor

Antworten:

6

GolfScript, 34 32 Zeichen

44,{84+2base(;{'-#'=}/@\n.}%2/n*

Stellt sich heraus, dass es gibt kürzere Lösungen als nur alle 64 Muster zu erzeugen und die schlechten herausgefiltert werden. In der Tat ist es durch geeignetes Abbilden von Bits auf Gitterpositionen möglich, alle gültigen (nicht leeren) Muster auf einen fortlaufenden Zahlenbereich abzubilden, wie dies bei diesem Programm der Fall ist.

Im Einzelnen verwende ich folgende Zuordnung:

5 4
3 1
2 0

Dabei bezeichnen die Zahlen die Bitposition (beginnend mit dem niedrigstwertigen Bit 0), die dieser Position im Raster zugeordnet ist. Bei dieser Zuordnung entsprechen die gültigen Gitter den Zahlen 20 bis einschließlich 63.

Dies ist fast dasselbe wie die offensichtliche Abbildung, die durch Ausschreiben der 6-Bit-Zahl in Binärschrift und Hinzufügen von Zeilenumbrüchen zwischen jedem zweiten Bit erhalten wird. Ausnahme, dass die Bits 1und 2vertauscht werden - und tatsächlich berechnet mein Programm dies genau so. (Ich füge auch 64 zu den Zahlen hinzu, bevor ich sie in Binärdaten umwandle, und entferne dann das extra hohe Bit. Das ist nur, um die Zahlen auf 6 Bits aufzufüllen, da GolfScripts basesonst keine führenden Nullen zurückgeben würden.)

Ps. Online Demo hier. (Der Server scheint in letzter Zeit überlastet zu sein. Wenn eine Zeitüberschreitung auftritt, versuchen Sie es erneut oder laden Sie den Interpreter herunter und testen Sie ihn lokal.)

Bearbeiten: Es konnten zwei Zeichen gespart werden, indem unnötiges Erstellen und Speichern von Arrays vermieden wurde. Puh!

Ilmari Karonen
quelle
2
Haben Sie etwas dagegen, einige Details hinzuzufügen? Ich bin gespannt, wie Sie dieses Mapping definieren.
ardnew
@ardnew: Fertig, siehe oben.
Ilmari Karonen
Ich denke, das wird die Antworten vieler Menschen ändern. :-)
Hand-E-Food
3

Mathematica 97

Grid /@ Cases[(#~Partition~2 & /@ Tuples[{"#", "-"}, 6]), x_ /; 
         x[[All, 1]] != {"-", "-", "-"} && x[[1]] != {"-", "-"}]

Blindenschrift


Leer ist nicht enthalten:

Length[%]

44

NB! = Ist ein einzelnes Zeichen in Mathematica.

DavidC
quelle
3

C # - 205

class C{static void Main(){var s="---##-##";Action<int,int>W=(i,m)=>{Console.WriteLine(s.Substring((i>>m&3)*2,2));};for(int i=0;i<64;++i){if((i&3)>0&&(i&42)>0){W(i,0);W(i,2);W(i,4);Console.WriteLine();}}}}

Lesbare Version:

class C
{
    static void Main()
    {
        var s = "---##-##"; // all two-bit combinations
        // a function to write one two-bit pattern (one line of a Braille character)
        Action<int,int> W = (i,m) => { Console.WriteLine(s.Substring(((i >> m) & 3) * 2, 2)); };
        // for all possible 6-bit combinations (all possible Braille characters)
        for(int i = 0; i < 64; ++i)
        {
            // filter out forbidden (non-unique) characters
            if ((i & 3) > 0 && (i & 42) > 0)
            {
                // write three rows of the Braille character and an empty line
                W(i,0);
                W(i,2);
                W(i,4);
                Console.WriteLine();
            }
        }
    }
}
Mormegil
quelle
3

Perl, 71 67 65 char

y/10/#-/,s/../$&
/g,/^#/m&&print
for map{sprintf"%06b
",$_}18..63

Konvertieren Sie int in binary, führen Sie die Transliteration durch und fügen Sie nach jeweils zwei Zeichen eine neue Zeile hinzu. Der /^#/mTest eliminiert zwei Muster (20 und 21), die in der äußersten linken Spalte keine Erhebung aufweisen.

Allgemeine Lösung, 150 106 103 100 char

Lesen Sie xund yvon Befehlszeilenargumenten. Zeilenumbrüche sind wichtig

y/01/-#/,s/.{$x}/$&
/g,/^#/m*/^.*#/&&print
for map{sprintf"%0*b
",$x*$y,$_-1}1..1<<($y=pop)*($x=pop)

Iterieren Sie wie zuvor über 0..2 xy , konvertieren Sie jedes int in binary, ersetzen Sie -und #für 0und 1und fügen Sie nach jedem eine neue Zeile ein$x Zeichen .

/^#/mprüft, ob in der linken Spalte /^.*#/eine Erhebung vorhanden ist , und prüft, ob in der oberen Reihe eine Erhebung vorhanden ist. Es werden nur die Muster gedruckt, die beide Tests bestehen.

Mob
quelle
Wie berücksichtigt dies die ungültigen Kombinationen?
Scleaver
Weil die Schleife die Muster für 1..17, 20 und 21 ausschließt.
Mob
2

Python, 120 118 113 95 118

for j in range(256):
    if j/4&48and j/4&42:print''.join('_#'[int(c)]for c in bin(j/4)[2:].rjust(6,'0'))[j%4*2:j%4*2+2]

Bearbeiten: verwendet Winston Ewert Vorschlag und x von y Grid-Lösung hinzugefügt

Edit: Irgendwie habe ich die letzte Einschränkung bezüglich der Einzigartigkeit übersehen. Dieses Skript generiert alle möglichen Sequenzen, nicht nur die 45.

Bearbeiten: Sichern auf 118 aber jetzt korrekt

scleaver
quelle
Ersetzen ['#','-']durch'#-'
Winston Ewert
2

J, 35 33 Zeichen

3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44

Verwendet den Ansatz, den Ilmari Karonen in ihrer Golfscript-Lösung vorstellte. Da das J-Verb #:(Antibase) jedoch die Bits (oder im allgemeinen Ziffern) in einer Liste speichert, müssen wir es von links statt von rechts indizieren (dh Index 0 ist das am weitesten links stehende, höchste Bit).

Die Lösung ist ziemlich einfach: 20+i.44gibt eine Liste der Zahlen 20..63einschließlich. #:Nimmt die Antibase-2 von jedem Element in dieser Liste und erzeugt so eine Liste von Bitmustern für jede Zahl in diesem Bereich. {Wählt die Bits in dem richtigen Muster aus (ordnet sie im Grunde neu an) und wird dann {erneut verwendet, um die Ziffern als Indizes in der Zeichenfolge '- #' zu verwenden, um die Ausgabe vorzubereiten. Zuletzt ordnen wir jeden Eintrag in ein 2 x 3 Rechteck mit $(Form).


3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44      N.B. use A. (anagram) to generate the right permutation

3 2$"1'-#'{~0 1 2 4 3 5{"1#:20+i.44

FireFly
quelle
Weiß jemand, wie so etwas (0 2 3 ,. 1 4 5) { #: 44optimiert werden kann, um mit einer Liste von Zahlen anstatt mit einer einzelnen Zahl zu arbeiten? Würde wahrscheinlich ein paar Zeichen mehr abschneiden.
FireFly
1

Python - 121 112

Leer ist nicht im Lieferumfang enthalten

from itertools import*
print'\n'.join('%s%s\n'*3%b for(b,n)in zip(product(*['_#']*6),range(64))if n&48and n&42)
quasimodo
quelle
Sie können das Produkt mit '_#',repeat=6->*['_#']*6
boothby 28.09.12
@boothby: danke. Außerdem bist bereits ein Tupel, so dass keine Notwendigkeit , es zu konvertieren :)
quasimodo