Отказ от ответственности: история, рассказанная в этом вопросе, является полностью вымышленной и придумана исключительно с целью ознакомления.
Мой босс получил нового игрушечного робота, и он хочет, чтобы я помог ему запрограммировать. Он хочет иметь возможность вводить простые инструкции стрелки, чтобы заставить его двигаться. Эти инструкции: ^ (для движения вперед) <(для поворота влево) и> (для поворота вправо). Однако теперь, когда я запрограммировал робота, ему нужны дополнительные функциональные возможности. Он хочет, чтобы я преобразовал любую последовательность стрелок, которые он вводит, так, чтобы вместо того, чтобы робот взял выбранный путь, он перемещался в желаемое место, обозначенное местом, в котором он оказался бы, если бы он взял введенный путь, так же эффективно, как возможный. Я призываю вас, членов PP & CG, помочь мне с этой задачей.
Твое задание:
Напишите программу или функцию для преобразования строки, составленной из стрелок, в строку, которая как можно быстрее попадет в местоположение, указанное входными данными. Поворот занимает ровно столько же времени, сколько движение вперед или назад.
Входные данные:
Строка стрелок, как указано выше. Если вы хотите, стрелки могут заменить другие символы, но не забудьте указать, что вы делаете это в своем ответе. Все тестовые случаи используют стрелки как обычно.
Выход:
Строка стрелок (или ваших эквивалентных символов), которые доставят робота к желаемому месту назначения максимально эффективно.
Тестовые случаи:
Обратите внимание, что предлагаемые решения являются только возможностями, и что другие решения могут быть действительными.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Подсчет очков:
Память робота ограничена, поэтому ваша программа должна иметь минимально возможное количество байтов.
источник
^<^^<^^<^^^^
->>^^>^
?Ответы:
Retina ,
1037471 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Поворот налево превращается в тройной поворот направо.
Уменьшить все обороты по модулю 4.
Отмените движения в противоположных направлениях.
Поверните тройной правый поворот обратно в левый поворот. Это также обрабатывает случай,
>>^>^
который должен стать<^<^
.Удалите ненужные конечные повороты.
источник
Mathematica, 135 байт
Принимает
List
строки в качестве входных данных.объяснение
Установите
j
на 0 и установитеi
на 1.Для каждого входного символа ...
Если символ есть
>
, умножьтеi
на мнимую единицу. Если символ есть>
, разделитеi
на мнимую единицу. Если персонаж есть^
, добавьтеi
кj
.Взять реальную и мнимую части
j
. Это дает декартову координату робота.Примените следующее к этому результату:
Установите
a
функцию, которая генерирует строку с символом(input)
или0
символом^
s, в зависимости от того, что больше.List
, Состоящий из ...a
применяется к первому входу (реальная частьj
)Если второй вход (мнимая часть
j
) больше , чем0
,>
. В противном случае<
. Установитеs
на получившийся символ.a
применяется к абсолютному значению второго входа.Если первый вход меньше 0,
s
. В противном случае пустая строка.Применить
a
к входным временам минус один.Присоединяйся к струнам.
источник
Mathematica 119 байт
Окончательная позиция JungHwan к коду пути была короче моей, поэтому я использовал это. Я думаю, что, возможно, есть еще более короткий способ сделать это ...
Я использую встроенную
AnglePath
функцию для определения окончательной позиции. Я также определяю символы L, F и R для "<", "^" и ">", чтобы сохранить несколько символов кавычек.Использование:
Выход:
источник
Рубин , 130 байт
Как это работает
Попробуйте онлайн!
источник
J, 90 байт
решение
объяснение
есть хитрый трюк с использованием комплексных чисел (умножение на i - это поворот на 90 градусов влево, а -i - на правый).
поэтому мы принимаем наш ввод как комплексные числа: 1 представляет «ход вперед», а i / -i - левый и правый повороты.
окончательная позиция рассчитывается без усилий с этим представлением. Обратите внимание, что это первая (самая правая) часть моего последнего выражения выше:
Эта короткая строка выше и решает проблему. Все остальное - просто выяснить, как отформатировать ответ, и, несомненно, может быть значительно больше.
Чтобы понять короткую линию выше, обратите внимание, что
*/\
(просмотр частичных продуктов) дает вам список позиций, с которыми вы сталкиваетесь по каждому индексу на входе: i - север, 1 и -1 - восток и запад, а -i - юг. , Но так как мы начинаем смотреть на север, мы должны умножить все те числа на i, которые в J представлены какj.
(пережевывая это предложение на мгновение).Мы только на самом деле «движение» , когда первоначальный вход 1, поэтому мы умножаем этот результат поэлементно с помощью булевой массива , который является 1 , где первоначальный вход 1 и 0 в противном случае:
=&1*
. Результатом этого умножения является массив «направленных шагов». Наша окончательная позиция - это просто сумма этих шагов:+/
тестирование
К сожалению, я не могу заставить это работать в TIO по какой-то причине, но вставка следующего в консоль J проверит, что это работает:
источник
C # (.NET Core) , 349 байт
Попробуйте онлайн!
Принимает строку в качестве входных данных и выводит кратчайший путь, по которому будет осуществляться ввод.
Ungolfed & Комментарии
источник
JavaScript (Node.js) , 187 байт
Попробуйте онлайн!
Гольф версия с пробелами
-14 байтов @Neil
Ungolfed:
источник
t&3
вместо того,t%4
потому что это работает с отрицательным,t
так что вы можете удалить4+
и()
.(x?"":t)+t
может быть написано(x?t:t+t)
для 1-байтового сохранения. Код направления движения выглядит слишком длинным. Также я думаю, что вы, вероятно, должны заменитьindexOf
иMath.abs
сравнения.indexOf
сравнением?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 байтовОтредактируйте 1: -5 байтов, разрешив направление за пределами диапазона 0-3 и удалив пробелы.
Отредактируйте 2: -4 байта, изменив входные данные на (1, 2, 3) вместо (<, ^,>), так как OP разрешил это, а также изменив мою систему координат, чтобы я мог уменьшить вычисление расстояния.
Попробуйте онлайн!
Определяет окончательные координаты через значения словаря, которые выполняются, а затем просто печатает прямой путь к конечной цели.
источник
Perl 5 , 185 + 1 (-p) = 186 байт
Попробуйте онлайн!
источник
JavaScript (document.getElementById () kind), 343 символа
расширен:
}
Использование:
оповещения:
>^^>^
Робот с реверсом был бы полезен.
источник