Напишите самую короткую программу, которая печатает этот художественный раздел ASCII из шестиугольной плитки или соты :
__
__/ \__
__/ \__/ \__
/ \__/ \__/ \
\__/ \__/ \__/
/ \__/ \__/ \
\__/ \__/ \__/
/ \__/ \__/ \
\__/ \__/ \__/
\__/ \__/
\__/
- Вклад не должен быть взят.
- Выведите на стандартный вывод или ближайшую альтернативу вашего языка.
- Вместо программы вы можете написать именованную функцию, которая не принимает параметров и обычно печатает результат или возвращает его в виде строки.
- Выходные данные могут иметь любое количество начальных и / или конечных новых строк, и каждая строка в выходных данных может иметь любое количество начальных и / или конечных пробелов (при условии, что шаблон выстраивается правильно).
- Самый короткий код в байтах побеждает.
code-golf
ascii-art
kolmogorov-complexity
tiling
hexagonal-grid
Кальвин Хобби
источник
источник
Ответы:
CJam,
4543424140 байтПопробуйте онлайн в интерпретаторе CJam .
Как это работает
повторяет шаблон
\__/
38 раз и разбивает его на куски длиной 21 . Если бы фрагменты были разделены переводом строки, это было бы результатом:Это явно содержит желаемые соты. Все, что осталось сделать, это заменить некоторые символы пробелами, отрезать некоторые другие и фактически ввести перевод строки.
генерирует целое число 74 100 000 036 и преобразует его в массив [7 4 1 0 0 0 0 0 0 3 6] . Каждый элемент массива кодирует количество начальных символов соответствующей строки, которые должны быть заменены пробелами. Вычитая это число из 16 , мы также получаем правильную длину для этой линии.
Поскольку пробел имеет более низкую кодовую точку, чем другие символы L, и векторизованные операторы оставляют символы более длинной строки, которые не соответствуют ни одному из более коротких строк, нетронутыми,
.e<
первые символы D заменяются пробелами.источник
Python 2, 73
Смотри, беги.
Для каждой из 11 выходных строк вычисляется количество первых пробелов
k
как максимум трех линейных функций, которые образуют оболочку левой стороны шестиугольника. Поскольку диагональные линии имеют наклон3
и-3
, лучше индексировать номер строки какi=0,3,...30
.Чтобы создать шестиугольную сетку, мы сначала разбиваем плитку на части
'\__/ '
. Затем сдвиг[i:]
выравнивает его на 3 для нечетных строк. Наконец, мы берем необходимую часть[k:16-k]
, оставляя полеk
слева и справа.источник
CJam,
655655 байтПопробуйте онлайн в интерпретаторе CJam .
идея
Правая половина каждой строки - это перевернутая копия левой половины с пометкой косой черты и обратной косой черты. Поэтому достаточно кодировать левую половину соты:
Вместо того, чтобы анализировать этот шаблон построчно, мы можем проанализировать его столбец за столбцом:
Очевидные образцы появляются:
_ _ _ _
встречается пять раз./
сопровождается\
.Заменив каждый
/\
,_
,_ _ _ _
и пространство с числом от 0 до 3, мы можем преобразовать результирующий массив из числа базового 4 до более высокой базы и сохранить полную картину в компактном виде.Код
источник
C
148144140 байтС пробелами, без предупреждений компилятора и перед настройкой кода для сохранения нескольких байтов:
Этот подход не использует никаких таблиц символов / строк. Он перебирает все 187 (11 строк, 17 столбцов, включая переводы строк) и решает, какой символ печатать для каждой позиции, на основе комбинации условий.
Условия включают в себя проверку на наличие внутри / снаружи 4 углов, используя 4 линейных уравнения, с результатом, сохраненным в переменной
p
. Остальное в основном повторяется каждые 6 символов, причем нечетные строки сдвигаются на 3 символа относительно четных строк.источник
int
.k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Рубин - 78 байт
Транскрипция решения xnor (69 байт):
источник
11.times
сохраняет 2 байтаJavaScript (ES6), 129
130Это чистая строка replace / replace / replace ... без использования каких-либо геометрических свойств.
Используя строки шаблона, все новые строки значимы и считаются.
Запустите фрагмент в Firefox для проверки
источник
PHP -
1391371071019187 байтЯ не знаю, является ли это лучшим способом игры в гольф, но вот моя попытка:
303646-50 байт благодаря Исмаилу МигелюПроверьте это онлайн здесь
старый код:
источник
<?
вместо того,<?php
чтобы сохранить 3 байта. Вместо этого$c=$a.$a."/ \\\n\__".$a.$a."/\n";
вы можете писать$c="$a$a/ \\\n\__.$a$a/\n";
(поскольку PHP расширяет переменные в строках). Вы можете применить ту же логику к,echo
чтобы еще больше уменьшить ее длину. Кроме того, вам не нужно пространство междуecho
строкой и.\n
вы можете поставить реальный символ новой строки и сохранить 1 байт на строку.<?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";
. Не забудьте заменить\t
символ табуляции и\n
реальный перевод строки.Луа 146
(новые строки добавлены для ясности)
источник
S
три раза.Дротик - 113
Чистое решение для интерполяции строк, ничего особенного. Строковые операции, подобные «подстроке», слишком многословны, чтобы конкурировать на практике.
Запустите его на DartPad .
источник
Javascript ( ES7 Draft ),
969493 байтаВдохновение взято из нескольких решений здесь ...
Изменить: -1 из edc65
комментарии:
источник
.substr(+x+z,16-x-x)
->.slice(+x+z,16-x+z)
-1+x
вместо простоx
?x
к числу. Без этого он бы объединялz
Питон 3,
10087 байтИ читаемая версия кода ниже. Идея состоит в том, чтобы жестко закодировать интервалы (начало, длина), а затем дополнить нужным количеством пробелов для центрирования интервала.
источник
Сетчатка , 66 байт
Каждая строка должна идти в свой собственный файл и
<LF>
означает фактическую новую строку в файле. 1 байт на дополнительный файл добавляется в счетчик байтов.Вы можете запустить код как один файл с
-s
флагом, сохранив<LF>
маркеры и, возможно, заменив их на новые строки в выходных данных для удобства чтения.Алгоритм состоит из 5 простых шагов замещения (изменение содержимого нечетной строки на содержимое четной строки), начиная с пустой входной строки. Результаты после каждого шага (ограничены
=
с):источник
Javascript,
154151 байтисточник