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.
code-golf
combinatorics
Hand-E-Food
la source
la source
x
x,y
vous générez les premiers2^(xy)
nombres et filtrez ceux qui masquent à 0 contre2^x - 1
ou(2^(xy+1) - 1)/(2^y - 1)
.Réponses:
GolfScript,
3432 caractèresIl 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:
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
1
et2
sont é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 GolfScriptbase
ne 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!
la source
Mathematica 97
Le blanc n'est pas inclus:
NB! = Est un caractère unique dans Mathematica.
la source
C # - 205
Version lisible:
la source
Perl,
716765 carConvertissez int en binaire, effectuez une translittération et ajoutez une nouvelle ligne après tous les deux caractères. Le
/^#/m
test élimine deux motifs (20 et 21) qui n'ont pas de relief sur la colonne de gauche.Solution générale,
150106103100 carbonisationLire
x
ety
partir des arguments de ligne de commande. Les nouvelles lignes sont importantesItérer sur 0..2 xy comme avant, en convertissant chaque entier en binaire, en substituant
-
et#
pour0
et1
, et en insérant une nouvelle ligne après chaque$x
caractère./^#/m
teste 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.la source
Python,
12011811395118Edit: 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
la source
['#','-']
par'#-'
J,
3533 caractèresUtilise 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.44
donne une liste des chiffres20..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).la source
(0 2 3 ,. 1 4 5) { #: 44
pourrait être modifié pour fonctionner avec une liste de nombres plutôt qu'avec un seul numéro? Raserait probablement quelques caractères supplémentaires.Python -
121112le blanc n'est pas inclus
la source
'_#',repeat=6
->*['_#']*6
b
est déjà un tuple, donc pas besoin de le convertir :)