拡張可能な列車交換問題


8

拡張列車交換問題

パート1:通常の列車交換問題

1996年のCCC(カナダコンピューティングコンペティション)では、最初のステージ2の問題は列車交換問題でした。ここのリンクにアクセスできます。基本的に、番号付きの列車の束があり、それらを順番に取得するために必要な列車の入れ替えの数を調べたい場合、各列車の入れ替え操作では、隣接する2つの列車を入れ替えることができます。車両はどちらの方向にも走ることができるので、入れ替えたときに車両が反対方向に向いていることを誰も気にしません。これはとても簡単です。あなたがする必要があるのは:

それをバブルソートするためのステップ数を見つけます。隣接する要素の交換のみを行うことができる場合、これは最も効率的なソートアルゴリズムです。

だから、もっと難しいものを作りました。

パート2:この課題の仕組み

基本的に、隣接する列車だけでなく、交換することができます。回転プラットフォームが長いと、複数の列車の位置を入れ替えることができます。たとえば、長さが4の回転プラットフォームでは、内側と外側のペアを同時に交換できるため、に1 2 3 4なり4 3 2 1ます。さまざまな回転プラットフォームサイズの例を以下に示します。

Length 2:
1 2 3 4 5
  ---
1 3 2 4 5

Length 3:
1 2 3 4 5
  -----
1 4 3 2 5

Length 4:
1 2 3 4 5
-------
4 3 2 1 5

基本的には、列車全体のサブリストを反転するだけです。明確にするために、各移動では、トレインを正確に 交換することしかできませんN

パート3:仕様

入力

入力には、回転プラットフォームの長さと車両の順序の2つを取り込む必要があります。必要に応じて、車両の数も必要になる場合があります。列車の車両の順序は、番号の順序付きリスト(各番号は列車の車両を表す)によって与えられるため、入力をスペース区切りの整数、改行区切りの整数、配列などとして読み取ることができます。

出力

キャリッジをすべて注文に入れるために必要なスワップの最適(最小)数を出力する必要があります1 2 3 ... N。何の解決策、出力がない場合-1No solutionまたは他のいくつかの一貫したメッセージ。stderrに出力できない場合があります。

得点

これは課題なので、スコアはバイト単位です。2016年9月1日の時点でバイト数が最も少ないソリューションが受け入れられます。

問題1 入力

4
2
1 3 2 4

出力

1

説明
これはかなり簡単です。長さ2の回転プラットフォームでは、通常の列車交換問題と同じです。スワップ23

問題2 入力

4
3
1 3 2 4

出力

No solution (or an equivalent consistent message).

問題3 入力

9
3
1 4 5 6 3 8 7 2 9

出力

4

説明

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

標準の抜け穴が適用されます

幸運を!

編集1:入力フォーマットをより柔軟にしました。@Megoに感謝!
編集2:長さ4の回転プラットフォームが内部ペア外部ペアの両方を交換することを明確にしました。@TimmyDに感謝!
編集3Nせいぜいではなく、正確に長さの順列を作成する必要があることを明確にしました。@Zgarbに感謝!


5
このような厳密な入力形式を持つことはお勧めできません。列車の車両のリスト(およびオプションでこのリストの長さ)とプラットフォームの長さのみが送信される限り、任意の入力形式を使用できます。
Mego

@Megoわかりました。変更します。
HyperNeutrino 2016

1
長さNのプラットフォームは、Nトレインを正確に反転しますか、または最大Nトレインを反転させますか
Zgarb

1
質問には5つのタグしか含めることができません。配列操作は非常に一般的すぎて事実上役に立たないため、配列操作を削除しました。質問は、追加したより具体的なタグを使用する方がよいと思います。
Peter Taylor

回答:


1

Perl、120バイト

+6を含みます-Xapi(コード内のとの-両方でオプションをと組み合わせることができないため、スペースもカウントされます)-i$'-e

STDINの入力と-iオプションの後のプラットフォームの長さを使用して実行します。例:

perl -Xapi3 trains.pl <<< "1 4 5 6 3 8 7 2 9"

-2解決策がない場合に印刷します

trains.pl

1until$_=$n++*$z{pack"W*",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/s,keys%z,pack"W*",1..@F;$_--

場合N <= 9あなたは5バイト以上を獲得することができます。

1until$_=$n++*$z{join"",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/,keys%z,join"",1..@F;$_--

よくやった; 私がテストした限りでは、これはうまくいきます!+1&承諾
HyperNeutrino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.