Найти площадь области единичных ячеек с учетом ее петли по периметру в виде последовательности поворотов на 90 градусов.
Например, возьмем трехклеточную область
XX
X
чей контур периметра мы рисуем
L<S<L
v ^
S R>L
v ^
L>L
Каждый поворот отмечен как левый (L), прямой (S) или правый (R). Начиная с R, повороты RLLSLSLL
. Таким образом, учитывая входные данные RLLSLSLL
, мы должны вывести 3 для области.
Входная последовательность гарантированно отследит петлю, охватывающую одну область слева.
- Путь заканчивается обратно в начальной точке, лицом к начальному направлению, образуя петлю.
- Петля не пересекает и не касается себя.
- Цикл идет против часовой стрелки вокруг области.
I / O
Вы можете принять ввод в виде списка или строки символов LSR
или в виде чисел -1, 0, 1
слева, справа и справа. Выход является положительным целым числом. Поплавки в порядке.
Контрольные примеры
Входные данные даны в обоих форматах, сопровождаемые их соответствующими выходными данными.
RLLSLSLL
LLLL
SLLSLL
LSRRSLLSSLSSLSSL
SSSSSLSSSSSLSSSSSLSSSSSL
[1, -1, -1, 0, -1, 0, -1, -1]
[-1, -1, -1, -1]
[0, -1, -1, 0, -1, -1]
[-1, 0, 1, 1, 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
[0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1]
3
1
2
7
36
JavaScript (ES6),
5250 байтСохранено 2 байта благодаря @Neil
Ожидается второй формат ввода.
Попробуйте онлайн!
Как?
Это описание относится к предыдущей версии : x и y с тех пор были инвертированы.
Это основано на формуле, уже упомянутой @ngn : A = Σ (x i - x i + 1 ) y i , которая также может быть записана как Σdx i y i, где dx i равно либо -1, 0, либо 1.
Начнем с r = y = 0 .
Мы продолжаем отслеживать направления тока в :
Он обновляется с помощью
a = a + k & 3
, где k - текущий элемент входного массива.Поскольку изначально содержит массив ввода, а + к принуждается к NaN на первой итерации , а затем в 0 , когда побитовое И применяется. Это означает, что первое изменение направления фактически игнорируется, и мы всегда начинаем двигаться на восток. Это не имеет значения, потому что область остается той же самой, независимо от ориентации окончательной формы.
Затем мы обновляем у с
y += (2 - a) % 2
.Наконец, мы вычисляем -dx с
~-a % 2
и вычитаем y * -dx из r , что - в конце процесса - наш конечный результат.источник
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
экономит 2 байта.Python 2 , 64 байта
Попробуйте онлайн!
Вычисляет ∑xΔy, используя комплексные числа.
источник
Haskell ,
717069 байтПояснение: Теорема Грина дает формулу для области: A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ), которая упрощается до A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (х k + 1 + x k ) * 0 = ∑xΔy, когда повороты на 90 градусов вдоль осей. У нас есть следующий псевдокод для рекурсивной функции поворота, которая отслеживает положение и направление x:
где новое направление ΔA и Δx видно из следующих таблиц. Мы можем видеть синусоидальную периодичность длины четыре в ΔA и Δx вдоль диагональной оси,
dir+turn
, которая реализуется с использованиемsin
вместо модульной арифметики.Попробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
3630 байтЕсли у вас более старая версия Mathematica (~ v10), вам понадобится
Most@
перед ней,AnglePath
чтобы избежать закрытия многоугольника. (Спасибо @ user202729 за советы).оригинал: попробуйте онлайн!
обновлено: попробуйте онлайн!
источник
#.5Pi
похоже на работу.Most
.Желе ,
1511 байтСпасибо @xnor за указание на бесполезный шаг, сохранение 2 байта.
Спасибо @dylnan за сохранение другого байта.
Ожидается второй формат ввода. Возвращает поплавок.
Попробуйте онлайн! или запустите все тесты
комментарии
источник
+\ı*Ḟ_\×ƊĊS
сохраняет байтPython 2 , 62 байта
Попробуйте онлайн!
Похоже на решение Линн , но использует некоторую сложную арифметику, чтобы извлечь правильный компонент комплексного числа за один раз.
источник
Pyth , 25 байт
Использует
-1, 0, 1
формат ввода.Попробуй это здесь!
источник
Pyth , 14 байт
Тестирование
Это выражает область как сумму
-1/2 * g(sum(l))
по всем смежным подспискамl
на входе, гдеg
выполняется модульная индексация в[0,1,0,-1]
. Код реализуетсяg
какg(x)=imag(1j**x)
. Может быть более короткий метод с прямым модульным индексированием, использованиемsin
или арифметической функциейx%4
.источник