コード内のミラー、ミラー


26

多くの場合、2次元プログラミング言語には、グリッド上の命令ポインターをリダイレクトするためのミラーコマンドが/あります\

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

この課題では、着信方向とミラーを指定し、発信方向を決定する必要があります。

ルール

到来方向は、文字の一つとして説明するNESWと、ミラーは、いずれかとして与えられる/、または\。これらは任意の順序で受け取ることができます。大文字を使用する必要があります。

2文字の文字列、文字間の区切り文字を使用した文字列、リスト内の文字のペア、またはシングルトン文字列のペアなど、任意の便利な形式で入力を取得できます。区切り文字付きの文字列を使用する場合、区切り文字には文字を使用できませんNWSE\/

出力は、からの文字NESWまたは単一文字の文字列でなければなりません。

プログラムまたは関数を作成し、入力を受け取り出力を提供する当社の標準的な方法のいずれかを使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定される最短の有効な回答が勝ちます。

テストケース

処理する必要がある入力は8つしかないため、すべてのコードをテストしない理由はありません。

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

1
入力時にバックスラッシュをエスケープする必要がある言語では、適切な場合に入力が「\\」になると想定できますか?
JDL

4
@JDL実際の文字列(または文字)には単一のを含める必要があり\ます。あなたの答えが文字列をとる関数サブミッションである場合、もちろん\\それを正しく呼び出すためにソースコードが必要になりますが、たとえば標準入力から入力を読み取る場合、それは単一でなければなりません\。あなたが入力に使用する言語のそれぞれの文字列の長さの関数を呼び出す言い換えれば、結果は関係なく、常に入力が含まれているかどうかの、同じでなければなりません/\
マーティンエンダー

さて、stdinを介してエスケープされていない「\」が入力された場合、Rに問題があると予想していましたreadline()が、それを処理できます。
JDL

1
@JDLおそらく、その記号をエスケープ(複製)する文字列を入力する必要ありますが、結果の文字列は "N \"になります
ルイスメンドー

回答:


24

Python、40 38バイト

-MitchSchwartzに感謝-2バイト(ord(d)+ord(m))%8->ord(d)+ord(m)&7

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

正常な序数の和の最小modによってインデックス付けされたリスト(別名文字列)の回答の単純な検索。

テストケースはイデオンにあります


ダンギット、私はASCII値を取得し、%8それらを合計し、インデックスを作成するのが非常に賢いと思っていました。その後、1時間以上前に同じソリューションを投稿しました。うん +1します。
AdmBorkBork

21

Python 2、40バイト

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

Sp3000は1バイト(.index.find)を保存しました。

説明

次のように方向をマッピングします。

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

方向2ビットコードを割り当て、両方のフリップを1番目と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)]

Lynnの回答のおかげで、比較を使用してさらに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の比較を巧みに使用して、最後まであなたの状態を
再現

6

MATL19 17バイト

'NWSE'jy&mjy+Eq-)

オンラインでお試しください!または、8つのケースを確認します。

説明

'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バイト

-1バイトごとに@Jakubeと@Maltysenに感謝

@J"NWES"xxJQh>E

改行で区切られた2つの引用符付き文字列(最初は方向、次にミラー)の入力を受け取り、結果を出力するプログラム。

これは@LynnのPython answerの移植版です。

オンラインで試す

使い方

@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の回答のポート)
@MartinEnderのおかげで-1バイト(文字列の末尾にスペースを追加し、モジュロ8の必要性を削除します)
@LuisMendoのおかげで-1バイト(2つではなく単一の文字列引数を取ります)

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));}

ひどくてcharAtindexOf非常に多くのバイトを必要とします

Ungolfedおよびすべてのテストケース:

ここで試してみてください。

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

Python、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]

入力を2つの明示的な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

summationsカラム(入力のASC​​IIコードポイントの合計から派生)で簡単な総当たり攻撃を実行すると、モジュロの合計を取ると8、次のようになります2 2 | 6 1 | 3 4 | 5 7。文字列内の証明だと"xNESSWNW"、としてE指標である2Nである61、というように。

だから、私たちは(暗黙のうちからキャストの入力を合計する必要があるcharint32道に沿って)、それを取る%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/、2文字の文字列コマンドラインパラメーターとして受け入れます。\そして/厄介なループします。124バイトかかります。


Idk、96バイトをカウントします。あなた\rはそれから取り除いたのですか?
コナーオブライエン

@ ConorO'Brienメモ帳を使用してバッチファイルを作成するので、いいえ。
ニール

2

オクターブ、30バイト

ジョナサンアランと同じ順序の引数を使用しました。

入力を2文字の文字列として受け取ります'W\'

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

オンラインでお試しください。


いいね!MATLに移植することもできます'NESSWNW 'is)すべてのテストケースを参照)。iis inputsis sum、および)indexingであり、モジュラーです。モジュロが8になるように文字列にスペースを追加しました
ルイスメンドー

ありがとう:)私は自分で書いていないので、それを別の答えとして追加すると不正行為だと感じます。ただし、自分で答えたくない場合は、この答えに追加できます。)
Stewie Griffin

私は理解している、おそらく同じことをするだろう:-)私が思い付かなかった全く異なるアプローチなので、私の答えを修正したくありません。わからない、それはあなたの答えに追加することが答えでは2つの異なる言語であるように、かかわらず、理にかなって
ルイス・Mendo

...私はそれを追加しないと思うので、PIは、それはあなたのMATLの答えよりも長いです参照してください。これは、しかし、私の最初のMATLの答えだろう
Stewieグリフィン

2

C、44、 35、 34のバイト

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

2つの変数として2文字が必要です。大文字と小文字の両方が必要です。多くのビット操作を使用します。フラグメントa&a/2は、下位2ビットに一意の値を持つ値を生成し、&3上位ビットをすべて切り捨てます。これは、\ミラーの文字列「NWES」へのインデックスとして使用されます。幸いにもASCII文字の2ビット、下位\/の正しい方向を取得するために、前述の指標とXORに完全であり、それぞれ00及び11である/ミラー。


2
いいね!ただし、明らかな-1バイトを見逃しました:(return"NWES"[...]スペースを省略します)。
ティムČas16年

ティムのおかげで、それが有効だとは思っていなかったC :)
G.スリーペン

1

CJam、17バイト

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

入力はスペースで区切られます。

オンラインでお試しください!(改行区切りのテストスイートとして。)

これは、チャレンジを投稿する前に見つけたソリューションです。ジョナサンの巡回インデックス付けほど短くはありませんが、このアプローチは非常に興味深い(そして斬新な)ものだと思いました。

説明

目標は、文字変換を使用して(つまり、文字から文字へのマッピングを使用して)入力文字を出力文字で置き換えることです。これを行うために、我々は、ミラーがあるかどうかに基づいて正しいマップを選択する必要があります/\SWENリストから条件付きで選択する別のリストにマップします。入力リストがのSWEN場合、2つの出力マップは次のとおりである必要があります。

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

SED 48(-rの場合は42 + 1)43

マーティン・エンダーのおかげで5を節約できました♦

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

入力を2文字の文字列として受け取ります。


0

Mathematica、98バイト

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

匿名関数。入力として2つの文字列を受け取り、出力として文字列を返します。


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  

ポインター比較を使用するため、ハードコーディングされた値でのみ機能します。
サミKuhmonen 16


0

TI-Basic、40バイト

入力をハードコードします。退屈ですが、最短の方法。

sub("NEWS",1+int(inString("E/W\N\S/N/S\E\W/",Ans)/4),1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.