Напишите все возможные символы Брайля


13

Сегодня утром мне пришла интересная загадка, когда я смотрел на кнопки лифта.

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

Ожидаемый выходной образец:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Правила:

  • Ваша программа должна разделять каждый шаблон хотя бы одним символом или строкой.
  • Шаблоны могут быть сгенерированы в любом порядке.
  • Все образцы, независимо от того, что фактически использует алфавит Брайля, должны быть произведены. Абсолютно пустой шаблон не является обязательным.
  • Должны быть сгенерированы только уникальные рисунки. Следующие модели считаются эквивалентными, поскольку неровности находятся в одинаковом расположении. В этих случаях используйте шаблон, ближайший к верхнему левому углу (т. Е. Первый вариант в этом примере.)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Бонусные баллы, если вы можете заставить его работать для любой сетки размером x на y . ( РЕДАКТИРОВАТЬ: В разумных пределах. До 4х4 достаточно для подтверждения концепции.)

Читая статью в вики, кажется, что есть 45 образцов (включая бланк), которые соответствуют правилам этой головоломки.


Это не совсем считается, но это очень близко. Для xх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 бит, так как в baseпротивном случае GolfScript не вернул бы никаких начальных нулей.)

Ps. Онлайн демо здесь. (В последнее время сервер кажется перегруженным; если вы получили тайм-аут, попробуйте еще раз или загрузите интерпретатор и протестируйте его локально.)

Редактировать: удалось сохранить два символа, избегая ненужного построения массива и дампа. Уф!


2
Вы не против добавить некоторые детали? Мне интересно посмотреть, как вы определяете это отображение.
ardnew

@ardnew: Готово, см. выше.
Ильмари Каронен,

Я думаю, что это изменит ответы многих людей. :-)
Hand-E-Food

3

Mathematica 97

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

шрифт Брайля


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

Length[%]

44

NB! = Это один символ в 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 символов

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

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

Общее решение 150 106 103 100 символов

Читай xи yиз командной строки args. Новые строки значимы

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

Выполните итерацию над 0..2 xy, как и раньше, конвертируя каждое int в двоичное, подставляя -и #для 0и 1и вставляя новую строку после каждого$x символ символа.

/^#/mпроверяет наличие выпуклого выступа в крайнем левом столбце и /^.*#/проверяет наличие выпуклого выступа в верхнем ряду. Только образцы, которые проходят оба теста, напечатаны.


Как это учитывает недопустимые комбинации?
Scleaver

Потому что петля исключает шаблоны для 1..17, 20 и 21.
моб

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]

Редактировать: использовал предложение Уинстона Эверта и добавил решение x x y grid

Изменить: я как-то пропустил последнее ограничение по уникальности. Этот скрипт генерирует все возможные последовательности, а не только 45.

Изменить: обратно до 118, но теперь правильно


Заменить ['#','-']на'#-'
Уинстон Эверт

2

J, 35 33 знака

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

Использует подход, который Илмари Каронен предложил в своем решении Golfscript. Однако, поскольку глагол J#: (antibase) хранит биты (или, ну, в общем, цифры в общем случае) в списке, нам нужно индексировать его слева, а не справа (т. Е. Индекс 0 - самый левый, старший бит).

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


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

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