アドベントチャレンジ8:保管カート輸送計画!


10

<<前へ

PPCGコミュニティのおかげで、サンタは現在、保管カートのバランスを調整しています。今、彼はそれらをローディングベイに送ることができるようにそれらを輸送ドックに移動する必要があります。残念ながら、カートを移動するためのトラックはめちゃくちゃで、一緒にクラッシュせずにすべてを移動する方法を見つける必要があります!

チャレンジ

各カートのトラックは、「ラベル」(またはステーション)のリストとして提供されます。カートは、いつでも2つのカートが同じラベル/ステーションにないように移動する必要があります。基本的に、カートはそれぞれに固有のラベルが付いている位置の間を移動します。

仕事

各カートのトラックをラベルのリスト(すべて正の整数)のリストとして指定し、すべてのカートをできるだけ短い時間で安全に目的地に送るために、各カートをいつリリースするかを決定します。

ここでは、トラックシステム全体の仕組みについて説明します。たとえば、カートit_iラベル付きのトラックにリリースされたとしT_i_1, T_i_2, ..., T_i_nます。すると、中にt_1までt_i-1、カートがiグリッド上ではなく、無視することができます。

時間枠t_iで、カートはラベルT_i_1にあり、t_kからt_iまでの時間枠ごとt_i+nに、カートはラベルにありT_i_k+1ます。

を含むすべての時間枠t_i+nで、カートは目的地にあり、グリッド上にありません。

所要時間の合計t_Tは、カートがシステムのトラック上に残っている最後の時間枠です。

仕様書

トラックシステムが指定されている場合、カートが時間に開始[t_1, t_2, ..., t_n]する時間枠のリストを返します。これにより、他の配置ではカートがより短い時間で目的地に安全に到着できなくなります。it_i

任意の時間枠であれば「安全」の面では、t_1へのt_T任意のラベル上に複数のカートがあり、それらが衝突し、配置が「安全」ではなかったです。トラックが2ウェイであるため、2つのカートがからa, bに移動してb, aも「安全」であることに注意してください。

フォーマット仕様

入力は、適切な形式の正の整数の行列として与えられます。出力は、適切な形式の正の整数のリストとして提供する必要があります。インデックスのない時間枠で出力を与えることができるので、出力は適切な形式の非負整数のリストになります。

ルール

  • 標準抜け穴が適用されます
  • これはので、バイト単位の最も短い答えが勝ちます
  • 回答は受け付けられません

テストケース

Input -> Output
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> [1, 1, 1]
[[1, 2, 3], [1, 2, 3]] -> [1, 2]
[[1, 2, 3], [3, 2, 1]] -> [1, 2]
[[1, 2, 3, 4], [4, 3, 2, 1]] -> [1, 1]
[[1, 1, 1], [1, 1, 1]] -> [1, 4]
[[1, 2, 3, 4], [2, 4, 3, 1]] -> [2, 1]
[[1, 2, 3, 4, 5, 6, 7], [2, 3, 3, 4], [5, 4, 3]] -> [1, 3, 4]
[[1, 2, 3, 4, 4], [1, 2, 3, 5, 4], [1, 2, 3, 4, 5]] -> [2, 3, 1]

注:このチャレンジシリーズは、Advent Of Codeからインスピレーションを得ました。このサイトとは関係ありません

こちらの最初のチャレンジの「リンクされた」セクションを見ると、シリーズのすべてのチャレンジのリストを確認できます

幸せなゴルフ!


要件を理解していない:カート=配列?
l4m2 2017

got:in [i] [t-out [i]]すべてのtですべて異なり、最大out [i] + in.length最小、サンプルで正しく推測した場合
l4m2

@ l4m2何が混乱していますか?私は仕様を十分に明確にしたと思います...配列は各カートがたどる経路を表しています
HyperNeutrino

私はテキストを注意深く読みませんでした(私には読みにくい、多分私の悪い)、それは2Dプレートだと思いました
l4m2

回答:


4

JavaScript(ES7)、172バイト

インデックスが0の時間フレームの配列を返します。

a=>(g=k=>a.map((a,i)=>[l=a.length+1,i,a,L=L<l?l:L]).sort(([a],[b])=>a-b).every(([,n,b],i)=>b.every((c,t)=>o[t+=A[n]=k/L**i%L|0]&1<<c?0:o[t]|=1<<c),o=[],A=[])?A:g(k+1))(L=0)

注意:これは[0-31]のラベルでのみ機能します。これはJSの制限であり、アルゴリズムの制限ではありません。

テストケース

コメントしました

a => (                         // given a = array of tracks
  g = k =>                     // g = recursive function taking k = counter
    a.map((t, i) => [          // map each track t in a to a new entry made of:
      l = t.length + 1,        //   - its length + 1 (l)
      i,                       //   - its original index in the input array
      t,                       //   - the original track data
      L = L < l ? l : L        //   and update the maximum track length L
    ])                         // end of map()
    .sort(([a], [b]) =>        // let's sort the tracks from shortest to longest
      a - b                    // so that solutions that attempt to delay short
    )                          // tracks are tried first
    .every(([, n, b],          // for each track b with an original position n,
                      i) =>    // now appearing at position i:
      b.every((c, t) =>        //   for each label c at position t in b:
        o[t += A[n] =          //     add to t the time frame A[n] corresponding
          k / L**i % L | 0     //     to this position (i) and this combination (k)
        ] & 1 << c ?           //     if the station c is already occupied at time t:
          0                    //       make every() fail
        :                      //     else:
          o[t] |= 1 << c       //       mark the station c as occupied at time t
      ),                       //   end of inner every()
      o = [],                  //   start with: o = empty array (station bitmasks)
      A = []                   //               A = empty array (time frames)
    ) ?                        // end of outer every(); if successful:
      A                        //   return A
    :                          // else:
      g(k + 1)                 //   try the next combination
)(L = 0)                       // initial call to g() + initialization of L

それはビット演算子のせいだと思いますか?(<<および|)代わりにboolの配列を使用して修正できます...
user202729

@ user202729はい、これはに保存されている値のビットごとの演算子が原因ですo[]。(実際には別の方法で行うこともできますが、最初はゴルフの結果のためにこの方法を選択しました。)
Arnauld
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.