43クインティオンの順列


16

次のように、ルービックキューブをネットとして表すことができます(解決した場合)。

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

各文字は対応する色を表します(W白、G緑など)

示された正確があることが43252003274489856000(〜43京)異なる順列がルービックキューブがでできること。

あなたの仕事は、間の整数取ることである143252003274489856000上に示したように、対応する順列及び出力。順列の順序を選択することもできますが、使用可能なアルゴリズムを表示して、可能な入力ごとに一意の正しい順列を生成する必要があります。

無効な順列規則

から撮影 このページ

ルービックキューブの中央の正方形は回転できないため、最初に、各3x3面の中心は同じである必要があります。キューブ全体を回転させて、顔の表示位置を変更できますが、これはキューブのネットには影響しません。

各順列には、その順列に到達するスワップの数のパリティに基づいてパリティがあると言うと、

  • 各コーナーピースには3つの方向があります。正しい方向(0)、時計回り(1)、または反時計回り(2)にすることができます。角の向きの合計は常に3で割り切れるままです

  • ルービックキューブの各法定回転は常に偶数のエッジを反転させるため、1つのピースだけが間違った方向を向くことはありません。

  • すべてのコーナーとエッジの順列を考慮すると、全体的なパリティは偶数である必要があります。つまり、各法定移動は常に偶数のスワップに相当するものを実行します(方向を無視)

たとえば、次の3つのネットは無効な出力です。

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

ルール

  • アルゴリズムが有効であることを、あなたが望む方法で証明しなければなりません。アルゴリズムの妥当性を証明する限り、すべての順列を列挙する必要はありません。
  • 限り、あなたのプログラムが動作するよう、理論的との間のすべての整数の143252003274489856000、あなたが実際に入力して、あなたの言語を扱うことができるよりも大きく取っての実用性を心配する必要はありません
    • 25312531
    • 27946105037114827095
  • 回答には何らかの有効性の証明を含める必要あります。この証明は、すべての可能性を列挙することを除いて、受け入れられた証明方法で有効性を証明できます。
  • 必要に応じて、別の入力方法を使用することを選択できます。ただし、
    • 入力は制限されています
    • 各入力は一意の出力に対応します
    • 入力形式と各出力にどのように対応するかを明確に説明します
  • 代わりに、33(!)〜126(~)の6つの異なるASCII文字を使用するために使用される文字を変更できます。WGRBOY
  • 有効なキューブネット、単線ストリング、3Dレンダリングなど、6面すべてを表示できるキューブの明確な表現を形成する限り、任意の方法で出力できます。特定の形式について確信が持てない場合は、コメントで質問することをheしないでください。

これはので、各言語のバイト単位の最短コードが優先されます。

有効な出力の例

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)

3番目の無効な例では、コーナーが無効な構成になっているだけでなく、r / y / oコーナーは、rとoが互いに反対であるため不可能なコーナー
です-fəˈnɛtɪk

3番目の無効な例(CC @ fəˈnɛtɪk)を修正
ジョナサンアラン

2番目の無効な例でも同じ問題が発生しましたが、気づいていませんでした。とにかく色が台無しになっているので重要ではありません
-f –n –tɪk

a1a2a3a4a18a237a312/2a4211

1
@Shaggyはい、1行の文字列で問題ありません
ません

回答:


13

334 297バイト

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

変数に整数を入力しますq

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

除算qにおける余りを入れ、3⁷でe。次に、e基数3の数字と見なしe、その数字(基数3)が3の倍数になるように数字に接尾辞を付けます。これによりe、角の回転を定義できます。

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

q8で除算し、残りをに入れzます。(8!はd、バイトを保存するために一時的に保存されます。)これによりz、コーナーの位置を定義できます。

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

除算qにおける余りを入れ、2¹¹でh。次に、h2を底とする数字と見なしh、その数字(2を底とする)が2の倍数になるように数字に接尾辞を付けます。これによりh、エッジの反転を定義できます。

F⪪”B"↷:μêKO″KW#})”³

中心の文字列表現をループします。

«J⌕α§ι⁰I§ι¹§ι²»

各センターの位置にジャンプして印刷します。

≔⁰ω

variableのコーナー位置のパリティを追跡しますw

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

角の位置の配列を作成します。

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

角の色の配列を作成します。

F²«

コーナー用に1回、エッジ用に1回、以下「キューブ」と呼ばれる2回ループします。

Fδ«

キューブの色の配列をループします。

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

から次のキューブ位置を抽出しz、パリティを更新しますwます。このパリティを最後の1つのエッジに使用します。これにより、エッジとコーナーのパリティの合計が均等になります。

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

必要に応じて次の回転または反転のために調整されたその位置で立方体を印刷します。

≧÷Lκε»

回転を削除するか、 eます。

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

エッジ位置の配列を作成します。これは、ループの2回目に使用されます。

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

エッジの色の配列を作成します。

≔θζ≔ηε

コーナー変数を上書きzし、e対応するエッジ変数とqし、hエッジがループの第二パス中並べ替えおよび反転されるようになっています。


自分にアドバイス:チャコールでゴルフしたものが330バイトの場合、PHPで試さないでください!
Night2

@ Night2悲しいことに今334、バグ修正(不適切なパリティ計算)のため。
ニール

8

ルビー570 408バイト

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

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

オリジナルバージョン、マジックストリングの代わりにマジックナンバーの配列

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

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

現在の形式で2つの整数の入力を受け取る匿名関数。これは許可されているようです:「別の入力方法を選択できます。」最初は0〜の範囲の順列で、12!*8!/2 - 12番目は0〜の範囲のピースの方向です2**11 * 3*7 - 1。解決済み状態の出力は次の文字列です。

000
000
000
222333444555
222333444555
222333444555
111
111
111

さらにゴルフ

出力形式を次の形状に調整すると、さらに約10個の文字が保存されます。しかし、これは読みやすさを低下させるので、私は現在それをしていません

      #########
      #########
      #########
#########
#########
#########

説明

順列

内部的に、解かれた状態は、配列内の一連の8進数で表されaます。入力gは数値12..1で除算され、モジュラスはエッジを選択して削除するために使用さazます。これが完了すると、唯一のコーナーは内に残るaので、g数字で割って8..1弾性率からコーナーを除去するのに使用されているとaし、それを置きますz

最後の2つのコーナーの順序を決定するのに十分な情報がないため、の値はgそれらに到達するまでにゼロに分割されているため、常にz元の順序で追加されます。次に、全体の順列が偶数か奇数かを判断するためのチェックが行われ、必要に応じて最後の2つのコーナーが交換されて、順列が偶数になります。

オリエンテーション

解決された位置にない場合にコーナーまたはエッジが正しい方向にあるかどうかを判断するさまざまな方法があります。この答えの目的上、コーナーが表示されている01、上面または下面にある場合、コーナーは正しい方向にあると見なされます。したがって、上面または底面を回転しても、角の向きは変わりません。他の面を回転させると向きは変わりますが、全体のパリティの合計が変わらないようになります。彼らが示した場合にエッジが正しい向きで考慮されている2か、4フロント/バックにか3またはを5左に右/。つまり、上部または下部を4分の1回転だけ回転すると4つのエッジが反転しますが、他の面を回転しても反転状態は変わりません。

入力には、最初のエッジと最後のコーナーを除くすべての明示的な情報が含まれます。11個の最下位ビットh%2048が合計され、モジュラスを使用して最初のエッジの方向が決定されます。hは、それ自体に追加することで2倍され、最初のエッジの方向の値が最下位ビットとして追加されます。最後のコーナーの向きは、から他のコーナーの向きを徐々に減算することで見つけられjます。最後のコーナー(ここでi/19= 1)の値は(ゼロに減らされます)にj%3加算されh、これにより最後のコーナーの方向が決まります。

文字列bは、顔の中心のテキストで事前に初期化されています。hは、モジュロを使用してピースの方向を決定し、212倍に分割してから38倍に分割します。いずれの場合も、入力zされた数値は適切な桁数(2または3)の文字列に変換され、文字列が複製されます。これにより、モジュロで見つかった数字の正しい回転が、インデックス付けによって文字列から抽出され、b

表示

最後に、生のステッカーは、インデックステーブルのマジックナンバーを使用bして、より人間が読める形式にコピーされsます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.