Écrivez tous les caractères braille possibles

13

Un puzzle intéressant m'est venu en regardant les boutons de l'ascenseur ce matin.

Vous devez générer une liste de tous les modèles braille qui tiennent dans une grille 2x3. Utilisez un hachage #pour désigner une bosse et un trait -d' union pour désigner une zone plate.

Échantillon de sortie attendu:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Règles:

  • Votre programme doit séparer chaque motif par au moins un caractère ou une ligne.
  • Les modèles peuvent être générés dans n'importe quel ordre.
  • Tous les modèles, indépendamment de ce que l'alphabet braille utilise réellement, doivent être produits. Le motif complètement vierge est facultatif.
  • Seuls les modèles de relief uniques doivent être générés. Les motifs suivants sont considérés comme équivalents car les bosses sont dans un arrangement identique. Dans ces cas, utilisez le motif le plus proche du coin supérieur gauche (c'est-à-dire la première option de cet exemple).
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Points bonus si vous pouvez le faire fonctionner pour n'importe quelle grille de taille x par y . ( EDIT: dans des limites raisonnables. Jusqu'à 4x4 est suffisant pour la preuve de concept.)

En lisant l'article du wiki, il semble qu'il y ait 45 modèles (y compris le blanc) qui répondent aux règles de ce puzzle.

Hand-E-Food
la source
Ça ne compte pas tout à fait, mais c'est très proche. Pour les grilles xx, yvous générez les premiers 2^(xy)nombres et filtrez ceux qui masquent à 0 contre 2^x - 1ou (2^(xy+1) - 1)/(2^y - 1).
Peter Taylor

Réponses:

6

GolfScript, 34 32 caractères

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

Il s'avère qu'il existe des solutions plus courtes que de simplement générer les 64 modèles et filtrer les mauvais. En fait, en mappant convenablement les bits aux positions de la grille, il est possible de mapper tous les modèles valides (non vides) sur une plage de nombres consécutifs, comme le fait ce programme.

Plus précisément, le mappage que j'utilise est:

5 4
3 1
2 0

où les nombres indiquent la position du bit (à partir du bit le moins significatif 0) mappé à cette position dans la grille. Avec cette cartographie, les grilles valides correspondent aux nombres 20 à 63 inclus.

C'est presque le même que le mappage évident obtenu en écrivant le nombre de 6 bits en binaire et en ajoutant des sauts de ligne entre chaque deuxième bit, sauf que les bits 1et 2sont échangés - et en effet, c'est exactement comme mon programme le calcule. (J'ajoute également 64 aux nombres avant de les convertir en binaire, puis je supprime le bit très élevé; c'est juste pour mettre à zéro les nombres à 6 bits, car GolfScript basene retournerait autrement aucun zéro à gauche .)

Ps. Démo en ligne ici. (Le serveur semble surchargé récemment; si vous obtenez un délai d'expiration, essayez à nouveau ou téléchargez l'interpréteur et testez-le localement.)

Edit: Géré pour enregistrer deux caractères en évitant la construction et le vidage inutiles de tableaux. Phew!

Ilmari Karonen
la source
2
Cela vous dérange d'ajouter quelques détails? Je suis intéressé de voir comment vous définissez ce mappage.
ardnew
@ardnew: Terminé, voir ci-dessus.
Ilmari Karonen
Je pense que cela va changer beaucoup de réponses des gens. :-)
Hand-E-Food
3

Mathematica 97

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

braille


Le blanc n'est pas inclus:

Length[%]

44

NB! = Est un caractère unique dans Mathematica.

DavidC
la source
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();}}}}

Version lisible:

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
la source
3

Perl, 71 67 65 car

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

Convertissez int en binaire, effectuez une translittération et ajoutez une nouvelle ligne après tous les deux caractères. Le /^#/mtest élimine deux motifs (20 et 21) qui n'ont pas de relief sur la colonne de gauche.

Solution générale, 150 106 103 100 carbonisation

Lire xet ypartir des arguments de ligne de commande. Les nouvelles lignes sont importantes

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

Itérer sur 0..2 xy comme avant, en convertissant chaque entier en binaire, en substituant -et #pour 0et 1, et en insérant une nouvelle ligne après chaque $xcaractère.

/^#/mteste qu'il y a une bosse surélevée dans la colonne la plus à gauche et /^.*#/teste qu'il y a une bosse surélevée dans la rangée du haut. Seuls les motifs qui réussissent les deux tests sont imprimés.

foule
la source
Comment cela explique-t-il les combinaisons invalides?
scleaver
Parce que la boucle exclut les motifs pour 1..17, 20 et 21.
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]

Edit: utilisé la suggestion Winston Ewert et ajouté la solution de grille x by y

Edit: j'ai en quelque sorte manqué la dernière contrainte sur l'unicité. Ce script génère toutes les séquences possibles, pas seulement les 45.

Edit: sauvegarder jusqu'à 118 mais maintenant correct

scleaver
la source
Remplacer ['#','-']par'#-'
Winston Ewert
2

J, 35 33 caractères

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

Utilise l'approche proposée par Ilmari Karonen dans sa solution Golfscript. Cependant, puisque le verbe J#: (antibase) stocke les bits (ou, bien, les chiffres dans le cas générique) dans une liste, nous devons l'indexer de gauche au lieu de droite (c'est-à-dire que l'index 0 est le bit le plus à gauche et le plus élevé).

La solution est plutôt simple: 20+i.44donne une liste des chiffres 20..63, inclus. #:prend l'antibase-2 de chaque élément de cette liste et produit ainsi une liste de motifs binaires pour chaque numéro de cette plage. {sélectionne (réordonne fondamentalement) les bits dans le bon modèle, puis {est à nouveau utilisé afin d'utiliser les chiffres comme indices dans la chaîne '- #' afin de préparer la sortie. Enfin, nous organisons chaque entrée dans un rectangle 2 par 3 avec $(forme).


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

Luciole
la source
Quelqu'un sait-il comment quelque chose comme cela (0 2 3 ,. 1 4 5) { #: 44pourrait être modifié pour fonctionner avec une liste de nombres plutôt qu'avec un seul numéro? Raserait probablement quelques caractères supplémentaires.
FireFly
1

Python - 121 112

le blanc n'est pas inclus

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
la source
vous pouvez couper ce produit avec '_#',repeat=6->*['_#']*6
stand
@boothby: merci. En outre, best déjà un tuple, donc pas besoin de le convertir :)
quasimodo