カスタムラベル付きの二面体グループD4コンポジション


14

二面体グループは、正方形の対称グループです。つまり、回転と反射を介して正方形をそれ自体に変換する動きです。8つの要素で構成されます:0、90、180、および270度の回転、水平、垂直、および2つの対角軸にわたる反射。D4

正方形に作用するD4の8つの要素。

画像はすべて、Larry Riddleによるこの素敵なページからのものです。

この課題は、これらの動きを構成することです。2つの動きが与えられると、それらを次々に実行するのと同じ動きを出力します。たとえば、移動7の後に移動4を行うことは、移動5を行うことと同じです。

構成例

移動を4に、次に移動7に順序を切り替えると、代わりに移動6が生成されることに注意してください。

結果は以下の表のとおりです。これは、グループ Cayleyテーブルです。だから、例えば、入力出力生成しなければならない。D47,45

12345678123456781234567823418756341265874123786557681324685731427685421385762431

チャレンジ

あなたの目標はこの操作を可能な限り少ないバイトで実装することですが、コードに加えて、1から8の動きを表すラベルも選択します。ラベルは0から255までの8つの異なる番号、または8でなければなりませんコードポイントが表す-バイト文字。

コードには、選択した8つのラベルのうち2つが与えられ、二面体グループ構成に対応するラベルを出力する必要があります。D4

1から8の動きに対してそれぞれ文字C、O、M、P、U、T、E、Rを選択したとします。次に、コードでこのテーブルを実装する必要があります。

COMPUTERCOMPUTERCOMPUTEROMPCREUTMPCOTUREPCOMERTUUETRCMOPTRUEMCPOETRUPOCMRUETOPMC

入力EとPを指定すると、Uを出力する必要があります。入力は常に文字C、O、M、P、U、T、E、Rの2つであり、出力は常にこれらの文字の1つです。

コピー用のテキストテーブル

1 2 3 4 5 6 7 8
2 3 4 1 8 7 5 6
3 4 1 2 6 5 8 7
4 1 2 3 7 8 6 5
5 7 6 8 1 3 2 4
6 8 5 7 3 1 4 2
7 6 8 5 4 2 1 3
8 5 7 6 2 4 3 1

Your choice of labels doesn't count against your code length.念入りに?現状では、マトリックスをコードにハードコーディングし、スコアにカウントされないと主張しています。
ベンジャミンアー

2
@BenjaminUrquhart私はあなたのコードの長さはあなたのコードの長さであると言っていました、そして、例えば、複数桁のラベルを選ぶことは余分な費用がかかりません。その行は役に立つとわかりにくいので、削除します。
-xnor

回答:


10

Ruby、18バイト

->a,b{a+b*~0**a&7}

非ゴルフ

->a,b{ (a+b*(-1)**a) % 8}  
# for operator precedence reasons, 
#-1 is represented as ~0 in the golfed version 

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

次のコーディング番号0〜7を使用します

コードにネイティブな順序で:

Native     Effect                    Codes per
Code                                 Question
0          rotate 0 anticlockwise    1C
1 /        flip in y=x               7E
2 /|       rotate 90 anticlockwise   2O
3 /|/      flip in x axis            5U
4 /|/|     rotate 180 anticlockwise  3M
5 /|/|/    flip in y=-x              8R
6 /|/|/|   rotate 270 anticlockwise  4P
7 /|/|/|/  flip in y axis            6T

質問ごとに

Native     Effect                    Codes per
Code                                 Question
0          rotate 0 anticlockwise    1C
2 /|       rotate 90 anticlockwise   2O
4 /|/|     rotate 180 anticlockwise  3M
6 /|/|/|   rotate 270 anticlockwise  4P
3 /|/      flip in x axis            5U
7 /|/|/|/  flip in y axis            6T
1 /        flip in y=x               7E
5 /|/|/    flip in y=-x              8R

説明

/はラインのフリップy=x|表し、y軸のフリップを表します。

それは例えば、次の2行に交互に反転させることによってグループD4の対称性のいずれかを生成することが可能である/続い|与える/|90度反時計回りの回転です。

連続したフリップの総数は、算術操作に非常に便利な表現を提供します。

最初の動きが回転の場合、単純にフリップの数を追加できます:

Rotate 90 degrees   +  Rotate 180 degrees = Rotate 270 degrees
/|                     /|/|                 /|/|/|

Rotate 90 degress   +  Flip in y=x        = Flip in x axis   
/|                    /                     /|/

最初の動きが反射の場合、同じ反射/|シンボルが互いに隣り合っていることがわかります。反射は自己反転なので、これらのフリップを1つずつ相殺できます。ですから、ある動きを他の動きから引く必要があります

Flip in x axis     +  Flip in y=x        = Rotate 90 degrees
/|/                   /                    /|/ / (cancels to) /|

Flip in x axis     +  Rotate 90 degrees  = Flip in y=x
/|/                   /|                   /|/ /| (cancels to ) / 

1
モジュラー演算のため、~0with を置き換えることができ7ます。
-NieDzejkob

素晴らしい方法と説明!フリップのキャンセル方法により、ラベルが加算または減算される理由が明確になります。
xnor

7

Wolfram言語(Mathematica)、31バイト

整数使用0,5,2,7,1,3,6,4ラベルとして。

BitXor[##,2Mod[#,2]⌊#2/4⌋]&

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

説明:

二面体群D4は、体F2上の次数3のユニタリ行列行列群と同型です。

D4U(3,2):={(1ab01c001)a,b,cF2}.

そして、私たちは持っています

(1a1b101c1001)(1a2b201c2001)=(1a1+a2b1+b2+a1c201c1+c2001)

ビット単位の操作で簡単に記述できます。


かなり派生-私はこの同型について知らなかった。
xnor



4

パイソン226の 23 21バイト

lambda x,y:y+x*7**y&7

D3andxnor

 id | r1 | r2 | r3 | s0 | s1 | s2 | s3 
----+----+----+----+----+----+----+----
 0  | 2  | 4  | 6  | 1  | 3  | 5  | 7  

2
あなたは置き換えることができ(-1)7いるため、モジュラー算術演算のために-3バイト。
-NieDzejkob

@NieDzejkobありがとう!しかし、alephalphaが28バイトから22バイトに答えを下げたという恥ずかしさ...-
ニール

いい解決策!演算子の優先順位を変更することにより、括弧を切り取ることができますy+x*7**y&7
。– xnor

@xnorありがとう、私は再びalephalphaの先を行っています!
ニール

3

TI-BASIC、165バイト

Ans→L₁:{.12345678,.23417865,.34126587,.41238756,.58671342,.67583124,.75862413,.86754231→L₂:For(I,1,8:10fPart(.1int(L₂(I)₁₀^(seq(X,X,1,8:List▶matr(Ans,[B]:If I=1:[B]→[A]:If I-1:augment([A],[B]→[A]:End:[A](L₁(1),L₁(2

入力はの長さ2のリストですAns
出力は、(row, column)テーブル内のインデックスの番号です。

バイトを節約するより良い圧縮方法があるかもしれませんが、私はそれを調べなければなりません。

例:

{1,2
           {1 2}
prgmCDGF1B
               2
{7,4
           {7 4}
prgmCDGF1B
               5

説明:(
読みやすくするために改行が追加されました。)

Ans→L₁                              ;store the input list into L₁
{.123456 ... →L₂                    ;store the compressed matrix into L₂
                                    ; (line shortened for brevity)
For(I,1,8                           ;loop 8 times
10fPart(.1int(L₂(I)₁₀^(seq(X,X,1,8  ;decompress the "I"-th column of the matrix
List▶matr(Ans,[B]                   ;convert the resulting list into a matrix column and
                                    ; then store it into the "[B]" matrix variable
If I=1                              ;if the loop has just started...
[B]→[A]                             ;then store this column into "[A]", another matrix
                                    ; variable
If I-1                              ;otherwise...
augment([A],[B]→[A]                 ;append this column onto "[A]"
End
[A](L₁(1),L₁(2                      ;get the index and keep it in "Ans"
                                    ;implicit print of "Ans"

これは155バイトのソリューションですが、マトリックスをハードコーディングしてインデックスを取得するだけです。
私はそれがより退屈であることがわかったので、私はそれを私の公式の提出にしませんでした:

Ans→L₁:[[1,2,3,4,5,6,7,8][2,3,4,1,8,7,5,6][3,4,1,2,6,5,8,7][4,1,2,3,7,8,6,5][5,7,6,8,1,3,2,4][6,8,5,7,3,1,4,2][7,6,8,5,4,2,1,3][8,5,7,6,2,4,3,1:Ans(L₁(1),L₁(2

注: TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ


あなたは使用することにより1バイトのように剃ることができませんでした0-71-8
ASCIIのみの

できましたが、さらに2つを使用して、マトリックスの各要素に1つずつ追加する必要がありました。しかし、良い考えです!
タウ

あなたはより多くの2を使用するhavevないように間違っている、あなたは、笑任意の文字セットを使用することができます
ASCIIのみの

それは本当かもしれませんが、TI-BASICの行列は1インデックスです。この投稿は、必要な値を取得するためにそれを利用しています(それがあなたが暗示しているものである場合。私が間違っている場合は私を修正してください)
タウ

ああ、それを忘れてしまった
ASCIIのみ

3

ゼリー、6 バイト

N⁹¡+%8

右側の最初の変換と左側の2番目の変換を受け入れるダイアディックリンクは、複合変換を生成します。

変換は次のとおりです。

as in question:  1    2    3    4    5    6    7    8
transformation: id  90a  180  90c  hor  ver  +ve  -ve
  code's label:  0    2    4    6    1    5    7    3

オンラインでお試しください!...または、質問のラベルにマップされたテーブルを参照してください。

(引数は、6バイトを使用して他の順序で取得できます。_+Ḃ?%8

どうやって?

各ラベルは、変換と同等の交互hor+ve変換のシーケンスの長さです(例:180と同等hor, +ve, hor, +ve)。

合成A,Bは、2つの同等なシーケンスの連結に相当し、8を法とする減算または加算の単純化を可能にします。

質問の7, 4例を使用すると、次のようになります+ve, 90c
hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve

以来...しかしhor, horであるid、我々は持っています:
hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve

以来、...と+ve, +veありid、私たちは持っています:
hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve

...そして、これらのキャンセルを次のように繰り返すことができます:
hor
..長さの減算(7-6=1)と同等。

90a, 180 2+4=6 90c

最後に、長さ8のシーケンスは8をid法とする結果のシーケンス長を取ることができることに注意してください。

N⁹¡+%8 - Link: B, A
  ¡    - repeat (applied to chain's left argument, B)...
 ⁹     - ...times: chain's right argument, A
N      - ...action: negate  ...i.e. B if A is even, otherwise -B
   +   - add (A)
    %8 - modulo eight

また、辞書式順列インデックスを使用したこの実装よりも1バイト短くなっています。

œ?@ƒ4Œ¿

...を受け入れるモナドリンク[first, second]

as in question:  1    2    3    4    5    6    7    8
transformation: id  90a  180  90c  hor  ver  +ve  -ve
  code's label:  1   10   17   19   24    8   15    6

3

JavaScript(Node.js)22 17バイト

(x,y)=>y+x*7**y&7

D3

 id | r1 | r2 | r3 | s0 | s1 | s2 | s3 
----+----+----+----+----+----+----+----
 0  | 2  | 4  | 6  | 1  | 3  | 5  | 7  

JavaScriptの古いバージョンは、22バイトでさまざまな方法でサポートできます。

(x,y)=>(y&1?y-x:y+x)&7
(x,y)=>y-x*(y&1||-1)&7
(x,y)=>y+x*(y<<31|1)&7

小さな改善-入力x=>y=>(y&1?y-x:y+x)&7をカリー化してバイトを節約し、を使用して関数を呼び出しますf(x)(y)
ダナ


2

Elm42バイト 19バイト

\a b->and 7<|b+a*7^b

NeilのNode.jsバージョンのポート

オンラインで試す

前のバージョン:

\a b->and 7<|if and 1 a>0 then a-b else a+b

1
素敵な最初の答え!Elmでプログラムする方法がわかりませんが、スペースを削除することはできますか?
MilkyWay90

@ MilkyWay90いいえ、これはMLベースの言語の主な違いの1つであり、Cのような言語での意味f xと同じように、関数呼び出しf(x)です。そして、あなたはそれを助けることはできません。しかし、多くのゴルフ以外のシナリオでは、本当にすてきで混乱が少なくなります。Elmにはビット単位の演算子(&など)がないため、ここでand x yは単なる関数呼び出しです。
エフゲニーマリューティン

わかりました、説明してくれてありがとう!
MilkyWay90

実際、@ MilkyWay90 <|では、括弧の代わりにパイプ演算子を使用して、1つのスペース(および1バイト)を切り捨てました。質問してくれてありがとう!
エフゲニーマリューティン

どういたしまして!新しいソリューションの作成に興味がある場合は、The Nineteenth Byte(私たちのSEチャットルーム)で助けを求めることができます。コーディングチャレンジを作成する場合は、それをThe Sandbox(メタ)に投稿し、The Nineteenth Byteの質問へのリンクを毎日投稿できます。
MilkyWay90

1

Python、82 71バイト



ASCIIのみのおかげで0-7 -11バイト

lambda a,b:int("27pwpxvfcobhkyqu1wrun3nu1fih0x8svriq0",36)>>3*(a*8+b)&7

TIO



また、76、および-2なぜならf=、それは再帰的ではないので、除去することができる
ASCIIのみ

待機リッピング、それは動作しません
ASCIIのみの


あなたがしてやれることのように思えるint.from_bytes...と非UTFエンコーディングではなく、必ずTIOにそれを行う方法
ASCIIのみの

0

Scala、161バイト

コンピューターをラベルとして選択します。

val m="0123456712307645230154763012675446570213574620316574310274651320"
val s="COMPUTER"
val l=s.zipWithIndex.toMap
def f(a: Char, b: Char)=s(m(l(a)*8+l(b))-48)

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


1
これはコードゴルフです:| あなたはできるだけ短く、それを作ることになっている
ASCIIのみの


ええ、ネイティブ0〜7だけでなく、scalaと本物のラベルを使うように挑戦しました。それを破ってみてください。
ピーター



0

Scala、70バイト

ラベルとして0〜7のネイティブ整数を選択します。

マトリックスを32バイトのASCII文字列に圧縮し、数字の各ペアn0、n1を1文字c = n0 + 8 * n1 + 49にします。49から始まって、エンコードされた文字列に\はありません。

(a:Int,b:Int)=>"9K]oB4h]K9Vh4BoVenAJne3<_X<AX_J3"(a*4+b/2)-49>>b%2*3&7

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




-3

Wolfram言語(Mathematica)、7バイト(UTF-8エンコーディング)

#⊙#2&

2つの引数を取る純粋な関数。ここでレンダリングされるシンボルは、実際にはMathematicaのプライベートUnicodeシンボルF3DE(3バイト)であり、関数を表しますPermutationProduct

Mathematicaは二面体グループについて知っており、Cyclesコマンドを使用して記述された順列としてさまざまなグループの要素を表します。たとえば、コマンドを実行する

GroupElements[DihedralGroup[4]]

出力が得られます:

{Cycles[{}], Cycles[{{2, 4}}], Cycles[{{1, 2}, {3, 4}}], 
 Cycles[{{1, 2, 3, 4}}], Cycles[{{1, 3}}], Cycles[{{1, 3}, {2, 4}}], 
 Cycles[{{1, 4, 3, 2}}], Cycles[{{1, 4}, {2, 3}}]}

PermutationProduct この形式で記述された場合、グループ要素を乗算する関数です。

独自のラベルを選択することが許可されているため、この関数はグループ要素のこれらのラベルを想定しています。これらのラベルと問題投稿内のラベルとの関連付けは、次のようになります。

Cycles[{}] -> 1
Cycles[{{1, 2, 3, 4}}] -> 2
Cycles[{{1, 3}, {2, 4}}] -> 3
Cycles[{{1, 4, 3, 2}}] -> 4
Cycles[{{2, 4}}] -> 5
Cycles[{{1, 3}}] -> 6
Cycles[{{1, 2}, {3, 4}}] -> 7
Cycles[{{1, 4}, {2, 3}}] -> 8

tl; drビルトインがあります。


8
ラベルは0〜255の数字または1バイトでなければなりません。
xnor

結構です(とにかくこの機能を発見できてうれしいです)。OPでそれを明確にできますか?現時点では、「独自のラベルを選択」(強調)、次にいくつかの可能な選択肢(「あなたは...」)のようになっています。
グレッグマーティン

1
ああ、私はあなたがそれをどのように読んでいるか見ます。ここで不明確であり、間違った道にあなたを導くために残念。言い換えてみましょう。
xnor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.