Предположим, вам даны несколько разных заглавных букв, разбросанных по прямоугольному массиву пустых ячеек. Каждая ячейка в массиве принадлежит ближайшей к ней букве , определяемой как буква, достижимая за наименьшее количество горизонтальных и / или вертикальных шагов - без диагональных шагов. (Если ячейка находится на одинаковом расстоянии от двух или более ближайших букв, она принадлежит любой из этих букв в алфавитном порядке. Ячейка с заглавной буквой в ней относится к этой букве.) Граничные ячейки - это те, которые расположены горизонтально или вертикально рядом с одной или несколькими ячейками, которые не принадлежат букве, к которой они принадлежат.
Напишите подпрограмму процедуры со следующим поведением, создавая вид диаграммы Вороного ...
Ввод : Любая строка ASCII, состоящая только из точек, заглавных букв и новых строк, так что при печати она отображает прямоугольный массив описанного выше типа с точками, действующими как пробелы.
Вывод : распечатка входной строки с заменой каждой пустой граничной ячейки на строчную версию буквы, которой она принадлежит. (Подпрограмма выполняет печать.)
Пример 1
Входные данные:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Выход:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Эскиз с выделением границ:
Пример 2
Входные данные:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Выход:
..rt.....ts...sg......gduu..U.....ui....
..rt..T..ts...sg......gddeu......ui.....
...rt...ts....sg......gddeeu....ui......
....rttts.....sggggggGgdde.euuuui.......
..R.rywss.S....sfffffFdDdEeeeeeei.....I.
...ryywwzs.....sf....fddhHhhhhhhhi......
..ryyYWwZzs..sssffff.fddh.......hi......
..rxxxXxzzs.sllvvvvvffddh....hhhhi......
rrrxxxxnzzssl.lv....vfddh...hjjjjii.....
mmmmmmmnnnnnl.lv.....vvdh..hj....jai....
mmmmmmMNnnnnl.lv...V...vvhhj.....jaai...
ppppppPQqqql...lv.......vhj......ja.ai..
ppppp.pq.ql....lkv.....vjj.......ja..aii
cccccppqql...L.lkkv...vj.....J...ja...aa
.....cpqqlll..lk..kvvvvj........ja......
......cccbbbllk....kkkkj.......ja.......
....C...cb..bk..K......kj.....ja........
.......cb....bk........kjjjjjja.........
......cb......bk.......kaaaaaa....A.....
.....cb....B...bk......ka...............
Улучшение цвета:
Ответы:
GolfScript,
138144137 символовВходные данные передаются подпрограмме в виде одной строки в стеке. К сожалению, мне пришлось использовать
puts
из-за требования, что процедура должна печатать результат.Пояснение к коду
Внешний блок по существу проходит по всей позиции (x, y) в соответствии с размером входных прямоугольников. Внутри цикла координаты x и y остаются в стеке каждый раз. После завершения каждой строки результат выводится на консоль.
Код, выполняемый в цикле, сначала принимает соответствующий символ ввода.
Затем в основном мы проверяем, есть ли у нас
.
, т.е. должны ли мы (возможно) заменить символ.Опять же, внутренний код начинается с цикла, теперь по всем координатам (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
Недавний фрагмент внутреннего кода просто возвращает букву (в нижнем регистре) ближайшей точки, учитывая две координаты.
Поэтому из пяти ближайших букв для координат (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y) берут первую, если не все равно, иначе возьмите
.
.источник
Python 3 -
424422417332295 символов:Есть три части, каждая из которых должна быть в отдельной строке из-за синтаксиса Python:
w
является шириной ряда доски (включая символ новой строки в конце, который будет переработан как столбец заполнения).r
этоrange
объект, который индексирует все символы вs
.n
является кортежем смещения индекса для соседей символа (поэтому, если вы хотите, чтобы буквы расширялись по диагонали, вам просто нужно добавить-w-1,-w+1,w-1,w+1
к кортежу).x
это краткое имяstr.replace
метода, которое несколько раз используется в более позднем коде (хотя вызовы будут выглядеть странно, поскольку я используюx(s,*"xy")
для сохранения символы, а не обычныеs.replace("x", "y")
).s
Строка параметра немного изменен на данный момент , а также, с ее.
символов и новой строки заменяются~
символы (потому что они сортируют после всех букв). В~
конце также добавляется количество отступов строки .t
позже будет использоваться как ссылка на «старую» версиюs
, но его нужно инициализировать чем-то, что не равноs
в начале, и ноль занимает только один символ (более Pythonic значение будетNone
, но это три дополнительных символа) ,s
с использованием понимания списка. По мере того, как понимание перебирает индексыs
,~
символы заменяютсяmin
соседями. Если~
персонаж был полностью окружен другими персонажами~
, это ничего не изменит. Если оно было рядом с одной или несколькими буквами, оно станет самым маленьким из них (предпочтение"a"
над"b"
и т. Д.). Новые строки, которые были превращены в~
символы, сохраняются путем определения их индексов с помощью оператора модуля. Строка отступа в конце не обновляется в понимании списка (так как диапазон индексовr
был вычислен до того, как они были добавленыs
). Вместо этого свежий ряд~
символы добавляются после того, как понимание сделано. Обратите внимание, чтоs
список становится символом, а не строкой после первого прохода цикла (но поскольку Python обладает гибкостью в отношении типов, мы все равно можем индексировать, чтобы получить символы таким же образом).~
символами из отступа), заменяется на.
. Затем все символы объединяются в одну строку. Наконец,~
символы заполнения преобразуются обратно в новые строки, и строка печатается.источник
r=range
должен находиться внутри тела функции, чтобы считаться частью вызываемой процедуры, но вы можете сохранять символы, записываяr=range;s=[l.replace
. Вы также можете выжать больше символов, написавif"~"==s[y][x]else
иif"~"==s[y][x]else
в общей сложности 422. (Кстати, это работало для меня с Python 2.7)r=range
в конце первой строки функции (где я установил другие переменные) и сбрил пару пробелов, которые я пропустил раньше. Я не уверен, получил ли я оба из тех, на которые вы ссылались, поскольку вы, кажется, упоминали одно и то же дважды. И в Python 2.7 он может быть еще на два символа короче, так как вам не нужны круглые скобки послеprint
(обычно это сохраняет только 1 символ, ноprint"\n".join(...)
работает).s[y][x]for
(удаление пробела), но вы, похоже, все равно его нашли.Питон,
229226 символовЗаполняет ли поток, чтобы вычислить результат. Конечный
for
/zip
комбинированный генерирует массивx
для каждой ячейки, содержащий значение в этой ячейке и ее четырех соседях. Затем мы используем трюк Blckknght иmin
кучу возможностей для каждой ячейки. Это исходное значение ячейки, любые соседи, если ячейка еще не посещена, или a,.
если она была посещена и все соседи равны.
или равны самой ячейке.источник
return s
наprint s
. Кроме того, не можетy!=b
быть изменено наy>b
? Я думаю, это будет 226 символов.Вот. Это моя первая программа на F #. Если я пропустил функцию языка, пожалуйста, предупредите меня, поскольку я все еще учусь.
Вот мой пример ввода
Вот вывод
Вот код Наслаждаться.
Теперь нам нужно преобразовать эти данные в массив двойного измерения, чтобы мы могли получить к нему доступ через индексаторы.
Давайте создадим матрицу, представляющую право собственности на каждую ячейку
Давайте посмотрим на то, что произошло.
Давайте создадим запись, чтобы представить, где находится конкретная заглавная буква.
Теперь мы хотим найти все заглавные буквы.
По мере нашего продвижения нам нужна концепция направления.
Когда мы будем двигаться, нам нужно будет знать размер. Это поможет нам отслеживать, выходим ли мы за пределы.
Активный шаблон: соответствует критериям данной ячейки.
Теперь мы переходим к латунному налогу. Это утверждает, что клетка!
Используя активный шаблон, закажите эту ячейку, если она не востребована, и верните координаты соседних ячеек.
Мы начинаем создавать списки этого пакета данных, давайте создадим тип, чтобы прояснить ситуацию.
Учитывая список критериев для ячеек заявки, мы перебираем список, возвращая следующие ячейки для заявки и возвращаясь в этот список.
Для каждой столицы создайте критерии заявки в каждом направлении, а затем рекурсивно заявите эти ячейки.
Каждая программа нуждается в главной.
источник