Двумерные языки программирования часто имеют зеркальные команды, такие как /
и \
для перенаправления указателя команд на сетке:
>>>>\
v
v
<<<</
В этом задании вы получаете входящее направление и зеркало, и вам необходимо определить исходящее направление.
правила
Входящее направление будет дано в качестве одного из персонажей NESW
и зеркало будет дано либо как /
или \
. Вы можете получить их в любом порядке. Вы должны использовать заглавные буквы.
Вы можете вводить данные в любом удобном формате, включая двухсимвольную строку, строку с использованием некоторого разделителя между символами, пару символов в списке или даже пару одиночных строк. Если вы используете строку с разделителем, разделитель не может использовать ни один из символов NWSE\/
.
Вывод должен быть символом NESW
или односимвольной строкой.
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
Есть только 8 возможных входов, которые вам нужно обработать, поэтому нет оправдания тому, чтобы не проверять ваш код на всех из них:
N / --> W
N \ --> E
E / --> S
E \ --> N
S / --> E
S \ --> W
W / --> N
W \ --> S
источник
\
. Если ваш ответ представляет собой отправку функции, которая принимает строку, то, конечно, вам потребуется\\
исходный код для ее правильного вызова, но если вы читаете свой ввод, например, из стандартного ввода, то он должен быть единичным\
. Другими словами, если вы вызываете соответствующую функцию длины строки вашего языка на входе, результат всегда должен быть одинаковым, независимо от того, содержит ли вход/
или\
.readline()
может справиться с этим.Ответы:
Python,
4038 байт-2 байта благодаря @MitchSchwartz
(ord(d)+ord(m))%8
->ord(d)+ord(m)&7
простой поиск ответа в списке (строка АКА), проиндексированный наименьшим модом из суммы ординалов, которые работают.
Тестовые случаи на ideone
источник
%8
их и делая индекс. Тогда я вижу, что вы отправили то же самое решение более часа назад. Хах. Есть +1.Python 2, 40 байт
Sp3000 сохранил один байт (
.index
→.find
).объяснение
Мы хотим отобразить направления следующим образом:
Мы можем назначить направлениям 2-битные коды и рассматривать оба броска как XOR, используя первый и второй биты:
Отображение между битовыми строками и направлениями происходит с использованием строки
k
. Теперь нам просто нужно отобразить зеркальные символы'/'
и'\\'
значения1
и2
. Так как'/' < '\\'
мы могли наивно использовать(m>'/')+1
в качестве формулы. Но ждать! Лексикографически,и мы
'NWES'
приятно назначеныk
! Таким образом, мы можем использовать(m>k)+1
вместо этого.источник
CJam, 14 байтов
(@MartinEnder перенес мой ответ на Python )
Как?
Тесты по адитсу
источник
Javascript (ES6),
50414037 байтБлагодаря ответу Линн сэкономил еще 3 байта с помощью сравнения
использование
источник
MATL ,
1917 байтПопробуйте онлайн! Или проверьте восемь случаев .
объяснение
источник
Pyth,
171615 байтовСпасибо @Jakube и @Maltysen за -1 байт каждый
Программа, которая принимает ввод двух строк в кавычках, разделенных новой строкой, сначала направление, а затем зеркало, и печатает результат.
Это порт ответа @ Lynn's Python .
Попробуйте онлайн
Как это работает
источник
<QE
на>E
.05AB1E , 14 байтов
Попробуйте онлайн!
источник
Желе ,
14 1312 байт(порт моего ответа на Python )
-1 байт благодаря @MartinEnder (добавьте пробел в конец строки и удалите необходимость по модулю 8)
-1 байт благодаря @LuisMendo (принимайте один строковый аргумент вместо двух)
Как?
Проверьте это на TryItOnline
источник
Java 7,
717068 байтЖаль
charAt
иindexOf
занимает столько байтов ..Ungolfed & все тестовые случаи:
Попробуй это здесь.
Выход:
источник
Python,
636159 байтДовольно просто Определенно можно играть в гольф больше. Решает, добавлять ли 1 или -1 к индексу ввода в
'NESW'
.Это лямбда-выражение; чтобы использовать его, добавьте к нему префикс
f=
.Идео это!
источник
Ява 8,
625856 байтТестовая программа Ungolfed
источник
PowerShell v2 +, 34 байта
Принимает ввод как два явных
char
s, выводит achar
.Это работает следующим образом: если мы сортируем выходные данные, мы хотим
S
/
как-то равняться так же, какN
\
,W
/
равномуE
\
и т. Д. Или, по крайней мере, производить числа, которые «достаточно близки», но все же различны. Если мы посмотрим на значения ASCII, мы получим таблицу, подобную приведенной ниже:Выполнение быстрого перебора в столбце суммирования (полученного путем суммирования кодовых точек ASCII входных данных) показывает, что если мы возьмем суммы по модулю
8
, мы получим следующее2 2 | 6 1 | 3 4 | 5 7
. Это подтверждается в строке"xNESSWNW"
, какE
в индексе2
,N
в6
и1
, и так далее.Итак, нам просто нужно сложить входные данные (неявно приведение
char
кint32
к пути), взять их%8
и использовать для индексации в нашей строке.Тестовые случаи
источник
Пакет, 111 байт
Принимает, например,
W/
как параметр командной строки из двух символов строки. То\
и/
делают зацикливание неловко; это заняло бы 124 байта.источник
\r
с него?Октава, 30 байт
Использовал тот же порядок аргументов, что и у Джонатана Аллана.
Принимает ввод в виде двухсимвольной строки
'W\'
.Попробуйте онлайн .
источник
'NESSWNW 'is)
(см. Все контрольные примеры ).i
естьinput
,s
естьsum
и)
индексация, которая является модульной. Я добавил пробел в строку, чтобы по модулю было 8C,
44,35,34 байтаТребуется два символа как две переменные. Требуется как нижний, так и верхний регистр. Это использует много битовых манипуляций. Фрагмент
a&a/2
приводит к значению, которое имеет уникальные значения для младших двух битов,&3
обрезает все старшие биты. Это используется как индекс в строке "NWES" для\
зеркала. К счастью, младшие два бита символов ASCII\
и/
00 и 11 соответственно, что идеально подходит для XOR с указанным выше индексом, чтобы получить правильное направление для/
зеркала.источник
return"NWES"[...]
(пропустите пробел).CJam , 17 байт
Ввод разделен пробелом.
Попробуйте онлайн!(Как набор тестов с разделением строк).
Это решение, которое я нашел, прежде чем отправлять вызов. Не такой короткий, как циклическое индексирование Джонатана, но я подумал, что этот подход довольно интересный (и новый).
объяснение
Цель состоит в том, чтобы использовать транслитерацию (то есть, используя сопоставление символов), чтобы заменить входной символ выходным символом. Для этого нам нужно выбрать правильную карту в зависимости от того, является ли зеркало
/
или нет\
. Мы отобразим изSWEN
списка другой, который мы выберем условно. Если входной список естьSWEN
, две выходные карты должны быть следующими:Обратите внимание, что они отсортированы в обратном порядке (именно поэтому мы выбрали, казалось бы, случайный
SWEN
порядок в качестве входного набора). Мы могли бы сгенерировать их, отсортировав входной список и изменив результат, если он есть\
, но есть лучший способ:источник
СЭД
48(42 + 1 за -r) 43Сохранено 5 благодаря Мартину Эндеру ♦
Принимает ввод в виде двухсимвольной строки.
источник
Mathematica, 98 байт
Анонимная функция. Принимает две строки в качестве входных данных и возвращает строку в качестве выходных.
источник
C, 81 байт
использование
Выход:
источник
Pyth, 13 байт
Тестирование
Суммируйте кодовые точки, модульный индекс, сжатую строку.
источник
TI-Basic, 40 байтов
Жесткие коды входов. Скучно, но самый короткий путь.
источник