Кто не любит хороший фрактал? Серпинского Ковер является классическим примером фрактала.
Для выполнения этой задачи вам потребуется сгенерировать ковер типа и распечатать получившееся изображение в stdout
(форматирование см. Ниже) , представляющем ковер уровня. Шаги можно найти в этой статье Википедии .
Это значение будет взято stdin
или эквивалентно.
Например, при вводе 4 будет получен ковер 4-го уровня:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Ввод 3 даст ковер 3 уровня:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Ввод 2 даст ковер 2 уровня:
■ ■ ■
■ ■
■ ■ ■
И ввод 1 даст ковер 1-го уровня (просто квадрат):
■
Обратите внимание на пробелы между столбцами.
Идея состоит в том, чтобы использовать символ ■ для блоков и пробел для пробелов
Строка начинается с символа ■.
Как всегда, наименьшее решение выигрывает по количеству символов (из-за нестандартных символов).
Кроме того, # можно использовать вместо символа ■ в языках, которые не поддерживают Unicode.
Ответы:
CJam,
3837313028 знаковНу что ж, мы считаем по символам, поэтому давайте распакуем Unicode:
Проверьте это здесь. Просто введите желаемый уровень в поле ввода.
объяснение
После преобразования базы это
что аналогично следующему, только с символом Unicode, записанным как
9632c
:Этот код основан на следующем наблюдении: если мы посмотрим на координаты (x, y) каждой ячейки, то получим пустую ячейку, когда и x, и y имеют
1
одинаковое положение в своем представлении base-3. Если подумать, то мелкомасштабный повторяющийся шаблон - это значащая цифра основания-3, затем следующая более значимая цифра управляет следующим крупномасштабным повторением и так далее.Содержимое полученного массива печатается автоматически.
Спасибо Деннису за то, что он сбрил три байта.
источник
#0<'■S
->#~S'■
сохраняет 1 символ.[1_]a#~
на3Yba&
.&
производит истинное / ложное значение (или даже то, что оно существует). Может быть, стоит написать в советах CJam канонический способ проверить, содержит ли массив какой-либо элемент.Матлаб
(113) (110) (99)(85)Вы можете попробовать это здесь (Вам придется заменить
input('')
на желаемый вход.)Теперь 99 благодаря feersum! А теперь до 85 благодаря RTL!
Golfed:
Ungolfed:
Объяснение:
Я злоупотребляю продуктом kronecker для этой задачи. (Это специальный продукт, определенный для двух матриц произвольного размера. Пример:
затем
Вот пример для n = 5 (в старом методе подсчета это 4);
источник
d=zeros(size([c,c]))
вас следует использоватьd=[c c]*0
.d
можно избежать путем злоупотребленияkron
еще раз:disp(char(kron(c,[1,0])*3+32));
,Хаскелл,
114108источник
Питон - 100
источник
Perl 5: 68 символов
п на стандартный.
Десятичное закодированное троичное представление списка координат сначала генерируется в
@,
(имя выбрано таким образом, что между@,
и и нет необходимости в пробелахfor
), используя цифры 0, 1 и 3. Теперь при добавлении координат x и y в десятичной области получим 2 в результате, если и только если было два в совпадающих позициях.//
используется для распространения переменной по умолчанию$_
из внешнего цикла (for
) в переменную postmatch,$'
когда она скрыта переменной по умолчаниюmap
во внутреннем цикле.источник
Java,
330283 персонажаParam - это размер, который вы хотите. Если не было оптимизации для алгоритма, я пытался подавить все.
Благодаря @StretchManiac, удаляющему
i
метод и очищающему декларации, пришлось потрудиться .Читаемый код
источник
String[]a
, и если вы используете толькоi
один раз, то вам лучше избавиться от метода.""+s
в своемp
методе? Это три лишних символа, абсолютно бесполезных. Даже если бы ониs
были чем-String
то еще, это все равно было бы совершенно ненужным.static void p(int s){System.out.print((char)s);}
и в основном сделайте этоint s=35;
,s=32;
иp(10);
(вместоp("\n");
) и сохраните еще несколько символов.Integer.valueOf
наnew Byte
Ракетка
230229225220Не лучший час ракетки для игры в гольф.
Golfed:
Ungolfed:
источник
C:
123 118 111104 символовОсновано на аналогичной идее моего решения на Perl. После добавления пробелов:
Использует троичную систему кодирования каждой цифры с 2 битами. Недопустимые значения (имеющие два в нечетно-четном положении) фильтруются с помощью
x & (x>>1) & 0b01010101
. Обе координаты хранятся в одном значении, поэтому проверка цвета пикселя сводится кx & (x >> 2 * n) & 0b01010101
.n
для удобства хранится как степень 2.редактировать
Заменено
define
на простую константуm
.Редактировать 2
0x5555555
маска может быть представлена с помощью(1LL<<32)/3
, но нам нужны толькоn
эти биты, поэтомуn/3
достаточно.Редактировать 3
Незначительные изменения Одно усиление в 2 символа, зависящее от выполнения scanf перед загрузкой значения
n
для выполнения--n
. Эол может только следовать#
, дух.источник
HTML / JavaScript, 205 символов
Обфускатвит , 205 символов
HTML / JS, 298 символов
Из-за того, как HTML играет с пробелами, несколько символов должны были быть выделены для символа nbsp. Кроме того, шрифтом по умолчанию в большинстве браузеров является не Courier, поэтому мне пришлось установить его тоже. Около 20 символов стоит стиля. Если для этого требуется метод прямого ввода, я могу добавить его, но при изменении ввода в настоящий момент задается другое значение n.
демонстрация
Читаемый HTML / JS
источник
CJam,
38353231 символовПопробуйте онлайн.
Пример запуска
Как это работает
преобразует строку Unicode из base 60,000 (
6e4b
) в base 128 (128b
), преобразуется в Character (:c
) и оценивает результирующую строку (~
).В результате выполняется следующий код:
источник
Python 3 -
116113 персонажейРЕДАКТИРОВАТЬ: Ну, использовал трюк, я сам не очень люблю и сжал код на 3 байта. Не знаю, если это самый лучший способ, но я пойду с этим.
Он может содержать некоторые непечатаемые символы, так что вот версия для печати строки.
Не слишком хорошо, но, по крайней мере, лучше, чем некоторые языки.
На что это распространяется:
Немного безрассудно, если кто-то не видит, как это работает:
источник
Mathematica, 71 байт
вход
выход
источник
CJam, 76 символов
Это прямой перевод приведенной здесь формулы
Попробуй здесь
источник
Bash + coreutils, 105 символов юникода
Поскольку мы считаем символы, а не байты:
В расшифрованном виде:
Чистый Баш, 143 байта
Ввод взят из аргументов командной строки:
Выход:
источник
C #
Полная программа - 237:
LINQPad - 166 +
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
источник
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 байтов / 227 символов ) (■
= 3 байта, так что вы можете заменить его,#
чтобы сэкономить 2 байта). В основном я поместил все внутри петли for, так что больше нет необходимости в скобках.С - 154
Ввод от стандартного ввода. Я пытался найти хороший способ избежать дополнительной функции, но не смог придумать какую-либо.
Количество символов включает только необходимые пробелы.
источник
PHP, 194 символа
n
Получил в качестве первого аргумента в командной строке.Удобочитаемый
источник
■
вместо#
, вы можете сохранить 2 символа, удалив кавычки.Scala 230 персонажей
Гольф-код:
Ungolfed код:
Только необходимые пробелы включены.
источник
V , 21 байт (не конкурирующий)
Попробуйте онлайн!
HexDump:
V новее, чем вызов, поэтому он должен быть помечен как не конкурирующий. Но все - таки, это приятно видеть , что этот ответ является waaaaay короче , чем все остальные, даже при подсчете в байтах , а не символы.
источник
ок, 40 байт
Попробуйте онлайн.
Он начинается с
1
, а затем рисует его в сетке(1 1 1;1 0 1;1 1 1)
, которую он затем рисует в сетке таким же образом и т. Д., Повторяется необходимое количество раз.источник
Python 2 , 91 байт
Попробуйте онлайн!
источник
C # (.NET Core) , 162 байта
Попробуйте онлайн!
Degolfed
источник
SOGL V0.12 , 27 байт
Попробуй здесь!
источник
R , 92 символа
94 байта со специальным символом.
Попробуйте онлайн!
источник
Холст ,
171617 знаковПопробуй это здесь!
-1: используется
[
вместо того,{
чтобы удалить первый;
внутри цикла.+1: исправлено ошибочное поведение:
■
теперь соответствует уровню 1, как указано в исходном посте.источник
■
многобайтовости. Так говорится в нижней части оригинального поста.Пип
-S
, 30 символовПопробуйте онлайн!
Основная идея: рассмотрим координатную сетку в базе 3. Отверстия в ковре возникают там, где 1) трит в координате x
1
и 2) трит в той же позиции в y-координате также1
.Аналогичное решение, такое же количество символов, но -2 байта:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
источник
K (нгн / к) , 50 байтов
спасибо @DLosc за напоминание, что я должен выводить пробелы между столбцами
Попробуйте онлайн!
источник