Сегодня утром мне пришла интересная загадка, когда я смотрел на кнопки лифта.
Вам необходимо создать список всех образцов Брайля , которые помещаются в сетку 2x3. Используйте хэш #
для обозначения выпуклости и дефис -
для обозначения плоской области.
Ожидаемый выходной образец:
#-
--
--
##
--
--
#-
#-
--
(and so on...)
Правила:
- Ваша программа должна разделять каждый шаблон хотя бы одним символом или строкой.
- Шаблоны могут быть сгенерированы в любом порядке.
- Все образцы, независимо от того, что фактически использует алфавит Брайля, должны быть произведены. Абсолютно пустой шаблон не является обязательным.
- Должны быть сгенерированы только уникальные рисунки. Следующие модели считаются эквивалентными, поскольку неровности находятся в одинаковом расположении. В этих случаях используйте шаблон, ближайший к верхнему левому углу (т. Е. Первый вариант в этом примере.)
#- -# -- --
#- -# #- -#
-- -- #- -#
Бонусные баллы, если вы можете заставить его работать для любой сетки размером x на y . ( РЕДАКТИРОВАТЬ: В разумных пределах. До 4х4 достаточно для подтверждения концепции.)
Читая статью в вики, кажется, что есть 45 образцов (включая бланк), которые соответствуют правилам этой головоломки.
code-golf
combinatorics
Hand-E-Food
источник
источник
x
хy
сеток вы генерируете первые2^(xy)
числа и отфильтровываете те, которые маскируются на 0 против2^x - 1
или(2^(xy+1) - 1)/(2^y - 1)
.Ответы:
GolfScript,
3432 символаОказывается, что имеют более короткие решения , чем просто генерировать все 64 моделей и отфильтровывать плохие. Фактически, путем соответствующего отображения битов в позиции сетки, можно отобразить все действительные (непустые) шаблоны в последовательный диапазон чисел, как это делает эта программа.
В частности, я использую следующее отображение:
где числа обозначают позицию бита (начиная с младшего значащего бита
0
), отображенную на эту позицию в сетке. При таком сопоставлении действительные сетки соответствуют номерам от 20 до 63 включительно.Это почти то же самое, что и очевидное отображение, полученное путем записи 6-битного числа в двоичном виде и добавления разрывов строк между каждым вторым битом, за исключением того, что биты
1
и2
меняются местами - и действительно, именно так моя программа вычисляет это. (Я также добавляю 64 к числам перед тем, как преобразовать их в двоичные, а затем убрать лишний старший бит; это просто для нуля чисел до 6 бит, так как вbase
противном случае GolfScript не вернул бы никаких начальных нулей.)Ps. Онлайн демо здесь. (В последнее время сервер кажется перегруженным; если вы получили тайм-аут, попробуйте еще раз или загрузите интерпретатор и протестируйте его локально.)
Редактировать: удалось сохранить два символа, избегая ненужного построения массива и дампа. Уф!
источник
Mathematica 97
Бланк не входит:
NB! = Это один символ в Mathematica.
источник
C # - 205
Читаемая версия:
источник
Perl,
716765 символовПреобразуйте int в двоичный файл, выполните транслитерацию и добавьте новую строку после каждых двух символов.
/^#/m
Тест устраняет две модели (20 и 21) , которые не имеют бугорок в крайней левой колонке.Общее решение
150106103100 символовЧитай
x
иy
из командной строки args. Новые строки значимыВыполните итерацию над 0..2 xy, как и раньше, конвертируя каждое int в двоичное, подставляя
-
и#
для0
и1
и вставляя новую строку после каждого$x
символ символа./^#/m
проверяет наличие выпуклого выступа в крайнем левом столбце и/^.*#/
проверяет наличие выпуклого выступа в верхнем ряду. Только образцы, которые проходят оба теста, напечатаны.источник
Python,
12011811395118Редактировать: использовал предложение Уинстона Эверта и добавил решение x x y grid
Изменить: я как-то пропустил последнее ограничение по уникальности. Этот скрипт генерирует все возможные последовательности, а не только 45.
Изменить: обратно до 118, но теперь правильно
источник
['#','-']
на'#-'
J,
3533 знакаИспользует подход, который Илмари Каронен предложил в своем решении Golfscript. Однако, поскольку глагол J
#:
(antibase) хранит биты (или, ну, в общем, цифры в общем случае) в списке, нам нужно индексировать его слева, а не справа (т. Е. Индекс 0 - самый левый, старший бит).Решение довольно простое:
20+i.44
дает список чисел20..63
включительно.#:
берет antibase-2 каждого элемента в этом списке и, таким образом, создает список битовых шаблонов для каждого числа в этом диапазоне.{
выбирает (в основном, переупорядочивает) биты в правильном шаблоне, а затем{
снова используется, чтобы использовать цифры в качестве индексов в строке '- #' для подготовки вывода. Наконец, мы упорядочиваем каждую запись в прямоугольник 2 на 3 с помощью$
(shape).источник
(0 2 3 ,. 1 4 5) { #: 44
можно настроить для работы со списком чисел, а не с одним числом? Вероятно, сбрил бы еще несколько символов.Питон -
121112бланк не включен
источник
'_#',repeat=6
->*['_#']*6
b
это уже кортеж, поэтому не нужно его преобразовывать :)