Вы должны написать программу или функцию, которая получает в качестве входных данных строку, представляющую полигон ascii-art, а выходные данные возвращают площадь полигона.
Ввод представляет собой строку, состоящую из символов _ / \ L V space
и newline
определяющую простой многоугольник (что означает отсутствие лишних сегментов, отсутствие самоприкосновения и самопересечения).
Площадь ячейки одного символа 2
_
разбивает ячейку на размеры0
и2
\
разбивает ячейку на размеры1
и1
/
разбивает ячейку на размеры1
и1
L
разбивает ячейку на размеры0
и2
V
разбивает ячейку на размеры1
и1
(две стороныV
всегда будут на одной стороне многоугольника, поэтому они рассматриваются вместе в листинге.)
Каждый персонаж соединяет два угла своей ячейки персонажа, которые вы ожидаете (например, верхний левый и верхний правый в случае V
).
Пример с площадью 7 ( 1+2+1
во втором ряду и 1+1+1
в третьем):
_
/ \
V\/
вход
- Ввод будет образовывать прямоугольник, т.е. между символами новой строки будет одинаковое количество символов.
- На любой стороне многоугольника могут быть дополнительные пробелы.
- Трейлинг новой строки не является обязательным.
Выход
- Единственное положительное целое число, площадь многоугольника.
Примеры
Выходы идут после последнего ряда их входов.
_
V
1
/L
\/
3
/VV\
L /
L/
14
____/\
\ /
/\/ /
\____/
32
/V\
/ \__
\ /
/\/ /V
L____/
45
Это код-гольф, поэтому выигрывает самый короткий вход.
^
намеренно?Ответы:
CJam,
48 4329 байтОбновление : много играл в гольф, используя математику и трюк состояния * 2 из ответа orlp.
Как это работает (устарело, скоро обновится)
Мы разделяем ввод на новую строку, а затем для каждой части мы поддерживаем счетчик появлений граничных символов
L\/
. Этот счетчик% 2 сообщит нам, какой из двух разделов можно выбрать для всех символов. Затем мы находим индекс каждого символа в строкеL _
.\/V
даст-1
ссылку на последний элемент в массиве. Получив индекс, мы используем его4558Zb2/
для создания массива,[[2 0] [0 2] [0 2] [1 1]]
а затем выбираем правильное значение счетчика с помощью счетчика.Попробуйте онлайн здесь
источник
Pyth,
4746453630Объяснение:
У нас есть два состояния: «в многоугольнике» и «вне многоугольника». Следующие символы каждый делает следующее при чтении их сверху слева внизу справа:
Обратите внимание, что «добавить один в область» и «если в полигоне добавить два в область» являются взаимоисключающими.
источник
x=
работает. Это где-то задокументировано?+=
или*=
или что-то еще. В этом случаеx
используется как xor, так что он точно такой же, как и в Python^=
.Сетчатка , 293 + 15 = 308
314385байтКаждая строка идет в отдельном файле, поэтому я добавил 13 к числу байтов. Кроме того, вы можете поместить все это в один файл как есть и использовать
-s
флаг.<empty>
Стенд на самом деле пустые файлы или строки.К сожалению, мне нужно 187 байтов, чтобы преобразовать результат из унарного в десятичное. Я думаю, что я действительно должен реализовать это в ближайшее время .
объяснение
Retina - это язык на основе регулярных выражений (который я написал именно для того, чтобы иметь возможность делать подобные вещи с помощью регулярных выражений). Каждая пара файлов / строк определяет этап замены, причем первая строка является шаблоном, а вторая строка - строкой замены.
`
Шаблонам может предшествовать строка конфигурации -delimited, которая может содержать обычные модификаторы регулярных выражений, а также некоторые специфичные для Retina параметры. Для вышеприведенной программы применимы соответствующие параметры;
, которые подавляют вывод этого этапа и+
применяют замену в цикле, пока результат не перестанет изменяться.Идея решения состоит в том, чтобы посчитать каждую строку отдельно, потому что мы всегда можем решить по символам, с которыми уже столкнулись, находимся ли мы внутри или вне полигона. Это также означает, что я могу объединить все это в одну линию, потому что начало и конец линии всегда находятся за пределами многоугольника. Также можно отметить, что
_
и пробел полностью идентичны для алгоритма развертки строки, а также\
и/
. Поэтому в качестве первого шага я заменяю все символы новой строки и пробелы на_
все\
,/
чтобы потом немного упростить код.Я отслеживаю текущее состояние внутри / снаружи с помощью символов
i
иo
, в то же время, используюi
s для подсчета области. Для этого я начинаю с добавленияo
к соединенной линии, чтобы отметить, что мы находимся за пределами многоугольника. Я также добавляюiio
в самый конец ввода, который я буду использовать для поиска новых персонажей.Затем первая большая замена просто заменяет
i
илиo
сопровождается одним из/V_L
следующего набора символов, тем самым затопляя и подсчитывая всю вещь. Таблица замены выглядит следующим образом, где столбцы соответствуют последнему символу в этой строке, а строки - следующему символу (гдеS
для пробела и<>
для пустой строки). Я включил все символы ввода, чтобы показать эквивалентности, которые я уже использовал:Обратите внимание, что последний символ всегда указывает, находится ли после символа внутри или вне многоугольника, а число
i
s соответствует области, которую необходимо добавить в многоугольник. В качестве примера здесь приведены результаты первых четырех итераций на последнем входном примере (это было сгенерировано старой версией, которая фактически заливала каждую строку отдельно, но принцип все тот же):Наконец, я просто избавляюсь от всех
o
s и разрывов строк, удаляя все, что соответствует[^i]
, а остаток - десятичное в унарное преобразование, которое довольно скучно.источник
Perl,
6558 байтисточник
$/=\1;$-^=2*y,/\\L,,,$a+=y,/\\V,,||$-for<>;print$a
GNU sed, 290 + 1
+1 должен учитывать
-r
переключение, переданное в sed. Комментарии и дополнительные пробелы не учитываются в счете.Я не выглядел очень подробно, но я думаю, что это, вероятно, похоже на ответ Retina Мартина :
обзор
:
Заметки
sed
ориентирован на строки, поэтому требуется некоторая работа для обработки нескольких строк одновременно. КомандаN
делает это, добавляя новую строку, а затем следующую строку в текущее пространство шаблона. Сложность вN
том, что, как только он попадает во входной поток EOF, онsed
полностью завершает работу без какой-либо возможности дальнейшей обработки. Чтобы обойти это, мы подсчитываем текущий набор двоеточий в конце каждой строки, непосредственно перед чтением в следующей строке.Выход:
источник
C 93
96 108байтРедактировать: учел предложения в комментариях, преобразовал while в цикл с одиночным оператором и полностью удалил переменную «i».
Исходное сообщение:
Это выглядело как забавная и достаточно простая проблема, чтобы наконец-то заставить меня создать аккаунт здесь.
Текст многоугольника должен быть передан в качестве первого аргумента командной строки; это должно работать с или без какого-либо количества новых строк / пробелов.
Это просто читает в многоугольнике по одному символу за раз, s переключается ли в настоящее время внутри или за пределами многоугольника на '/', 'L' или '\', и t увеличивается на 1 на '/', 'V', и '\', или на 2, если внутри / 0, если снаружи на 'L', '_', пробел и символ новой строки.
Я впервые пробую свои силы в любом виде «игры в гольф» (или C, в той степени, в которой он отличается от C ++), поэтому любая критика приветствуется!
источник
i=t=s=0;
я думаю, C инициализирует всеint
s до 0. Также посмотрите, сможете ли вы превратитьwhile
петлю вfor
петлю; это часто экономит несколько байтов....int i,t,s;for(i=t=s=0;c=v[1][i++];t+=s+(c>46^!(c%19)^s))s^=c>13^c%9>4;...
что должно сохранить 4 байта; один {, один} и два;int i,t,v;
нужно было помещать перед,main
а не внутри, мы могли бы избавиться отi=t=s=0
общей экономии еще 7 байтов.POSIX сед,
245244POSIX sed, без расширений или расширенных регулярных выражений. Вход ограничен максимальным размером пространства хранения sed - мандаты POSIX не менее 8192; GNU управляет больше. Эта версия предполагает, что до или после фигуры не будет пустых строк; дополнительные 10 байтов кода, указанного в расширении, могут соответствовать этому требованию (в оригинальном вопросе это не уточняется).
Расширено и аннотировано
источник
C, 84 байта
Мы переходим на другую сторону, когда видим
\
,/
илиL
; мы всегда добавляем один для\\
,/
илиV
, но добавляем 2 (если внутри) или 0 (если снаружи) для пробела, новой строкиL
или_
.Переменные
a
иi
предполагаются равными нулю при входе - они должны быть сброшены, если функция должна вызываться более одного раза.Ungolfed:
Тестовая программа:
источник