Вызов
В качестве входных данных вы получите таблицу, составленную с помощью ASCII |
и_
. Ваша задача - расставить вокруг нее стулья.
пример
Входные данные:
____
| |
| |
| |
| |
|____|
Выход:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Эти стулья сделаны из <>
иv^
.
Другой пример:
В линии должно быть как можно больше стульев.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Между каждым стулом должно быть пространство. И >_^_^_<
недействительно, так и должно быть |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Никакие стулья не могут быть внутри "пончика".
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
и v
расставить приоритеты <
и >
. Сам по себе стул не должен быть (должен быть хотя бы один |
или _
в ряду).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
Это код гольф, поэтому выигрывает самый короткий код.
Ответы:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 байта6 байтов сохранено благодаря Райли
6 байтов сохранено благодаря Аднану
Поскольку этому вопросу уже более года, и он до сих пор не получил ответов, я решил попробовать.
Попробуйте онлайн!
Программа считывает таблицу с именем файла
I
и печатает таблицу со стульямиstd::out
. Я не был уверен в куче крайних случаев, поэтому я принял лучшее решение (независимо от того, что потребовало наименьших усилий), но, похоже, он прошел все контрольные примеры. Некоторые из результатов не совпадают точно, но все они имеют одинаковое количество стульев.объяснение
Первая строка довольно просто устанавливает некоторые определения, которые будут экономить нам байты в будущем:
(Я распакую эти макросы для удобства чтения в следующих строках)
Затем мы откроем файл с именем,
I
потому что у нас уже есть переменная, которая коротка для этого, поэтому он сохраняет несколько байтов.Мы разбиваем вдоль строк, чтобы создать список строк (строк изображения)
Затем я нахожу длину самой длинной строки, чтобы можно было дополнить все строки этой длиной. (Я также добавляю 3, потому что нам нужно немного дополнительного заполнения)
Затем мы выполняем фактическое заполнение и создаем границу
I
символов по краю. Это потому, что позже нам нужно будет определить разницу между внутренней и внешней частью фигуры. Мы также изменим тип данных из списка строк в список списка символов (длина строки 1).Следующая строка - это просто еще одно определение сохранения байта.
(Я также распакую этот)
Теперь мы хотим выкладывать
I
символы повсюду за пределами фигуры. Мы можем сделать это с помощью псевдо-клеточного автомата. КаждыйI
будет распространяться на любые соседниесимволы. Мы можем зацикливаться, пока автомат не стабилизируется, однако это не может занять больше итераций, чем количество символов, поэтому мы просто перебираем все символы внутри
b
(исходные данные)Для каждой итерации мы хотим передать каждый символ в 2D-списке (исключая внешние отступы)
Для каждой позиции мы запускаем следующий код:
Давайте разберемся с этим.
У нас есть, если с двумя условиями, разделенными
&
(поразрядноand
)Первый просто проверяет, есть ли
I
в какой-либо из соседних ячеек, а второй просто проверяет, является ли текущая ячейка a" "
. Если мы передаем эти условия, мы устанавливаем текущую ячейку, чтобы бытьI
.Теперь, когда мы определили форму снаружи и внутри, мы можем начать расставлять стулья вокруг стола.
Еще раз мы перебираем все ячейки (и устанавливаем еще несколько сокращений)
Теперь вот моя любимая часть. Если вы дошли до моего скучного, в основном основанного на определениях, игры в гольф до сих пор, я собираюсь наградить вас приятным лакомым кусочком умного гольфа (если я сам так скажу).
Немного предыстории в python:
В Python, если вы пытаетесь назначить словарный ключ дважды, он назначает последний. Например
Мы будем злоупотреблять этим свойством, чтобы присвоить текущую ячейку определенному персонажу.
Первое условие
Если ячейка находится в середине края из 3
_
символов, мы переназначим текущую ячейку и ячейку под ней. Мы присвоим его результату индексации перегруженного словаря поI
. Сначала мы устанавливаем значение по умолчанию с парой,"I":"_"+a[x+1][y]
это означает, что если нет изменений, мы присвоим двум ячейкам их исходные значения. Далее мы добавим паруa[x-1][y]:"^ "
. Это ничего не сделает (важно), если ячейка над текущей (a[x-1][y]
) не заполненаI
. Если в нем есть значение,I
то оно переопределит значение по умолчанию, говорящее нам о размещении стула в текущей ячейке. Затем мы переходим к ячейке ниже текущей ячейки, если эта ячейкаI
снова переопределяется, чтобы поместить стул, обращенный вверх, ниже текущей точки.Следующее условие немного проще
Мы проверяем, являются ли текущая ячейка и ячейка над ней
|
. Если это так, мы создали словарь.Первая пара в словаре
"I":"|"
устанавливает значение по умолчанию. Поскольку мы собираемся получить доступ к ключу,I
еслиI
его не переназначить, он по умолчанию вернется к|
(символ, которым он уже является) и ничего не сделает.Мы добавим две клавиши.
A[y+1]:">",A[y-1]:"<"
Если любая из двух ячеек слева и справа будет,I
то она переназначит текущую ячейку на стул, указывающий в направлении наружу.Теперь нам просто нужно вывести. Однако мы не можем просто напечатать, есть пара вещей, которые мы должны сделать в первую очередь. Мы должны преобразовать обратно в строку и удалить все
I
s, которые мы создали. Это делается в одну строку.источник
i,o="I "
вместоi="I";o=" "
работы?n
стоит 4 байта и спасает меня 6. Хотя я не использую это часто, это экономит 2 байта.