Где я сейчас?
Учитывая строку d
, содержащую только буквы NSWE
, определите координаты, которые я путешествовал (слева направо, жадно потребляя) и окончательную координату, где я живу.
Правила чтения координат слева направо:
- Если следующий символ
N
илиS
:- Если символ после
N
илиS
является другимN
илиS
:- Потребляйте только первое
N
илиS
. - Выход
[0,1]
дляN
- Выход
[0,-1]
дляS
- Потребляйте только первое
- Если символ после
N
илиS
являетсяW
илиE
:- Потребляйте и
N
илиS
иW
или илиE
. - Выход
[1,1]
или[-1,1]
дляNE
иNW
, соответственно. - Выход
[1,-1]
или[-1,-1]
дляSE
иSW
, соответственно.
- Потребляйте и
- Если символ после
- Если символ является
E
илиW
не предшествуетS
илиN
:- Потреблять
E
илиW
. - Выход
[1,0]
заE
. - Выход
[-1,0]
заW
.
- Потреблять
Работал пример
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Обратите внимание, что это может быть в любом формате, вот другие примеры правильного вывода:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
И т.д...
Больше примеров
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NNEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
NEN
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
правила
- Вы можете выводить в любом удобном формате, который не нарушает лазейки.
- Вы должны потреблять с жадностью,
NWE
никогдаN,W,E
, это всегдаNW,E
.- Это относится к:
SW*
,SE*
,NW*
,NE*
. - Вы потребляете слева направо, жадно.
- Это относится к:
- Это код-гольф , выигрывает самый низкий счетчик байтов.
[4, 3]
или около того, сделает немного легче увидеть, что происходит в результатах теста.1
,-1j
, и(-1+1j)
т.д. допустимый формат вывода?NE
это простоN+E
не должно иметь значение?Ответы:
Python 2 , 116 байт
Попробуйте онлайн!
С выводом как
[(3+4j), 1, -1j, …]
, 91 байтПопробуйте онлайн!
Эта лямбда возвращает список гауссовых целых : первая - это конечная координата, а все остальные - шаги, необходимые для ее получения.
источник
Атташе , 80 байт
Попробуйте онлайн!
Это анонимная функция, которая принимает один строковый аргумент.
объяснение
Первая задача - реализовать этап синтаксического анализа этого вопроса. Я нашел самое короткое использование простого регулярного выражения для разбора input (
_
):Это соответствует всем вхождениям регулярного выражения
[NS][WE]|.
, как видно из многих других ответов. Это жадно дает запрошенные направления.Теперь мы собираемся применить хеш-функцию к каждому направлению. Мы берем кодовые точки каждого направления и суммируем их. Это дает следующее отображение:
Мы попытаемся отобразить эти значения в меньшую область; Для этого полезно использовать модуль по модулю, и мы можем продемонстрировать, что наименьшее значение по модулю, которое приводит к уникальным значениям для всех заданных входных данных, равно 11. Сортировка по остаткам дает следующую таблицу:
Теперь у нас есть входное соответствие, как кодировка
Sum@Ords=>[...]%11
. Далее мы должны преобразовать эти остатки в точки. Мы попытаемся получить другое отображение, которое означает, что вставка «разреженных значений» в хэши, которые не соответствуют направлениям, будет полезна:В настоящее время у нас есть ряд точек, которые могут дать список, индексируемый по хешу:
Теперь мы сжимаем это, видя, как оно состоит только из
-1
s,0
s и1
s. Поскольку список представляет пары, мы можем сгладить список без потери данных. Затем, если мы возьмем каждое числоx
и вычислим1-x
, мы получим следующий список:Мы можем преобразовать это в число 3 базы:
Преобразование в базу 10:
Подводя итоги, мы взяли наши очки, развязали их, взяли каждый элемент, вычтенный из
1
, и преобразовали из базы3
, дав нам22260446188
. Мы можем распаковать как таковой:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
Это дает нам наш оригинальный набор пар. Затем мы можем выполнить вышеупомянутую индексацию следующим образом:
Поскольку в Attache индексирование по массиву возвращает все элементы, соответствующие этим индексам. (Итак,.
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
) Теперь у нас есть направления пути, по которому прошел ОП. Осталось подсчитать сумму.Таким образом, мы записываем этот результат в лямбду
{...}
и помещаем его как первую функцию в композицию функций (a##b
) со вторым существомV#Sum
. Это форк, который с учетом входных данныхx
расширяется до:Sum
при задании 2D-массива происходит суммирование каждого столбца в массиве (в результате векторизованного суммирования). Таким образом, это соединяет направления с конечным пунктом назначения, и мы получаем наш конечный результат.источник
JavaScript (ES6), 102 байта
Возвращает строку.
Попробуйте онлайн!
источник
MATL , 45 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
Пояснение (с примером)
Рассмотрим ввод
'NSWE'
в качестве примера.источник
Java (JDK 10) , 171 байт
Попробуйте онлайн!
Пояснения
Благодаря этому
c=~-s[i]/6%4
выполняется следующее отображение:NS
проверяется сc<2
и отображается на+1
/-1
использование1-c*2
;EW
проверяется сc>1
и отображается на+1
/-1
использованиеc*2-5
.кредиты
источник
Сетчатка 0.8.2 , 93 байта
Попробуйте онлайн! Объяснение:
Дублируйте ввод.
Разделите первую копию на направления.
Удалите посторонние пустые строки, созданные вышеуказанным процессом.
Изменение
W
вJ
так что она сортирует междуE
иN
. (ПереходE
к междуS
иW
будет также работать.)Сортировка каждой строки в порядке.
Удалите пары противоположных направлений (это влияет только на последнюю строку курса).
Подсчитайте количество горизонтальных и вертикальных движений, добавляя знаки, где это необходимо.
Те из вас, кто знает разницу между Retina 0.8.2 и Retina 1, захотят указать, что я могу сохранить 2 байта в Retina 1, потому что он использует
*
вместо$*
. Пока я был там, я пытался упростить процесс разделения, но я не смог еще больше уменьшить количество байтов, я смог сравнять его только с этим:источник
Java 10,
269265243 байтаОпределенно не правильный язык для этого вызова ..
Попробуйте онлайн.
Объяснение:
источник
Perl 5
-n
, 94 байтаПопробуйте онлайн!
источник
JavaScript (ES6), 102 байта
Возвращает строку.
источник
Рубин ,
7571 байтПопробуйте онлайн!
-4 байта благодаря benj2240.
Поскольку возвращение комплексных чисел выглядит приемлемым выходным форматом, я полагаю, что он не станет намного лучше, чем просто сделать порт очень приятного ответа Линн .
источник
map
, передав его блок напрямуюsum
: Попробуйте онлайн!F # (моно) , 269 байтов
Попробуйте онлайн!
источник
NSWE
вас в данный момент выводится(0,1)
,(-1,-1)
,(1,0)
, а четвертый выход должен быть сумма этих координат, поэтому(0,0)
(потому0+-1+1 = 0
и1+-1+0 = 0
).сед, 125
В вольности с форматом вывода версии:
Оценка включает +1 для
-r
параметра к sed.Попробуйте онлайн .
Вывод следующий:
A
символов представляет целое число + velen(string)
a
символов представляет целое число -ve-len(string)
0
Например:
,
это [0,0],AA
это [0,2]aaa,
это [-3,0]sed 4.2.2, включая расширение GNU exec , 147
Разумный формат вывода версии:
Оценка включает +1 для
-r
параметра к sed.Выходные данные даны как разделенные пробелом координаты, по одной на строку. Существует дополнительная новая строка между предпоследним и окончательным наборами координат - не уверен, проблематично это или нет.
Попробуйте онлайн!
источник
PHP, 153 байта
пусть регулярное выражение выполнит разбиение; перебрать совпадения, вывести и подвести промежуточные результаты:
Запустите как трубу с
-nR
или попробуйте онлайн .источник
C (gcc) , 173 байта
Интересно делать это на языке без поддержки регулярных выражений!
Попробуйте онлайн!
источник