超順列


26

前書き

あなたは、新しいハイテクスタートアップDejavuからいくつかの秘密の計画を盗むことを任された犯罪者です。奥の壁をこっそり覗き込みますが、ドアを開くにはピンが必要です。ロックのメーカーを認識し、0〜4のすべての数字を使用して5桁のピンを取ることを知っています。各桁が入力されると、ロックは入力された最後の5桁をチェックし、コードが正しい場合は開きます。あなたは、このロックをすり抜けなければなりません。

一言で言えば超順列

順列は、特定の数字セットのすべての可能な組み合わせです。たとえば、数字0、1、2のすべての順列は次のとおりです。

012、021、102、120、201、および210。

これらすべての順列を連結すると、スーパー順列が得られます。

012021102120201210

このスーパー順列には0、1、2の順列がすべて含まれていますが、これよりも短い順列を作成することもできます。ここでは少しスキップしますが、これらの数字の最短のスーパーパーミュテーションは次のとおりです。

012010210

私たちの意図と目的のために、これは本質的にそれらの数字のすべての可能な順列、すなわちスーパー順列を含む数字の最短文字列です。

仕事

心配する必要のある数字がさらに2桁あるため、上記のスーパー順列の例よりもタスクが少し難しくなります。-スーパー順列について読んでいない場合、または上記の私の例が少し不明瞭だった場合、このテーマに関するパトリック・ホナーのこの素晴らしい記事を読むことを強くお勧めします(この挑戦は彼の記事に非常に強く触発されたので、彼に敬意を表します):https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/。あなたの目標は、数字0〜4のスーパー順列を生成する可能な限り短いプログラムを書くことです。

得点

プログラムはいかなる種類の入力も受け付けず、0から4までの数字のスーパー順列を生成します。この結果のスーパー順列は、選択した言語が提供する範囲でコンソールに出力するか、ユーザーに表示する必要があります。これは可能な限り短い順列である必要はなく、有効なスーパー順列でなければなりません。このため、目標は最短の順列を持つ最短のプログラムを書くことです。そのため、次のようにスコアを計算する必要があります。

ファイルサイズ(バイト)*生成されたスーパーパーミュテーションの長さ(桁)

たとえば、40バイトのプログラムがあり、スーパー順列の長さが153桁の場合、スコアは次のようになります。

40 * 153 = 6120

いつものように、目標はこのスコアをできるだけ低くすることです。

テンプレート

回答を投稿する方法は次のとおりです。

言語| スコア

作業環境のコードへのリンク(可能な場合)

code snippet

コードの説明など

ファイナリティ

これは、このサイトに関する最初の質問の1つです。それで、私が何かを逃しているのか、私の挑戦のセクションが不明確なのか教えてください。ありがとう、そして楽しいゴルフを!


最短のスーパーパーミュテーションの長さを知って、最低スコアのアイデアを得ることができますか?
致命的

1
@Fatalize 153は最短です
TFeld

1
@Fatalizeを参照してくださいA180632
アーナウルド

1
一見すると、これはde Bruijnシーケンスを要求しているように見えます。ただし、スコアリング基準はこの課題を興味深いものにします。よくやった!
エリック・ザ・アウトゴルファー

3
@EriktheOutgolferこれは単なるスコアリングの違いではありません。スーパー順列にはある長さのすべての順列が含まれ、de Bruijnシーケンスにはある長さのすべての文字列が含まれます。
アンデルスカセオルグ

回答:


6

05AB1E、スコア= 1673(7バイト・239)

žBœ∊{3ý

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

使い方

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth、スコア= 1944(9バイト・216)

s+R+4d.p4

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

使い方

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJバイトを保存します
Emigna

1
Pythコードでは、m+d-> +Rはバイトを保存します。
isaacg

8
アプローチとプログラミング言語の両方が異なるため、これを2つの別々の回答として投稿する方が良いと思いませんか?
ケビンクルーッセン

@KevinCruijssen Meh、どちらも4つの要素の順列を残りの要素と結合するというテーマのバリエーションです。私の05AB1Eの回答は、実際には、Pythの回答とほぼ同じくらい多くの共通点を持っています。したがって、言語を切り替えるためだけに2倍の賛成票を要求したくありませんでした。
アンデルスカセオルグ

3

Brachylog、スコア= 2907(19バイト×153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

何も表示するには遅すぎますが、変更4する2場合はテストできます:オンラインで試してみてください!

これにより、最短の超順列が検出されます。

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript(ES6)、26975(325 * 83バイト)

このスコアリングシステムでは、「最適なスーパーミューテーションをハードコードする」ことの間には余地がほとんどありません。は、少なくとも非エソラン言語では、「すべての順列を連結するために短いビルトインを使用するます。

とにかくここに試みがあります。

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

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

325バイトの文字列を生成します。

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

有効なポイントがあります。得点システムについて少し心配していました。将来的には、さまざまな方法を考慮した方法で、より思いやりと得点を目指します。:D
アイザックC

23バイト未満の定型的な文字列を返すことができる場合、このソリューションよりもハードコーディングスコアが優れています(26975/153-153>23
Sanchises

私たちは、文字列を定型バイト5を必要と@Sanchises、またはのBigIntのため4
アーナウド

@Sanchises文字列をわずかに圧縮できます。オンラインで試してください!(またはnconsole.log出力するデフォルトのサフィックスをカウントしない場合はそれ以下)
ニール


2

05AB1E、スコア:5355 2160(216 * 10 バイト

3ÝœJε4yJ}J

@AndersKaseorgのPyth回答のポートので、必ず彼にしてください!

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

説明:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

オクターブ、27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

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

したがって、すべての順列を単純に生成、有効な超順列である最も短い部分文字列に切り捨てることは、最短の超順列を生成するよりも短くなります。悲しいことに、今回のスコアは回文ではありません。

オクターブ、97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

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

いくつかの点で更新されたエントリ

  • a++ シンボリック数には実装されていません。
  • contains()Octaveには実装されていません。に置き換えられましたany(regexp())
  • オンラインリンクでa、153に非常に近い長さのスーパー順列を手動で入力しました。これにより、ソリューションを検証できます。

2

CJam(6 * 240 = 1440)

5e!72>

オンラインデモ検証(各順列のインデックスを出力0..4が見つかる。元のプログラムはstdoutに適切な出力を提供しますが、スタックに配置されたものは直接使用できないため、出力をフラット化する必要があります)。

Sanchisesから盗まれたアプローチ。ただし、CJamの置換順序は異なり、異なるサブストリングを与えます。


CJam(22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

オンラインデモ検証

解剖

これは、単純な再帰構造を使用します。

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

木炭、29バイト、出力長153、スコア4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:@TFeldと同様に、私はスーパーパーミュテーションの半分を印刷してミラーリングします。次のコードを使用して、超順列を計算しました。

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

これはCharcoalの45バイトのプログラムに変換されるため、6885を獲得します。





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