Дзеркало, Дзеркало, в кодексі


26

Двовимірні мови програмування часто мають дзеркальні команди, як /і \перенаправляти вказівник інструкцій на сітці:

>>>>\
    v
    v
<<<</

У цьому виклику вам надається напрямок, що надходить, і дзеркало, і вам потрібно визначити вихідний напрямок.

Правила

Вхідний напрямок буде задано як один із символів, NESWа дзеркало - як /або \. Ви можете отримати їх у будь-якому порядку. Ви повинні використовувати великі літери.

Ви можете приймати дані в будь-якому зручному форматі, включаючи дво символьну рядок, рядок, використовуючи деякий роздільник між символами, пару символів у списку або навіть пару однорядних рядків. Якщо ви використовуєте рядок з роздільником, то роздільник не може використовувати жоден із символів NWSE\/.

Вихід повинен бути символом з NESWабо односимвольного рядка.

Ви можете написати програму чи функцію та скористатися будь-яким із наших стандартних методів отримання вводу та надання виводу.

Ви можете використовувати будь-яку мову програмування , але зауважте, що ці лазівки за замовчуванням заборонені.

Це , тому найкоротший вірний відповідь - вимірюється в байтах - виграє.

Випробування

Існує лише 8 можливих входів, з якими потрібно обробити, тому немає виправдання, щоб не перевірити свій код на всіх:

N /   -->   W
N \   -->   E
E /   -->   S
E \   -->   N
S /   -->   E
S \   -->   W
W /   -->   N
W \   -->   S

1
Чи можемо ми вважати, що мовами, на яких слід вводити косої риски на вході, вхід буде "\\"?
JDL

4
@JDL Фактичний рядок (або символ) повинен містити єдиний \. Якщо ваша відповідь - це функція, яка займає рядок, то, звичайно, вам знадобиться \\у вихідному коді, щоб правильно її зателефонувати, але якщо ви, наприклад, читаєте свої дані зі стандартного введення, тоді це повинно бути одиничним \. Іншими словами, якщо ви називаєте відповідну функцію довжини рядків на мові на вході, результат повинен бути завжди однаковим, незалежно від того, містить він /чи \.
Мартін Ендер

Гаразд, я очікував, що R матиме проблеми, коли введено непризначений "\" через stdin, але він readline()може це впоратися.
JDL

1
@JDL Вам, ймовірно, потрібно буде ввести рядок, що втікає (дублює) цей символ, але в результаті рядок буде "N \"
Луїс Мендо

Відповіді:


24

Пітон, 40 38 байт

-2 байти завдяки @MitchSchwartz (ord(d)+ord(m))%8->ord(d)+ord(m)&7

lambda d,m:' NESSWNW'[ord(d)+ord(m)&7]

простий пошук відповіді у списку (рядок AKA), індексованому найменшим модом суми розпоряджень, що працює.

Тестові справи є на ideone


Dangit, я думав, що я дуже розумний, приймаючи значення ASCII, підсумовуючи їх, %8їх і роблячи індекс. Потім я бачу, що ви розмістили те саме рішення більше години тому. Ха-ха. Майте +1.
AdmBorkBork

21

Python 2, 40 байт

lambda c,m,k="NWES":k[k.find(c)^(m>k)+1]

Sp3000 зберегла один байт ( .index.find).

Пояснення

Ми хочемо відобразити такі напрямки:

       \
  N ⇄⇄⇄⇄⇄⇄⇄ E
  ⇅         ⇅
  ⇅         ⇅
/ ⇅         ⇅ /
  ⇅         ⇅
  ⇅         ⇅
  W ⇄⇄⇄⇄⇄⇄⇄ S
       \

Ми можемо призначити вказівки 2-бітовим кодам і переглядати обидва перекидання як XOR-ове перший і другий біти:

         xor 2
     0 0 ⇄⇄⇄⇄⇄ 1 0
      ⇅         ⇅
      ⇅         ⇅
xor 1 ⇅         ⇅ xor 1
      ⇅         ⇅
      ⇅         ⇅
     0 1 ⇄⇄⇄⇄⇄ 1 1
         xor 2

Відображення між бітовими рядками та напрямками відбувається за допомогою рядка k. Тепер нам просто потрібно відобразити дзеркальні символи '/'та '\\'значення 1та 2. Оскільки '/' < '\\'ми могли б наївно використовувати (m>'/')+1формулу. Але зачекайте! Лексикографічно,

'/' < 'NWES' < '\\'

і ми 'NWES'приємно призначили k! Тож ми можемо використовувати (m>k)+1замість цього.



6

Javascript (ES6), 50 41 40 37 байт

d=>m=>(S="NWES")[S.search(d)^-~(m>S)]

Збережено ще 3 байти за допомогою порівняння завдяки відповіді Лінн

Використання

let f =
d=>m=>(S="NWES")[S.search(d)^-~(m>S)]

console.log(f("N")("/"));  //   -->   W
console.log(f("N")("\\")); //   -->   E
console.log(f("E")("/"));  //   -->   S
console.log(f("E")("\\")); //   -->   N
console.log(f("S")("/"));  //   -->   E
console.log(f("S")("\\")); //   -->   W
console.log(f("W")("/"));  //   -->   N
console.log(f("W")("\\")); //   -->   S


Розумне використання зіставлень ASCII, щоб досягти свого стану в кінцевому підсумку ...
WallyWest,

6

MATL , 19 17 байт

'NWSE'jy&mjy+Eq-)

Спробуйте в Інтернеті! Або перевірити вісім випадків .

Пояснення

'NWSE'    % Push this string
j         % Take first input, say 'W'. Stack contains: 'NWSE', 'W'
y         % Duplicate from below. Stack: 'NWSE', 'W', 'NWSE'
&m        % Index of membership. Stack: 'NWSE', 2
j         % Take second input, say '/'. Stack: 'NWSE', 2, '/'
y         % Duplicate from below. Stack: 'NWSE', 2, '/', 2
+         % Add (char '/' is converted to code point). Stack: 'NWSE', 2, 49 
Eq        % Multiply by 2, subtract 1. Stack: 'NWSE', 2, 97
-         % Subtract. Stack: 'NWSE', -95
)         % Apply -95 as (modular, 1-based) index into 'NWSE'. Stack: 'N'
          % Implicitly display

6

Pyth, 17 16 15 байт

Дякуємо @Jakube та @Maltysen за по 1 байт

@J"NWES"xxJQh>E

Програма, яка приймає дані про два рядки з цитатами, розділеними новими рядками, спочатку напрямок, а потім дзеркало та друкує результат.

Це порт відповіді Python @ Lynn .

Спробуйте в Інтернеті

Як це працює

@J"NWES"xxJQh>E  Program. Inputs: Q, E
 J"NWES"         J="NWES". Yield J
         xJQ     J.index(Q)
             >E  E>Q, lexographically (implicit input fill)
            h    +1
        x        Bitwise XOR of the above two
@                Index into J with the above
                 Implicitly print

ви можете зберегти інший байт, замінивши <QEна >E.
Малтісен


4

Желе , 14 13 12 байт

(порт моєї відповіді Python )
-1 байт завдяки @MartinEnder (додайте пробіл до кінця рядка та видаліть потребу в модулі 8)
-1 байт завдяки @LuisMendo (візьміть аргумент одного рядка, а не два)

OSị“NESSWNW 

Як?

OSị“NESSWNW  - takes a single argument "dm" (direction and mirror), in either order.
                   strings and lists are equivalent in Jelly
 O            - ordinal: [ord(d),ord(m)]
  S           - sum: ord(d)+ord(m)
    “NESSWNW  - string: "NESSWNW "
   ị          - fetch modulo index (the string is 8 long and 1-based)

Перевірте його на TryItOnline


4

Java 7, 71 70 68 байт

char c(int d,int m){return"NEWS".charAt("NEWS".indexOf(d)^-~(m%2));}

Шкода charAtі indexOfзаймає стільки байтів ..

Недоліковані та всі тестові справи:

Спробуйте тут.

class M{
  static char c(int d, int m) {
    return "NEWS".charAt("NEWS".indexOf(d) ^ -~(m%2));
  }

  public static void main(String[] a){
    System.out.print(c('N', '/') + " ");
    System.out.print(c('N', '\\') + " ");
    System.out.print(c('E', '/') + " ");
    System.out.print(c('E', '\\') + " ");
    System.out.print(c('S', '/') + " ");
    System.out.print(c('S', '\\') + " ");
    System.out.print(c('W', '/') + " ");
    System.out.print(c('W', '\\') + " ");
  }
}

Вихід:

W E S N E W N S

3

Пітон, 63 61 59 байт

lambda d,m,x='NESW'*2:x[x.find(d)+2*(m=='/\\'[d in'NS'])-1]

Досить просто. Однозначно можна більше пограти в гольф. Вирішує, чи слід додати 1 або -1 до індексу введення в 'NESW'.

Це лямбда-вираз; використовувати його, приставку до f=.

Ідей це!


3

Java 8, 62 58 56 байт

(d,m)->"SEWN".charAt("NWES".indexOf(d)^m.indexOf(47)+2);

Непрограмна тестова програма

import java.util.function.BiFunction;

public class Mirror {

public static void main(String[] args) {
    BiFunction<String, String, Character> function = (d,m)->"SEWN".charAt("NWES".indexOf(d)^m.indexOf(47)+2);

    System.out.println(function.apply("N", "/")); //W
    System.out.println(function.apply("N", "\\")); //E
    System.out.println(function.apply("W", "/")); //N
    System.out.println(function.apply("W", "\\")); //S
    System.out.println(function.apply("E", "/")); //S
    System.out.println(function.apply("E", "\\")); //N
    System.out.println(function.apply("S", "/")); //E
    System.out.println(function.apply("S", "\\")); //W
}

}

3

PowerShell v2 +, 34 байти

param($a,$b)"xNESSWNW"[(+$a+$b)%8]

Приймає вхід як два явних chars, виводить a char.

Це працює наступним чином : якщо ми сортуємо висновок, що ми хочемо , S /щоб як - то рівнятися такий же , як N \, W /рівним E \і т.д. Або, принаймні, цифри, які виробляють «досить близько» , але по- як і раніше різні. Якщо ми подивимося на значення ASCII, то отримаємо таблицю, як показано нижче:

In1   In2       Res.    Sum
S 83  / 47  --> E 69 -> 130
N 78  \ 92  --> E 69 -> 170
W 87  / 47  --> N 78 -> 134
E 69  \ 92  --> N 78 -> 161
W 87  \ 92  --> S 83 -> 179
E 69  / 47  --> S 83 -> 116
N 78  / 47  --> W 87 -> 125
S 83  \ 92  --> W 87 -> 175

Запуск швидкого грубого форсара на стовпчик підсумовування (отриманий від підсумовування кодових точок ASCII вхідних даних) показує, що якщо ми візьмемо модуль сум 8, отримаємо наступне 2 2 | 6 1 | 3 4 | 5 7. Ось про що свідчить в рядку "xNESSWNW", так як Eз індексом 2, Nзнаходиться 6і 1, і так далі.

Отже, нам просто потрібно підсумовувати вхідні дані (неявно відкидаючи charїх int32по дорозі), взяти це %8та використати це для індексації в нашому рядку.

Випробування

PS C:\Tools\Scripts\golfing> ('N','/'),('N','\'),('E','/'),('E','\'),('S','/'),('S','\'),('W','/'),('W','\')|%{"$($_[0]) $($_[1]) --> "+(.\mirror-mirror-in-the-code.ps1 ([char]$_[0]) ([char]$_[1]))}
N / --> W
N \ --> E
E / --> S
E \ --> N
S / --> E
S \ --> W
W / --> N
W \ --> S

2

Пакет, 111 байт

:goto %1
:W/
:E\
@echo N
@exit/b
:S/
:N\
@echo E
@exit/b
:E/
:W\
@echo S
@exit/b
:N/
:S\
@echo W

Приймає, наприклад W/, параметр командного рядка з двома символами. \І /зробити цикл незручно; це займе 124 байти.


Idk, я рахую 96 байт. Ви знімали \rз нього?
Conor O'Brien

@ ConorO'Brien Я записую свої файли Batch за допомогою блокнота, так, ні.
Ніл

2

Октава, 30 байт

Використовували той самий порядок аргументів, що і Джонатан Аллан.

Приймає введення як двосимвольний рядок 'W\'.

@(x)['NESSWNW'](mod(sum(x),8))

Спробуйте в Інтернеті .


Приємно! Ви можете перенести порт MATL: 'NESSWNW 'is)(див. Усі тестові випадки ). iє input, sє sumі )є індексуванням, яке є модульним. Я додав пробіл у рядку, щоб модуль був 8
Луїс Мендо

Дякую :) Я відчуваю, що це обман, якщо додам це як окрему відповідь, оскільки я сам цього не написав. Я можу додати його до цієї відповіді, хоча якщо ви самі не хочете відповідати на неї :)
Стюі Гріффін

Я розумію, я, мабуть, зробив би те саме :-) Я не хочу змінювати свою відповідь, оскільки це зовсім інший підхід, який я не придумав. Не впевнений, що додавати його у вашу відповідь має сенс, хоча, як це було б дві різні мови у відповіді
Луїс Мендо

Це буде моя перша відповідь MATL, хоча: я бачу, це довше, ніж ваша відповідь MATL, тому я не думаю, що я додаю її ...
Стюі Гріффін

2

C, 44, 35, 34 байт

f(a,b){return"NWES"[a&a/2&3^b&3];}

Для цього потрібні два символи як дві змінні. Він бере як нижній, так і верхній регістр. Тут використовується безліч маніпуляцій. Фрагмент a&a/2призводить до значення, яке має унікальні значення для двох нижніх бітів, &3обрізає всі більш високі біти. Це використовується як покажчик у рядку "NWES" для \дзеркала. На щастя, нижні два біта символів ASCII \і /є 00 і 11 відповідно, що ідеально підходить для XOR зі згаданим вище індекс , щоб отримати правильний напрямок для /дзеркала.


2
Приємно! Однак ви пропустили очевидний -1 байт: return"NWES"[...](пропустіть пробіл).
Тім Час

Дякую Тіме, мені не сталося, що це буде дійсно C :)
G. Sliepen

1

CJam , 17 байт

r"SWEN"_e!r'/#=er

Введення розділено пробілом.

Спробуйте в Інтернеті! (Як тестовий набір, відокремлений лінійною подачею.)

Це рішення, яке я знайшов перед тим, як опублікувати виклик. Не такий короткий, як циклічна індексація Джонатана, але я вважав, що цей підхід є досить цікавим (і новим).

Пояснення

Метою є використання транслітерації (тобто використання відображення символів на символ) для заміни вхідного символу вихідним символом. Для цього нам потрібно вибрати правильну карту виходячи з того, чи є дзеркало /чи \. Ми будемо зіставляти зі SWENсписку інший, який виберемо умовно. Якщо список вводу є SWEN, дві вихідні карти повинні бути наступними:

in  SWEN
/   ENSW
\   WSNE

Зауважимо, що вони розташовані в упорядкованому та зворотно-відсортованому порядку (саме тому ми вибрали, здавалося б, випадковий SWENпорядок в якості вхідного набору). Ми можемо генерувати їх, сортуючи список вхідних даних і повертаючи результат, якщо вхід є \, але є кращий спосіб:

r       e# Read incoming direction.
"SWEN"  e# Push input list for transliteration.
_e!     e# Duplicate and get all permutations. The way, `e!` is implemented, it
        e# always gives the permutations in sort order, regardless of the order
        e# of the input set. Specifically that means that "ENSW" will be first
        e# and "WSNE" will be last in this list.
r       e# Read the mirror.
'/#     e# Find the index of / in this string. If the mirror is '/', then this
        e# gives 0. Otherwise, this gives -1, indicating that '/' was not found.
=       e# Select the corresponding permutation. Indexing is zero-based and
        e# cyclic so that 0 (input '/') gives the first permutation "ENSW" and
        e# -1 (input '\') gives the last permutation "WSNE".
er      e# Perform the transliteration on the incoming direction.
        e# Printing is implicit.

1

СЕД 48 (42 + 1 за -р) 43

Збережено 5 подяк Мартіну Ендеру ♦

s,N/|S\\,W,;s,E/|W\\,S,;s,N.|S/,E,;s,..,N,

Вводиться як дворядний рядок.


0

Математика, 98 байт

If[#2=="/",{"S",,,,,,,,,"W",,,,,"E",,,,"N"},{"N",,,,,,,,,"E",,,,,"W",,,,"S"}][[LetterNumber@#-4]]&

Анонімна функція. Приймає два рядки як вхідні дані та повертає рядок як вихід.


0

C, 81 байт

f(char*a){return a!="N/"&a!="S\\"?a!="N\\"&a!="S/"?a!="W\\"&a!="E/"?78:83:69:87;}

Використання

main()
{
    printf("N/ \t %c\n",f("N/"));
    printf("N\\\t %c\n",f("N\\"));
    printf("E/ \t %c\n",f("E/"));
    printf("E\\\t %c\n",f("E\\"));
    printf("S/ \t %c\n",f("S/"));
    printf("S\\\t %c\n",f("S\\"));
    printf("W/ \t %c\n",f("W/"));
    printf("W\\\t %c\n",f("W\\"));
}

Вихід:

N/      : W  
N\      : E  
E/      : S  
E\      : N  
S/      : E  
S\      : W  
W/      : N  
W\      : S  

Працює лише на твердо кодованих значеннях, оскільки використовує порівняння вказівників.
Самі Кухмонен


0

TI-Basic, 40 байт

Жорсткі коди входів. Нудний, але найкоротший шлях.

sub("NEWS",1+int(inString("E/W\N\S/N/S\E\W/",Ans)/4),1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.