Когда учеников впервые учат доказательной технике математической индукции , типичным примером является проблема мозаики 2 N × 2. наложения сетки N на L-образные тромино , оставляя одно заданное пространство сетки пустым. (N - некоторое неотрицательное целое число.)
Я оставлю это вам, чтобы просмотреть доказательства, если вы еще этого не знаете. Есть много ресурсов, которые обсуждают это.
Ваша задача здесь состоит в том, чтобы написать программу, которая принимает значение для N, а также координаты пространства сетки, чтобы оставить пустым, и печатает ASCII-представление результирующей мозаики Tromino.
Персонаж O
заполнит пустое пространство, и 4 поворота нашего тромино будут выглядеть так:
|
+-
|
-+
-+
|
+-
|
(Да, это может быть неоднозначно, что +
идет с какой -
и |
для определенных договоренностей, но это нормально.)
Ваша программа должна работать при N = 0 (для сетки 1 × 1), по крайней мере, до N = 8 (для сетки 256 × 256). Будут даны значения x и y, которые являются координатами для O
:
- х горизонтальная ось. x = 1 - левый край сетки, x = 2 N - правый край сетки.
- у вертикальная ось. y = 1 - верхний край сетки, y = 2 N - нижний край сетки.
И x, и y всегда находятся в диапазоне [1, 2 N ].
Таким образом, для заданных N, x и y ваша программа должна вывести 2 N × 2 N сетку , полностью покрытую L-образными тромино, за исключением координаты сетки x, y, которая будет являться O
.
Примеры
Если N = 0, тогда x и y должны быть равны 1. Выход
O
Если N = 1, x = 1 и y = 2, результат будет
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (например, изображение на этой странице ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Детали
- Вы можете написать функцию, которая принимает 3 целых числа вместо написания всей программы. Он должен напечатать или вернуть строку сетки.
- Возьмите ввод из стандартного ввода, командной строки (или аргументов функции, если вы пишете функцию).
- Выходные данные могут дополнительно содержать один обучающий перевод строки.
- Вы не обязаны использовать метод листов, который обычно предлагает доказательство. Имеет значение только то, что сетка заполнена L-образными тромино, кроме
O
. (Тромино нельзя разрезать или выходить за границы сетки.)
Самый короткий код в байтах побеждает. Tiebreaker - более ранний пост. ( Удобный счетчик байтов. )
if p!=i
; список внутри.join()
не нужен[]
;(1-i%2)
может быть сделано как~i%2
; Вы можете использовать итеративную распаковку, чтобы написатьt,l,a=[],...
как*t,l,a=...
;if n==0
может быть проверено,if n<1
потому чтоn
не может быть отрицательным; окончательный"\n".join
вариант, вероятно, можно сделать, напечатав каждый элемент, поскольку общие правила допускают печать вместо возврата;if p!=i
может бытьif p-i
потому, что ненулевые значения являются правдой.f
это рекурсивная функция. Я на самом деле должен возвращать форматирование выводаsplit()
после каждого самостоятельного вызова.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
на второй-последняя строка может быть записана какt+=...,
(добавление кортежа вместо списка), и я не уверен, что эта работает, ноA if B else C
может быть записана какB and A or C
(также на вторая-последняя строка), но только если A никогда не бывает ложным (что я так не думаю?)JavaScript (ES6) 317
414Много работы по гольфу, но все же довольно долго.
Запустите сниппет для проверки (лучше выглядит при использовании символов блока Unicode - но даже немного дольше)
Показать фрагмент кода
источник
IDL 8,3+, 293 байта
Это слишком долго, я пытаюсь сократить это, но я еще не получил там.
Выходы:
И ... просто для удовольствия ...
источник
Ruby Rev 1, 288
Как анонимный лямбда-литерал. Показано в тестовой программе (лямбда-литерал есть
->(n,a,b){...}
)Ruby Rev 0, 330 без золота
В настоящее время я требую только игры в гольф - это исключение комментариев, ненужных новых строк и отступов.
Это мой первый правильный алгоритм, закодированный в Ruby, и это была тяжелая работа. Я уверен, что есть как минимум 50 символов, которые можно убрать, но я сделал достаточно на данный момент. Есть некоторые реальные ужасы, например, вход. Вероятно, это можно исправить с помощью функции или лямбды вместо программы, но внутренняя функция,
t
которая рисует тромино, все еще нуждается в доступе к глобальным переменным. Я должен выяснить синтаксис для этого.Особенностью моего ответа, которого нет в других, является то, что я инициализирую массив строк
|
символами. Это означает, что мне нужно только нарисовать+-
или-+
, которые находятся рядом друг с другом на одной линии.источник
Haskell, 170 байт
Запустить онлайн на Ideone
Пример выполнения:
источник