Если кто-то, смотрящий на север в точке A в этой сетке, хотел, чтобы направления следовали по зеленой траектории (поскольку они могут следовать только по линиям сетки) до точки B, вы можете сказать им:
Go North, North, West, East, East, South, East, East
.
или эквивалентно
Go Forward, Forward, Left, Back, Forward, Right, Left, Forward
.
(Если команда « Вправо» , « Влево» или « Назад» неявно означает поворот в этом направлении, а затем движение вперед.)
Напишите функцию с одним аргументом, которая переводит между этими абсолютными и относительными направлениями по одному и тому же пути , а не только в одну и ту же точку. Предположим, что направленный человек всегда начинает смотреть на север.
Если аргумент является строкой букв NSEW
, вернуть эквивалентные относительные направления.
например, f("NNWEESEE")
возвращает строку FFLBFRLF
.
Если аргумент является строкой букв FBLR
, вернуть эквивалентные абсолютные направления.
например, f("FFLBFRLF")
возвращает строку NNWEESEE
.
Пустая строка возвращает себя. Не предполагайте никаких других входных случаев.
Если ваш язык не имеет функций или строк, используйте то, что кажется наиболее подходящим.
Самый короткий код в байтах побеждает.
R
равняетсяE
в начале.Ответы:
CJam,
575349Предыдущая версия
Пример:
Выход:
Как это устроено
источник
С ++,
9997Следующее форматируется как лямбда-выражение. Он принимает один
char*
аргумент и перезаписывает его.Для тех, кто не знаком с этой функцией (как я 1 час назад), используйте ее следующим образом:
Некоторые объяснения:
flag ? (x = y) : (x += z)
второй пары скобок требуется в C. Поэтому я использовал C ++ вместо этого!*s*9%37&4
тестирует первый байт; результат 4, если он один изNESW
; 0 иначе*s%11/3
преобразует байтыNESW
в 0, 1, 2, 3*s%73%10
преобразует байтыFRBL
в 0, 9, 6, 3 (это 0, 1, 2, 3 по модулю 4)d
переменная. Я попытался изменить код, чтобы полностью устранить его, но это кажется невозможным ...источник
JavaScript (E6) 84
86 88 92 104Редактировать: используя & вместо%, другой приоритет оператора (меньше скобок) и лучше работает с отрицательными числами
Edit2: | вместо + снова укажите приоритет, -2. Спасибо DocMax
Edit3: понимание массива на 2 символа короче, чем map (), для строк
Тест в консоли FireFox / FireBug
Выход
источник
&& o
в конце значит?array && value
оцениватьvalue
как любой массив оцениватьtruthy
4+(n-d&3)
с4|n-d&3
и сохранить 2 символов.APL, 72
Если конфигурации переводчика могут быть изменены без штрафа, то оценка 66 , изменив
⎕IO
на0
:источник
Питон,
171139Не так близко, как другие решения, но я думаю, что это должно быть относительно хорошо для того, что можно сделать с помощью Python:
Расширенная версия для немного лучшей читаемости:
источник
Go, 201
Читаемая версия:
источник
GNU sed, 356 байт
Задача требует простого преобразования потока символов.
sed
, редактор потоков - очевидный выбор языка ;-)(Комментарии и пробелы удалены для целей подсчета очков в гольф)
Выход:
Объяснение:
Идея в том, что когда мы меняем систему отсчета, всегда существует прямое отображение между
{N, E, S, W}
и{F, R, B, L}
.В случае абсолютного и относительного мы работаем вперед по строке. Для каждого символа мы карта ,
{N, E, S, W}
чтобы{F, R, B, L}
, затем повернуть остальные[NESW]
символы в соответствии с характером , мы просто отображенным, а затем перейти к следующему символу.Для случая относительно абсолютного мы делаем обратное. Мы работаем в обратном направлении через строку, вращая все последующие
[NESW]
символы в соответствии с символом непосредственно перед. Тогда мы отображаем этот символ{N, E, S, W}
к{F, R, B, L}
, пока не дойдут до начала строки.источник
Хаскелл, 224
Это назначает числа вращения относительным направлениям и числа ориентации абсолютным направлениям, затем либо находит повороты между последовательными ориентациями, либо ориентации после последовательных вращений.
i
Функция находит индекс в пределах двух легенды.источник