Цель этой задачи - найти направление и область, заключенную в петлю.
Входные данные:
Прямоугольная сетка, состоящая целиком из этих символов: ^v<>
(При желании вам также могут быть указаны размеры сетки перед самой сеткой в десятичном виде с префиксом, суффиксом и разделительным символом по вашему выбору.)
Петля в сетке представляет собой набор из вышеупомянутых символов таким образом, что один указывает на следующий, указывая на следующий, в конечном счете , указывая на первый символ. Например:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
Левая сетка - образец ввода; правая сетка - это изолированная петля.
Входная сетка не будет содержать ни одного цикла или одного цикла; Вам не нужно беспокоиться о любых случаях, когда сетка содержит более одного цикла.
Выход:
Если сетка не содержит петли, выведите X
.
Если сетка содержит две стрелки, указывающие друг на друга, выведите 0
.
Если сетка содержит цикл против часовой стрелки, подсчитайте символы, заключенные в цикл, включая границу. Выведите это число.
Если сетка содержит цикл по часовой стрелке, выполните тот же процесс для цикла против часовой стрелки, но выведите отрицательное значение этого числа. Например, вышеупомянутая входная сетка будет иметь выход -11
: 10 поступает из самого цикла, а 1 из символа, заключенного в цикл.
Это код-гольф . Самый короткий код выигрывает.
Тестовые случаи:
<<^
^>v
^v<
Выход X
.
<<<<
><<<
>>^>
Выход 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Выход -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Выход 20
.
Ответы:
C #, 604 байта
Полная программа, принимает входные данные (разграничение строк, без размеров) из STDIN, выводит в STDOUT.
Само собой разумеется, что программа сначала читает в макете, а затем перебирает каждую ячейку. Затем мы запускаем «змею» из каждой клетки, которая следует за стрелками, пока она не сойдет с края или не столкнется с самим собой. Если он сталкивается с самим собой, то мы знаем, что нашли цикл (или одну из этих вещей "> <"), и он также знает, сколько змей находится в цикле.
Как только мы узнаем, что у нас есть цикл, мы знаем, какие ячейки находятся в цикле, и мы создаем карту от каждой ячейки (+1, по причинам) либо до самой себя
-1
(означает, что она находится в цикле), либоW
(по всей ширине) если он на грани (или +1 (который находится в индексеW
), чтобы упростить вещи еще один).Пока мы делаем это, мы также находим направление, которое имеет «последний» элемент цикла (то есть последний элемент цикла в последней строке, в котором есть элементы из цикла). Этот элемент должен быть «<» или «^», и это говорит нам о цикличности (CW / CCW) цикла (переводится в -1 / + 1).
Затем мы выполняем разбор набора, который назначает все элементы, которые находятся за пределами цикла,
W
набора. Затем мы вычитаем, сколько из них,W
чтобы получить число, содержащееся в цикле. Если это число меньше 3, мы заменим его на 0. Мы умножим это на время, установим его как результат и каким-то образом выберем из циклов for, где выводится результат.Если, однако, большинство из вышеперечисленного никогда не происходит (потому что ни одна змея не находит себя), тогда результат остается как «X», и это выводится.
источник