Вам дана гексагональная сетка символов .
и #
вот так:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Ваша задача состоит в том, чтобы заполнить всю выровненный по осям ограничивающего прямоугольника #
с последующим #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
Выравнивающая ось ограничивающая рамка является самой маленькой выпуклой шестиугольной формой, которая содержит все #
. Обратите внимание, что в случае гексагональной сетки необходимо рассмотреть три оси (W / E, SW / NE, NW / SE):
Вот еще один пример, чтобы показать, что в некоторых случаях одна или несколько сторон будут содержать только одну #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Вы можете рассматривать их как шестиугольники с вырожденными сторонами, или вы можете нарисовать ограничивающий прямоугольник вокруг них, как я делал выше, и в этом случае они все еще являются шестиугольниками:
Слишком сложно? Попробуйте Часть I!
правила
Вы можете использовать любые два различных непечатаемых символа ASCII (от 0x21 до 0x7E включительно) вместо #
и .
. Я буду продолжать ссылаться на них как #
и .
для остальной части спецификации, хотя.
Ввод и вывод могут быть либо строкой, разделенной переводом строки, либо списком строк (по одной на каждую строку), но формат должен быть согласованным.
Вы можете предположить, что вход содержит как минимум одну #
и все строки одинаковой длины. Обратите внимание, что есть два разных «вида» строк (начиная с пробела или не пробела) - вы не можете предполагать, что ввод всегда начинается с одного и того же типа. Вы можете предположить, что ограничивающий прямоугольник всегда вписывается в заданную вами сетку.
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
Каждый тестовый пример имеет вход и выход рядом друг с другом.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
источник
Ответы:
Pyth ,
8271 байтПопробуйте онлайн!
объяснение
Пусть A - точка с наименьшей координатой y, а B - точка с наивысшей координатой y.
Пусть C будет точкой с самым низким (значение x минус значение y), а D будет точкой с самым высоким.
Пусть E будет точкой с самым низким (значение x плюс значение y), а F будет точкой с самым высоким.
Тогда это эквивалентно нахождению координат, у которых координата y находится между A и B, значение x минус значение y находится между C и D, а значение x плюс значение y находится между E и F.
источник
Haskell,
256 254243 байтаСпасибо @Damien за игру в гольф
f
!Ввод принимается как список списка символов, вывод осуществляется аналогично.
Су это зверь, чтобы написать. Он основан на идее LeakyNun, использующей максимальную и минимальную фильтрацию на основе координат элементов.
Я действительно удивлен тем, что на
m=map
самом деле экономит байты, так как это кажется таким дорогостоящим.Объяснение:
Вот немного менее резкая версия (акцент на немного ):
f
это функция, которая присваивает каждому символу индекс(y-index, x-index)
, сохраняя при этом исходную структуру списка.b
: Учитывая элемент из индексированного списка,b
вычисляет[y-index, y - x, y + x]
.p
: С учетом индексированного поля вернуть 3 функцииInt -> Bool
, первая из которых - проверка y-индекса, вторая из разности и третья сумма.min(snd e)
заботится о пробелах (пробел меньше обоих). Эта функция указана в коде гольфа.q
учитывая проиндексировано поле, изменить все необходимое ,.
чтобы#
, проверяя , если это специальное поле возвратаTrue
к каждой тестовой функции.Окончательное решение тогда состав
q
иf
.источник
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 байтОбратите внимание, что отступы - это табуляция, а не пробелы.
Гольф версия:
Проверьте это на Ideone
Пояснение (для негольфированной версии ниже):
Вся обработка выполняется без преобразования, пробелы просто пропускаются.
Функция
axes_pos
вычисляет 3 кортежа мнимых «трехмерных» координат, они накапливаются в (поэлементно) минимальный и максимальный 3 кортежа (bmin
,bmax
) для всех#
символов.Координаты рассчитываются в
def axes_pos(x, y): return y, x + y, lc - y + x
;где X отсчитывает от 0 до правого, а Y отсчитывает от 0 до нижнего (от первой строки до последней).
Первая мнимая координата в основном Y, потому что очевидно почему. Его топор ортогонален зеленым границам (на фотографиях ОП).
Второй - ортогональный красным границам, а третий - ортогональный голубым границам.
Во втором проходе, замена производится для всех
.
символов, координаты «3D» попадают вbmin
..bmax
диапазоне, поэлементны - это проверяемый в этом выраженииall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Версия Ungolfed с тестами, также на Ideone :
Обновление 1:Удалил ненужные
Обновление 2,3:-1
для третьей мнимой координаты, потому что это ничего не меняетЧастично реализованные улучшения, предложенные
Leaky Nun
+ моим тоже.источник
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
вx-y
Желе ,
4535 134241 байтЭто список ссылок; последний должен быть вызван на входе, чтобы произвести вывод.
Ввод / вывод осуществляется в виде строковых массивов, где
.
указывает на пустое и@
указывает на заполненный.Попробуйте онлайн! или проверьте все контрольные примеры .
Задний план
Давайте рассмотрим следующий пример.
Рисуя пару или параллельные линии - ближайшую пару, охватывающую все заполненные позиции - в каждом из трех направлений мы можем определить шестиугольную ограничивающую рамку.
В реализации мы заменяем все символы между этими двумя строками
@
и все, что находится за этими строками.
, с возможным исключением диагоналей, которые содержат только пробелы).Для горизонтальной оси это дает
для падающей диагональной оси это дает
и для повышения диагональной оси, это дает
Взяв символьный минимум из всех трех, так как
.
<@
, мы получаемВсе, что осталось сделать, это восстановить пространство.
Как это работает
источник
Python,
237230 байт7 байтов благодаря Денису.
Порт моего ответа в Pyth .
Принимает массив строк в качестве входных данных, выводит двумерный массив символов.
источник
Perl,
128,126 байтВключает +6 для
-0F\n
Запустить с вводом на STDIN. Используйте
1
для заполненных,0
для пустых. Строки не должны быть дополнены пробелами в конце:hexafill.pl
Использует кубические координаты. Определите максимум и минимум во время
$= == 1
цикла и заполните координаты между этими границами во время$= == 0
цикла. Первые 58 циклов бессмысленны и заполнены$-
только количеством строкисточник
TSQL, 768 байт
Я написал запрос для решения этой проблемы, который мне показался довольно сложным. Он не в состоянии конкурировать со всеми отличными короткими ответами. Но все равно хотел опубликовать его для тех, кто заинтересован. Извините за длину ответа - надеюсь, что Codegolf также о разных подходах.
Golfed:
Ungolfed:
Скрипка разгульная
источник
GNU Octave,
212, 196 байтовМожет быть, это не самый любимый язык для игры в гольф, но это то, что делает вызов, не так ли? Предполагая, что m взято в качестве матрицы символов: 178 байтов отдельно и 196, если они вставлены в функцию .
golfed:
ungolfed:
Пояснение : мы строим систему координат, 3 оси - ортогональные сторонам шестиугольника, находим max и min каждой координаты, затем строим логическую маску, начинающуюся с 1 везде и логически и: в каждой координате max и min ограничение, наконец переустанавливая каждая оставшаяся "истинная" позиция до "#" символа.
Если вы хотите проверить это, вы можете просто создать m матрицу следующим образом:
а затем вызовите f (m) и сравните с m, построив матрицу с ними обоими в:
источник
m
а выход сохраненk
. Ответы всегда должны быть полными программами или вызываемыми функциями.