Напишіть усі можливі символи Брайля


13

Цікава головоломка прийшла до мене, дивлячись на кнопки ліфтів сьогодні вранці.

Вам потрібно створити список усіх моделей Брайля, які вміщуються в сітку 2x3. Використовуйте хеш #для позначення шишки та дефісу, -щоб позначити плоску область.

Очікуваний вихідний зразок:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Правила:

  • Ваша програма повинна відокремлювати кожен візерунок хоча б одним символом або рядком.
  • Шаблони можуть бути згенеровані в будь-якому порядку.
  • Усі візерунки, незалежно від того, що насправді використовує алфавіт Брайля, повинні бути створені. Повністю порожній візерунок не є обов'язковим.
  • Необхідно створювати лише унікальні шаблони. Наступні зразки вважаються рівносильними, оскільки шишки в однаковій структурі. У цих випадках використовуйте шаблон, який знаходиться найближче до верхнього лівого кута (тобто перший варіант у цьому прикладі.)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Бонусні бали, якщо ви можете змусити його працювати для будь-якого x за сіткою розміром y . ( EDIT: В межах розумних. Додання до 4x4 достатньо для підтвердження концепції.)

Читаючи статтю у вікі, виявляється, що існує 45 моделей (включаючи бланк), які відповідають правилам цієї головоломки.


Це не зовсім підрахунок, але це дуже близько. Для xx yсіток ви генеруєте перші 2^(xy)числа та фільтруєте ті, які маскуються до 0 проти 2^x - 1або (2^(xy+1) - 1)/(2^y - 1).
Пітер Тейлор

Відповіді:


6

GolfScript, 34 32 символи

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

Виявляється, що мають коротші рішення , ніж просто генерувати всі 64 моделей і фільтрувати погані. Насправді, за допомогою відповідного відображення бітів на позиції сітки, можна зіставити всі дійсні (не порожні) шаблони до послідовного діапазону чисел, як це робить ця програма.

Зокрема, я використовую відображення:

5 4
3 1
2 0

де числа позначають бітове положення (починаючи з найменш значущого біта 0), відображене на це положення в сітці. При такому відображенні дійсні сітки відповідають цифрам від 20 до 63 включно.

Це майже те саме, що очевидне відображення, отримане виписуванням 6-розрядного числа у двійковій формі та додавання розривів рядків між кожним другим бітом, за винятком того, що біти 1і 2підміняються - і справді, саме так моя обчислює його програма. (Я також додаю 64 до чисел перед тим, як перетворити їх у двійкові, а потім зніміть зайвий високий біт; це просто нуль-прокладка чисел до 6 біт, оскільки GolfScript в baseіншому випадку не поверне жодних провідних нулів.)

Пс. Демонстрація в Інтернеті тут. (Сервер здається перевантаженим останнім часом; якщо у вас з’явився тайм-аут, спробуйте ще раз або скачайте перекладач і перевіряйте його локально.)

Редагувати: вдалося зберегти дві символи, уникаючи непотрібного створення масиву та скидання. Фу!


2
Ви не проти додати деякі деталі? Мені цікаво подивитися, як ви визначаєте це відображення.
ardnew

@ardnew: Готово, див. вище.
Ільмарі Каронен

Я думаю, що це змінить багато відповідей людей. :-)
Hand-E-Food

3

Математика 97

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

Брайля


Бланк не входить:

Length[%]

44

Примітка! = - це єдиний символ у Mathematica.


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

Читаема версія:

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

3

Perl, 71 67 65 char

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

Перетворіть int у бінарне, виконайте транслітерацію та додайте новий рядок через кожні два символи. /^#/mТест усуває дві моделі (20 і 21) , які не мають горбок в крайньому лівому стовпчику.

Загальне рішення, 150 106 103 100 char

Читання xта yз аргументів командного рядка. Нові рядки значні

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

Ітератуйте понад 0..2 xy, як і раніше, перетворюючи кожну інту в двійкову, замінюючи -і #для, 0і 1, і вставляючи новий рядок після кожного $xсимволу.

/^#/mперевіряє наявність піднятого кута в крайньому лівому стовпці та /^.*#/перевіряє наявність піднятого удару в верхньому рядку. Друкуються лише візерунки, які проходять обидва тести.


Як це враховує недійсні комбінації?
скалер

Тому що цикл виключає шаблони для 1..17, 20 та 21.
моб

2

Пітон, 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]

Редагувати: використано пропозицію Вінстона Еверта та додано рішення x x y y grid

Редагувати: Я якось пропустив останнє обмеження щодо унікальності. Цей сценарій генерує всі можливі послідовності, а не лише 45.

Редагувати: створити резервну копію до 118, але тепер виправте


Замініть ['#','-']на'#-'
Вінстон Еверт

2

J, 35 33 символів

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

Використовує підхід, який Ілмарі Каронен придумав у своєму рішенні Golfscript. Однак, оскільки дієслово J #:(антибаза) зберігає біти (або, ну, цифри у родовому відмінку) у списку, нам потрібно індексувати його зліва, а не праворуч (тобто індекс 0 - крайній лівий, найвищий біт).

Рішення досить просте: 20+i.44дає список номерів 20..63включно. #:приймає antibase-2 кожного елемента цього списку і, таким чином, створює список бітових шаблонів для кожного числа в цьому діапазоні. {вибирає (в основному переробляє) біти в потрібний візерунок, а потім {знову використовується для того, щоб використовувати цифри як індекси в рядку '- #', щоб підготувати вихід. Нарешті, ми влаштовуємо кожен запис у прямокутник 2 на 3 з $(формою).


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


Хтось знає, як щось подібне (0 2 3 ,. 1 4 5) { #: 44можна налаштувати для роботи зі списком чисел, а не з одним номером? Мабуть, поголіть ще декілька символів.
FireFly

1

Пітон - 121 112

Бланк не входить

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)

ви можете обрізати цей виріб за допомогою '_#',repeat=6->*['_#']*6
кабінки

@boothby: спасибі Крім того, bвже є кортеж, тому не потрібно його конвертувати :)
quasimodo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.